devpi-builder 7.0.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-7.0.0 → devpi_builder-7.1.0}/.github/workflows/tests.yml +3 -16
  2. {devpi_builder-7.0.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-7.0.0 → devpi_builder-7.1.0}/CHANGELOG.rst +27 -0
  6. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/PKG-INFO +34 -7
  7. devpi_builder-7.1.0/core-requirements.txt +8 -0
  8. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/devpi_builder/cli.py +1 -2
  9. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/devpi_builder/requirements.py +4 -4
  10. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/devpi_builder/wheeler.py +9 -7
  11. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/devpi_builder.egg-info/PKG-INFO +34 -7
  12. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/devpi_builder.egg-info/SOURCES.txt +4 -2
  13. {devpi_builder-7.0.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.0.0 → devpi_builder-7.1.0}/requirements.txt +66 -75
  17. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/setup.py +3 -3
  18. devpi_builder-7.1.0/tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz +0 -0
  19. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/test_cli.py +9 -1
  20. devpi_builder-7.1.0/tox.toml +14 -0
  21. devpi_builder-7.0.0/.python-version +0 -1
  22. devpi_builder-7.0.0/core-requirements.txt +0 -8
  23. devpi_builder-7.0.0/tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz +0 -0
  24. devpi_builder-7.0.0/tests/fixture/non-ascii_package/setup.cfg +0 -2
  25. devpi_builder-7.0.0/tests/fixture/pure_package/setup.cfg +0 -2
  26. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/.coveragerc +0 -0
  27. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/.github/workflows/publish.yml +0 -0
  28. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/.pyup.yml +0 -0
  29. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/COPYING +0 -0
  30. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/MANIFEST.in +0 -0
  31. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/README.rst +0 -0
  32. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/devpi_builder/__init__.py +0 -0
  33. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/devpi_builder.egg-info/dependency_links.txt +0 -0
  34. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/devpi_builder.egg-info/entry_points.txt +0 -0
  35. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/devpi_builder.egg-info/top_level.txt +0 -0
  36. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/pyproject.toml +0 -0
  37. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/requirements.in +0 -0
  38. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/setup.cfg +0 -0
  39. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/non-ascii_package/setup.py +0 -0
  40. {devpi_builder-7.0.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-7.0.0 → devpi_builder-7.1.0}/tests/fixture/non-pure_package/setup.cfg +0 -0
  42. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/non-pure_package/setup.py +0 -0
  43. {devpi_builder-7.0.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-7.0.0 → devpi_builder-7.1.0}/tests/fixture/pure_package/setup.py +0 -0
  45. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/pure_package/test_package/__init__.py +0 -0
  46. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_blacklist.txt +0 -0
  47. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_comments.txt +0 -0
  48. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_continue_on_failed.txt +0 -0
  49. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_different_styles.txt +0 -0
  50. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_inexact_version.txt +0 -0
  51. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_junit.txt +0 -0
  52. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_multiple_versions.txt +0 -0
  53. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_multiple_versions_on_line.txt +0 -0
  54. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_no_version.txt +0 -0
  55. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_non-ascii.txt +0 -0
  56. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_pure_and_non-pure.txt +0 -0
  57. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_simple.txt +0 -0
  58. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_test_package.txt +0 -0
  59. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/fixture/sample_vcs.txt +0 -0
  60. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/test_requirements.py +0 -0
  61. {devpi_builder-7.0.0 → devpi_builder-7.1.0}/tests/test_wheeler.py +0 -0
@@ -12,7 +12,7 @@ jobs:
12
12
  strategy:
13
13
  fail-fast: false
14
14
  matrix:
15
- python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']
15
+ python-version: ['3.11', '3.12', '3.13', '3.14', '3.15']
16
16
  steps:
17
17
  - uses: actions/checkout@v3
18
18
  - name: Set up Python ${{ matrix.python-version }}
@@ -22,25 +22,12 @@ jobs:
22
22
  - name: Install dependencies
23
23
  run: |
24
24
  python -m pip install --upgrade pip
25
- # requirements.txt omits setuptools (pip-compile); setuptools<82 needed for pkg_resources (devpi-server)
26
- python -m pip install 'setuptools<82'
27
- python -m pip install -r requirements.txt
28
- python -m pip install --no-deps -e .
29
- if [ "${{ matrix.python-version }}" != "3.13" ]; then # workaround for TheKevJames/coveralls-python#523
30
- python -m pip install coveralls
31
- fi
25
+ python -m pip install tox coveralls
32
26
  python -m pip freeze
