devpi-builder 6.1.0__tar.gz → 7.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/.github/workflows/tests.yml +4 -7
  2. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/.gitignore +3 -0
  3. devpi_builder-7.1.0/.python-version +1 -0
  4. devpi_builder-7.1.0/AGENTS.md +12 -0
  5. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/CHANGELOG.rst +47 -0
  6. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/PKG-INFO +68 -10
  7. devpi_builder-7.1.0/core-requirements.txt +8 -0
  8. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/devpi_builder/cli.py +3 -4
  9. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/devpi_builder/requirements.py +4 -4
  10. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/devpi_builder/wheeler.py +9 -7
  11. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/devpi_builder.egg-info/PKG-INFO +68 -10
  12. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/devpi_builder.egg-info/SOURCES.txt +6 -3
  13. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/devpi_builder.egg-info/requires.txt +3 -3
  14. devpi_builder-7.1.0/devpi_builder.egg-info/scm_file_list.json +50 -0
  15. devpi_builder-7.1.0/devpi_builder.egg-info/scm_version.json +8 -0
  16. devpi_builder-7.1.0/pyproject.toml +8 -0
  17. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/requirements.in +2 -1
  18. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/requirements.txt +112 -125
  19. devpi_builder-7.1.0/setup.cfg +4 -0
  20. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/setup.py +5 -8
  21. devpi_builder-7.1.0/tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz +0 -0
  22. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/test_cli.py +30 -13
  23. devpi_builder-7.1.0/tox.toml +14 -0
  24. devpi-builder-6.1.0/core-requirements.txt +0 -8
  25. devpi-builder-6.1.0/setup.cfg +0 -10
  26. devpi-builder-6.1.0/tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz +0 -0
  27. devpi-builder-6.1.0/tests/fixture/non-ascii_package/setup.cfg +0 -2
  28. devpi-builder-6.1.0/tests/fixture/pure_package/setup.cfg +0 -2
  29. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/.coveragerc +0 -0
  30. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/.github/workflows/publish.yml +0 -0
  31. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/.pyup.yml +0 -0
  32. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/COPYING +0 -0
  33. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/MANIFEST.in +0 -0
  34. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/README.rst +0 -0
  35. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/devpi_builder/__init__.py +0 -0
  36. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/devpi_builder.egg-info/dependency_links.txt +0 -0
  37. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/devpi_builder.egg-info/entry_points.txt +0 -0
  38. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/devpi_builder.egg-info/top_level.txt +0 -0
  39. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/non-ascii_package/setup.py +0 -0
  40. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/non-pure_package/dist/test_package-0.1.dev1-cp27-none-linux_x86_64.whl +0 -0
  41. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/non-pure_package/setup.cfg +0 -0
  42. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/non-pure_package/setup.py +0 -0
  43. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/pure_package/dist/test_package-0.1.dev1-py2.py3-none-any.whl +0 -0
  44. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/pure_package/setup.py +0 -0
  45. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/pure_package/test_package/__init__.py +0 -0
  46. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_blacklist.txt +0 -0
  47. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_comments.txt +0 -0
  48. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_continue_on_failed.txt +0 -0
  49. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_different_styles.txt +0 -0
  50. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_inexact_version.txt +0 -0
  51. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_junit.txt +0 -0
  52. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_multiple_versions.txt +0 -0
  53. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_multiple_versions_on_line.txt +0 -0
  54. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_no_version.txt +0 -0
  55. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_non-ascii.txt +0 -0
  56. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_pure_and_non-pure.txt +0 -0
  57. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_simple.txt +0 -0
  58. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_test_package.txt +0 -0
  59. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/fixture/sample_vcs.txt +0 -0
  60. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/test_requirements.py +0 -0
  61. {devpi-builder-6.1.0 → devpi_builder-7.1.0}/tests/test_wheeler.py +0 -0
@@ -10,8 +10,9 @@ jobs:
10
10
  test:
11
11
  runs-on: ubuntu-latest
12
12
  strategy:
13
+ fail-fast: false
13
14
  matrix:
14
- python-version: ['3.7', '3.8', '3.9', '3.10', '3.11']
15
+ python-version: ['3.11', '3.12', '3.13', '3.14', '3.15']
15
16
  steps:
16
17
  - uses: actions/checkout@v3
17
18
  - name: Set up Python ${{ matrix.python-version }}
@@ -21,15 +22,11 @@ jobs:
21
22
  - name: Install dependencies
22
23
  run: |
23
24
  python -m pip install --upgrade pip
24
- python -m pip install -r requirements.txt
25
- python -m pip install --no-deps -e .
26
- python -m pip install coveralls
25
+ python -m pip install tox coveralls
27
26
  python -m pip freeze
28
- python -m pip --version
29
- python -c 'import setuptools; print(f"setuptools=={setuptools.__version__}")'
30
27
  - name: Test with pytest
31
28
  run: |
32
- pytest
29
+ tox -e ${{ matrix.python-version }} -- --cov
33
30
  - name: Upload coverage data
34
31
  run: |
35
32
  coveralls --service=github
@@ -10,6 +10,9 @@ build
10
10
  README.html
11
11
  CHANGELOG.html
12
12
  .cache
13
+ .pytest_cache
14
+ .tox
15
+ .venv
13
16
  coverage_html_report
14
17
  .coverage*
15
18
  !.coveragerc
