[Whodo.SVN] r91 - trunk/doc/agile_python

0 views
Skip to first unread message

SVN 提交记录

unread,
Sep 12, 2008, 6:35:00 AM9/12/08
to s...@list.worldhello.net
Author: jiangxin
Date: 2008-09-12 18:35:00 +0800 (五, 2008-09-12)
New Revision: 91

Modified:
trunk/doc/agile_python/ch01-preface.xml
trunk/doc/agile_python/ch02-model-tdd.xml
trunk/doc/agile_python/ch04-auth.xml
trunk/doc/agile_python/ch05-config.xml
trunk/doc/agile_python/ch06-i18n.xml
trunk/doc/agile_python/ch07-package.xml
Log:
screen -> programlisting

已修改: trunk/doc/agile_python/ch01-preface.xml
===================================================================
--- trunk/doc/agile_python/ch01-preface.xml 2008-09-12 07:35:13 UTC (rev 90)
+++ trunk/doc/agile_python/ch01-preface.xml 2008-09-12 10:35:00 UTC (rev 91)
@@ -14,8 +14,8 @@
就采用了测试驱动开发(TDD)技术,通过一系列的迭代最终敏捷的实现了预期的需求。</para>

<para>在该项目中采用了Python最新流行的MVC框架:Pylons。并在 Web 页面中大量使用了
- AJAX 技术。本文涉及到的技术术语有:敏捷, TDD, MVC,
- 单元测试, 代码覆盖测试, AJAX, 重构, i18n, 开放源代码。</para>
+ AJAX 技术。本文涉及到的技术术语有:敏捷, TDD, MVC, 单元测试, 代码覆盖测试,
+ AJAX, 重构, i18n, 开放源代码。</para>

<!-- ================================================================= -->
<sect2 id="psm.preface.background">
@@ -24,7 +24,7 @@
<para>Subversion使用配置文件进行基于路径的授权,手工配置易于出错。
下面是一个错误百出的配置示例:</para>

- <screen>
+ <programlisting>
[groups]
admin = &amp;admin, admin1, admin2
group1 = @group2, user1
@@ -49,7 +49,7 @@
* =
@group1 = rw
@visiters = r
-</screen>
+</programlisting>

<para>其中的错误或可能的错误有:</para>

已修改: trunk/doc/agile_python/ch02-model-tdd.xml
===================================================================
--- trunk/doc/agile_python/ch02-model-tdd.xml 2008-09-12 07:35:13 UTC (rev 90)
+++ trunk/doc/agile_python/ch02-model-tdd.xml 2008-09-12 10:35:00 UTC (rev 91)
@@ -41,7 +41,7 @@
<para>假设svnauthz的 User, Alias, Group 类已经完成,我们期望他们实现的功能是什么呢?
于是在纸上写下假想任务目标(模拟python交互式命令行):</para>

- <screen>
+ <programlisting>
&gt;&gt;&gt; <emphasis>from svnauthz import User, Group, Alias</emphasis>
&gt;&gt;&gt; <emphasis>user1=User('Tom')</emphasis>
&gt;&gt;&gt; <emphasis>user2=User("Jerry")</emphasis>
@@ -63,7 +63,7 @@
&gt;&gt;&gt; <emphasis>group2.append(group1, user1, autodrop=True)</emphasis>
&gt;&gt;&gt; <emphasis>print group2</emphasis>
team2 = Tom # 使用 autodrop 参数,自动抛弃冲突的组成员,而不引发异常。(即容错性)
-</screen>
+</programlisting>

</sect3>

@@ -73,7 +73,7 @@

<para>将假想的任务目标翻译为测试用例。建立单元测试文件 <filename>test_svnauthz.py</filename> 如下:</para>

- <screen>
+ <programlisting><![CDATA[
#!/usr/bin/env python
# -*- coding: utf-8 -*-

@@ -100,13 +100,13 @@
group1 = Group('team1')
group2 = Group('team2')
group1.append(group2, user2, alias1, user1)
- self.assert_(str(group1) == 'team1 = &amp;admin, @team2, Jerry, Tom')
+ self.assert_(str(group1) == 'team1 = &admin, @team2, Jerry, Tom')
self.assertRaises(Exception, group2.append, group1, user1)
group2.append(group1, user1, autodrop=True)
self.assert_(str(group2) == 'team2 = Tom')

if __name__ == '__main__': unittest.main()
-</screen>
+]]></programlisting>

<para>执行测试用例:</para>

@@ -152,7 +152,7 @@