33
- python -m pip --version
34
- python -c 'import setuptools; print(f"setuptools=={setuptools.__version__}")'
35
27
  - name: Test with pytest
36
28
  run: |
37
- if [ "${{ matrix.python-version }}" == "3.13" ]; then
38
- pytest --no-cov # workaround for TheKevJames/coveralls-python#523
39
- else
40
- pytest
41
- fi
29
+ tox -e ${{ matrix.python-version }} -- --cov
42
30
  - name: Upload coverage data
43
- if: matrix.python-version != '3.13' # workaround for TheKevJames/coveralls-python#523
44
31
  run: |
45
32
  coveralls --service=github
46
33
  env:
@@ -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,33 @@ 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
+
7
34
 
8
35
  Version 7.0.0 - 2026-02-16
9
36
  ==========================
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devpi-builder
3
- Version: 7.0.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,19 +13,19 @@ 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.9
17
- Classifier: Programming Language :: Python :: 3.10
18
16
  Classifier: Programming Language :: Python :: 3.11
19
17
  Classifier: Programming Language :: Python :: 3.12
20
18
  Classifier: Programming Language :: Python :: 3.13
21
- Requires-Python: >=3.9
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
- Requires-Dist: setuptools<82
25
+ Requires-Dist: setuptools
26
26
  Requires-Dist: wheel
27
- Requires-Dist: wheel-filename<2
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
30
  Requires-Dist: junit-xml>=1.9
31
31
  Requires-Dist: pip-requirements-parser>=32.0.1
@@ -147,6 +147,33 @@ Changelog
147
147
 
148
148
  This lists the most important changes for each release.
149
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
+
150
177
 
151
178
  Version 7.0.0 - 2026-02-16
152
179
  ==========================
@@ -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,7 +5,6 @@ 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
@@ -125,7 +124,7 @@ 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
129
  to_xml_report_file(output, [test_suite], encoding=encoding)
131
130
 
@@ -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
1
  Metadata-Version: 2.4
2
2
  Name: devpi-builder
3
- Version: 7.0.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,19 +13,19 @@ 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.9
17
- Classifier: Programming Language :: Python :: 3.10
18
16
  Classifier: Programming Language :: Python :: 3.11
19
17
  Classifier: Programming Language :: Python :: 3.12
20
18
  Classifier: Programming Language :: Python :: 3.13
21
- Requires-Python: >=3.9
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
- Requires-Dist: setuptools<82
25
+ Requires-Dist: setuptools
26
26
  Requires-Dist: wheel
27
- Requires-Dist: wheel-filename<2
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
30
  Requires-Dist: junit-xml>=1.9
31
31
  Requires-Dist: pip-requirements-parser>=32.0.1
@@ -147,6 +147,33 @@ Changelog
147
147
 
148
148
  This lists the most important changes for each release.
149
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
+
150
177
 
151
178
  Version 7.0.0 - 2026-02-16
152
179
  ==========================
@@ -2,6 +2,7 @@
2
2
  .gitignore
3
3
  .python-version
4
4
  .pyup.yml
5
+ AGENTS.md
5
6
  CHANGELOG.rst
6
7
  COPYING
7
8
  MANIFEST.in
@@ -11,6 +12,7 @@ pyproject.toml
11
12
  requirements.in
12
13
  requirements.txt
13
14
  setup.py
15
+ tox.toml
14
16
  .github/workflows/publish.yml
15
17
  .github/workflows/tests.yml
16
18
  devpi_builder/__init__.py
@@ -22,6 +24,8 @@ devpi_builder.egg-info/SOURCES.txt
22
24
  devpi_builder.egg-info/dependency_links.txt
23
25
  devpi_builder.egg-info/entry_points.txt
24
26
  devpi_builder.egg-info/requires.txt
27
+ devpi_builder.egg-info/scm_file_list.json
28
+ devpi_builder.egg-info/scm_version.json
25
29
  devpi_builder.egg-info/top_level.txt
26
30
  tests/test_cli.py
27
31
  tests/test_requirements.py