@@ -0,0 +1 @@
1
+ 3.11
@@ -0,0 +1,12 @@
1
+ # Agents
2
+
3
+ Use these project-specific defaults when making future changes:
4
+
5
+ - Run tests with `pytest`.
6
+ - Use `tox` to run the full test matrix across supported Python versions.
7
+ - Keep `core-requirements.txt` for runtime dependencies and `requirements.in` for test and development dependencies.
8
+ - Regenerate `requirements.txt` from `requirements.in` with `tox -e compile`. Use `tox -e compile -- --upgrade` to upgrade dependencies to the latest compatible versions.
9
+ - When changing supported Python versions, keep `tox.toml`, the GitHub Actions workflow, `setup.py` trove classifiers, and `.python-version` in sync.
10
+ - Keep `.python-version` set to the lowest supported Python version so Dependabot and single-version tooling pick it up correctly.
11
+ - Keep `base_python` in the `compile` environment in `tox.toml` set to the lowest supported Python version so that `tox -e compile` works correctly.
12
+ - When changing supported Python versions, recompile `requirements.txt` with `tox -e compile -- --upgrade` to ensure compatible dependency versions are used.
@@ -4,6 +4,53 @@ Changelog
4
4
 
5
5
  This lists the most important changes for each release.
6
6
 
7
+ Version 7.1.0 - 2026-10-22
8
+ ==========================
9
+
10
+ Added
11
+ -----
12
+
13
+ * Verified compatibility with Python 3.15.
14
+ * Compatibility with newer version of setuptools and ``wheel-filename``.
15
+
16
+ Removed
17
+ -------
18
+
19
+ * Compatibility with Python 3.10 is no longer verified.
20
+ * Removed deprecated universal wheel configuration from test fixtures.
21
+
22
+ Changed
23
+ -------
24
+
25
+ * Refreshed the locked test dependencies for Python 3.11+.
26
+ * Requires ``wheel-filename`` 2.0 or newer.
27
+ * JUnit XML reports are written with built-in ``open`` instead of deprecated ``codecs.open``.
28
+
29
+ Removed
30
+ -------
31
+
32
+ * Removed the remaining use of ``pkg_resources``.
33
+
34
+
35
+ Version 7.0.0 - 2026-02-16
36
+ ==========================
37
+
38
+ Added
39
+ -----
40
+
41
+ * Support for Python 3.12 and 3.13.
42
+ * Compatibility with junit-xml >= 2.0.
43
+
44
+ Fixed
45
+ -----
46
+
47
+ * Ensure Setuptools and ``wheel-filename`` are installed in compatible versions.
48
+
49
+ Removed
50
+ -------
51
+
52
+ * Python 3.6 to 3.8 are no longer supported. They likely still works but we will no longer run CI against it.
53
+ * Compatibility with junit-xml < 1.9. Junit-xml 1.9 was released more than three years ago.
7
54
 
8
55
  Version 6.1.0 — 2023-09-22
9
56
  ==========================
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: devpi-builder
3
- Version: 6.1.0
3
+ Version: 7.1.0
4
4
  Summary: Devpi-builder takes a requirements.txt and incrementally fills a devpi index with wheels of the listed python packages.
5
5
  Home-page: https://github.com/blue-yonder/devpi-builder
6
6
  Author: Matthias Bach
@@ -13,22 +13,33 @@ Classifier: Intended Audience :: System Administrators
13
13
  Classifier: License :: OSI Approved :: BSD License
14
14
  Classifier: Topic :: System :: Archiving :: Packaging
15
15
  Classifier: Programming Language :: Python :: 3
16
- Classifier: Programming Language :: Python :: 3.7
17
- Classifier: Programming Language :: Python :: 3.8
18
- Classifier: Programming Language :: Python :: 3.9
19
- Classifier: Programming Language :: Python :: 3.10
20
16
  Classifier: Programming Language :: Python :: 3.11
21
- Requires-Python: >=3.7
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Programming Language :: Python :: 3.15
21
+ Requires-Python: >=3.11
22
22
  Description-Content-Type: text/x-rst
23
23
  License-File: COPYING
24
24
  Requires-Dist: devpi-plumber>=0.2.14
25
25
  Requires-Dist: setuptools
26
26
  Requires-Dist: wheel
27
- Requires-Dist: wheel-filename
28
- Requires-Dist: wheel-inspect>=1.6.0
27
+ Requires-Dist: wheel-filename>=2.0
28
+ Requires-Dist: wheel-inspect>=1.8.0
29
29
  Requires-Dist: pip>=1.5.3
30
- Requires-Dist: junit-xml
30
+ Requires-Dist: junit-xml>=1.9
31
31
  Requires-Dist: pip-requirements-parser>=32.0.1
32
+ Dynamic: author
33
+ Dynamic: author-email
34
+ Dynamic: classifier
35
+ Dynamic: description
36
+ Dynamic: description-content-type
37
+ Dynamic: home-page
38
+ Dynamic: license
39
+ Dynamic: license-file
40
+ Dynamic: requires-dist
41
+ Dynamic: requires-python
42
+ Dynamic: summary
32
43
 
33
44
  =========================
34
45
  Brandon the Devpi Builder
@@ -136,6 +147,53 @@ Changelog
136
147
 
137
148
  This lists the most important changes for each release.
138
149
 