<para>svnauthz.py第一个版本的代码如下:</para>

- <screen>
+ <programlisting><![CDATA[
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
@@ -173,12 +173,12 @@
18
19 def __str__(self):
20 return self.__name
-</screen>
+]]></programlisting>

<para>再次执行测试用例:</para>

<screen>
-$ python test_svnauthz.py -v
+$ <emphasis>python test_svnauthz.py -v</emphasis>
testAlias (__main__.TestStage1) ... ERROR
testGroup (__main__.TestStage1) ... ERROR
testUser (__main__.TestStage1) ... ok
@@ -256,12 +256,12 @@

<para>我们在testUser用例的最后补充一条断言:</para>

- <screen>
+ <programlisting>
def testUser(self):
user1 = User('Tom')
self.assert_(str(user1) == 'Tom')
self.assertRaises(Exception, User, " ")
-</screen>
+ </programlisting>

<para>再次检查一下测试用例对代码的覆盖度。哇,100% 通过!</para>

@@ -299,10 +299,10 @@

<para>在 test_svnauthz.py 文件头增加如下语句,设置Python模组查询路径:</para>

- <screen>
+ <programlisting>
import sys
sys.path.insert(0,'src')
-</screen>
+</programlisting>

<para>测试用例又可以成功执行了。</para>

已修改: trunk/doc/agile_python/ch04-auth.xml
===================================================================
--- trunk/doc/agile_python/ch04-auth.xml 2008-09-12 07:35:13 UTC (rev 90)
+++ trunk/doc/agile_python/ch04-auth.xml 2008-09-12 10:35:00 UTC (rev 91)
@@ -22,7 +22,7 @@
<para>BaseController 是所有控制器的基类,在该基类增加授权功能,
会自动为其他控制器所使用。BaseController 的代码在文件 <filename>lib/base.py</filename> 中。</para>

- <screen>
+ <programlisting>
class BaseController(WSGIController):
requires_auth = []

@@ -37,7 +37,7 @@
session['path_before_login'] = request.path_info
session.save()
return redirect_to(h.url_for(controller='security'))
-</screen>
+</programlisting>

<para>从BaseController 继承的类,可以设置 requires_auth 来增加授权。
requires_auth 可以为 True 或者是一个包含要进行授权的动作列表。如果需要授权,
@@ -51,10 +51,10 @@

<para>在需要增加授权的控制器中增加requires_auth的属性。</para>

- <screen>
+ <programlisting>
class CheckController(BaseController):
requires_auth = True
-</screen>
+</programlisting>

</sect2>

@@ -99,7 +99,7 @@

<para>在控制器的测试用例基类TestController中加上login方法,以简化登录调用:</para>

- <screen>
+ <programlisting><![CDATA[
class TestController(TestCase):
...
def login(self, username, password=""):
@@ -111,17 +111,17 @@
password = d.get(username,'')
form['password'] = password
form.submit()
-</screen>
+]]></programlisting>

<para>在测试用例中调用login方法:</para>

- <screen><![CDATA[
+ <programlisting><![CDATA[
self.login('root')
res = self.app.get(url_for(controller='check'))
assert res.status == 200
assert '''<input type="submit" name="submit" value='Check Permissions'>''' in res.body
assert res.c.reposlist == ['/', u'repos1', u'repos2', u'repos3', u'document']
-]]></screen>
+]]></programlisting>

</sect2>

已修改: trunk/doc/agile_python/ch05-config.xml
===================================================================
--- trunk/doc/agile_python/ch05-config.xml 2008-09-12 07:35:13 UTC (rev 90)
+++ trunk/doc/agile_python/ch05-config.xml 2008-09-12 10:35:00 UTC (rev 91)
@@ -18,23 +18,23 @@
<para>在前面我们提到TestController中加入login方法,实现测试用例中的模拟登录。
其中代码中出现了 "config.get()",这是什么呢?</para>

- <screen>
+ <programlisting><![CDATA[
if not password:
d = eval(config.get('test_users', {}))
password = d.get(username,'')
-</screen>
+]]></programlisting>

<para>其实,config是Pylons读取ini文件创建的数据结构。在test.ini
(用于单元测试的Pylons配置)中,包含test_users的配置,
为单元测试的用户登录帐号提供默认口令:</para>

- <screen>
+ <programlisting><![CDATA[
[app:main]
...
# Login test: user account and password
test_users = {'root':'guess', 'jiangxin':'guess', 'nobody':'guess'}
...
-</screen>
+]]></programlisting>