@@ -40,13 +44,11 @@ tests/fixture/sample_pure_and_non-pure.txt
40
44
  tests/fixture/sample_simple.txt
41
45
  tests/fixture/sample_test_package.txt
42
46
  tests/fixture/sample_vcs.txt
43
- tests/fixture/non-ascii_package/setup.cfg
44
47
  tests/fixture/non-ascii_package/setup.py
45
48
  tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz
46
49
  tests/fixture/non-pure_package/setup.cfg
47
50
  tests/fixture/non-pure_package/setup.py
48
51
  tests/fixture/non-pure_package/dist/test_package-0.1.dev1-cp27-none-linux_x86_64.whl
49
- tests/fixture/pure_package/setup.cfg
50
52
  tests/fixture/pure_package/setup.py
51
53
  tests/fixture/pure_package/dist/test_package-0.1.dev1-py2.py3-none-any.whl
52
54
  tests/fixture/pure_package/test_package/__init__.py
@@ -1,8 +1,8 @@
1
1
  devpi-plumber>=0.2.14
2
- setuptools<82
2
+ setuptools
3
3
  wheel
4
- wheel-filename<2
5
- wheel-inspect>=1.6.0
4
+ wheel-filename>=2.0
5
+ wheel-inspect>=1.8.0
6
6
  pip>=1.5.3
7
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
+ }
@@ -1,46 +1,46 @@
1
1
  #
2
- # This file is autogenerated by pip-compile with Python 3.9
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 --strip-extras
5
+ # pip-compile --no-emit-index-url --strip-extras --unsafe-package=pip
6
6
  #
7
- anyio==4.9.0
7
+ anyio==4.15.1
8
8
  # via httpx
9
- argon2-cffi==23.1.0
9
+ argon2-cffi==25.1.0
10
10
  # via
11
11
  # devpi-server
12
12
  # passlib
13
- argon2-cffi-bindings==21.2.0
13
+ argon2-cffi-bindings==26.1.0
14
14
  # via argon2-cffi
15
- attrs==25.3.0
15
+ attrs==26.1.0
16
16
  # via
17
17
  # devpi-server
18
18
  # headerparser
19
19
  # wheel-inspect
20
- build==1.2.2.post1
20
+ build==1.6.1
21
21
  # via
22
22
  # check-manifest
23
23
  # devpi-client
24
- certifi==2025.1.31
24
+ certifi==2026.7.22
25
25
  # via
26
26
  # httpcore
27
27
  # httpx
28
28
  # requests
29
- cffi==1.17.1
29
+ cffi==2.1.1
30
30
  # via argon2-cffi-bindings
31
- charset-normalizer==3.4.1
31
+ charset-normalizer==3.5.2
32
32
  # via requests
33
- check-manifest==0.50
33
+ check-manifest==0.51
34
34
  # via devpi-client
35
- coverage==7.8.0
35
+ coverage==7.16.2
36
36
  # via pytest-cov
37
37
  defusedxml==0.7.1
38
38
  # via devpi-server
39
- deprecated==1.2.18
39
+ deprecated==1.3.1
40
40
  # via headerparser
41
- devpi-client==7.2.0
41
+ devpi-client==7.3.0
42
42
  # via devpi-plumber
43
- devpi-common==4.0.4
43
+ devpi-common==4.1.1
44
44
  # via
45
45
  # devpi-client
46
46
  # devpi-server
@@ -48,16 +48,12 @@ devpi-plumber==0.7.0
48
48
  # via
49
49
  # -r core-requirements.txt
50
50
  # -r requirements.in
51
- devpi-server==6.14.0
51
+ devpi-server==6.20.3
52
52
  # via devpi-plumber
53
- docutils==0.21.2
53
+ docutils==0.23
54
54
  # via readme-renderer
55
- entry-points-txt==0.2.1
55
+ entry-points-txt==0.3.0
56
56
  # via wheel-inspect
57
- exceptiongroup==1.2.2
58
- # via
59
- # anyio
60
- # pytest
61
57
  h11==0.16.0
62
58
  # via httpcore
63
59
  headerparser==0.5.2
@@ -68,16 +64,12 @@ httpx==0.28.1
68
64
  # via devpi-server
69
65
  hupper==1.12.1
70
66
  # via pyramid
71
- idna==3.10
67
+ idna==3.20
72
68
  # via
