使用 Pycco 生成代码文档
目录
作为开发人员,我们喜欢编写代码,尽管当时对我们来说很有意义,但我们必须考虑我们的受众。有人必须阅读、使用和/或维护所述代码。三个月后,它可能是另一个开发人员、客户或我们未来的自己。
即使是像 Python 这样优美的语言有时也很难理解。因此,作为非常关心我们的程序员同事(或者更有可能是因为我们的老板希望我们这样做)的优秀编程公民,我们应该编写一些文档。
但是有规则:
- 编写文档不能烂(即我们不能使用 MS Word)。
- 编写文档必须尽可能轻松。
- 编写文档不能要求我们离开我们最喜欢的文本编辑器/IDE。
- 编写文档不得要求我们对最终演示文稿进行任何格式化或完全关心。
这就是Pycco 的用武之地:
“Pycco”是 Docco 的 Python 端口:原始的快速而肮脏的、百行长的、文学编程风格的文档生成器。它生成 HTML,在代码旁边显示您的注释。注释通过 Markdown 和 SmartyPants 传递,而代码通过 Pygments 传递以进行语法高亮显示。
所以基本上这意味着 Pycco 可以为我们自动生成看起来不错的代码文档。Pycco 还遵守上述代码文档的四项规则。那么什么是不爱呢?让我们来看看如何使用它的一些示例。
对于本文,我从一个用Django编写的简单 TODO 应用程序开始,您可以从repo 中获取它。该应用程序允许用户将项目添加到列表中并在完成后删除它们。这个应用程序可能不会为我赢得 Webby,但它应该满足本文的目的。
请注意,repo 中的文件已经包含最终代码,已经记录在案。不过,您仍然可以创建单独的文档文件,所以请随意克隆 repo 并跟随我。
项目设置
克隆回购:
$ git clone git@github.com:mjhea0/django-todo.git
设置虚拟环境:
$ cd django-todo
$ virtualenv --no-site-packages venv
$ source venv/bin/activate
安装要求:
$ pip install -r requirements.txt
同步数据库:
$ cd todo
$ python manage.py syncdb
生成一些文档
入门很简单:
$ pip install pycco
然后要运行它,您可以使用如下命令:
$ pycco todos/*.py
请注意,您可以通过这种方式指定单个文件或文件目录。在我们的 TODO 存储库上执行上述命令会产生以下结果:
pycco = todo/todos/__init__.py -> docs/__init__.html
pycco = todo/todos/models.py -> docs/models.html
pycco = todo/todos/tests.py -> docs/tests.html
pycco = todo/todos/views.py -> docs/views.html
换句话说,它生成 html 文件(每个 python 文件一个)并将它们全部转储到“docs”目录中。对于较大的项目,您可能需要使用 -p 选项来保留原始文件路径。
例如:
pyccoo todo/todos/*.py -p
会产生:
pycco = todo/todos/__init__.py -> docs/todo/todos/__init__.html
pycco = todo/todos/models.py -> docs/todo/todos/models.html
pycco = todo/todos/tests.py -> docs/todo/todos/tests.html
pycco = todo/todos/views.py -> docs/todo/todos/views.html
请注意,它已将 todos 应用程序的文档存储在“docs/todo/todos”子文件夹下。通过这样做,浏览大型项目的文档会容易得多,因为文档结构将与代码结构相匹配。
生成的文档
pycco 的目的是生成一个两列文档,左侧带有注释,右侧与后续代码对齐。因此,在我们还没有注释的models.py类上调用 pycco将生成一个如下所示的页面:
您会注意到左侧的列(应该是注释的地方)是空白的,而右侧则显示了代码。我们可以通过添加docstring来更改models.py以通过将以下代码添加到models.py来获得更有趣的文档。
from django.db import models
# === Models for Todos app ===
class ListItem(models.Model):
"""
The ListItem class defines the main storage point for todos.
Each todo has two fields:
text - stores the text of the todo
is_visible - used to control if the todo is displayed on screen
"""
text = models.CharField(max_length=300)
is_visible = models.BooleanField()
使用上面的代码片段,pycco 找到了以下行:
# === Models for Todos app ===
然后在文档中生成一个标题。
文档字符串:
"""
The ListItem class defines the main storage point for todos.
Each todo has two fields:
text - stores the text of the todo
is_visible - used to control if the todo is displayed on screen
"""
Pycco 使用文档字符串来生成文档。再次运行 pycco 后的最终结果将是:
如您所见,左侧的文档与右侧的代码很好地对齐。这使得查看代码和了解正在发生的事情变得非常容易。
Pycco 还识别代码中以 a 开头的单行注释#
以生成文档。
Make It Fancy
但 pycco 并不止于此。它还允许使用 Markdown 自定义注释格式。作为示例,让我们在views.py文件中添加一些注释。首先,让我们在views.py的顶部放置一个文档字符串:
"""
All the views for our todos application
Currently we support the following 3 views:
1. **Home** - The main view for Todos
2. **Delete** - called to delete a todo
3. **Add** - called to add a new todo
"""
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template import RequestContext
from todos.models import ListItem
def home(request):
items = ListItem.objects.filter(is_visible=True)
return render_to_response('home.html', {'items': items}, context_instance = RequestContext(request))
# ... code omitted for brevity ...
这将生成如下报告:
我们还可以在文件之间甚至在同一文件内添加链接。可以使用[[filename.py]]
或添加链接[[filename.py#section]]
,它们将呈现为带有文件名的链接。让我们更新views.py以在列表中每个项目的末尾添加一些链接:
"""
All the views for our todos application
Currently we support the following 3 views:
1. **Home** - The main view for Todos (jump to section in [[views.py#home]] )
2. **Delete** - called to delete a todo ( jump to section in [[views.py#delete]] )
3. **Add** - called to add a new todo (jump to section in [[views.py#add]])
"""
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template import RequestContext
# defined in [[models.py]]
from todos.models import ListItem
# === home ===
def home(request):
items = ListItem.objects.filter(is_visible=True)
return render_to_response('home.html', {'items': items}, context_instance = RequestContext(request))
# === delete ===
def delete(request):
# ... code omitted for brevity ...
如您所知,建立链接有两个组成部分。首先,我们必须在我们的文档中定义一个部分。您可以看到我们已经使用代码定义了 home 部分# === home ===
。创建部分后,我们可以使用代码链接到它[[views.py#home]]
。我们还插入了一个指向模型文档文件的链接,代码如下:
# defined in [[models.py]]
最终结果是如下所示的文档:
请记住,因为 pycco 允许使用标记语法,您还可以使用完整的 html。所以发疯:)
为整个项目自动生成文档
如何使用 pycco 为整个项目生成文档可能并不明显,但如果您使用 bash 或 zsh 或任何支持全局的 sh,它实际上非常简单,您只需运行如下命令:
$ pycco todo/**/*.py -p
这将为.py
todo的任何/所有子目录中的所有文件生成文档。如果你在 Windows 上,你应该可以用 cygwin、git bash 或 power sh 来做到这一点。
非 Python 文件的文档
Pycco 还支持其他几种文件类型,这对于经常使用一种以上文件类型的 Web 项目很有帮助。在撰写本文时,受支持文件的完整列表是:
.coffee
- CoffeeScript.pl
- Perl.sql
- SQL.c
- C.cpp
- C++.js
- JavaScript.rb
- Ruby.py
- Python.scm
- Scheme.lua
- Lua.erl
- Erlang.tcl
- Tcl.hs
- Haskell
这应该涵盖您的文档需求。所以只要记住写一些注释,让 pycco 轻松地为您生成漂亮的代码文档。
项目级文档如何?
通常项目除了代码文档之外还有其他要求——比如自述文件、安装文档、部署文档等。使用 pycco 生成该文档也很好,这样我们就可以始终坚持使用一个工具。好吧,此时,pycco 将仅处理具有上述列表中扩展名的文件。但是没有什么可以阻止您创建readme.py或installation.py文件并使用 pycco 生成文档。您所要做的就是将您的文档放在一个文档字符串中,然后 pycco 将生成它并为您提供完整的降价支持。所以想象一下,如果在你的项目目录的底部你有一个名为的文件夹project_docs
,其中包含:
install_docs.py
project_readme.py
deployment.py
然后你可以运行以下命令:
$ pycco project_docs/*.py -p
这会在您的“docs/project_docs 目录”中添加适当的 html 文件。当然,这可能有点小技巧,但它确实允许您使用一种工具为您的项目生成所有文档。
Regeneration
Pycco 还有一个绝招:自动重新生成文档。换句话说,您可以让 pycco 监视您的源文件,并在每次保存源文件时自动重新生成必要的文档。如果您尝试在评论中添加一些自定义降价/html 并希望确保其正确呈现,这将非常有用。随着自动文档重新生成运行,您只需进行更改、保存文件并刷新浏览器,无需在其间重新运行 pycco 命令。为此,您需要安装看门狗:
$ pip install watchdog
Watchdog 是监听文件变化的模块。因此,一旦安装完成,只需执行如下命令:
$ pycco todo/**/*.py -p --watch
它将运行 pycco 并保持运行,直到您用Ctrl+C停止它为止。只要它正在运行,它就会重新生成有关源文件每次更改的文档。简单的文档如何?
Pycoo 是迄今为止我遇到的最简单、最直接的 Python 代码文档工具。
- 点赞
- 收藏
- 关注作者
评论(0)