<note>
<para>注:test.ini的[app:main]小节和[server:main]小节中的设置,
@@ -54,7 +54,7 @@
<para> <filename>localconfig.py</filename> 包含从 DefaultConfig 派生的类,
用户的修改保存在 <filename>localconfig.py</filename> 中。</para>

- <screen>
+ <programlisting><![CDATA[
# -*- coding: utf-8 -*-

from pysvnmanager.config.DefaultConfig import DefaultConfig
@@ -62,7 +62,7 @@
class LocalConfig(DefaultConfig):
from pysvnmanager.model.auth.http import htpasswd_login
auth = [htpasswd_login]
-</screen>
+]]></programlisting>

<para>这里我们定义了 pySvnManager 的需要用到的认证插件。</para>

已修改: trunk/doc/agile_python/ch06-i18n.xml
===================================================================
--- trunk/doc/agile_python/ch06-i18n.xml 2008-09-12 07:35:13 UTC (rev 90)
+++ trunk/doc/agile_python/ch06-i18n.xml 2008-09-12 10:35:00 UTC (rev 91)
@@ -18,41 +18,41 @@
<para>函数_()实际上是gettext模组的 ugettext方法别名。将程序中出现的字符串输出改为
_()调用。例如,在模板文件中:</para>

- <screen><![CDATA[
+ <programlisting><![CDATA[
<tr>
<th>Account</th>
<th>Repository</th>
<th>Modules</th>
</tr>
-]]></screen>
+]]></programlisting>

<para>修改为</para>

- <screen><![CDATA[
+ <programlisting><![CDATA[
<tr>
<th>${_("Account")}</th>
<th>${_("Repository")}</th>
<th>${_("Modules")}</th>
</tr>
-]]></screen>
+]]></programlisting>

<para>控制器代码中:</para>

- <screen>
+ <programlisting><![CDATA[
def get_auth_path(self, repos=None, type=None, path=None):
..
msg += 'id[0]="%s";' % '...'
msg += 'name[0]="%s";\n' % "Please choose..."
-</screen>
+]]></programlisting>

<para>修改为:</para>

- <screen>
+ <programlisting><![CDATA[
def get_auth_path(self, repos=None, type=None, path=None):
..
msg += 'id[0]="%s";' % '...'
msg += 'name[0]="%s";\n' % _("Please choose...")
-</screen>
+]]></programlisting>

</sect2>

@@ -60,7 +60,7 @@
<sect2 id="psm.i18n.default">
<title>根据浏览器喜好自动选择缺省语种</title>

- <screen>
+ <programlisting><![CDATA[
from pylons.i18n import set_lang, add_fallback

class BaseController(WSGIController):
@@ -71,7 +71,7 @@
for lang in request.languages:
if lang in ['zh', 'en']:
add_fallback(lang)
-</screen>
+]]></programlisting>

</sect2>

已修改: trunk/doc/agile_python/ch07-package.xml
===================================================================
--- trunk/doc/agile_python/ch07-package.xml 2008-09-12 07:35:13 UTC (rev 90)
+++ trunk/doc/agile_python/ch07-package.xml 2008-09-12 10:35:00 UTC (rev 91)
@@ -55,7 +55,7 @@
我们对websetup.py的setup_config方法进行设置,
用以初始化应用(拷贝三个配置文件到config目录)。示例如下:</para>

- <screen>
+ <programlisting><![CDATA[
def setup_config(command, filename, section, vars):
"""Place any commands to setup pysvnmanager here"""
conf = appconfig('config:' + filename)
@@ -72,7 +72,7 @@
log.warning("Warning: %s already exist, ignored." % f)
else:
copyfile(src, dest)
-</screen>
+]]></programlisting>

</sect2>

@@ -82,7 +82,7 @@

<para>版本号等信息保存于文件setup.py。</para>

- <screen>
+ <programlisting><![CDATA[
setup(
name='pySvnManager',
version="0.1.2",
@@ -90,7 +90,7 @@
author='Jiang Xin',
author_email='jian...@ossxp.com',
url='https://sourceforge.net/projects/pysvnmanager',
-</screen>
+]]></programlisting>

<para>如果代码是保存在SVN中,编译时,还会将SVN的全局版本号作为软件的
Build号添加在版本号的后面。</para>


_______________________________________________
Svn mailing list
S...@list.worldhello.net
http://www.worldhello.net/mailman/listinfo/svn

Reply all
Reply to author
Forward
0 new messages