73
69
  # anyio
74
70
  # httpx
75
71
  # requests
76
- importlib-metadata==8.6.1
77
- # via
78
- # build
79
- # setuptools-scm
80
- iniconfig==2.1.0
72
+ iniconfig==2.3.1
81
73
  # via
82
74
  # devpi-client
83
75
  # pytest
@@ -85,7 +77,7 @@ itsdangerous==2.2.0
85
77
  # via devpi-server
86
78
  junit-xml==1.9
87
79
  # via -r core-requirements.txt
88
- lazy==1.6
80
+ lazy==2.0
89
81
  # via
90
82
  # devpi-common
91
83
  # devpi-server
@@ -93,15 +85,16 @@ legacy-cgi==2.6.4
93
85
  # via -r requirements.in
94
86
  mock==5.2.0
95
87
  # via -r requirements.in
96
- nh3==0.2.21
88
+ nh3==0.3.7
97
89
  # via readme-renderer
98
- packaging==25.0
90
+ packaging==26.3
99
91
  # via
100
92
  # build
101
93
  # packaging-legacy
102
94
  # pip-requirements-parser
103
95
  # pytest
104
96
  # setuptools-scm
97
+ # vcs-versioning
105
98
  # wheel
106
99
  # wheel-inspect
107
100
  packaging-legacy==23.0.post0
@@ -112,7 +105,7 @@ pastedeploy==3.1.0
112
105
  # via plaster-pastedeploy
113
106
  pip-requirements-parser==32.0.1
114
107
  # via -r core-requirements.txt
115
- pkginfo==1.12.1.2
108
+ pkginfo==1.13.1
116
109
  # via devpi-client
117
110
  plaster==1.1.2
118
111
  # via
@@ -120,68 +113,69 @@ plaster==1.1.2
120
113
  # pyramid
121
114
  plaster-pastedeploy==1.0.1
122
115
  # via pyramid
123
- platformdirs==4.3.7
116
+ platformdirs==4.13.3
124
117
  # via
125
118
  # devpi-client
126
119
  # devpi-server
127
- pluggy==1.5.0
120
+ pluggy==1.7.0
128
121
  # via
129
122
  # devpi-client
130
123
  # devpi-server
131
124
  # pytest
125
+ # pytest-cov
132
126
  py==1.11.0
133
127
  # via devpi-server
134
- pycparser==2.22
128
+ pycparser==3.11
135
129
  # via cffi
136
- pygments==2.19.1
137
- # via readme-renderer
138
- pyparsing==3.2.3
130
+ pygments==2.21.0
131
+ # via
132
+ # pytest
133
+ # readme-renderer
134
+ pyparsing==3.3.3
139
135
  # via pip-requirements-parser
140
- pyproject-hooks==1.2.0
136
+ pyproject-hooks==1.3.3
141
137
  # via build
142
- pyramid==2.0.2
138
+ pyramid==2.1
143
139
  # via devpi-server
144
- pytest==8.3.5
140
+ pytest==9.1.1
145
141
  # via
146
142
  # -r requirements.in
147
143
  # pytest-cov
148
144
  # pytest-mock
149
- pytest-cov==6.1.1
145
+ pytest-cov==7.1.0
150
146
  # via -r requirements.in
151
- pytest-mock==3.14.0
147
+ pytest-mock==3.16.0
152
148
  # via -r requirements.in
153
149
  python-dateutil==2.9.0.post0
154
150
  # via strictyaml
155
- readme-renderer==44.0
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.32.4
155
+ requests==2.34.2
160
156
  # via
157
+ # devpi-client
161
158
  # devpi-common
162
159
  # devpi-plumber
163
- ruamel-yaml==0.18.10
160
+ # devpi-server
161
+ ruamel-yaml==0.19.1
164
162
  # via devpi-server
165
- ruamel-yaml-clib==0.2.12
166
- # via ruamel-yaml
167
- setuptools-scm==8.3.1
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
173
  six==1.17.0
170
174
  # via
171
175
  # junit-xml
172
176
  # python-dateutil
173
- sniffio==1.3.1
174
- # via anyio
175
177
  strictyaml==1.7.3
176
178
  # via devpi-server
177
- tomli==2.2.1
178
- # via
179
- # build
180
- # check-manifest
181
- # coverage
182
- # devpi-client
183
- # pytest
184
- # setuptools-scm
185
179
  translationstring==1.4
