Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 增强提案

PEP 753 – 核心元数据中的统一项目 URL

作者:
William Woodruff <william at yossarian.net>,Facundo Tuesca <facundo.tuesca at trailofbits.com>
赞助者:
Barry Warsaw <barry at python.org>
PEP 代表:
Paul Moore <p.f.moore at gmail.com>
讨论列表:
Discourse 线程
状态:
草稿
类型:
标准跟踪
主题:
打包
创建:
2024 年 8 月 29 日
发布历史:
2024 年 8 月 26 日2024 年 9 月 3 日

目录

摘要

本 PEP 建议对索引(如 PyPI)处理核心元数据的方式进行两处独立的更改

  • 弃用 Home-pageDownload-URL 字段,转而使用其 Project-URL 等价物;
  • 一组用于规范化和为 Project-URL 标签分配语义的约定。

基本原理和动机

Python 的标准 核心元数据 经历了多年的修订,并具有各种标准化的里程碑版本。

这些核心元数据的修订引入了各种机制,用于通过 URL 表达包与外部资源的关系

  1. 元数据 1.0 引入了 Home-page,这是一个单用途字段,包含指向发行版主页的 URL。
    Home-page: https://example.com/sampleproject
    
  2. 元数据 1.1 引入了 Download-URL,这是一个补充性的单用途字段,包含适合下载当前发行的 URL。
    Download-URL: https://example.com/sampleproject/sampleproject-1.2.3.tar.gz
    
  3. 元数据 1.2 引入了 Project-URL,这是一个多用途字段,包含标签和 URL 对。每个标签都是自由文本,传达 URL 的语义。
    Project-URL: Homepage, https://example.com/sampleproject
    Project-URL: Download, https://example.com/sampleproject/sampleproject-1.2.3.tar.gz
    Project-URL: Documentation, https://example.com/sampleproject/docs
    

元数据 2.1、2.2 和 2.3 将这些字段的行为保留为最初指定的。

因为 Project-URL 允许自由文本标签并且是多用途的,所以出现了用于在 Project-URL 中表示 Home-pageDownload-URL 值的非正式约定。

这些约定得到了广泛采用,PEP 621 明确选择仅提供 project.urls 表格,而不是 project.home-page 字段。来自 PEP 621 的被拒绝的想法

虽然核心元数据支持它,但对于项目的 URL 使用单个字段,同时还支持完整的表格,这似乎是多余且令人困惑的。

本 PEP 的存在是为了将出现的非正式约定形式化,以及明确记录 Home-pageDownload-URL 已被弃用,转而使用等效的 Project-URL 表示。

规范

本 PEP 提出将 Home-pageDownload-URL 视为已弃用。此弃用对包元数据生产者(例如构建后端和打包工具)和包索引(例如 PyPI)都有影响。

元数据生产者

本 PEP 为元数据生产者规定以下内容

  • 在生成 1.2 或更高版本的元数据时,生产者应该仅发出 Project-URL,并且不应该发出 Home-pageDownload-URL 字段。
  • 在为 Home-pageDownload-URL 生成 Project-URL 等价物时,生产者应该使用下面描述的 标签约定

这些规定不会更改核心元数据中 URL 字段的可选项。换句话说,生产者可以根据自己的判断选择完全省略 Project-URL

本 PEP建议完全删除对 Home-pageDownload-URL 的支持。但是,请参阅 未来考虑,了解新的(尚未指定的)主要核心元数据版本如何通过删除这些已弃用字段来完成弃用周期。

包索引

本 PEP 为包索引规定以下内容

  • 在解释 1.2 或更高版本的分布元数据时(例如,在网页上呈现时),索引必须优先考虑 Project-URL 字段作为 URL 的来源,而不是 Home-pageDownload-URL,即使后者被明确提供。
  • 如果分布的元数据仅包含 Home-pageDownload-URL 字段,则索引可以选择忽略这些字段,并表现得好像元数据中没有提供任何 URL 一样。在这种情况下,索引应该向上传输方显示适当的警告或通知。
    • 显示此警告或通知的机制未指定,因为它会因索引而异。例如,索引可以选择在 HTTP 响应中显示上传请求的警告,或向项目的维护者发送电子邮件或其他通知。
  • 如果分布的元数据包含两组字段,则索引可以选择完全拒绝该分布。但是,在未来的未指定的主要元数据版本正式删除对 Home-pageDownload-URL 的支持之前,不建议这样做。
  • 对 1.2 或更高版本的元数据解释的任何更改,导致先前识别的 URL 无法识别,不应该追溯应用于先前上传的包。

这些规定不会更改索引处理 URL 的可选项。换句话说,不处理上传分布中 URL 的索引可以继续完全忽略所有 URL 字段。

Project-URL 标签约定

上述弃用需要正式确定 Home-pageDownload-URL 及其 Project-URL 等价物之间当前非正式的关系。

此规范化包含两个部分

  1. 一组用于规范化 Project-URL 标签的规则;
  2. 一组索引可以专门用于 URL 展示的“知名”规范标签值。

标签规范化

核心元数据规范规定 Project-URL 标签是自由文本,限制为 32 个字符。

