Skip to content

Commit bebc19a

Browse files
Vendor pypa/packaging into micropip (#178)
1 parent 5ce6e1f commit bebc19a

21 files changed

+89
-43
lines changed

.github/workflows/main.yml

+14-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
fail-fast: false
2020
matrix:
2121
os: [ubuntu-latest]
22-
pyodide-version: ['0.27.0a2']
22+
pyodide-version: ["0.27.0a2"]
2323
test-config: [
2424
# FIXME: recent version of chrome gets timeout
2525
{runner: selenium, runtime: chrome, runtime-version: "125" },
@@ -28,6 +28,8 @@ jobs:
2828

2929
steps:
3030
- uses: actions/checkout@v4
31+
with:
32+
submodules: recursive
3133

3234
- uses: actions/setup-python@v5
3335
with:
@@ -88,6 +90,7 @@ jobs:
8890
- uses: actions/checkout@cbb722410c2e876e24abbe8de2cc27693e501dcb # v4.2.2
8991
with:
9092
ref: ${{ github.event.pull_request.head.sha }}
93+
submodules: recursive
9194

9295
- id: check-integration-test-trigger
9396
name: Check integration test trigger
@@ -110,15 +113,25 @@ jobs:
110113
environment: PyPi-deploy
111114
steps:
112115
- uses: actions/checkout@v4
116+
with:
117+
submodules: recursive
113118

114119
- uses: actions/setup-python@v5
115120
with:
116121
python-version: 3.12
122+
123+
# IMPORTANT: always build sdist, and then the wheel from
124+
# the sdist (like it is currently done here). This is
125+
# because we want to ensure that no extra files get
126+
# copied, which can be the case with building in-tree.
127+
# The MANIFEST.in file ensures that the sdist doesn't
128+
# contain any unnecessary files.
117129
- name: Install requirements and build wheel
118130
shell: bash -l {0}
119131
run: |
120132
python -m pip install build twine
121133
python -m build .
134+
122135
- name: Publish package
123136
uses: pypa/gh-action-pypi-publish@release/v1
124137
with:

.github/workflows/remote_package_index_test.yml

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ jobs:
2323

2424
steps:
2525
- uses: actions/checkout@v4
26+
with:
27+
submodules: recursive
2628

2729
- uses: actions/setup-python@v5
2830
with:

.gitmodules

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# d8e3b31b734926ebbcaff654279f6855a73e052f, for 24.2 release
2+
# https://github.com/pypa/packaging/releases/tag/24.2
3+
[submodule "micropip/_vendored/packaging"]
4+
path = micropip/_vendored/packaging
5+
url = https://github.com/pypa/packaging/

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
(the ones that starts with `../` or `./`)
1313
[#174](https://github.com/pyodide/micropip/pull/174)
1414

15+
### Added
16+
17+
- `micropip` now vendors `pypa/packaging` for better reliability.
18+
[#178](https://github.com/pyodide/micropip/pull/178)
19+
1520
## [0.8.0] - 2024/12/15
1621

1722
### Added

MANIFEST.in

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
exclude micropip/_vendored/packaging/.github/*
2+
exclude micropip/_vendored/packaging/docs/*
3+
exclude micropip/_vendored/packaging/tasks/*
4+
exclude micropip/_vendored/packaging/tests/*
5+
exclude micropip/_vendored/packaging/.pre-commit-config.yaml
6+
exclude micropip/_vendored/packaging/.readthedocs.yml
7+
exclude micropip/_vendored/packaging/CHANGELOG.rst
8+
exclude micropip/_vendored/packaging/CONTRIBUTING.rst
9+
exclude micropip/_vendored/packaging/noxfile.py
10+
exclude micropip/_vendored/packaging/pyproject.toml
11+
12+
include micropip/_vendored/packaging/LICENSE
13+
include micropip/_vendored/packaging/LICENSE.APACHE
14+
include micropip/_vendored/packaging/LICENSE.BSD
15+
16+
include micropip/_vendored/packaging/README.rst

micropip/_compat/_compat_not_in_pyodide.py

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
class CompatibilityNotInPyodide(CompatibilityLayer):
1515

1616
# Vendored from packaging
17+
# TODO: use packaging APIs here instead?
1718
_canonicalize_regex = re.compile(r"[-_.]+")
1819

1920
class HttpStatusError(Exception):

micropip/_utils.py

+12-7
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,19 @@
44
from pathlib import Path
55
from sysconfig import get_config_var, get_platform
66

7-
from packaging.requirements import Requirement
8-
from packaging.tags import Tag
9-
from packaging.tags import sys_tags as sys_tags_orig
10-
from packaging.utils import BuildTag, InvalidWheelFilename, canonicalize_name
11-
from packaging.utils import parse_wheel_filename as parse_wheel_filename_orig
12-
from packaging.version import InvalidVersion, Version
13-
147
from ._compat import REPODATA_PACKAGES
8+
from ._vendored.packaging.src.packaging.requirements import Requirement
9+
from ._vendored.packaging.src.packaging.tags import Tag
10+
from ._vendored.packaging.src.packaging.tags import sys_tags as sys_tags_orig
11+
from ._vendored.packaging.src.packaging.utils import (
12+
BuildTag,
13+
InvalidWheelFilename,
14+
canonicalize_name,
15+
)
16+
from ._vendored.packaging.src.packaging.utils import (
17+
parse_wheel_filename as parse_wheel_filename_orig,
18+
)
19+
from ._vendored.packaging.src.packaging.version import InvalidVersion, Version
1520

1621

1722
def get_dist_info(dist: Distribution) -> Path:

micropip/_vendored/packaging

Submodule packaging added at d8e3b31

micropip/externals/mousebender/simple.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@
77
import warnings
88
from typing import Any, Dict, List, Optional, Union, Literal, TypeAlias, TypedDict
99

10-
import packaging.utils
10+
import micropip._vendored.packaging.src.packaging.utils as packaging_utils
1111

1212

1313
ACCEPT_JSON_V1 = "application/vnd.pypi.simple.v1+json"
1414

1515

16-
1716
class UnsupportedAPIVersion(Exception):
1817
"""The major version of an API response is not supported."""
1918

@@ -92,15 +91,15 @@ class ProjectDetails_1_0(TypedDict):
9291
"""A :class:`~typing.TypedDict` for a project details response (:pep:`691`)."""
9392

9493
meta: _Meta_1_0
95-
name: packaging.utils.NormalizedName
94+
name: packaging_utils.NormalizedName
9695
files: list[ProjectFileDetails_1_0]
9796

9897

9998
class ProjectDetails_1_1(TypedDict):
10099
"""A :class:`~typing.TypedDict` for a project details response (:pep:`700`)."""
101100

102101
meta: _Meta_1_1
103-
name: packaging.utils.NormalizedName
102+
name: packaging_utils.NormalizedName
104103
files: list[ProjectFileDetails_1_1]
105104
# PEP 700
106105
versions: List[str]
@@ -235,6 +234,6 @@ def from_project_details_html(html: str, name: str) -> ProjectDetails_1_0:
235234
files.append(details)
236235
return {
237236
"meta": {"api-version": "1.0"},
238-
"name": packaging.utils.canonicalize_name(name),
237+
"name": packaging_utils.canonicalize_name(name),
239238
"files": files,
240239
}

micropip/freeze.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
from copy import deepcopy
55
from typing import Any
66

7-
from packaging.utils import canonicalize_name
8-
97
from ._utils import fix_package_dependencies
8+
from ._vendored.packaging.src.packaging.utils import canonicalize_name
109

1110

1211
def freeze_lockfile(

micropip/install.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
from pathlib import Path
55
from typing import Any
66

7-
from packaging.markers import default_environment
8-
97
from ._compat import loadPackage, to_js
8+
from ._vendored.packaging.src.packaging.markers import default_environment
109
from .constants import FAQ_URLS
1110
from .logging import setup_logging
1211
from .transaction import Transaction

micropip/metadata.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
from collections.abc import Iterable
88
from pathlib import Path
99

10-
from packaging.requirements import Requirement
11-
from packaging.utils import canonicalize_name
10+
from ._vendored.packaging.src.packaging.requirements import Requirement
11+
from ._vendored.packaging.src.packaging.utils import canonicalize_name
1212

1313

1414
def safe_name(name):

micropip/package.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from dataclasses import astuple, dataclass
44
from typing import Any
55

6-
from packaging.utils import canonicalize_name
6+
from ._vendored.packaging.src.packaging.utils import canonicalize_name
77

88
__all__ = ["PackageDict"]
99

micropip/package_index.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@
99
from typing import Any
1010
from urllib.parse import urljoin, urlparse, urlunparse
1111

12-
from packaging.utils import InvalidWheelFilename
13-
from packaging.version import InvalidVersion, Version
14-
1512
from ._compat import HttpStatusError, fetch_string_and_headers
1613
from ._utils import is_package_compatible, parse_version
14+
from ._vendored.packaging.src.packaging.utils import InvalidWheelFilename
15+
from ._vendored.packaging.src.packaging.version import InvalidVersion, Version
1716
from .externals.mousebender.simple import from_project_details_html
1817
from .types import DistributionMetadata
1918
from .wheelinfo import WheelInfo

micropip/transaction.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66
from importlib.metadata import PackageNotFoundError
77
from urllib.parse import urlparse
88

9-
from packaging.requirements import Requirement
10-
from packaging.utils import canonicalize_name
11-
129
from . import package_index
1310
from ._compat import REPODATA_PACKAGES
1411
from ._utils import best_compatible_tag_index, check_compatible
12+
from ._vendored.packaging.src.packaging.requirements import Requirement
13+
from ._vendored.packaging.src.packaging.utils import canonicalize_name
1514
from .constants import FAQ_URLS
1615
from .package import PackageMetadata
1716
from .package_index import ProjectInfo

micropip/wheelinfo.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,16 @@
77
from typing import Any, Literal
88
from urllib.parse import ParseResult, urlparse
99

10-
from packaging.requirements import Requirement
11-
from packaging.tags import Tag
12-
from packaging.version import Version
13-
1410
from ._compat import (
1511
fetch_bytes,
1612
get_dynlibs,
1713
loadDynlibsFromPackage,
1814
loadedPackages,
1915
)
2016
from ._utils import parse_wheel_filename
17+
from ._vendored.packaging.src.packaging.requirements import Requirement
18+
from ._vendored.packaging.src.packaging.tags import Tag
19+
from ._vendored.packaging.src.packaging.version import Version
2120
from .metadata import Metadata, safe_name, wheel_dist_info_dir
2221
from .types import DistributionMetadata
2322

pyproject.toml

+7-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ classifiers = [
1313
"Operating System :: OS Independent",
1414
]
1515
dynamic = ["version"]
16-
dependencies = ["packaging>=23.0"]
16+
dependencies = []
17+
1718
[project.optional-dependencies]
1819
test = [
1920
"pytest-httpserver",
@@ -64,7 +65,12 @@ known-first-party = [
6465
]
6566

6667
[tool.mypy]
68+
exclude = ["micropip/_vendored/"]
6769
python_version = "3.12"
6870
show_error_codes = true
6971
warn_unreachable = true
7072
ignore_missing_imports = true
73+
74+
[[tool.mypy.overrides]]
75+
module = "micropip._vendored.*"
76+
warn_unreachable = false

tests/conftest.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
from typing import Any
1111

1212
import pytest
13-
from packaging.utils import parse_wheel_filename
1413
from pytest_httpserver import HTTPServer
1514
from pytest_pyodide import spawn_web_server
1615

16+
from micropip._vendored.packaging.src.packaging.utils import parse_wheel_filename
17+
1718

1819
def pytest_addoption(parser):
1920
parser.addoption(

tests/test_install.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import pytest
22
from conftest import mock_fetch_cls
3-
from packaging.utils import parse_wheel_filename
43
from pytest_pyodide import run_in_pyodide
54

65
import micropip
6+
from micropip._vendored.packaging.src.packaging.utils import parse_wheel_filename
77

88

99
def test_install_custom_url(selenium_standalone_micropip, wheel_catalog):

tests/test_transaction.py

+6-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import pytest
22
from conftest import SNOWBALL_WHEEL
3-
from packaging.tags import Tag
3+
4+
from micropip._vendored.packaging.src.packaging.tags import Tag
45

56

67
@pytest.mark.parametrize(
@@ -188,8 +189,7 @@ def _pypi_metadata(package, versions_to_tags):
188189

189190
def test_last_version_from_pypi():
190191
pytest.importorskip("packaging")
191-
from packaging.requirements import Requirement
192-
192+
from micropip._vendored.packaging.src.packaging.requirements import Requirement
193193
from micropip.transaction import find_wheel
194194

195195
requirement = Requirement("dummy_module")
@@ -209,8 +209,7 @@ def test_find_wheel_invalid_version():
209209
it should be skipped instead of producing an error
210210
"""
211211
pytest.importorskip("packaging")
212-
from packaging.requirements import Requirement
213-
212+
from micropip._vendored.packaging.src.packaging.requirements import Requirement
214213
from micropip.transaction import find_wheel
215214

216215
requirement = Requirement("dummy_module")
@@ -245,8 +244,7 @@ def test_find_wheel_invalid_version():
245244
@pytest.mark.parametrize(*_best_tag_test_cases)
246245
def test_best_tag_from_pypi(package, version, incompatible_tags, compatible_tags):
247246
pytest.importorskip("packaging")
248-
from packaging.requirements import Requirement
249-
247+
from micropip._vendored.packaging.src.packaging.requirements import Requirement
250248
from micropip.transaction import find_wheel
251249

252250
requirement = Requirement(package)
@@ -280,8 +278,7 @@ def test_last_version_and_best_tag_from_pypi(
280278
package, old_version, new_version, old_tags, new_tags
281279
):
282280
pytest.importorskip("packaging")
283-
from packaging.requirements import Requirement
284-
281+
from micropip._vendored.packaging.src.packaging.requirements import Requirement
285282
from micropip.transaction import find_wheel
286283

287284
requirement = Requirement(package)

tests/test_uninstall.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# isort: skip_file
22

33
from pytest_pyodide import run_in_pyodide
4-
from packaging.utils import parse_wheel_filename
4+
from micropip._vendored.packaging.src.packaging.utils import parse_wheel_filename
55

66
TEST_PACKAGE_NAME = "test-wheel-uninstall"
77

0 commit comments

Comments
 (0)