Date: 2014-6-15
Tags: python, sphinx

Sphinxメンテナ日記: チケットとメールの対応いろいろ

前置き: Sphinx本家のMLに返信したり、チケットに返信した内容のメモです。このエントリを読むと、Sphinxのこまかい機能を知ることが出来るかもしれません。前置きおわり。

docs.python.org みたいなドキュメントバージョン切り替え

sphinx-users ML: Different version drop-down like python.org

Q. docs.python.org のようにドキュメントのバージョンをドロップダウンで表示して切り換える機能はSphinxにありますか?

A. ありません。

Pythonのドキュメントチームがその機能を用意したぽいですね。 http://blog.python.org/2012/10/updates-to-docspythonorg.html

他の例では、Read The Docs のシステムと専用テーマの組み合わせで 似たような機能を提供しています。 https://github.com/snide/sphinx_rtd_theme/

スペイン語の日付をPDF出力に表示したい

sphinx-users ML How i can generate the date into Spanish with latexpdf?

Q. language='es' で make latexpdf したら日付が 5 de june de 2014 と表示されたんだけど、スペイン語としては 5 de junio de 2014 が正しい。conf.pyの todaytoday_fmt を設定してみたけどうまくいかない。どうすればいいだろう?

A. Sphinxはtoday_fmtのスペイン語翻訳を持っています: https://bitbucket.org/birkenfeld/sphinx/src/6e61d8a5/sphinx/locale/es/LC_MESSAGES/sphinx.po#cl-47 しかしながら、Sphinxはlocaleを設定していないので、 "%B" を指定すると英語の月名を表示してしまいます。そこで、以下のように locale.setlocale をconf.pyで実行することで問題を回避できます:

#today = ''
#today_fmt = '%B %d, %Y'
import locale
locale.setlocale(locale.LC_TIME, 'es_ES.UTF-8')

%Bを指定すると月が英語表示になる、って、これはバグっぽい気もする。しかし、setlocaleの値はシステムによって異なるので、Windowsだと 'es_ES.UTF-8' じゃなくて 'spanish' を指定する必要がある。そういうconfig設定増やすのが良いのかなあ。

脚注マークを [] で囲わない方法は?

sphinx-users ML: Can I have a footnote without []?

Q. 文中に脚注へのリンクがあると [1] のように表示されるけど、この角括弧を付けないHTML出力にして、CSSでsuperscript(上付き)表示にしたい。

A. それdocutils.confにオプション設定すれば出来るよ

Sphinx-1.2 以降では docutils.conf でdocutilsのオプションを設定できます。 http://sphinx-doc.org/changes.html#release-1-2-beta2-released-sep-17-2013

docutils.confをconf.pyと同じディレクトリに置いて(カレントディレクトリだったかな)、以下の内容を書いて下さい:

[html4css1 writer]
footnote_references = superscript

docutilsの設定値については以下も参照してください: http://docutils.sourceforge.net/docs/user/config.html#footnote-references

インスタンス属性のドキュメントが1行で複数設定した場合反映されない

sphinx-users ML: autoattribute for parallel assignment

Q. 以下のように書いたらautodocでインスタンス属性のドキュメントとして反映されます:

class Foo:
    def __init__(self):
        self.spam = 4
        """Docstring for instance attribute spam."""

でも以下のように書くと反映されません:

class Foo:
    def __init__(self):
        self.spam, self.bar, self.moo = 4, 5, 6
        """Docstring for instance attribute spam."""

ドキュメントを反映する方法はありますか?

A. ありません。属性毎に別の行にしてドキュメントを書いて下さい。

技術的には、 sphinx.pycode.AttrDocVisitor.add_docstring 関数が属性ドキュメントを解釈しています。146行目のIFブロックはドキュメントコメントの前か後に self.variable = value といった形式の行がなければ属性ドキュメントとみなしません。 https://bitbucket.org/birkenfeld/sphinx/src/ba4b069e/sphinx/pycode/__init__.py#cl-146

@property デコレータを付けた属性にシグネチャが付く問題

Pull Request #157 Remove spurious signatures from @property decorated attributes

以下のような属性 myattribute を書くと、cythonがdocstringの先頭に 'Bar.myattributes(self)' って付けるようになってしまったので、autodocでdocstring先頭のシグネチャをメソッドのときと同じように@propertyが付いている時も無視するようにしたい:

# cython: embedsignature=True
class Bar(object):
    def __init__(self):
        pass

    @property
    def myattribute(self):
        """my docstring"""

これの動作検証をして、テストコード書いてmergeした。 https://bitbucket.org/birkenfeld/sphinx/commits/679955b96d

Sphinxのautodoのための複雑なコードを簡略化

Pull Request #246: remove complex distinguishing method/classmethod/staticmethod approach for autodoc

自分で提出したPR。あるメソッドがclassmethodか、staticmethodか、普通のmethodかを判別する実装が複雑だったので簡略化したい。

修正前:

  • py2: メソッドオブジェクトを取得するために getattr(classobj, 'methname') してからいくつかの条件チェックを行う

  • py3: メソッドオブジェクトを取得するために classobj.__dict__.get('methname') してからisinstance()でclassmethodかstaticmethodかのチェックを行う

修正後:

  • 修正前のpy3用の実装に統一

この修正で既存の機能が壊れることはなさそうだけど、心配だったのでPR出してレビューしてもらった。たぶん大丈夫、ということでマージ。

非minify版のjquery.js, underscore.jsをmake htmlで選べるようにする

Issue #1434: provide non-minified options for jquery.js, underscore.js, all others

Debianのlintianが、配布パッケージの内容物にライセンス違反がないかチェックを自動的に行っているが、それによって、Sphinxが同梱しているminified版のJSファイルがひっかかって、SQLAlchemyの配布物を作るために人間が毎回手動でJSファイルを入れ替えている。この問題を解決したい。

最終的に、選択出来るように、ではなく、非minified版を常にmake htmlの結果として同梱するようにしました。とりあえず反論はなさそうなので、Issueを一旦クローズ。

CIFSファイルシステム上でmake htmlするとエラー

Issue #1490: sphinx-build -b html . ./_build -> No such file or directory

cifsでWindowsの共有ディレクトリUbuntuにマウントしてそこでmake htmlすると OSError: [Errno 2] No such file or directory というエラーが出る。

これは libc getcwd(3) の制限なので、Python/Sphinxではどうにもならなそう: http://bugs.python.org/issue17525

なので、make htmlしてから出力結果をcifsディレクトリにコピーする方法を進めておいた。

画像が次のページに表示されて、キャプションだけ前のページにある

Issue #1482: Forcing images to be seen in the same page

PDF出力すると、ページ内に収まらない画像は次のページに送られてしまうけど、画像の次の行に書いた説明文は前のページに残るので、画像なしで説明文だけあると意味が分からなくなってしまう、という問題。

手元では再現しなかった。 figure ディレクティブと image ディレクティブ両方で試してみたけど再現せず。ソースを添付して、って依頼してHOLD状態へ。

使われてないimportとかPEP8的な修正とか

https://bitbucket.org/birkenfeld/sphinx/commits/ba4b069ed617a6479a7d701fb3cc8fd3544db25e

Sphinxのテストではpyflakesとかpep8とか実行していないけど、 check_sources.py というチェックスクリプトでチェックする運用になっている。なんでこういう仕組みにしたんだろう?flake8で検査してみたら大量にエラー出過ぎたので、そのうちflake8で通るようにして、flake8に切り換えよう・・・。