Use dashes instead of underscores for METADATA.toml field names (#15614)

This commit is contained in:
lev-blit
2026-04-07 16:03:53 +03:00
committed by GitHub
parent 7eb0dddd46
commit 563213272e
204 changed files with 365 additions and 362 deletions
+23 -23
View File
@@ -169,27 +169,27 @@ supported:
be listed here, for security reasons. See
[this issue](https://github.com/typeshed-internal/stub_uploader/issues/90)
for more information about what external dependencies are allowed.
* `extra_description` (optional): Can be used to add a custom description to
* `extra-description` (optional): Can be used to add a custom description to
the package's long description. It should be a multi-line string in
Markdown format.
* `stub_distribution` (optional): Distribution name to be uploaded to PyPI.
* `stub-distribution` (optional): Distribution name to be uploaded to PyPI.
This defaults to `types-<distribution>` and should only be set in special
cases.
* `upstream_repository` (recommended): The URL of the upstream repository.
* `obsolete_since` (optional): This field is part of our process for
* `upstream-repository` (recommended): The URL of the upstream repository.
* `obsolete-since` (optional): This field is part of our process for
[removing obsolete third-party libraries](#third-party-library-removal-policy).
It contains the first version of the corresponding library that ships
its own `py.typed` file.
* `no_longer_updated` (optional): This field is set to `true` before removing
* `no-longer-updated` (optional): This field is set to `true` before removing
stubs for other reasons than the upstream library shipping with type
information.
* `upload` (optional): This field is set to `false` to prevent automatic
uploads to PyPI. This should only be used in special cases, e.g. when the stubs
break the upload.
* `partial_stub` (optional): This field marks the type stub package as
* `partial-stub` (optional): This field marks the type stub package as
[partial](https://peps.python.org/pep-0561/#partial-stub-packages). This is for
3rd-party stubs that don't cover the entirety of the package's public API.
* `requires_python` (optional): The minimum version of Python required to install
* `requires-python` (optional): The minimum version of Python required to install
the type stub package. It must be in the form `>=3.*`. If omitted, the oldest
Python version supported by typeshed is used.
@@ -198,36 +198,36 @@ This has the following keys:
* `skip` (default: `false`): Whether stubtest should be run against this
package. Please avoid setting this to `true`, and add a comment if you have
to.
* `ignore_missing_stub`: When set to `true`, this will add the
`--ignore_missing_stub` option to the stubtest call. See
* `ignore-missing-stub`: When set to `true`, this will add the
`--ignore-missing-stub` option to the stubtest call. See
[tests/README.md](./tests/README.md) for more information. In most cases,
this field should be identical to `partial_stub`.
* `stubtest_dependencies` (default: `[]`): A list of Python packages that need
this field should be identical to `partial-stub`.
* `stubtest-dependencies` (default: `[]`): A list of Python packages that need
to be installed for stubtest to run successfully. These packages are installed
in addition to the dependencies in the `dependencies` field.
* `apt_dependencies` (default: `[]`): A list of Ubuntu APT packages
* `apt-dependencies` (default: `[]`): A list of Ubuntu APT packages
that need to be installed for stubtest to run successfully.
* `brew_dependencies` (default: `[]`): A list of MacOS Homebrew packages
* `brew-dependencies` (default: `[]`): A list of MacOS Homebrew packages
that need to be installed for stubtest to run successfully
* `choco_dependencies` (default: `[]`): A list of Windows Chocolatey packages
* `choco-dependencies` (default: `[]`): A list of Windows Chocolatey packages
that need to be installed for stubtest to run successfully
* `supported_platforms` (default: all platforms): A list of OSes on which
* `supported-platforms` (default: all platforms): A list of OSes on which
stubtest can be run. When a package is not platform-specific, this should
not be set. If the package is platform-specific, this should usually be set
to the supported platforms, unless stubtest is known to fail on a
specific platform.
* `ci_platforms` (default: `["linux"]`): A list of OSes on which to run
* `ci-platforms` (default: `["linux"]`): A list of OSes on which to run
stubtest as part of our continuous integration (CI) tests. Can contain
`win32`, `linux`, and `darwin` values. If not specified, stubtest is run
only on `linux`. Only add extra OSes to the test if there are
platform-specific branches in a stubs package.
* `mypy_plugins` (default: `[]`): A list of Python modules to use as mypy plugins
when running stubtest. For example: `mypy_plugins = ["mypy_django_plugin.main"]`
* `mypy_plugins_config` (default: `{}`): A dictionary mapping plugin names to their
* `mypy-plugins` (default: `[]`): A list of Python modules to use as mypy plugins
when running stubtest. For example: `mypy-plugins = ["mypy_django_plugin.main"]`
* `mypy-plugins-config` (default: `{}`): A dictionary mapping plugin names to their
configuration dictionaries for use by mypy plugins. For example:
`mypy_plugins_config = {"django-stubs" = {"django_settings_module" = "@tests.django_settings"}}`
`mypy-plugins-config = {"django-stubs" = {"django_settings_module" = "@tests.django_settings"}}`
`*_dependencies` are usually packages needed to `pip install` the implementation
`*-dependencies` are usually packages needed to `pip install` the implementation
distribution.
The format of all `METADATA.toml` files can be checked by running
@@ -436,7 +436,7 @@ following criteria is met:
Case 1: If a package ships its own `py.typed` file, please follow these steps:
1. Make sure **stubsabot** open a PR that sets the `obsolete_since` field in the
1. Make sure **stubsabot** open a PR that sets the `obsolete-since` field in the
`METADATA.toml` file to the first version of the package that shipped `py.typed`.
2. After at least six months, make sure **stubsabot** open a PR to remove the stubs.
@@ -446,7 +446,7 @@ these steps:
1. Open an issue explaining why the stubs should be removed.
2. A maintainer will add the
["stubs: removal" label](https://github.com/python/typeshed/labels/%22stubs%3A%20removal%22).
3. Open a PR that sets the `no_longer_updated` field in the `METADATA.toml`
3. Open a PR that sets the `no-longer-updated` field in the `METADATA.toml`
file to `true`.
4. When a new version of the package was automatically uploaded to PyPI (which
can take up to a day), make sure **stubsabot** open a PR to remove the stubs.
+48 -45
View File
@@ -58,7 +58,7 @@ def _is_nested_dict(obj: object) -> TypeGuard[dict[str, dict[str, Any]]]:
@functools.cache
def get_oldest_supported_python() -> str:
with PYPROJECT_PATH.open("rb") as config:
val = tomllib.load(config)["tool"]["typeshed"]["oldest_supported_python"]
val = tomllib.load(config)["tool"]["typeshed"]["oldest-supported-python"]
assert type(val) is str
return val
@@ -102,16 +102,16 @@ def read_stubtest_settings(distribution: str) -> StubtestSettings:
data: dict[str, object] = tomllib.load(f).get("tool", {}).get("stubtest", {})
skip: object = data.get("skip", False)
apt_dependencies: object = data.get("apt_dependencies", [])
brew_dependencies: object = data.get("brew_dependencies", [])
choco_dependencies: object = data.get("choco_dependencies", [])
apt_dependencies: object = data.get("apt-dependencies", [])
brew_dependencies: object = data.get("brew-dependencies", [])
choco_dependencies: object = data.get("choco-dependencies", [])
extras: object = data.get("extras", [])
ignore_missing_stub: object = data.get("ignore_missing_stub", False)
supported_platforms: object = data.get("supported_platforms")
ci_platforms: object = data.get("ci_platforms", DEFAULT_STUBTEST_PLATFORMS)
stubtest_dependencies: object = data.get("stubtest_dependencies", [])
mypy_plugins: object = data.get("mypy_plugins", [])
mypy_plugins_config: object = data.get("mypy_plugins_config", {})
ignore_missing_stub: object = data.get("ignore-missing-stub", False)
supported_platforms: object = data.get("supported-platforms")
ci_platforms: object = data.get("ci-platforms", DEFAULT_STUBTEST_PLATFORMS)
stubtest_dependencies: object = data.get("stubtest-dependencies", [])
mypy_plugins: object = data.get("mypy-plugins", [])
mypy_plugins_config: object = data.get("mypy-plugins-config", {})
assert type(skip) is bool
assert type(ignore_missing_stub) is bool
@@ -128,12 +128,12 @@ def read_stubtest_settings(distribution: str) -> StubtestSettings:
assert _is_nested_dict(mypy_plugins_config)
unrecognised_platforms = set(ci_platforms) - _STUBTEST_PLATFORM_MAPPING.keys()
assert not unrecognised_platforms, f"Unrecognised ci_platforms specified for {distribution!r}: {unrecognised_platforms}"
assert not unrecognised_platforms, f"Unrecognised ci-platforms specified for {distribution!r}: {unrecognised_platforms}"
if supported_platforms is not None:
assert set(ci_platforms).issubset(
supported_platforms
), f"ci_platforms must be a subset of supported_platforms for {distribution!r}"
), f"ci-platforms must be a subset of supported-platforms for {distribution!r}"
for platform, dep_key in _STUBTEST_PLATFORM_MAPPING.items():
if platform not in ci_platforms:
@@ -194,31 +194,31 @@ _KNOWN_METADATA_FIELDS: Final = frozenset(
{
"version",
"dependencies",
"extra_description",
"stub_distribution",
"upstream_repository",
"obsolete_since",
"no_longer_updated",
"extra-description",
"stub-distribution",
"upstream-repository",
"obsolete-since",
"no-longer-updated",
"upload",
"tool",
"partial_stub",
"requires_python",
"partial-stub",
"requires-python",
"mypy-tests",
}
)
_KNOWN_METADATA_TOOL_FIELDS: Final = {
"stubtest": {
"skip",
"apt_dependencies",
"brew_dependencies",
"choco_dependencies",
"apt-dependencies",
"brew-dependencies",
"choco-dependencies",
"extras",
"ignore_missing_stub",
"supported_platforms",
"ci_platforms",
"stubtest_dependencies",
"mypy_plugins",
"mypy_plugins_config",
"ignore-missing-stub",
"supported-platforms",
"ci-platforms",
"stubtest-dependencies",
"mypy-plugins",
"mypy-plugins-config",
}
}
_DIST_NAME_RE: Final = re.compile(r"^[a-z0-9]([a-z0-9._-]*[a-z0-9])?$", re.IGNORECASE)
@@ -259,41 +259,41 @@ def read_metadata(distribution: str) -> StubMetadata:
assert isinstance(dependencies_s, list)
dependencies = [parse_dependencies(distribution, dep) for dep in dependencies_s]
extra_description: object = data.get("extra_description") # pyright: ignore[reportUnknownMemberType]
extra_description: object = data.get("extra-description") # pyright: ignore[reportUnknownMemberType]
assert isinstance(extra_description, (str, type(None)))
if "stub_distribution" in data:
stub_distribution = data["stub_distribution"]
if "stub-distribution" in data:
stub_distribution = data["stub-distribution"]
assert isinstance(stub_distribution, str)
assert _DIST_NAME_RE.fullmatch(stub_distribution), f"Invalid 'stub_distribution' value for {distribution!r}"
assert _DIST_NAME_RE.fullmatch(stub_distribution), f"Invalid 'stub-distribution' value for {distribution!r}"
else:
stub_distribution = f"types-{distribution}"
upstream_repository: object = data.get("upstream_repository") # pyright: ignore[reportUnknownMemberType]
upstream_repository: object = data.get("upstream-repository") # pyright: ignore[reportUnknownMemberType]
assert isinstance(upstream_repository, (str, type(None)))
if isinstance(upstream_repository, str):
parsed_url = urllib.parse.urlsplit(upstream_repository)
assert parsed_url.scheme == "https", f"{distribution}: URLs in the upstream_repository field should use https"
assert parsed_url.scheme == "https", f"{distribution}: URLs in the upstream-repository field should use https"
no_www_please = (
f"{distribution}: `World Wide Web` subdomain (`www.`) should be removed from URLs in the upstream_repository field"
f"{distribution}: `World Wide Web` subdomain (`www.`) should be removed from URLs in the upstream-repository field"
)
assert not parsed_url.netloc.startswith("www."), no_www_please
no_query_params_please = (
f"{distribution}: Query params (`?`) should be removed from URLs in the upstream_repository field"
f"{distribution}: Query params (`?`) should be removed from URLs in the upstream-repository field"
)
assert parsed_url.hostname in _QUERY_URL_ALLOWLIST or (not parsed_url.query), no_query_params_please
no_fragments_please = f"{distribution}: Fragments (`#`) should be removed from URLs in the upstream_repository field"
no_fragments_please = f"{distribution}: Fragments (`#`) should be removed from URLs in the upstream-repository field"
assert not parsed_url.fragment, no_fragments_please
if parsed_url.netloc == "github.com":
cleaned_url_path = parsed_url.path.strip("/")
num_url_path_parts = len(Path(cleaned_url_path).parts)
bad_github_url_msg = (
f"Invalid upstream_repository for {distribution!r}: "
f"Invalid upstream-repository for {distribution!r}: "
"URLs for GitHub repositories always have two parts in their paths"
)
assert num_url_path_parts == 2, bad_github_url_msg
obsolete_since: object = data.get("obsolete_since") # pyright: ignore[reportUnknownMemberType]
obsolete_since: object = data.get("obsolete-since") # pyright: ignore[reportUnknownMemberType]
assert isinstance(obsolete_since, (String, type(None)))
if obsolete_since:
comment = obsolete_since.trivia.comment
@@ -302,13 +302,13 @@ def read_metadata(distribution: str) -> StubMetadata:
obsolete = ObsoleteMetadata(since_version=obsolete_since, since_date=since_date)
else:
obsolete = None
no_longer_updated: object = data.get("no_longer_updated", False) # pyright: ignore[reportUnknownMemberType]
no_longer_updated: object = data.get("no-longer-updated", False) # pyright: ignore[reportUnknownMemberType]
assert type(no_longer_updated) is bool
uploaded_to_pypi: object = data.get("upload", True) # pyright: ignore[reportUnknownMemberType]
assert type(uploaded_to_pypi) is bool
partial_stub: object = data.get("partial_stub", True) # pyright: ignore[reportUnknownMemberType]
partial_stub: object = data.get("partial-stub", True) # pyright: ignore[reportUnknownMemberType]
assert type(partial_stub) is bool
requires_python_str: object = data.get("requires_python") # pyright: ignore[reportUnknownMemberType]
requires_python_str: object = data.get("requires-python") # pyright: ignore[reportUnknownMemberType]
oldest_supported_python = get_oldest_supported_python()
oldest_supported_python_specifier = Specifier(f">={oldest_supported_python}")
if requires_python_str is None:
@@ -316,12 +316,12 @@ def read_metadata(distribution: str) -> StubMetadata:
else:
assert isinstance(requires_python_str, str)
requires_python = Specifier(requires_python_str)
assert requires_python != oldest_supported_python_specifier, f'requires_python="{requires_python}" is redundant'
assert requires_python != oldest_supported_python_specifier, f'requires-python="{requires_python}" is redundant'
# Check minimum Python version is not less than the oldest version of Python supported by typeshed
assert oldest_supported_python_specifier.contains(
requires_python.version
), f"'requires_python' contains versions lower than typeshed's oldest supported Python ({oldest_supported_python})"
assert requires_python.operator == ">=", "'requires_python' should be a minimum version specifier, use '>=3.x'"
), f"'requires-python' contains versions lower than typeshed's oldest supported Python ({oldest_supported_python})"
assert requires_python.operator == ">=", "'requires-python' should be a minimum version specifier, use '>=3.x'"
empty_tools: dict[object, object] = {}
tools_settings: object = data.get("tool", empty_tools) # pyright: ignore[reportUnknownMemberType]
@@ -361,6 +361,9 @@ def update_metadata(distribution: str, **new_values: object) -> tomlkit.TOMLDocu
except FileNotFoundError:
raise NoSuchStubError(f"Typeshed has no stubs for {distribution!r}!") from None
data.update(new_values) # pyright: ignore[reportUnknownMemberType] # tomlkit.TOMLDocument.update is partially typed
for key in list(data.keys()):
new_key = key.replace("_", "-") # pyright: ignore[reportUnknownMemberType] # tomlkit.TOMLDocument.keys is partially typed
data[new_key] = data.pop(key) # pyright: ignore[reportUnknownMemberType] # tomlkit.TOMLDocument.pop is partially typed
with path.open("w", encoding="UTF-8") as file:
tomlkit.dump(data, file) # pyright: ignore[reportUnknownMemberType] # tomlkit.dump has partially unknown Mapping type
return data
+1 -1
View File
@@ -265,4 +265,4 @@ extra-standard-library = [
known-first-party = ["_utils", "ts_utils"]
[tool.typeshed]
oldest_supported_python = "3.10"
oldest-supported-python = "3.10"
+2 -2
View File
@@ -134,11 +134,11 @@ def create_metadata(project: str, stub_dir: Path, version: str) -> None:
if upstream_repo_url is None:
warning = (
f"\nCould not find a URL pointing to the source code for {project!r}.\n"
f"Please add it as `upstream_repository` to `stubs/{project}/METADATA.toml`, if possible!\n"
f"Please add it as `upstream-repository` to `stubs/{project}/METADATA.toml`, if possible!\n"
)
print(termcolor.colored(warning, "red"))
else:
metadata += f'upstream_repository = "{upstream_repo_url}"\n'
metadata += f'upstream-repository = "{upstream_repo_url}"\n'
print(f"Writing {filename}")
filename.write_text(metadata, encoding="UTF-8")
+1 -1
View File
@@ -607,7 +607,7 @@ def parse_no_longer_updated_from_archive(source: zipfile.ZipFile | tarfile.TarFi
with file as f:
toml_data: dict[str, object] = tomllib.load(f)
no_longer_updated = toml_data.get("no_longer_updated", False)
no_longer_updated = toml_data.get("no-longer-updated", False)
assert type(no_longer_updated) is bool
return bool(no_longer_updated)
+1 -1
View File
@@ -1,3 +1,3 @@
version = "1.6.9"
upstream_repository = "https://github.com/authlib/authlib"
upstream-repository = "https://github.com/authlib/authlib"
dependencies = ["cryptography"]
+1 -1
View File
@@ -1,3 +1,3 @@
version = "~=1.3.1"
upstream_repository = "https://github.com/laurent-laporte-pro/deprecated"
upstream-repository = "https://github.com/laurent-laporte-pro/deprecated"
dependencies = []
+1 -1
View File
@@ -1,4 +1,4 @@
version = "6.0.*"
upstream_repository = "https://github.com/corydolphin/flask-cors"
upstream-repository = "https://github.com/corydolphin/flask-cors"
# Requires a version of flask with a `py.typed` file
dependencies = ["Flask>=2.0.0"]
+1 -1
View File
@@ -1,4 +1,4 @@
version = "4.1.*"
upstream_repository = "https://github.com/miguelgrinberg/Flask-Migrate"
upstream-repository = "https://github.com/miguelgrinberg/Flask-Migrate"
# Requires versions of flask and Flask-SQLAlchemy with `py.typed` files
dependencies = ["Flask-SQLAlchemy>=3.0.1", "Flask>=2.0.0"]
+1 -1
View File
@@ -1,3 +1,3 @@
version = "5.6.*"
dependencies = ["Flask>=0.9"]
upstream_repository = "https://github.com/miguelgrinberg/flask-socketio"
upstream-repository = "https://github.com/miguelgrinberg/flask-socketio"
+5 -5
View File
@@ -1,12 +1,12 @@
version = "0.5.*"
upstream_repository = "https://github.com/spatialaudio/jackclient-python"
upstream-repository = "https://github.com/spatialaudio/jackclient-python"
# Requires a version of numpy with a `py.typed` file
dependencies = ["numpy>=1.20", "types-cffi"]
[tool.stubtest]
# darwin and win32 are equivalent
ci_platforms = ["darwin", "linux"]
apt_dependencies = ["libjack-dev"]
brew_dependencies = ["jack"]
ci-platforms = ["darwin", "linux"]
apt-dependencies = ["libjack-dev"]
brew-dependencies = ["jack"]
# No need to install on the CI. Leaving here as information for Windows contributors.
# choco_dependencies = ["jack"]
# choco-dependencies = ["jack"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "2.1.12"
upstream_repository = "https://github.com/NVIDIA/jetson-gpio"
upstream-repository = "https://github.com/NVIDIA/jetson-gpio"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "~=3.10.2"
upstream_repository = "https://github.com/Python-Markdown/markdown"
upstream-repository = "https://github.com/Python-Markdown/markdown"
+1 -1
View File
@@ -1,3 +1,3 @@
version = "0.9.*"
upstream_repository = "https://github.com/asweigart/pyautogui"
upstream-repository = "https://github.com/asweigart/pyautogui"
dependencies = ["types-PyScreeze"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.5.*"
upstream_repository = "https://github.com/architest/pymeeus"
upstream-repository = "https://github.com/architest/pymeeus"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "1.1.*"
upstream_repository = "https://github.com/PyMySQL/PyMySQL"
upstream-repository = "https://github.com/PyMySQL/PyMySQL"
+3 -3
View File
@@ -1,11 +1,11 @@
version = "1.0.1"
upstream_repository = "https://github.com/asweigart/pyscreeze"
upstream-repository = "https://github.com/asweigart/pyscreeze"
dependencies = ["Pillow>=10.3.0"]
[tool.stubtest]
# Linux has extra constants, win32 has different definitions
ci_platforms = ["linux", "win32"]
ci-platforms = ["linux", "win32"]
# PyScreeze has an odd setup.py file
# that doesn't list Pillow as a dependency for py312+ yet:
# https://github.com/asweigart/pyscreeze/blob/eeca245a135cf171c163b3691300138518efa64e/setup.py#L38-L46
stubtest_dependencies = ["Pillow"]
stubtest-dependencies = ["Pillow"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "1.7.1"
upstream_repository = "https://github.com/Anorov/PySocks"
upstream-repository = "https://github.com/Anorov/PySocks"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "6.0.*"
upstream_repository = "https://github.com/yaml/pyyaml"
upstream-repository = "https://github.com/yaml/pyyaml"
+3 -3
View File
@@ -1,7 +1,7 @@
version = "2.20.*"
upstream_repository = "https://github.com/pygments/pygments"
upstream-repository = "https://github.com/pygments/pygments"
dependencies = ["types-docutils"]
partial_stub = true
partial-stub = true
[tool.stubtest]
stubtest_dependencies = ["sphinx"]
stubtest-dependencies = ["sphinx"]
+3 -3
View File
@@ -1,10 +1,10 @@
version = "0.7.*"
upstream_repository = "https://sourceforge.net/p/raspberry-gpio-python/code/"
upstream-repository = "https://sourceforge.net/p/raspberry-gpio-python/code/"
[tool.stubtest]
# This package is only supported on Raspberry Pi hardware, which identifies
# itself as 'linux'. When run on other hardware, it raises a RuntimeError:
# RPi.GPIO failed to import. RuntimeError: This module can only be run on a Raspberry Pi!
# https://sourceforge.net/p/raspberry-gpio-python/code/ci/08048dd1894a6b09a104557b6eaa6bb68b6baac5/tree/source/py_gpio.c#l1008
supported_platforms = []
ci_platforms = []
supported-platforms = []
ci-platforms = []
+1 -1
View File
@@ -1,2 +1,2 @@
version = "2.1.*"
upstream_repository = "https://github.com/arsenetar/send2trash"
upstream-repository = "https://github.com/arsenetar/send2trash"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "1.2.*"
upstream_repository = "https://github.com/pyrogram/tgcrypto"
upstream-repository = "https://github.com/pyrogram/tgcrypto"
+1 -1
View File
@@ -1,3 +1,3 @@
version = "~= 3.2.1"
upstream_repository = "https://github.com/pallets-eco/wtforms"
upstream-repository = "https://github.com/pallets-eco/wtforms"
dependencies = ["MarkupSafe"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "1.8.*"
upstream_repository = "https://github.com/Pylons/webob"
upstream-repository = "https://github.com/Pylons/webob"
+2 -2
View File
@@ -1,6 +1,6 @@
version = "25.1.*"
upstream_repository = "https://github.com/Tinche/aiofiles"
upstream-repository = "https://github.com/Tinche/aiofiles"
[tool.stubtest]
# linux and darwin are equivalent
ci_platforms = ["linux", "win32"]
ci-platforms = ["linux", "win32"]
+2 -2
View File
@@ -1,5 +1,5 @@
version = "4.13.*"
upstream_repository = "https://github.com/antlr/antlr4"
upstream-repository = "https://github.com/antlr/antlr4"
[tool.stubtest]
ci_platforms = ["linux", "win32"]
ci-platforms = ["linux", "win32"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "1.1.*"
upstream_repository = "https://github.com/assertpy/assertpy"
upstream-repository = "https://github.com/assertpy/assertpy"
+3 -3
View File
@@ -1,6 +1,6 @@
version = "3.0.*"
upstream_repository = "https://github.com/google/atheris"
partial_stub = true
upstream-repository = "https://github.com/google/atheris"
partial-stub = true
[tool.stubtest]
ignore_missing_stub = true
ignore-missing-stub = true
+1 -1
View File
@@ -1,3 +1,3 @@
version = "4.10.*"
upstream_repository = "https://github.com/auth0/auth0-python"
upstream-repository = "https://github.com/auth0/auth0-python"
dependencies = ["cryptography", "types-requests"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "2.15.*"
upstream_repository = "https://github.com/aws/aws-xray-sdk-python"
upstream-repository = "https://github.com/aws/aws-xray-sdk-python"
+3 -3
View File
@@ -1,6 +1,6 @@
version = "1.3.*"
upstream_repository = "https://github.com/behave/behave"
partial_stub = true
upstream-repository = "https://github.com/behave/behave"
partial-stub = true
[tool.stubtest]
ignore_missing_stub = true
ignore-missing-stub = true
+2 -2
View File
@@ -1,3 +1,3 @@
version = "0.4.*"
upstream_repository = "https://github.com/binaryornot/binaryornot"
obsolete_since = "0.5.0" # Released on 2026-03-07
upstream-repository = "https://github.com/binaryornot/binaryornot"
obsolete-since = "0.5.0" # Released on 2026-03-07
+1 -1
View File
@@ -1,6 +1,6 @@
version = "6.3.*"
dependencies = ["types-html5lib"]
upstream_repository = "https://github.com/mozilla/bleach"
upstream-repository = "https://github.com/mozilla/bleach"
[tool.stubtest]
extras = ["css"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "25.0.*"
upstream_repository = "https://github.com/mahmoud/boltons"
upstream-repository = "https://github.com/mahmoud/boltons"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "4.42.*"
upstream_repository = "https://github.com/braintree/braintree_python"
upstream-repository = "https://github.com/braintree/braintree_python"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "6.2.*"
upstream_repository = "https://github.com/tkem/cachetools"
upstream-repository = "https://github.com/tkem/cachetools"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "3.0.*"
upstream_repository = "https://github.com/xolox/python-capturer"
upstream-repository = "https://github.com/xolox/python-capturer"
+2 -2
View File
@@ -1,7 +1,7 @@
version = "2.0.*"
upstream_repository = "https://github.com/python-cffi/cffi/"
upstream-repository = "https://github.com/python-cffi/cffi/"
dependencies = ["types-setuptools"]
[tool.stubtest]
# linux and darwin are mostly equivalent, except for a single `RTLD_DEEPBIND` variable
ci_platforms = ["linux", "win32"]
ci-platforms = ["linux", "win32"]
+4 -4
View File
@@ -1,8 +1,8 @@
version = "4.3.*"
upstream_repository = "https://github.com/django/channels"
upstream-repository = "https://github.com/django/channels"
dependencies = ["django-stubs>=4.2", "asgiref"]
[tool.stubtest]
mypy_plugins = ['mypy_django_plugin.main']
mypy_plugins_config = {"django-stubs" = {"django_settings_module" = "@tests.django_settings"}}
stubtest_dependencies = ["daphne"]
mypy-plugins = ['mypy_django_plugin.main']
mypy-plugins-config = {"django-stubs" = {"django_settings_module" = "@tests.django_settings"}}
stubtest-dependencies = ["daphne"]
+1 -1
View File
@@ -1,4 +1,4 @@
version = "0.14.*"
upstream_repository = "https://github.com/noahmorrison/chevron"
upstream-repository = "https://github.com/noahmorrison/chevron"
[tool.stubtest]
+1 -1
View File
@@ -1,4 +1,4 @@
version = "1.2.*"
upstream_repository = "https://github.com/click-contrib/click-default-group"
upstream-repository = "https://github.com/click-contrib/click-default-group"
# requires a version of click with a py.typed
dependencies = ["click>=8.0.0"]
+1 -1
View File
@@ -1,3 +1,3 @@
version = "0.4.*"
dependencies = ["click>=8.0.0"]
upstream_repository = "https://github.com/click-contrib/click-log"
upstream-repository = "https://github.com/click-contrib/click-log"
+1 -1
View File
@@ -1,3 +1,3 @@
version = "2.1"
upstream_repository = "https://github.com/clarkperkins/click-shell"
upstream-repository = "https://github.com/clarkperkins/click-shell"
dependencies = ["click>=8.0.0"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.1.*"
upstream_repository = "https://github.com/click-contrib/click-spinner"
upstream-repository = "https://github.com/click-contrib/click-spinner"
+1 -1
View File
@@ -1,3 +1,3 @@
version = "0.8.*"
dependencies = ["click>=8.0.0", "Flask>=2.3.2"]
upstream_repository = "https://github.com/fredrik-corneliusson/click-web"
upstream-repository = "https://github.com/fredrik-corneliusson/click-web"
+2 -2
View File
@@ -1,5 +1,5 @@
version = "0.4.*"
upstream_repository = "https://github.com/tartley/colorama"
upstream-repository = "https://github.com/tartley/colorama"
[tool.stubtest]
ci_platforms = ["linux", "win32"]
ci-platforms = ["linux", "win32"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.5.*"
upstream_repository = "https://github.com/timofurrer/colorful"
upstream-repository = "https://github.com/timofurrer/colorful"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.8.*"
upstream_repository = "https://github.com/aegirhall/console-menu"
upstream-repository = "https://github.com/aegirhall/console-menu"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "2.4.1"
upstream_repository = "https://github.com/fitnr/convertdate"
upstream-repository = "https://github.com/fitnr/convertdate"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "6.2.2"
upstream_repository = "https://github.com/pallets-eco/croniter"
upstream-repository = "https://github.com/pallets-eco/croniter"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "1.1.*"
upstream_repository = "https://github.com/eclecticiq/python-data-uri"
upstream-repository = "https://github.com/eclecticiq/python-data-uri"
+1 -1
View File
@@ -1,5 +1,5 @@
version = "~=1.4.0"
upstream_repository = "https://github.com/scrapinghub/dateparser"
upstream-repository = "https://github.com/scrapinghub/dateparser"
[tool.stubtest]
extras = ["fasttext", "langdetect"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "5.2.*"
upstream_repository = "https://github.com/micheles/decorator"
upstream-repository = "https://github.com/micheles/decorator"
+2 -2
View File
@@ -1,5 +1,5 @@
version = "0.7.*"
upstream_repository = "https://github.com/tiran/defusedxml"
upstream-repository = "https://github.com/tiran/defusedxml"
[tool.stubtest]
stubtest_dependencies = ["lxml"]
stubtest-dependencies = ["lxml"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.5.*"
upstream_repository = "https://github.com/andhus/dirhash-python"
upstream-repository = "https://github.com/andhus/dirhash-python"
+3 -3
View File
@@ -1,7 +1,7 @@
version = "25.2.*"
upstream_repository = "https://github.com/carltongibson/django-filter/"
upstream-repository = "https://github.com/carltongibson/django-filter/"
dependencies = ["django-stubs"]
[tool.stubtest]
mypy_plugins = ["mypy_django_plugin.main"]
mypy_plugins_config = {"django-stubs" = {"django_settings_module" = "@tests.django_settings"}}
mypy-plugins = ["mypy_django_plugin.main"]
mypy-plugins-config = {"django-stubs" = {"django_settings_module" = "@tests.django_settings"}}
+1 -1
View File
@@ -1,5 +1,5 @@
version = "4.4.*"
upstream_repository = "https://github.com/django-import-export/django-import-export"
upstream-repository = "https://github.com/django-import-export/django-import-export"
dependencies = ["django-stubs"] # Add tablib when typed, and update _Incomplete aliases in stubs
[tool.stubtest]
+1 -1
View File
@@ -1,3 +1,3 @@
version = "7.1.*"
upstream_repository = "https://github.com/docker/docker-py"
upstream-repository = "https://github.com/docker/docker-py"
dependencies = ["types-paramiko", "types-requests", "urllib3>=2"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "2.0.*"
upstream_repository = "https://github.com/containerbuildsystem/dockerfile-parse"
upstream-repository = "https://github.com/containerbuildsystem/dockerfile-parse"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.22.3"
upstream_repository = "https://sourceforge.net/p/docutils/code"
upstream-repository = "https://sourceforge.net/p/docutils/code"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.8.*"
upstream_repository = "https://github.com/roy-ht/editdistance"
upstream-repository = "https://github.com/roy-ht/editdistance"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.4.*"
upstream_repository = "https://github.com/takluyver/entrypoints"
upstream-repository = "https://github.com/takluyver/entrypoints"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "4.2.*"
upstream_repository = "https://github.com/brandon-rhodes/pyephem"
upstream-repository = "https://github.com/brandon-rhodes/pyephem"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "2.0.*"
upstream_repository = "https://foss.heptapod.net/openpyxl/et_xmlfile"
upstream-repository = "https://foss.heptapod.net/openpyxl/et_xmlfile"
+1 -1
View File
@@ -1,3 +1,3 @@
version = "1.7.*"
upstream_repository = "https://github.com/zopefoundation/fanstatic"
upstream-repository = "https://github.com/zopefoundation/fanstatic"
dependencies = ["types-setuptools", "types-WebOb"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "2.0.*"
upstream_repository = "https://github.com/hynek/first"
upstream-repository = "https://github.com/hynek/first"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "25.11.29"
upstream_repository = "https://github.com/PyCQA/flake8-bugbear"
upstream-repository = "https://github.com/PyCQA/flake8-bugbear"
+1 -1
View File
@@ -1,3 +1,3 @@
version = "3.1.*"
upstream_repository = "https://github.com/gforcada/flake8-builtins"
upstream-repository = "https://github.com/gforcada/flake8-builtins"
dependencies = ["types-flake8"]
+1 -1
View File
@@ -1,3 +1,3 @@
version = "1.7.*"
upstream_repository = "https://github.com/pycqa/flake8-docstrings"
upstream-repository = "https://github.com/pycqa/flake8-docstrings"
dependencies = ["types-flake8"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.4.*"
upstream_repository = "https://github.com/peterjc/flake8-rst-docstrings"
upstream-repository = "https://github.com/peterjc/flake8-rst-docstrings"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.30.*"
upstream_repository = "https://github.com/MartinThoma/flake8-simplify"
upstream-repository = "https://github.com/MartinThoma/flake8-simplify"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "1.17.*"
upstream_repository = "https://github.com/asottile/flake8-typing-imports"
upstream-repository = "https://github.com/asottile/flake8-typing-imports"
+1 -1
View File
@@ -1,3 +1,3 @@
version = "7.3.*"
upstream_repository = "https://github.com/pycqa/flake8"
upstream-repository = "https://github.com/pycqa/flake8"
dependencies = ["types-pyflakes"]
+3 -3
View File
@@ -1,7 +1,7 @@
version = "2.8.4"
upstream_repository = "https://github.com/py-pdf/fpdf2"
upstream-repository = "https://github.com/py-pdf/fpdf2"
dependencies = ["Pillow>=10.3.0"]
obsolete_since = "2.8.6" # Released on 2026-02-19
obsolete-since = "2.8.6" # Released on 2026-02-19
[tool.stubtest]
stubtest_dependencies = ["cryptography"]
stubtest-dependencies = ["cryptography"]
+4 -4
View File
@@ -1,8 +1,8 @@
version = "16.3.*"
# This is the official web portal for the GDB Git repo,
# see https://sourceware.org/gdb/current/ for other ways of obtaining the source code.
upstream_repository = "https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=tree"
extra_description = """\
upstream-repository = "https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=tree"
extra-description = """\
Type hints for GDB's \
[Python API](https://sourceware.org/gdb/onlinedocs/gdb/Python-API.html). \
Note that this API is available only when running Python scripts under GDB: \
@@ -12,5 +12,5 @@ extra_description = """\
[tool.stubtest]
skip = true # https://github.com/python/typeshed/issues/15236
ci_platforms = ["linux"]
apt_dependencies = ["gdb"]
ci-platforms = ["linux"]
apt-dependencies = ["gdb"]
+2 -2
View File
@@ -1,9 +1,9 @@
version = "1.1.3"
# Requires a version of numpy with a `py.typed` file
dependencies = ["numpy>=1.20", "pandas-stubs", "types-shapely", "pyproj"]
upstream_repository = "https://github.com/geopandas/geopandas"
upstream-repository = "https://github.com/geopandas/geopandas"
[tool.stubtest]
# libproj-dev and proj-bin are required to build pyproj if wheels for the
# target Python version are not available.
apt_dependencies = ["libproj-dev", "proj-bin"]
apt-dependencies = ["libproj-dev", "proj-bin"]
+5 -5
View File
@@ -1,12 +1,12 @@
version = "25.9.*"
upstream_repository = "https://github.com/gevent/gevent"
upstream-repository = "https://github.com/gevent/gevent"
dependencies = ["types-greenlet", "types-psutil>=7.2.0"]
[tool.stubtest]
# Run stubtest on all platforms, since there is some platform specific stuff
# especially in the stdlib module replacement
ci_platforms = ["linux", "darwin", "win32"]
ci-platforms = ["linux", "darwin", "win32"]
# for testing the ffi loop implementations on all platforms
stubtest_dependencies = ["cffi", "dnspython"]
apt_dependencies = ["libev4", "libev-dev", "libuv1", "libuv1-dev"]
brew_dependencies = ["libev", "libuv"]
stubtest-dependencies = ["cffi", "dnspython"]
apt-dependencies = ["libev4", "libev-dev", "libuv1", "libuv1-dev"]
brew-dependencies = ["libev", "libuv"]
+3 -3
View File
@@ -1,6 +1,6 @@
version = "2.4.*"
upstream_repository = "https://github.com/googleapis/python-ndb"
partial_stub = true
upstream-repository = "https://github.com/googleapis/python-ndb"
partial-stub = true
[tool.stubtest]
ignore_missing_stub = true
ignore-missing-stub = true
+1 -1
View File
@@ -1,2 +1,2 @@
version = "3.3.*"
upstream_repository = "https://github.com/python-greenlet/greenlet"
upstream-repository = "https://github.com/python-greenlet/greenlet"
+1 -1
View File
@@ -1,3 +1,3 @@
version = "1.*"
upstream_repository = "https://github.com/grpc/grpc"
upstream-repository = "https://github.com/grpc/grpc"
dependencies = ["types-grpcio", "types-protobuf"]
+1 -1
View File
@@ -1,3 +1,3 @@
version = "1.*"
upstream_repository = "https://github.com/grpc/grpc"
upstream-repository = "https://github.com/grpc/grpc"
dependencies = ["types-grpcio", "types-protobuf"]
+1 -1
View File
@@ -1,3 +1,3 @@
version = "1.*"
upstream_repository = "https://github.com/grpc/grpc"
upstream-repository = "https://github.com/grpc/grpc"
dependencies = ["types-grpcio", "types-protobuf"]
+1 -1
View File
@@ -1,3 +1,3 @@
version = "1.*"
upstream_repository = "https://github.com/grpc/grpc"
upstream-repository = "https://github.com/grpc/grpc"
dependencies = ["types-grpcio"]
+3 -3
View File
@@ -1,6 +1,6 @@
version = "1.*"
upstream_repository = "https://github.com/grpc/grpc"
partial_stub = true
upstream-repository = "https://github.com/grpc/grpc"
partial-stub = true
[tool.stubtest]
ignore_missing_stub = true
ignore-missing-stub = true
+4 -4
View File
@@ -1,8 +1,8 @@
version = "25.3.0"
upstream_repository = "https://github.com/benoitc/gunicorn"
upstream-repository = "https://github.com/benoitc/gunicorn"
dependencies = ["types-gevent"]
[tool.stubtest]
supported_platforms = ["linux", "darwin"]
ci_platforms = ["linux", "darwin"]
stubtest_dependencies = ["gevent>=1.4.0", "eventlet>=0.24.1,!=0.36.0", "tornado>=0.2", "setproctitle", "PasteDeploy", "inotify"]
supported-platforms = ["linux", "darwin"]
ci-platforms = ["linux", "darwin"]
stubtest-dependencies = ["gevent>=1.4.0", "eventlet>=0.24.1,!=0.36.0", "tornado>=0.2", "setproctitle", "PasteDeploy", "inotify"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "2.25.*"
# upstream_repository = closed-source
# upstream-repository = closed-source
+1 -1
View File
@@ -1,4 +1,4 @@
version = "0.8.*"
# Requires a version of numpy with a `py.typed` file
dependencies = ["numpy>=1.21"]
upstream_repository = "https://github.com/nmslib/hnswlib"
upstream-repository = "https://github.com/nmslib/hnswlib"
+1 -1
View File
@@ -1,5 +1,5 @@
version = "1.1.*"
upstream_repository = "https://github.com/html5lib/html5lib-python"
upstream-repository = "https://github.com/html5lib/html5lib-python"
dependencies = ["types-webencodings"]
[tool.stubtest]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.31.2"
upstream_repository = "https://github.com/httplib2/httplib2"
upstream-repository = "https://github.com/httplib2/httplib2"
+1 -1
View File
@@ -1,3 +1,3 @@
version = "2.4.*"
upstream_repository = "https://github.com/hvac/hvac"
upstream-repository = "https://github.com/hvac/hvac"
dependencies = ["types-requests"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "3.2.8"
upstream_repository = "https://github.com/ibmdb/python-ibmdb"
upstream-repository = "https://github.com/ibmdb/python-ibmdb"
+3 -3
View File
@@ -1,7 +1,7 @@
version = "6.3.2"
upstream_repository = "https://github.com/collective/icalendar"
upstream-repository = "https://github.com/collective/icalendar"
dependencies = ["types-python-dateutil", "types-pytz"]
obsolete_since = "7.0.0" # Released on 2026-02-11
obsolete-since = "7.0.0" # Released on 2026-02-11
[tool.stubtest]
stubtest_dependencies = ["pytz"]
stubtest-dependencies = ["pytz"]
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.4.*"
upstream_repository = "https://github.com/mitsuhiko/python-inifile"
upstream-repository = "https://github.com/mitsuhiko/python-inifile"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "1.1.*"
upstream_repository = "https://github.com/jmespath/jmespath.py"
upstream-repository = "https://github.com/jmespath/jmespath.py"
+1 -1
View File
@@ -1,2 +1,2 @@
version = "0.22.*"
upstream_repository = "https://github.com/google/jsonnet"
upstream-repository = "https://github.com/google/jsonnet"
+1 -1
View File
@@ -1,5 +1,5 @@
version = "~=4.26.0"
upstream_repository = "https://github.com/python-jsonschema/jsonschema"
upstream-repository = "https://github.com/python-jsonschema/jsonschema"
dependencies = ["referencing"]
[tool.stubtest]
+1 -1
View File
@@ -1,3 +1,3 @@
version = "1.5.*"
upstream_repository = "https://github.com/latchset/jwcrypto"
upstream-repository = "https://github.com/latchset/jwcrypto"
dependencies = ["cryptography"]
+2 -2
View File
@@ -1,9 +1,9 @@
version = "0.13.*"
upstream_repository = "https://github.com/boppreh/keyboard"
upstream-repository = "https://github.com/boppreh/keyboard"
# [tool.stubtest]
# While the stubs slightly differ on Windows vs Linux.
# It's only by possible mouse buttons and event literal types.
# As well as returning a tuple of int/long from keyboard.mouse.get_position
# The "mouse" module is obsoleted by the "mouse" package.
# ci_platforms = ["linux"]
# ci-platforms = ["linux"]
+5 -5
View File
@@ -1,10 +1,10 @@
version = "2.9.*"
upstream_repository = "https://github.com/cannatag/ldap3"
upstream-repository = "https://github.com/cannatag/ldap3"
dependencies = ["types-pyasn1"]
[tool.stubtest]
apt_dependencies = ["libkrb5-dev"]
apt-dependencies = ["libkrb5-dev"]
# No need to install on the CI. Leaving here as information for MacOs/Windows contributors.
# brew_dependencies = ["krb5"]
# choco_dependencies = ["mitkerberos"]
stubtest_dependencies = ["gssapi"]
# brew-dependencies = ["krb5"]
# choco-dependencies = ["mitkerberos"]
stubtest-dependencies = ["gssapi"]

Some files were not shown because too many files have changed in this diff Show More