150
+ Version 7.1.0 - 2026-10-22
151
+ ==========================
152
+
153
+ Added
154
+ -----
155
+
156
+ * Verified compatibility with Python 3.15.
157
+ * Compatibility with newer version of setuptools and ``wheel-filename``.
158
+
159
+ Removed
160
+ -------
161
+
162
+ * Compatibility with Python 3.10 is no longer verified.
163
+ * Removed deprecated universal wheel configuration from test fixtures.
164
+
165
+ Changed
166
+ -------
167
+
168
+ * Refreshed the locked test dependencies for Python 3.11+.
169
+ * Requires ``wheel-filename`` 2.0 or newer.
170
+ * JUnit XML reports are written with built-in ``open`` instead of deprecated ``codecs.open``.
171
+
172
+ Removed
173
+ -------
174
+
175
+ * Removed the remaining use of ``pkg_resources``.
176
+
177
+
178
+ Version 7.0.0 - 2026-02-16
179
+ ==========================
180
+
181
+ Added
182
+ -----
183
+
184
+ * Support for Python 3.12 and 3.13.
185
+ * Compatibility with junit-xml >= 2.0.
186
+
187
+ Fixed
188
+ -----
189
+
190
+ * Ensure Setuptools and ``wheel-filename`` are installed in compatible versions.
191
+
192
+ Removed
193
+ -------
194
+
195
+ * Python 3.6 to 3.8 are no longer supported. They likely still works but we will no longer run CI against it.
196
+ * Compatibility with junit-xml < 1.9. Junit-xml 1.9 was released more than three years ago.
139
197
 
140
198
  Version 6.1.0 — 2023-09-22
141
199
  ==========================
@@ -0,0 +1,8 @@
1
+ devpi-plumber>=0.2.14
2
+ setuptools
3
+ wheel
4
+ wheel-filename>=2.0
5
+ wheel-inspect>=1.8.0
6
+ pip>=1.5.3
7
+ junit-xml>=1.9 # First version to support to_xml_report_file
8
+ pip-requirements-parser>=32.0.1
@@ -5,13 +5,12 @@ Command line interface for brandon
5
5
  """
6
6
 
7
7
  import argparse
8
- import codecs
9
8
  import getpass
10
9
  import locale
11
10
  import logging
12
11
  import os
13
12
 
14
- from junit_xml import TestSuite, TestCase
13
+ from junit_xml import TestSuite, TestCase, to_xml_report_file
15
14
  from devpi_plumber.client import DevpiClient, DevpiClientError
16
15
 
17
16
  from devpi_builder import requirements, wheeler
@@ -125,9 +124,9 @@ class Processor(object):
125
124
 
126
125
  if self._junit_xml:
127
126
  encoding = locale.getpreferredencoding()
128
- with codecs.open(self._junit_xml, 'w', encoding) as output:
127
+ with open(self._junit_xml, 'w', encoding=encoding) as output:
129
128
  test_suite = TestSuite('devpi-builder results', self._results)
130
- TestSuite.to_file(output, [test_suite], encoding=encoding)
129
+ to_xml_report_file(output, [test_suite], encoding=encoding)
131
130
 
132
131
 
133
132
  def main(args=None):
@@ -5,7 +5,7 @@ Functionality for reading specifications of required packages.
5
5
  """
6
6
 
7
7
  import pip_requirements_parser
8
- import pkg_resources
8
+ from packaging.utils import canonicalize_name, canonicalize_version
9
9
 
10
10
 
11
11
  def _extract_project_version(requirement):
@@ -61,10 +61,10 @@ def matched_by_list(package, version, requirements):
61
61
  :param requirements: A list of requirements as read by read_raw()
62
62
  :return: True if the package can be used to fulfil on of the requirements in the file, False otherwise
63
63
  """
64
- version = pkg_resources.safe_version('{}'.format(version))
65
- package = pkg_resources.safe_name(package)
64
+ version = canonicalize_version('{}'.format(version))
65
+ package = canonicalize_name(package)
66
66
  matches = (
67
- package.lower() == pkg_resources.safe_name(requirement.name) and (requirement.specifier.contains(version) if requirement.specifier else 1)
67
+ package == canonicalize_name(requirement.name) and (requirement.specifier.contains(version) if requirement.specifier else True)
68
68
  for requirement in requirements
69
69
  )
70
70
  return any(matches)
@@ -11,9 +11,10 @@ import subprocess
11
11
  import tempfile
12
12
 
13
13
  from packaging import tags
14
- from pkg_resources import Distribution, Requirement
14
+ from packaging.requirements import Requirement
15
+ from packaging.utils import canonicalize_name
16
+ from wheel_filename import ParseError, WheelFilename
15
17
 
16
- from wheel_filename import InvalidFilenameError, parse_wheel_filename
17
18
  from wheel_inspect import inspect_wheel
18
19
  from wheel_inspect.classes import WheelFile
19
20
 
@@ -52,13 +53,14 @@ class Builder(object):
52
53
  :param requirement:str : The requirement to satisfy
53
54
  :param wheels: List of wheels to search.
54
55
  """
55
- req = Requirement.parse(requirement)
56
+ req = Requirement(requirement)
57
+ req_name = canonicalize_name(req.name)
56
58
 
57
59
  matching = []
58
60
  for wheel in wheels:
59
61
  w = wheel.parsed_filename
60
- dist = Distribution(project_name=self._standardize_package_name(w.project), version=w.version)
61
- if dist in req:
62
+ name = canonicalize_name(self._standardize_package_name(w.project))
63
+ if name == req_name and req.specifier.contains(str(w.version)):
62
64
  matching.append(wheel.path)
63
65
  return matching
64
66
 
@@ -120,12 +122,12 @@ def is_compatible(package):
120
122
  Compatibility is based on https://www.python.org/dev/peps/pep-0425/
