跳转到主要内容

从您的文档中去除pragma语句。

项目描述

提高开发者体验:

  • 编写更好的文档。

  • 不要重复自己。

  • 确保代码易于维护。

PyPI Version Supported Python versions Build Status Documentation Status MIT Coverage

TL;DR

sphinx-no-pragma 是一个用于从文档中使用的源代码中去除pragma注释的Sphinx 扩展。

如果您需要了解这些内容以继续前进,请直接跳转到安装部分。否则,请继续阅读。


有人说,“文档是王”。其他人则认为——“不,演示才是”。还有一些人说,“测试是一切!”而另一些人会跳进来,“编写干净的代码!black,isort,mypy和ruff无处不在!”

然而,你希望做得更好,编写更好的包,因为有一个通用的问题需要解决,你知道如何解决,你希望与世界分享。你还希望确保或至少努力使你的项目对开发者友好,吸引贡献,这最终导致持续改进并使其寿命更长。

所以,结合最佳实践,你

  • 在您的存储库中引入示例,以使其更容易开始。

  • 使用示例编写出色的文档(最终可能需要重复自己,从实际代码示例中复制内容)。

  • 为您的代码编写测试。然后您意识到测试示例也很好。最终,您在三个地方几乎有相同的代码:测试、示例和文档。

  • 引入代码检查工具和MyPy

然后您投入时间确保所有代码看起来正确,并修复无尽的MyPy问题。

然后您需要做一些小改动,不幸的是,其中之一需要更改示例代码。您需要更改示例、文档、测试和示例测试。然而,您也需要快速推动这个改变。就像以前很多次一样,您跳过了文档更新,留待“另一次”再处理。

那时您发现代码维护是地狱。您修复了一切,测试通过,您很高兴推动它,到那时MyPy开始抱怨您不知道如何解决的问题,到那时您对这些问题已经不关心了。您对此感到厌倦,并开始使用pragma注释来抑制错误,把修复留给另一天。您的维护工作涉及大量的复制粘贴(示例、测试、文档)。

这听起来熟悉吗?


如果我现在告诉你,实际上可以采取一些步骤来简化这个过程。具体来说,您可以直接使用示例代码在文档中,使用Sphinx.. literalinclude::指令。这一部分已经在jsphinx项目中得到了很好的处理(主要是JavaScript)。然而,jsphinx没有解决的是文档中存在pragma注释的问题。本项目就关注这部分。您不需要在可读性、可解释性和易于维护之间做出选择或权衡。

由懒惰的开发者为懒惰的开发者编写,以提高编写低维护代码的开发体验。

特性

  • 准确移除您在文档中包含的源代码中的pragma注释。

先决条件

Python 3.8+

安装

pip install sphinx-no-pragma

文档

使用示例

为了继续前进,您首先需要了解一些关于Sphinx指令的知识。特别是.. literalinclude:::download:。为此,首先阅读jsphinx文档。

但可能有一个小问题。当然,您可能很幸运,代码中一个pragma注释都没有(没有# noqa,没有# type: ignore等)。但更常见的是,您至少有几个这样的。您完美主义者性格不容易让您让他们成为您简洁、美丽的文档的一部分。您诅咒我之前的建议,开始用复制粘贴的示例替换DRY文档部分。

这就是这个包介入的地方。它只是一个简单的Sphinx扩展,它会从进入文档的代码中移除所有的pragma注释。

Sphinx配置

文件名:docs/conf.py

extensions = [
    # ... other extensions
    "sphinx_no_pragma",
    # ... other extensions
]

代码示例

文件名:examples/example_1.py

from typing import Any, Optional

class ThirdPartyLibrary:
    @staticmethod
    def get_dynamic_object() -> Any:
        # Returns an object whose type is not known at compile time
        return "a string"  # In reality, this could be any type


# Usage of the third-party library
obj = ThirdPartyLibrary.get_dynamic_object()

# Attempt to use the object as a string, even though its type is 'Any'
length = len(obj)  # type: ignore

# Deliberately long line to violate PEP 8 line length rule, suppressed with noqa
print(f"The length of the object, a dynamically typed one, is just {length}")  # noqa

鉴于这是您的代码结构

├── examples
│  └── example_1.py
├── docs
│  ├── conf.py
│  ├── index.rst
│  ├── Makefile
│  ├── _static
│  │  └── example_1.py
│  └── usage.rst
├── LICENSE
├── Makefile
├── pyproject.toml
├── README.rst
└── sphinx_no_pragma.py

可以使用html_extra_path = ["examples"]或从docs/_static创建到examples/example_1.py的符号链接。

然后按照以下方式将其包含到您的文档中

文件名:example.rst

.. container:: jsphinx-download

.. literalinclude:: _static/example_1.py
    :language: python
    :lines: 1-

*See the full example*
:download:`here <_static/example_1.py>`

现在,渲染后的代码将不包含 # type: ignore# noqa 预处理指令注释。

查看演示。点击 在此查看完整示例 链接查看原始代码。

测试

使用 unittest 运行测试

python -m unittest sphinx_no_pragma.py

或 pytest

pytest

许可证

MIT 许可

支持

关于安全问题,请联系作者部分提供的电子邮箱。

对于总体问题,请访问 GitHub

作者

Artur Barseghyan <artur.barseghyan@gmail.com>

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码发行版

sphinx_no_pragma-0.1.1.tar.gz (23.8 kB 查看哈希值)

上传时间 源代码

构建发行版

sphinx_no_pragma-0.1.1-py3-none-any.whl (6.5 kB 查看哈希值)

上传时间 Python 3

支持者: