2012-04-30 4 views
20

CPythonはそのドキュメントにautodocを使用していません - 私たちは手書きの散文を使用しています。sphinx autodocからreStructuredTextを送信しますか?

PEP 3144(ipaddressモジュール)では、初期のリファレンスドキュメントを生成するためにsphinx-apidocを使用したいと思います。それは私が2パス操作を実行したいこと:

  1. 使用スフィンクス-apidoc autodocのに依存モジュールのスフィンクスプロジェクトを発する

  2. ラン新しいreStructuredTextのソースファイルを作成し、スフィンクスビルダー、すべてのautodocのディレクティブは、同じ出力

最初のステップは簡単ですが、私は第2工程を行う方法見当がつかないも良いと考えることはできませんが生成インラインreStructuredTextのコンテンツとマークアップに置き換えてfを検索する方法またはこれらの線に沿った既存のプロジェクト。

+0

autodocによって生成された最初のファイルを使用することについては何が間違っていますか(つまり、オートディレクティブは完全なpy-domain定義のみです) – bmu

+0

ipaddressには既に豊富なドキュメントストリングがありますので、コピーして貼り付けて残りのドキュメントを手作業で再フォーマットする必要はありません。 – ncoghlan

+0

なぜコピーしなければならないのですか?あなたは自動ディレクティブの間にあなたの追加の文書を書くことができ、それをスフィンクスが翻訳し、コピーする必要はありません。申し訳ありません、おそらく私はあなた(またはあなたの質問)を理解していません。 – bmu

答えて

9

私は同じ問題を抱えていましたが、私はdocsを生成するために、私はかなり醜い解決策を使ってSphinxにパッチを当てました。Make Sphinx generate RST class documentation from pydocを参照してください。

+0

+1これは、autodocで完全にフォーマットされた最初のソースを取得する唯一の方法だと思います。それを得るためにオートドックにイベントがあるはずです。 (私の答えも見てください)。 – bmu

+0

ありがとう、それはうまく動作するように見えます。 – ncoghlan

2

ない完全な答えは、多かれ少なかれ出発点:

autodocはPythonのディレクティブに自動ディレクティブを変換します。 したがって、autodocイベントを使用して翻訳されたpythonディレクティブを取得できます。例えば

あなたがmymodule.pyを以下している場合:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

""" 
This is my module. 
""" 

def my_test_func(a, b=1): 
    """This is my test function""" 
    return a + b 

class MyClass(object): 
    """This is my class""" 

    def __init__(x, y='test'): 
     """The init of my class""" 
     self.x = float(x) 
     self.y = y 

    def my_method(self, z): 
     """This is my method. 

     :param z: a number 
     :type z: float, int 
     :returns: the sum of self.x and z 
     :rtype: float 
     """ 
     return self.x + z 

sphinx-apidoc

mymodule Module 
=============== 

.. automodule:: mymodule 
    :members: 
    :undoc-members: 
    :show-inheritance: 

次の拡張(またはconf.pyに加えて)を作成します:

NAMES = [] 
DIRECTIVES = {} 

def get_rst(app, what, name, obj, options, signature, 
      return_annotation): 
    doc_indent = ' ' 
    directive_indent = '' 
    if what in ['method', 'attribute']: 
     doc_indent += ' ' 
     directive_indent += ' ' 
    directive = '%s.. py:%s:: %s' % (directive_indent, what, name) 
    if signature: # modules, attributes, ... don't have a signature 
     directive += signature 
    NAMES.append(name) 
    rst = directive + '\n\n' + doc_indent + obj.__doc__ + '\n' 
    DIRECTIVES[name] = rst 

def write_new_docs(app, exception): 
    txt = ['My module documentation'] 
    txt.append('-----------------------\n') 
    for name in NAMES: 
     txt.append(DIRECTIVES[name]) 
    print '\n'.join(txt) 
    with open('../doc_new/generated.rst', 'w') as outfile: 
     outfile.write('\n'.join(txt)) 

def setup(app): 
    app.connect('autodoc-process-signature', get_rst) 
    app.connect('build-finished', write_new_docs) 

はあなたを与えるだろう:

しかし、翻訳が完了すると、autodocはイベントが発生しないので、autodocで行われる処理はここではdocstringsに適合させる必要があります。

関連する問題