121
123
  """
122
124
  try:
123
- w = parse_wheel_filename(package)
125
+ w = WheelFilename.parse(package)
124
126
  for systag in tags.sys_tags():
125
127
  for tag in w.tag_triples():
126
128
  if systag in tags.parse_tag(tag):
127
129
  return True
128
- except InvalidFilenameError:
130
+ except ParseError:
129
131
  return False
130
132
 
131
133
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: devpi-builder
3
- Version: 6.1.0
3
+ Version: 7.1.0
4
4
  Summary: Devpi-builder takes a requirements.txt and incrementally fills a devpi index with wheels of the listed python packages.
5
5
  Home-page: https://github.com/blue-yonder/devpi-builder
6
6
  Author: Matthias Bach
@@ -13,22 +13,33 @@ Classifier: Intended Audience :: System Administrators
13
13
  Classifier: License :: OSI Approved :: BSD License
14
14
  Classifier: Topic :: System :: Archiving :: Packaging
15
15
  Classifier: Programming Language :: Python :: 3
16
- Classifier: Programming Language :: Python :: 3.7
17
- Classifier: Programming Language :: Python :: 3.8
18
- Classifier: Programming Language :: Python :: 3.9
19
- Classifier: Programming Language :: Python :: 3.10
20
16
  Classifier: Programming Language :: Python :: 3.11
21
- Requires-Python: >=3.7
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Programming Language :: Python :: 3.15
21
+ Requires-Python: >=3.11
22
22
  Description-Content-Type: text/x-rst
23
23
  License-File: COPYING
24
24
  Requires-Dist: devpi-plumber>=0.2.14
25
25
  Requires-Dist: setuptools
26
26
  Requires-Dist: wheel
27
- Requires-Dist: wheel-filename
28
- Requires-Dist: wheel-inspect>=1.6.0
27
+ Requires-Dist: wheel-filename>=2.0
28
+ Requires-Dist: wheel-inspect>=1.8.0
29
29
  Requires-Dist: pip>=1.5.3
30
- Requires-Dist: junit-xml
30
+ Requires-Dist: junit-xml>=1.9
31
31
  Requires-Dist: pip-requirements-parser>=32.0.1
32
+ Dynamic: author
33
+ Dynamic: author-email
34
+ Dynamic: classifier
35
+ Dynamic: description
36
+ Dynamic: description-content-type
37
+ Dynamic: home-page
38
+ Dynamic: license
39
+ Dynamic: license-file
40
+ Dynamic: requires-dist
41
+ Dynamic: requires-python
42
+ Dynamic: summary
32
43
 
33
44
  =========================
34
45
  Brandon the Devpi Builder
@@ -136,6 +147,53 @@ Changelog
136
147
 
137
148
  This lists the most important changes for each release.
138
149
 
150
+ Version 7.1.0 - 2026-10-22
151
+ ==========================
152
+
153
+ Added
154
+ -----
155
+
156
+ * Verified compatibility with Python 3.15.
157
+ * Compatibility with newer version of setuptools and ``wheel-filename``.
158
+
159
+ Removed
160
+ -------
161
+
162
+ * Compatibility with Python 3.10 is no longer verified.
163
+ * Removed deprecated universal wheel configuration from test fixtures.
164
+
165
+ Changed
166
+ -------
167
+
168
+ * Refreshed the locked test dependencies for Python 3.11+.
169
+ * Requires ``wheel-filename`` 2.0 or newer.
170
+ * JUnit XML reports are written with built-in ``open`` instead of deprecated ``codecs.open``.
171
+
172
+ Removed
173
+ -------
174
+
175
+ * Removed the remaining use of ``pkg_resources``.
176
+
177
+
178
+ Version 7.0.0 - 2026-02-16
179
+ ==========================
180
+
181
+ Added
182
+ -----
183
+
184
+ * Support for Python 3.12 and 3.13.
185
+ * Compatibility with junit-xml >= 2.0.
186
+
187
+ Fixed
188
+ -----
189
+
190
+ * Ensure Setuptools and ``wheel-filename`` are installed in compatible versions.
191
+
192
+ Removed
193
+ -------
194
+
195
+ * Python 3.6 to 3.8 are no longer supported. They likely still works but we will no longer run CI against it.
196
+ * Compatibility with junit-xml < 1.9. Junit-xml 1.9 was released more than three years ago.
139
197
 
140
198
  Version 6.1.0 — 2023-09-22
141
199
  ==========================
@@ -1,15 +1,18 @@
1
1
  .coveragerc
2
2
  .gitignore
3
+ .python-version
3
4
  .pyup.yml
5
+ AGENTS.md
4
6
  CHANGELOG.rst
5
7
  COPYING
6
8
  MANIFEST.in
7
9
  README.rst
8
10
  core-requirements.txt
11
+ pyproject.toml
9
12
  requirements.in
10
13
  requirements.txt
11
- setup.cfg
12
14
  setup.py
15
+ tox.toml
13
16
  .github/workflows/publish.yml
14
17
  .github/workflows/tests.yml
15
18
  devpi_builder/__init__.py
@@ -21,6 +24,8 @@ devpi_builder.egg-info/SOURCES.txt
21
24
  devpi_builder.egg-info/dependency_links.txt
22
25
  devpi_builder.egg-info/entry_points.txt
23
26
  devpi_builder.egg-info/requires.txt
27
+ devpi_builder.egg-info/scm_file_list.json
28
+ devpi_builder.egg-info/scm_version.json
24
29
  devpi_builder.egg-info/top_level.txt
25
30
  tests/test_cli.py
26
31
  tests/test_requirements.py
@@ -39,13 +44,11 @@ tests/fixture/sample_pure_and_non-pure.txt
39
44
  tests/fixture/sample_simple.txt
40
45
  tests/fixture/sample_test_package.txt
41
46
  tests/fixture/sample_vcs.txt
42
- tests/fixture/non-ascii_package/setup.cfg
43
47
  tests/fixture/non-ascii_package/setup.py
44
48
  tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz
45
49
  tests/fixture/non-pure_package/setup.cfg
46
50
  tests/fixture/non-pure_package/setup.py
47
51
  tests/fixture/non-pure_package/dist/test_package-0.1.dev1-cp27-none-linux_x86_64.whl
48
- tests/fixture/pure_package/setup.cfg
49
52
  tests/fixture/pure_package/setup.py
50
53
  tests/fixture/pure_package/dist/test_package-0.1.dev1-py2.py3-none-any.whl
51
54
  tests/fixture/pure_package/test_package/__init__.py
@@ -1,8 +1,8 @@
1
1
  devpi-plumber>=0.2.14
2
2
  setuptools
3
3
  wheel
4
- wheel-filename
5
- wheel-inspect>=1.6.0
4
+ wheel-filename>=2.0
5
+ wheel-inspect>=1.8.0
6
6
  pip>=1.5.3
7
- junit-xml
7
+ junit-xml>=1.9
8
8
  pip-requirements-parser>=32.0.1
@@ -0,0 +1,50 @@
1
+ {
2
+ "files": [
3
+ ".coveragerc",
4
+ ".github/workflows/publish.yml",
5
+ ".github/workflows/tests.yml",
6
+ ".gitignore",
7
+ ".python-version",
8
+ ".pyup.yml",
9
+ "AGENTS.md",
10
+ "CHANGELOG.rst",
11
+ "COPYING",
12
+ "MANIFEST.in",
13
+ "README.rst",
14
+ "core-requirements.txt",
15
+ "devpi_builder/__init__.py",
16
+ "devpi_builder/cli.py",
17
+ "devpi_builder/requirements.py",
18
+ "devpi_builder/wheeler.py",
19
+ "pyproject.toml",
20
+ "requirements.in",
21
+ "requirements.txt",
22
+ "setup.py",
23
+ "tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz",
24
+ "tests/fixture/non-ascii_package/setup.py",
25
+ "tests/fixture/non-pure_package/dist/test_package-0.1.dev1-cp27-none-linux_x86_64.whl",
26
+ "tests/fixture/non-pure_package/setup.cfg",
27
+ "tests/fixture/non-pure_package/setup.py",
28
+ "tests/fixture/pure_package/dist/test_package-0.1.dev1-py2.py3-none-any.whl",
29
+ "tests/fixture/pure_package/setup.py",
30
+ "tests/fixture/pure_package/test_package/__init__.py",
31
+ "tests/fixture/sample_blacklist.txt",
32
+ "tests/fixture/sample_comments.txt",
33
+ "tests/fixture/sample_continue_on_failed.txt",
34
+ "tests/fixture/sample_different_styles.txt",
35
+ "tests/fixture/sample_inexact_version.txt",
36
+ "tests/fixture/sample_junit.txt",
37
+ "tests/fixture/sample_multiple_versions.txt",
38
+ "tests/fixture/sample_multiple_versions_on_line.txt",
39
+ "tests/fixture/sample_no_version.txt",
40
+ "tests/fixture/sample_non-ascii.txt",
41
+ "tests/fixture/sample_pure_and_non-pure.txt",
42
+ "tests/fixture/sample_simple.txt",
43
+ "tests/fixture/sample_test_package.txt",
44
+ "tests/fixture/sample_vcs.txt",
45
+ "tests/test_cli.py",
46
+ "tests/test_requirements.py",
47
+ "tests/test_wheeler.py",
48
+ "tox.toml"
49
+ ]
50
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "7.1.0",
3
+ "distance": 0,
4
+ "node": "gfc196d6642c4e92259b2b51b1949654953dede54",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-10-22"
8
+ }
@@ -0,0 +1,8 @@
1
+ [build-system]
2
+ requires = ["setuptools>=64", "setuptools_scm>=8"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [tool.setuptools_scm]
6
+
7
+ [tool.pytest.ini_options]
8
+ addopts = "--cov-report= --cov=devpi_builder tests"
@@ -1,8 +1,9 @@
1
1
  -r core-requirements.txt
2
2
 
3
3
  setuptools_scm
4
- pytest
4
+ pytest>=6.2 # Minimum version we know yield_fixture to be an alias for fixture
5
5
  pytest-cov
6
6
  pytest-mock
7
7
  mock
8
8
  devpi-plumber[test]>=0.4.3
9
+ legacy-cgi
@@ -1,193 +1,181 @@
1
1
  #
2
- # This file is autogenerated by pip-compile with Python 3.8
2
+ # This file is autogenerated by pip-compile with Python 3.11
3
3
  # by the following command:
4
4
  #
5
- # pip-compile --no-emit-index-url
5
+ # pip-compile --no-emit-index-url --strip-extras --unsafe-package=pip
6
6
  #
7
- aiohttp==3.8.5
8
- # via devpi-server
9
- aiosignal==1.2.0
10
- # via aiohttp
11
- argon2-cffi==21.3.0
7
+ anyio==4.15.1
8
+ # via httpx
9
+ argon2-cffi==25.1.0
12
10
  # via
13
11
  # devpi-server
14
12
  # passlib
15
- argon2-cffi-bindings==21.2.0
13
+ argon2-cffi-bindings==26.1.0
16
14
  # via argon2-cffi
17
- async-timeout==4.0.2
18
- # via aiohttp
19
- attrs==21.4.0
15
+ attrs==26.1.0
20
16
  # via
21
- # aiohttp
22
17
  # devpi-server
23
- # pytest
18
+ # headerparser
24
19
  # wheel-inspect
25
- bleach==5.0.1
26
- # via readme-renderer
27
- build==0.8.0
28
- # via check-manifest
29
- certifi==2023.7.22
30
- # via requests
31
- cffi==1.15.0
32
- # via argon2-cffi-bindings
33
- charset-normalizer==2.0.12
20
+ build==1.6.1
34
21
  # via
35
- # aiohttp
22
+ # check-manifest
23
+ # devpi-client
24
+ certifi==2026.7.22
25
+ # via
26
+ # httpcore
27
+ # httpx
36
28
  # requests
37
- check-manifest==0.48
29
+ cffi==2.1.1
30
+ # via argon2-cffi-bindings
31
+ charset-normalizer==3.5.2
32
+ # via requests
33
+ check-manifest==0.51
38
34
  # via devpi-client
39
- coverage[toml]==6.4.1
35
+ coverage==7.16.2
40
36
  # via pytest-cov
41
37
  defusedxml==0.7.1
42
38
  # via devpi-server
43
- devpi-client==5.2.3
39
+ deprecated==1.3.1
40
+ # via headerparser
41
+ devpi-client==7.3.0
44
42
  # via devpi-plumber
45
- devpi-common==3.6.0
43
+ devpi-common==4.1.1
46
44
  # via
47
45
  # devpi-client
48
46
  # devpi-server
49
- devpi-plumber[test]==0.6.0
47
+ devpi-plumber==0.7.0
50
48
  # via
51
49
  # -r core-requirements.txt
52
50
  # -r requirements.in
53
- devpi-server==6.5.1
51
+ devpi-server==6.20.3
54
52
  # via devpi-plumber
55
- distlib==0.3.4
56
- # via virtualenv
57
- docutils==0.19
53
+ docutils==0.23
58
54
  # via readme-renderer
59
- entry-points-txt==0.1.0
55
+ entry-points-txt==0.3.0
60
56
  # via wheel-inspect
61
- filelock==3.7.1
62
- # via
63
- # tox
64
- # virtualenv
65
- frozenlist==1.3.3
66
- # via
67
- # aiohttp
68
- # aiosignal
69
- headerparser==0.4.0
57
+ h11==0.16.0
58
+ # via httpcore
59
+ headerparser==0.5.2
70
60
  # via wheel-inspect
71
- hupper==1.10.3
61
+ httpcore==1.0.9
62
+ # via httpx
63
+ httpx==0.28.1
64
+ # via devpi-server
65
+ hupper==1.12.1
72
66
  # via pyramid
73
- idna==3.3
67
+ idna==3.20
74
68
  # via
69
+ # anyio
70
+ # httpx
75
71
  # requests
76
- # yarl
77
- iniconfig==1.1.1
78
- # via pytest
79
- itsdangerous==2.1.2
72
+ iniconfig==2.3.1
73
+ # via
74
+ # devpi-client
75
+ # pytest
76
+ itsdangerous==2.2.0
80
77
  # via devpi-server
81
78
  junit-xml==1.9
82
79
  # via -r core-requirements.txt
83
- lazy==1.4
80
+ lazy==2.0
84
81
  # via
85
82
  # devpi-common
86
83
  # devpi-server
87
- mock==4.0.3
84
+ legacy-cgi==2.6.4
88
85
  # via -r requirements.in
89
- multidict==6.0.2
90
- # via
91
- # aiohttp
92
- # yarl
93
- packaging==21.3
86
+ mock==5.2.0
87
+ # via -r requirements.in
88
+ nh3==0.3.7
89
+ # via readme-renderer
90
+ packaging==26.3
94
91
  # via
95
92
  # build
93
+ # packaging-legacy
96
94
  # pip-requirements-parser
97
95
  # pytest
98
96
  # setuptools-scm
99
- # tox
97
+ # vcs-versioning
98
+ # wheel
100
99
  # wheel-inspect
101
- passlib[argon2]==1.7.4
100
+ packaging-legacy==23.0.post0
101
+ # via devpi-common
102
+ passlib==1.7.4
102
103
  # via devpi-server
103
- pastedeploy==2.1.1
104
+ pastedeploy==3.1.0
104
105
  # via plaster-pastedeploy
105
- pep517==0.12.0
106
- # via build
107
106
  pip-requirements-parser==32.0.1
108
107
  # via -r core-requirements.txt
109
- pkginfo==1.8.2
108
+ pkginfo==1.13.1
110
109
  # via devpi-client
111
- plaster==1.0
110
+ plaster==1.1.2
112
111
  # via
113
112
  # plaster-pastedeploy
114
113
  # pyramid
115
- plaster-pastedeploy==0.7
114
+ plaster-pastedeploy==1.0.1
116
115
  # via pyramid
117
- platformdirs==2.5.2
118
- # via
119
- # devpi-server
120
- # virtualenv
121
- pluggy==1.0.0
116
+ platformdirs==4.13.3
122
117
  # via
123
118
  # devpi-client
124
119
  # devpi-server
125
- # pytest
126
- # tox
127
- py==1.11.0
120
+ pluggy==1.7.0
128
121
  # via
129
122
  # devpi-client
130
- # devpi-common
131
123
  # devpi-server
132
124
  # pytest
133
- # tox
134
- pycparser==2.21
125
+ # pytest-cov
126
+ py==1.11.0
127
+ # via devpi-server
128
+ pycparser==3.11
135
129
  # via cffi
136
- pygments==2.15.0
137
- # via readme-renderer
138
- pyparsing==3.0.9
130
+ pygments==2.21.0
139
131
  # via
140
- # packaging
141
- # pip-requirements-parser
142
- pyramid==2.0.2
132
+ # pytest
133
+ # readme-renderer
134
+ pyparsing==3.3.3
135
+ # via pip-requirements-parser
136
+ pyproject-hooks==1.3.3
137
+ # via build
138
+ pyramid==2.1
143
139
  # via devpi-server
144
- pytest==7.1.2
140
+ pytest==9.1.1
145
141
  # via
146
142
  # -r requirements.in
147
143
  # pytest-cov
148
144
  # pytest-mock
149
- pytest-cov==3.0.0
145
+ pytest-cov==7.1.0
150
146
  # via -r requirements.in
151
- pytest-mock==3.10.0
147
+ pytest-mock==3.16.0
152
148
  # via -r requirements.in
153
- python-dateutil==2.8.2
149
+ python-dateutil==2.9.0.post0
154
150
  # via strictyaml
155
- readme-renderer==37.3
151
+ readme-renderer==46.0
156
152
  # via wheel-inspect
157
- repoze-lru==0.7
153
+ repoze-lru==0.8
158
154
  # via devpi-server
159
- requests==2.31.0
155
+ requests==2.34.2
160
156
  # via
157
+ # devpi-client
161
158
  # devpi-common
162
159
  # devpi-plumber
163
- ruamel-yaml==0.17.21
160
+ # devpi-server
161
+ ruamel-yaml==0.19.1
164
162
  # via devpi-server
165
- ruamel-yaml-clib==0.2.7
166
- # via ruamel-yaml
167
- setuptools-scm==6.4.2
163
+ setuptools==81.0.0
164
+ # via
165
+ # -r core-requirements.txt
166
+ # check-manifest
167
+ # devpi-server
168
+ # pyramid
169
+ # setuptools-scm
170
+ # zope-deprecation
171
+ setuptools-scm==10.3.4
168
172
  # via -r requirements.in
169
- six==1.16.0
173
+ six==1.17.0
170
174
  # via
171
- # bleach
172
- # headerparser
173
175
  # junit-xml
174
176
  # python-dateutil
175
- # tox
176
- # virtualenv
177
- strictyaml==1.6.1
177
+ strictyaml==1.7.3
178
178
  # via devpi-server
179
- toml==0.10.2
180
- # via tox
181
- tomli==2.0.1
182
- # via
183
- # build
184
- # check-manifest
185
- # coverage
186
- # pep517
187
- # pytest
188
- # setuptools-scm
189
- tox==3.25.0
190
- # via devpi-client
191
179
  translationstring==1.4
192
180
  # via pyramid
193
181
  twitter-common-contextutil==0.3.11
@@ -196,33 +184,32 @@ twitter-common-dirutil==0.3.11
196
184
  # via twitter-common-contextutil
197
185
  twitter-common-lang==0.3.11
198
186
  # via twitter-common-dirutil
199
- urllib3==1.26.9
187
+ typing-extensions==4.16.0
188
+ # via anyio
189
+ urllib3==2.8.0
200
190
  # via requests
201
- venusian==3.0.0
191
+ vcs-versioning==2.6.0
192
+ # via setuptools-scm
193
+ venusian==3.1.1
202
194
  # via pyramid
203
- virtualenv==20.14.1
204
- # via tox
205
- waitress==2.1.2
195
+ waitress==3.0.2
206
196
  # via devpi-server
207
- webencodings==0.5.1
208
- # via bleach
209
- webob==1.8.7
197
+ webob==1.8.11
210
198
  # via pyramid
211
- wheel==0.38.4
199
+ wheel==0.48.0
212
200
  # via -r core-requirements.txt
213
- wheel-filename==1.4.1
201
+ wheel-filename==2.1.0
214
202
  # via
215
203
  # -r core-requirements.txt
216
204
  # wheel-inspect
217
- wheel-inspect==1.7.1
205
+ wheel-inspect==1.8.0
218
206
  # via -r core-requirements.txt
219
- yarl==1.8.2
220
- # via aiohttp
221
- zope-deprecation==4.4.0
207
+ wrapt==2.5.1
208
+ # via deprecated
209
+ zope-deprecation==6.0
222
210
  # via pyramid
223
- zope-interface==5.4.0
211
+ zope-interface==8.7
224
212
  # via pyramid
225
213
 
226
214
  # The following packages are considered to be unsafe in a requirements file:
227
215
  # pip
228
- # setuptools
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -19,10 +19,7 @@ setup(
19
19
  long_description_content_type='text/x-rst',
20
20
  license='new BSD',
21
21
  install_requires=requirements,
22
- python_requires='>=3.7',
23
- setup_requires=[
24
- 'setuptools_scm',
25
- ],
22
+ python_requires='>=3.11',
26
23
  classifiers=[
27
24
  'Development Status :: 5 - Production/Stable',
28
25
  'Environment :: Console',
@@ -31,11 +28,11 @@ setup(
31
28
  'License :: OSI Approved :: BSD License',
32
29
  'Topic :: System :: Archiving :: Packaging',
33
30
  'Programming Language :: Python :: 3',
34
- 'Programming Language :: Python :: 3.7',
35
- 'Programming Language :: Python :: 3.8',
36
- 'Programming Language :: Python :: 3.9',
37
- 'Programming Language :: Python :: 3.10',
38
31
  'Programming Language :: Python :: 3.11',
32
+ 'Programming Language :: Python :: 3.12',
33
+ 'Programming Language :: Python :: 3.13',
34
+ 'Programming Language :: Python :: 3.14',
35
+ 'Programming Language :: Python :: 3.15',
39
36
  ],
40
37
  entry_points={
41
38
  'console_scripts': [
@@ -3,12 +3,13 @@
3
3
  import xml.etree.ElementTree as ET
4
4
 
5
5
  import pytest
6
+ import requests
6
7
 
7
8
  from mock import patch
8
9
  from devpi_plumber.server import TestServer
9
10
  from devpi_plumber.client import DevpiClient, DevpiClientError
10
11
 
11
- from devpi_builder.cli import main
12
+ from devpi_builder.cli import Processor, main
12
13
  from devpi_builder import wheeler
13
14
 
14
15
 
@@ -26,7 +27,7 @@ INDICES = {
26
27
  }
27
28
 
28
29
 
29
- @pytest.yield_fixture()
30
+ @pytest.fixture()
30
31
  def devpi():
31
32
  with TestServer(USERS, INDICES) as _devpi:
32
33
  yield _devpi
@@ -187,20 +188,36 @@ def test_reports_junit_xml(devpi, tmpdir):
187
188
  _assert_junit_xml_content(junit_filename)
188
189
 
189
190
 
190
- def test_handles_non_ascii_build_output(devpi, tmpdir, monkeypatch):
191
- monkeypatch.setenv('PIP_INDEX_URL', devpi.url + '/' + PURE_INDEX)
191
+ def test_writes_empty_junit_xml_without_devpi(tmpdir):
192
+ junit_filename = str(tmpdir.join('junit.xml'))
192
193
 
193
- with DevpiClient(devpi.server_url + '/' + PURE_INDEX,
194
- USER,
195
- PASSWORD) as client:
196
- client.upload('tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz')
194
+ Processor(None, None, None, junit_xml=junit_filename).build_packages([])
197
195
 
198
- junit_filename = str(tmpdir.join('junit.xml'))
196
+ assert ET.parse(junit_filename).getroot().tag == 'testsuites'
199
197
 
200
- # our main assertion is that the main does not fail
201
- main(['tests/fixture/sample_non-ascii.txt', devpi.url + '/' + INDEX,
202
- '--user={}'.format(USER),
203
- '--password={}'.format(PASSWORD), '--junit-xml', junit_filename])
198
+
199
+ def test_handles_non_ascii_build_output(tmpdir, monkeypatch):
200
+
201
+ with TestServer(USERS, {
202
+ PURE_INDEX: {'bases': '/root/pypi'},
203
+ INDEX: {'bases': ''},
204
+ }) as devpi:
205
+ sdist_index = devpi.url + '/' + PURE_INDEX
206
+
207
+ monkeypatch.setenv('PIP_INDEX_URL', sdist_index)
208
+
209
+ # trigger retrieval of setuptools from upstream as that can take forever
210
+ requests.get(sdist_index + '/+simple/setuptools/', timeout=300).raise_for_status()
211
+
212
+ with DevpiClient(sdist_index, USER, PASSWORD) as client:
213
+ client.upload('tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz')
214
+
215
+ junit_filename = str(tmpdir.join('junit.xml'))
216
+
217
+ # our main assertion is that the main does not fail
218
+ main(['tests/fixture/sample_non-ascii.txt', devpi.url + '/' + INDEX,
219
+ '--user={}'.format(USER),
220
+ '--password={}'.format(PASSWORD), '--junit-xml', junit_filename])
204
221
 
205
222
  # check that the build failure shows up in the build output
206
223
  assert 'No non-ascii 4 you!' in open(junit_filename).read()
@@ -0,0 +1,14 @@
1
+ min_version = "4.0"
2
+ env_list = ["3.11", "3.12", "3.13", "3.14", "3.15"]
3
+
4
+ [env_run_base]
5
+ description = "run tests on {base_python}"
6
+ deps = ["-r requirements.txt", "--no-deps"]
7
+ commands = [["pytest", { replace = "posargs", default = ["--no-cov"], extend = true }]]
8
+
9
+ [env.compile]
10
+ description = "compile dependencies"
11
+ skip_install = true
12
+ deps = ["pip-tools"]
13
+ commands = [["pip-compile", "--no-emit-index-url", "--strip-extras", "--unsafe-package", "pip", { replace = "posargs", extend = true }]]
14
+ base_python = "3.11"
@@ -1,8 +0,0 @@
1
- devpi-plumber>=0.2.14
2
- setuptools
3
- wheel
4
- wheel-filename
5
- wheel-inspect>=1.6.0
6
- pip>=1.5.3
7
- junit-xml
8
- pip-requirements-parser>=32.0.1
@@ -1,10 +0,0 @@
1
- [tool:pytest]
2
- addopts = --cov-report= --cov=devpi_builder tests
3
-
4
- [aliases]
5
- test = pytest
6
-
7
- [egg_info]
8
- tag_build =
9
- tag_date = 0
10
-
@@ -1,2 +0,0 @@
1
- [wheel]
2
- universal=1
@@ -1,2 +0,0 @@
1
- [wheel]
2
- universal=1
File without changes
File without changes
File without changes
File without changes
File without changes