本 PEP 提出在核心元数据规范中添加“规范化”标签的概念。标签规范化通过以下 Python 函数定义

import string
def canonicalize_label(label: str) -> str:
    chars_to_remove = string.punctuation + string.whitespace
    removal_map = str.maketrans("", "", chars_to_remove)
    return label.translate(removal_map).lower()

简单来说:通过删除所有 ASCII 标点符号和空格,然后将结果转换为小写来规范化标签。

下表显示了规范化前(原始)和规范化后的标签示例

原始 规范化
Homepage homepage
Home-page homepage
Home page homepage
Change_Log changelog
What's New? whatsnew

元数据生产者应该发出用户指定标签的规范化形式,但可以选择发出未规范化的形式,只要它符合现有的 32 个字符限制。

包索引不应该将属于知名标签集的规范化标签直接用作 UI 元素(而是用适当的大写文本标签替换它们)。不属于知名集的标签可以直接用作 UI 元素。

知名标签

除了上述规范化规则外,本 PEP 还提出了一组固定(但可扩展)的“知名”Project-URL 标签,以及等效的别名。

下表列出了这些标签,以规范形式表示

标签 描述 别名
homepage 项目的首页 (无)
download 当前发行版的下载 URL,等效于 Download-URL (无)
changelog 项目的更改日志 changesreleasenoteswhatsnewhistory
documentation 项目的在线文档 docs
issues 项目的错误跟踪器 bugsissuebugtrackerreport
sponsor 赞助信息 fundingdonatedonation

打包人员和元数据生产者可以选择使用这些知名标签来向包索引和下游传达特定的 URL 意图。

打包人员和元数据生产者应该在包元数据中生成知名标签的规范化版本。

类似地,索引可以选择专门化使用这些标签的 URL 渲染或呈现,例如,为每个标签显示适当的图标或工具提示。

索引可以专门化其他标签或 URL 的渲染或呈现,包括(但不限于)以知名标签开头的标签,以及引用已知服务提供商域(例如,用于文档托管或问题跟踪)的 URL。

本 PEP 认识到,知名标签列表不太可能保持静态,并且对其后续添加不应需要与正式 PEP 流程或新元数据版本相关的开销。由于此信息的预期主要用例是控制 Python 包索引上项目 URL 的显示方式,因此本 PEP 提出将上述列表作为 PyPI 文档中的“动态”列表(在撰写本文时,影响 PyPI URL 显示的文档可以在这里找到 here)。

向后兼容性

有限影响

预计此 PEP 对现有的打包工具或软件包索引几乎没有影响。

  • 打包工具:核心元数据正确性和格式良好的性没有变化。此 PEP 提出弃用以及行为改进,但所有当前(以及历史上)生成的元数据将继续根据其各自版本的规则有效。
  • 软件包索引:索引将继续期望格式良好的核心元数据,且行为没有变化。索引**可以**选择在存在现已弃用的字段时发出警告或通知,如上所述

未来考虑

此 PEP 并未规定或要求任何未来的元数据更改。

但是,根据元数据生成器项目 URL 标签约定,我们确定了核心元数据标准的下一个主要版本的一些潜在未来目标。

  • 在下一个主要核心元数据版本中完全移除对Home-pageDownload-URL的支持。如果移除,软件包索引和使用者**必须**拒绝包含这些字段的元数据,当该元数据属于新的主要版本时。
  • 强制实施标签规范化。如果强制实施,软件包生产者**必须**在生成发行版元数据时仅发出规范化的Project-URL标签,并且软件包索引和使用者**必须**拒绝包含非规范化标签的发行版。注意:要求规范化仅限于将标签限制为小写文本,并排除空格和标点符号。它**不**限制项目 URL 仅使用“知名”标签。

这些潜在的更改将是不兼容的,因此仅包含在本节中。接受此 PEP**不会**承诺任何未来的元数据修订实际上会进行这些更改。

安全隐患

此 PEP 未识别与弃用Home-pageDownload-URL或与标签规范化相关的任何正面或负面的安全影响。

如何教授

此 PEP 中的更改对于打包生态系统的大多数用户来说应该是透明的;此 PEP 更改的主要受益者是打包工具作者和索引维护者,他们将能够减少生成和检查的唯一 URL 字段的数量。

少数软件包维护者可能会从其选择的索引中观察到新的警告或通知,如果该索引选择忽略Home-pageDownload-URL(如建议的那样)。同样,少数软件包维护者可能会观察到其选择的索引不再呈现其 URL,如果仅存在于已弃用的字段中。但是,由于此 PEP 提出的更改,没有任何软件包维护者应该观察到被拒绝的软件包上传或打包工作流程的其他重大更改。

任何观察到索引上 URL 显示的警告或更改的人员都可以通过官方打包资源了解此 PEP 的行为,例如Python 打包用户指南PyPI 的用户文档,后者已经包含了 PyPI 的 URL 处理行为的非正式描述。

如果此 PEP 被接受,此 PEP 的作者将协调更新和交叉链接上面提到的资源。


来源:https://github.com/python/peps/blob/main/peps/pep-0753.rst

上次修改时间:2024-09-10 19:07:31 GMT