跳转到主要内容

提取项目的__version__变量

项目描述

Project Status: Inactive – The project has reached a stable, usable state but is no longer being actively developed; support/maintenance will be provided as time allows. CI Status https://codecov.io/gh/jwodder/read_version/branch/master/graph/badge.svg https://img.shields.io/pypi/pyversions/read_version.svg MIT License

GitHub | PyPI | 问题 | 变更日志

注意: 自从setuptools 46.4.0版本发布以来,setuptools已经原生支持在setup.cfg中使用attr:指令,根据项目源代码的静态分析来设置项目版本。这使得read_version的大部分用例变得过时,因此它将不会获得进一步的开发。

在为新的项目创建setup.py时,您是否发现自己总是在编写相同的代码块来解析项目源代码中的__version__?类似这样的?

with open(join(dirname(__file__), 'package_name', '__init__.py')) as fp:
    for line in fp:
        m = re.search(r'^\s*__version__\s*=\s*([\'"])([^\'"]+)\1\s*$', line)
        if m:
            version = m.group(2)
            break
    else:
        raise RuntimeError('Unable to find own __version__ string')

setup(
    version = version,
    ...
)

有人需要把这些内容放入一个可重用的包中,对吧?是的,有人已经这么做了,这就是那个包。它导出单个函数,执行上述操作,非常适合导入到你的 setup.py 文件中,并且(从 v0.2.0 版本开始新增!)这个包还允许你通过 pyproject.toml 将 Python 变量映射到受支持的元数据字段。

安装

read_version 需要 Python 3.6 或更高版本。只需使用 Python 3 的 pip 来安装 read_version 及其依赖项。

python3 -m pip install read_version

read_version 还有一个 toml 扩展,它提供了从 pyproject.toml 读取配置的支持。使用以下命令安装它:

python3 -m pip install "read_version[toml]"

使用方法

函数式方法

  1. 在您的开发环境中安装 read_version

  2. 在您的项目中添加一个 pyproject.toml 文件,声明 read_version 为构建依赖项。(这是为了让其他人能够从源代码构建您的包;有关更多信息,请参阅 PEP 518。)文件的內容应类似于以下内容:

    [build-system]
    requires = [
        "read_version ~= 0.3.0",
        "setuptools",
        "wheel"
    ]
    build-backend = "setuptools.build_meta"
  3. 在您的 setup.py 中,删除您那些模板化的 __version__ 查找代码,并用以下内容替换它:

    from read_version import read_version
    
    setup(
        version = read_version('packagename', '__init__.py'),
        ...
    )
  4. 构建您的项目,并确保版本已设置为正确的值。

  5. 完成!

声明式方法

从版本 0.2.0 开始新增!

  1. 使用 toml 扩展在您的开发环境中安装 read_version

    pip install 'read_version[toml]'

    您还需要 setuptools 的 42.0.0 或更高版本。

    pip install -U 'setuptools>=42'
  2. pyproject.toml 文件添加到您的项目中,声明 read_version[toml] 为构建依赖项,并要求 setuptools 的版本为 42.0.0 或更高。文件的相应部分应类似于以下内容:

    [build-system]
    requires = [
        "read_version[toml] ~= 0.3.0",
        "setuptools >= 42.0.0",
        "wheel"
    ]
    build-backend = "setuptools.build_meta"
  3. 在您的 setup.py 中删除您那些模板化的 __version__ 查找代码。相反,在您的 pyproject.toml 文件中添加一个 tool.read_version 表,并为每个您希望从 Python 源文件中的变量读取的元数据字段添加一个条目到这个表中,格式为 FIELD = "dotted.file.path:varname",其中:

    • FIELD 被替换为字段的英文小写名称。支持的字段有:

      • author

      • author_email

      • description(注意,这是简短描述或摘要,而不是长描述!)

      • keywords(建议使用字符串列表作为值,否则 setuptools 可能会对其进行损坏)

      • license

      • maintainer

      • maintainer_email

      • url

      • version

      不支持或未知字段名的条目将被忽略。

    • dotted.file.path 被替换为包含变量的文件的路径(相对于项目根目录),路径组件用点分隔,最后路径组件的 .py 被省略。

    • varname 被替换为要读取的变量名称。

    示例

    [tool.read_version]
    
    # Set the project's version to the value of __version__ in foobar.py:
    version = "foobar:__version__"
    
    # Set the project's author to the value of author_name in
    # foobar/__init__.py
    author = "foobar.__init__:author_name"
    
    # Set the project's license to the value of LICENSE in
    # src/foobar/about.py:
    license = "src.foobar.about:LICENSE"

    如果这个语法对您不起作用——比如说,因为您的路径组件中包含一个点或冒号,或者文件没有 .py 扩展名——或者您想为找不到变量设置默认值,那么将 tool.read_version.FIELD 设置为一个表格,如下所示:

    # Set the project's version to the value of __version__ in
    # foo.bar/__init__.pyq:
    [tool.read_version.version]
    path = ["foo.bar", "__init__.pyq"]
    variable = "__version__"
    
    # Set the project's author_email to the value of EMAIL in foobar.py.
    # If the variable isn't found, use the value "me@example.com" instead
    # of erroring
    [tool.read_version.author_email]
    path = ["foobar.py"]
    variable = "EMAIL"
    default = "me@example.com"

    tool.read_version.FIELD 表可能包含以下键

    路径:

    (必需) 读取变量的源文件的路径,相对于项目根目录,作为路径组件的列表

    变量名:

    (必需) 要从中获取值的 Python 变量的名称

    默认值:

    (可选) 如果在源文件中找不到变量,则使用给定值代替;如果找不到变量且未设置 default,则将引发错误

  4. 构建您的项目,并确保元数据中所有相关字段都已设置为正确的值。

  5. 完成!

API

read_version 导出一个名为 read_version 的单个函数,其签名也是 read_version

read_version(*filepath, variable='__version__', default=NOTHING)

read_version() 接受指向要解析的 Python 源文件的文件路径组件,一个或多个。路径组件将使用 os.path.join() 连接在一起,然后,如果路径不是绝对路径,则将调用 read_version() 的脚本的目录路径添加到路径之前。(不再需要 join(dirname(__file__), ...) 空板!)然后 read_version() 解析给定的 Python 文件,并搜索解析树中任何对名为 __version__ 的变量的赋值,返回最后赋的值。

可以将 variable 关键字参数设置为除了 __version__ 之外的其他变量的名称,以搜索不同变量的赋值。将其设置为 "__doc__" 将导致函数返回模块文档字符串。

如果没有找到变量的赋值,将引发 ValueError。要在此情况下返回默认值,请设置 default 关键字参数。

限制

read_variable 仅查找模块顶层发生的赋值,不在任何块之外。

仅支持字面值赋值;涉及更复杂表达式的搜索变量的赋值将引发错误。

项目详情


下载文件

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

源分布

read_version-0.3.2.tar.gz (17.4 kB 查看哈希)

上传时间

构建分布

read_version-0.3.2-py3-none-any.whl (8.6 kB 查看哈希)

上传时间 Python 3

支持