186
180
  # via pyramid
187
181
  twitter-common-contextutil==0.3.11
@@ -190,35 +184,32 @@ twitter-common-dirutil==0.3.11
190
184
  # via twitter-common-contextutil
191
185
  twitter-common-lang==0.3.11
192
186
  # via twitter-common-dirutil
193
- typing-extensions==4.13.2
194
- # via
195
- # anyio
196
- # setuptools-scm
197
- urllib3==2.6.3
187
+ typing-extensions==4.16.0
188
+ # via anyio
189
+ urllib3==2.8.0
198
190
  # via requests
191
+ vcs-versioning==2.6.0
192
+ # via setuptools-scm
199
193
  venusian==3.1.1
200
194
  # via pyramid
201
195
  waitress==3.0.2
202
196
  # via devpi-server
203
- webob==1.8.9
197
+ webob==1.8.11
204
198
  # via pyramid
205
- wheel==0.46.2
199
+ wheel==0.48.0
206
200
  # via -r core-requirements.txt
207
- wheel-filename==1.4.2
201
+ wheel-filename==2.1.0
208
202
  # via
209
203
  # -r core-requirements.txt
210
204
  # wheel-inspect
211
- wheel-inspect==1.7.2
205
+ wheel-inspect==1.8.0
212
206
  # via -r core-requirements.txt
213
- wrapt==1.17.2
207
+ wrapt==2.5.1
214
208
  # via deprecated
215
- zipp==3.21.0
216
- # via importlib-metadata
217
- zope-deprecation==5.1
209
+ zope-deprecation==6.0
218
210
  # via pyramid
219
- zope-interface==7.2
211
+ zope-interface==8.7
220
212
  # via pyramid
221
213
 
222
214
  # The following packages are considered to be unsafe in a requirements file:
223
215
  # pip
224
- # setuptools
@@ -19,7 +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.9',
22
+ python_requires='>=3.11',
23
23
  classifiers=[
24
24
  'Development Status :: 5 - Production/Stable',
25
25
  'Environment :: Console',
@@ -28,11 +28,11 @@ setup(
28
28
  'License :: OSI Approved :: BSD License',
29
29
  'Topic :: System :: Archiving :: Packaging',
30
30
  'Programming Language :: Python :: 3',
31
- 'Programming Language :: Python :: 3.9',
32
- 'Programming Language :: Python :: 3.10',
33
31
  'Programming Language :: Python :: 3.11',
34
32
  'Programming Language :: Python :: 3.12',
35
33
  'Programming Language :: Python :: 3.13',
34
+ 'Programming Language :: Python :: 3.14',
35
+ 'Programming Language :: Python :: 3.15',
36
36
  ],
37
37
  entry_points={
38
38
  'console_scripts': [
@@ -9,7 +9,7 @@ from mock import patch
9
9
  from devpi_plumber.server import TestServer
10
10
  from devpi_plumber.client import DevpiClient, DevpiClientError
11
11
 
12
- from devpi_builder.cli import main
12
+ from devpi_builder.cli import Processor, main
13
13
  from devpi_builder import wheeler
14
14
 
15
15
 
@@ -188,6 +188,14 @@ def test_reports_junit_xml(devpi, tmpdir):
188
188
  _assert_junit_xml_content(junit_filename)
189
189
 
190
190
 
191
+ def test_writes_empty_junit_xml_without_devpi(tmpdir):
192
+ junit_filename = str(tmpdir.join('junit.xml'))
193
+
194
+ Processor(None, None, None, junit_xml=junit_filename).build_packages([])
195
+
196
+ assert ET.parse(junit_filename).getroot().tag == 'testsuites'
197
+
198
+
191
199
  def test_handles_non_ascii_build_output(tmpdir, monkeypatch):
192
200
 
193
201
  with TestServer(USERS, {
@@ -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 +0,0 @@
1
- 3.9
@@ -1,8 +0,0 @@
1
- devpi-plumber>=0.2.14
2
- setuptools<82 # setuptools 82 drops pkg_resources
3
- wheel
4
- wheel-filename<2 # wheel-filename 2 breaks imports of InvalidFilenameError, parse_wheel_filename
5
- wheel-inspect>=1.6.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
@@ -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
File without changes