devpi-builder 6.0.0__tar.gz → 7.0.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 (57) hide show
  1. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/.github/workflows/tests.yml +13 -3
  2. devpi_builder-7.0.0/.python-version +1 -0
  3. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/CHANGELOG.rst +34 -0
  4. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/PKG-INFO +58 -5
  5. devpi_builder-7.0.0/core-requirements.txt +8 -0
  6. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/devpi_builder/cli.py +4 -3
  7. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/devpi_builder/requirements.py +16 -13
  8. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/devpi_builder/wheeler.py +10 -3
  9. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/devpi_builder.egg-info/PKG-INFO +58 -5
  10. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/devpi_builder.egg-info/SOURCES.txt +3 -1
  11. devpi_builder-7.0.0/devpi_builder.egg-info/requires.txt +8 -0
  12. devpi_builder-7.0.0/pyproject.toml +8 -0
  13. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/requirements.in +2 -1
  14. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/requirements.txt +116 -111
  15. devpi_builder-7.0.0/setup.cfg +4 -0
  16. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/setup.py +3 -6
  17. devpi_builder-7.0.0/tests/fixture/sample_vcs.txt +3 -0
  18. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/test_cli.py +22 -13
  19. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/test_requirements.py +10 -1
  20. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/test_wheeler.py +12 -2
  21. devpi-builder-6.0.0/core-requirements.txt +0 -7
  22. devpi-builder-6.0.0/devpi_builder.egg-info/requires.txt +0 -7
  23. devpi-builder-6.0.0/setup.cfg +0 -10
  24. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/.coveragerc +0 -0
  25. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/.github/workflows/publish.yml +0 -0
  26. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/.gitignore +0 -0
  27. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/.pyup.yml +0 -0
  28. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/COPYING +0 -0
  29. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/MANIFEST.in +0 -0
  30. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/README.rst +0 -0
  31. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/devpi_builder/__init__.py +0 -0
  32. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/devpi_builder.egg-info/dependency_links.txt +0 -0
  33. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/devpi_builder.egg-info/entry_points.txt +0 -0
  34. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/devpi_builder.egg-info/top_level.txt +0 -0
  35. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz +0 -0
  36. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/non-ascii_package/setup.cfg +0 -0
  37. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/non-ascii_package/setup.py +0 -0
  38. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/non-pure_package/dist/test_package-0.1.dev1-cp27-none-linux_x86_64.whl +0 -0
  39. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/non-pure_package/setup.cfg +0 -0
  40. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/non-pure_package/setup.py +0 -0
  41. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/pure_package/dist/test_package-0.1.dev1-py2.py3-none-any.whl +0 -0
  42. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/pure_package/setup.cfg +0 -0
  43. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/pure_package/setup.py +0 -0
  44. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/pure_package/test_package/__init__.py +0 -0
  45. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_blacklist.txt +0 -0
  46. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_comments.txt +0 -0
  47. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_continue_on_failed.txt +0 -0
  48. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_different_styles.txt +0 -0
  49. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_inexact_version.txt +0 -0
  50. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_junit.txt +0 -0
  51. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_multiple_versions.txt +0 -0
  52. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_multiple_versions_on_line.txt +0 -0
  53. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_no_version.txt +0 -0
  54. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_non-ascii.txt +0 -0
  55. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_pure_and_non-pure.txt +0 -0
  56. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_simple.txt +0 -0
  57. {devpi-builder-6.0.0 → devpi_builder-7.0.0}/tests/fixture/sample_test_package.txt +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.9', '3.10', '3.11', '3.12', '3.13']
15
16
  steps:
16
17
  - uses: actions/checkout@v3
17
18
  - name: Set up Python ${{ matrix.python-version }}
@@ -21,16 +22,25 @@ jobs:
21
22
  - name: Install dependencies
22
23
  run: |
23
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'
24
27
  python -m pip install -r requirements.txt
25
28
  python -m pip install --no-deps -e .
26
- python -m pip install coveralls
29
+ if [ "${{ matrix.python-version }}" != "3.13" ]; then # workaround for TheKevJames/coveralls-python#523
30
+ python -m pip install coveralls
31
+ fi
27
32
  python -m pip freeze
28
33
  python -m pip --version
29
34
  python -c 'import setuptools; print(f"setuptools=={setuptools.__version__}")'
30
35
  - name: Test with pytest
31
36
  run: |
32
- pytest
37
+ if [ "${{ matrix.python-version }}" == "3.13" ]; then
38
+ pytest --no-cov # workaround for TheKevJames/coveralls-python#523
39
+ else
40
+ pytest
41
+ fi
33
42
  - name: Upload coverage data
43
+ if: matrix.python-version != '3.13' # workaround for TheKevJames/coveralls-python#523
34
44
  run: |
35
45
  coveralls --service=github
36
46
  env:
@@ -0,0 +1 @@
1
+ 3.9
@@ -5,6 +5,40 @@ Changelog
5
5
  This lists the most important changes for each release.
6
6
 
7
7
 
8
+ Version 7.0.0 - 2026-02-16
9
+ ==========================
10
+
11
+ Added
12
+ -----
13
+
14
+ * Support for Python 3.12 and 3.13.
15
+ * Compatibility with junit-xml >= 2.0.
16
+
17
+ Fixed
18
+ -----
19
+
20
+ * Ensure Setuptools and ``wheel-filename`` are installed in compatible versions.
21
+
22
+ Removed
23
+ -------
24
+
25
+ * Python 3.6 to 3.8 are no longer supported. They likely still works but we will no longer run CI against it.
26
+ * Compatibility with junit-xml < 1.9. Junit-xml 1.9 was released more than three years ago.
27
+
28
+ Version 6.1.0 — 2023-09-22
29
+ ==========================
30
+
31
+ Added
32
+ -----
33
+
34
+ * Support using VCS URLs in requirements files.
35
+
36
+ Fixed
37
+ -----
38
+
39
+ * Building wheels for packages like ``zope-event`` that normalise the project name using dots instead of underscores is no longer broken.
40
+
41
+
8
42
  Version 6.0.0 — 2023-06-09
9
43
  ==========================
10
44
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: devpi-builder
3
- Version: 6.0.0
3
+ Version: 7.0.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,14 +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
16
  Classifier: Programming Language :: Python :: 3.9
19
17
  Classifier: Programming Language :: Python :: 3.10
20
18
  Classifier: Programming Language :: Python :: 3.11
21
- Requires-Python: >=3.7
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Requires-Python: >=3.9
22
22
  Description-Content-Type: text/x-rst
23
23
  License-File: COPYING
24
+ Requires-Dist: devpi-plumber>=0.2.14
25
+ Requires-Dist: setuptools<82
26
+ Requires-Dist: wheel
27
+ Requires-Dist: wheel-filename<2
28
+ Requires-Dist: wheel-inspect>=1.6.0
29
+ Requires-Dist: pip>=1.5.3
30
+ Requires-Dist: junit-xml>=1.9
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
24
43
 
25
44
  =========================
26
45
  Brandon the Devpi Builder
@@ -129,6 +148,40 @@ Changelog
129
148
  This lists the most important changes for each release.
130
149
 
131
150
 
151
+ Version 7.0.0 - 2026-02-16
152
+ ==========================
153
+
154
+ Added
155
+ -----
156
+
157
+ * Support for Python 3.12 and 3.13.
158
+ * Compatibility with junit-xml >= 2.0.
159
+
160
+ Fixed
161
+ -----
162
+
163
+ * Ensure Setuptools and ``wheel-filename`` are installed in compatible versions.
164
+
165
+ Removed
166
+ -------
167
+
168
+ * Python 3.6 to 3.8 are no longer supported. They likely still works but we will no longer run CI against it.
169
+ * Compatibility with junit-xml < 1.9. Junit-xml 1.9 was released more than three years ago.
170
+
171
+ Version 6.1.0 — 2023-09-22
172
+ ==========================
173
+
174
+ Added
175
+ -----
176
+
177
+ * Support using VCS URLs in requirements files.
178
+
179
+ Fixed
180
+ -----
181
+
182
+ * Building wheels for packages like ``zope-event`` that normalise the project name using dots instead of underscores is no longer broken.
183
+
184
+
132
185
  Version 6.0.0 — 2023-06-09
133
186
  ==========================
134
187
 
@@ -0,0 +1,8 @@
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
@@ -11,7 +11,7 @@ import locale
11
11
  import logging
12
12
  import os
13
13
 
14
- from junit_xml import TestSuite, TestCase
14
+ from junit_xml import TestSuite, TestCase, to_xml_report_file
15
15
  from devpi_plumber.client import DevpiClient, DevpiClientError
16
16
 
17
17
  from devpi_builder import requirements, wheeler
@@ -114,7 +114,8 @@ class Processor(object):
114
114
 
115
115
  for package, version in packages:
116
116
  if self._should_package_be_build(package, version):
117
- logger.info('Building %s %s', package, version)
117
+ msg = ('Building %s %s', package, version) if version else ('Building %s', package)
118
+ logger.info(*msg)
118
119
  try:
119
120
  wheel_file = self._builder(package, version)
120
121
  self._upload_package(package, version, wheel_file)
@@ -126,7 +127,7 @@ class Processor(object):
126
127
  encoding = locale.getpreferredencoding()
127
128
  with codecs.open(self._junit_xml, 'w', encoding) as output:
128
129
  test_suite = TestSuite('devpi-builder results', self._results)
129
- TestSuite.to_file(output, [test_suite], encoding=encoding)
130
+ to_xml_report_file(output, [test_suite], encoding=encoding)
130
131
 
131
132
 
132
133
  def main(args=None):
@@ -4,6 +4,7 @@
4
4
  Functionality for reading specifications of required packages.
5
5
  """
6
6
 
7
+ import pip_requirements_parser
7
8
  import pkg_resources
8
9
 
9
10
 
@@ -14,23 +15,25 @@ def _extract_project_version(requirement):
14
15
  :param requirement: A pkg_config Requirement
15
16
  :return: Pair of project_name and version
16
17
  """
17
- specs = requirement.specs
18
- if len(specs) == 1:
19
- spec = specs[0]
20
- if spec[0] == '==':
21
- return requirement.project_name, spec[1]
22
- else:
23
- raise ValueError('Versions must be specified exactly. "{}" is not an exact version specification.'.format(requirement))
24
- elif len(specs) > 1:
25
- raise ValueError('Multiple version specifications on a single line are not supported.')
18
+ if requirement.is_vcs_url:
19
+ return requirement.line, None
20
+ if not requirement.specifier:
21
+ raise ValueError('Version specification is missing for "{}".'.format(requirement.line))
26
22
  else:
27
- raise ValueError('Version specification is missing for "{}".'.format(requirement))
23
+ if len(requirement.specifier) == 1 and requirement.is_pinned:
24
+ return requirement.name, requirement.get_pinned_version
25
+ elif len(requirement.specifier) == 1 and not requirement.is_pinned:
26
+ raise ValueError('Versions must be specified exactly. "{}" is not an exact version specification.'.format(requirement.line))
27
+ elif len(requirement.specifier) > 1:
28
+ raise ValueError('Multiple version specifications on a single line are not supported.')
28
29
 
29
30
 
30
31
  def read_raw(filename):
31
32
  if filename:
32
- with open(filename) as requirements_file:
33
- return list(pkg_resources.parse_requirements(requirements_file))
33
+ rf = pip_requirements_parser.RequirementsFile.from_file(filename)
34
+ if rf.invalid_lines:
35
+ raise ValueError("There are invalid lines in requirements file: \n", "\n".join(line.dumps() for line in rf.invalid_lines))
36
+ return rf.requirements
34
37
  else:
35
38
  return []
36
39
 
@@ -61,7 +64,7 @@ def matched_by_list(package, version, requirements):
61
64
  version = pkg_resources.safe_version('{}'.format(version))
62
65
  package = pkg_resources.safe_name(package)
63
66
  matches = (
64
- package.lower() == requirement.key and version in requirement
67
+ package.lower() == pkg_resources.safe_name(requirement.name) and (requirement.specifier.contains(version) if requirement.specifier else 1)
65
68
  for requirement in requirements
66
69
  )
67
70
  return any(matches)
@@ -19,6 +19,7 @@ from wheel_inspect.classes import WheelFile
19
19
 
20
20
  class BuildError(Exception):
21
21
  def __init__(self, package, version, root_exception=None):
22
+ version = version or ""
22
23
  super(BuildError, self).__init__('Failed to create wheel for {} {}:\n{}\nOutput:\n{}'.format(
23
24
  package,
24
25
  version,
@@ -40,6 +41,10 @@ class Builder(object):
40
41
  def __exit__(self, exc_type, exc_val, exc_tb):
41
42
  shutil.rmtree(self.scratch_dir)
42
43
 
44
+ @staticmethod
45
+ def _standardize_package_name(name):
46
+ return name.replace(".", "-")
47
+
43
48
  def _matches_requirement(self, requirement, wheels):
44
49
  """
45
50
  List wheels matching a requirement.
@@ -52,7 +57,7 @@ class Builder(object):
52
57
  matching = []
53
58
  for wheel in wheels:
54
59
  w = wheel.parsed_filename
55
- dist = Distribution(project_name=w.project, version=w.version)
60
+ dist = Distribution(project_name=self._standardize_package_name(w.project), version=w.version)
56
61
  if dist in req:
57
62
  matching.append(wheel.path)
58
63
  return matching
@@ -63,7 +68,9 @@ class Builder(object):
63
68
  Find a wheel with the given name and version
64
69
  """
65
70
  candidates = [WheelFile(filename) for filename in glob.iglob(path.join(self.wheelhouse, '*.whl'))]
66
- matches = self._matches_requirement('{}=={}'.format(name, version), candidates)
71
+ name = self._standardize_package_name(name)
72
+ requirement = '{}=={}'.format(name, version) if version else name
73
+ matches = self._matches_requirement(requirement, candidates)
67
74
  if len(matches) > 0:
68
75
  return str(matches[0])
69
76
  else:
@@ -81,7 +88,7 @@ class Builder(object):
81
88
  subprocess.check_output([
82
89
  'pip', 'wheel',
83
90
  '--wheel-dir=' + self.wheelhouse,
84
- '{}=={}'.format(package, version)
91
+ '{}=={}'.format(package, version) if version else package,
85
92
  ], stderr=subprocess.STDOUT)
86
93
  return self._find_wheel(package, version)
87
94
  except subprocess.CalledProcessError as e:
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: devpi-builder
3
- Version: 6.0.0
3
+ Version: 7.0.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,14 +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
16
  Classifier: Programming Language :: Python :: 3.9
19
17
  Classifier: Programming Language :: Python :: 3.10
20
18
  Classifier: Programming Language :: Python :: 3.11
21
- Requires-Python: >=3.7
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Requires-Python: >=3.9
22
22
  Description-Content-Type: text/x-rst
23
23
  License-File: COPYING
24
+ Requires-Dist: devpi-plumber>=0.2.14
25
+ Requires-Dist: setuptools<82
26
+ Requires-Dist: wheel
27
+ Requires-Dist: wheel-filename<2
28
+ Requires-Dist: wheel-inspect>=1.6.0
29
+ Requires-Dist: pip>=1.5.3
30
+ Requires-Dist: junit-xml>=1.9
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
24
43
 
25
44
  =========================
26
45
  Brandon the Devpi Builder
@@ -129,6 +148,40 @@ Changelog
129
148
  This lists the most important changes for each release.
130
149
 
131
150
 
151
+ Version 7.0.0 - 2026-02-16
152
+ ==========================
153
+
154
+ Added
155
+ -----
156
+
157
+ * Support for Python 3.12 and 3.13.
158
+ * Compatibility with junit-xml >= 2.0.
159
+
160
+ Fixed
161
+ -----
162
+
163
+ * Ensure Setuptools and ``wheel-filename`` are installed in compatible versions.
164
+
165
+ Removed
166
+ -------
167
+
168
+ * Python 3.6 to 3.8 are no longer supported. They likely still works but we will no longer run CI against it.
169
+ * Compatibility with junit-xml < 1.9. Junit-xml 1.9 was released more than three years ago.
170
+
171
+ Version 6.1.0 — 2023-09-22
172
+ ==========================
173
+
174
+ Added
175
+ -----
176
+
177
+ * Support using VCS URLs in requirements files.
178
+
179
+ Fixed
180
+ -----
181
+
182
+ * Building wheels for packages like ``zope-event`` that normalise the project name using dots instead of underscores is no longer broken.
183
+
184
+
132
185
  Version 6.0.0 — 2023-06-09
133
186
  ==========================
134
187
 
@@ -1,14 +1,15 @@
1
1
  .coveragerc
2
2
  .gitignore
3
+ .python-version
3
4
  .pyup.yml
4
5
  CHANGELOG.rst
5
6
  COPYING
6
7
  MANIFEST.in
7
8
  README.rst
8
9
  core-requirements.txt
10
+ pyproject.toml
9
11
  requirements.in
10
12
  requirements.txt
11
- setup.cfg
12
13
  setup.py
13
14
  .github/workflows/publish.yml
14
15
  .github/workflows/tests.yml
@@ -38,6 +39,7 @@ tests/fixture/sample_non-ascii.txt
38
39
  tests/fixture/sample_pure_and_non-pure.txt
39
40
  tests/fixture/sample_simple.txt
40
41
  tests/fixture/sample_test_package.txt
42
+ tests/fixture/sample_vcs.txt
41
43
  tests/fixture/non-ascii_package/setup.cfg
42
44
  tests/fixture/non-ascii_package/setup.py
43
45
  tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz
@@ -0,0 +1,8 @@
1
+ devpi-plumber>=0.2.14
2
+ setuptools<82
3
+ wheel
4
+ wheel-filename<2
5
+ wheel-inspect>=1.6.0
6
+ pip>=1.5.3
7
+ junit-xml>=1.9
8
+ pip-requirements-parser>=32.0.1
@@ -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,184 +1,187 @@
1
1
  #
2
- # This file is autogenerated by pip-compile with Python 3.7
2
+ # This file is autogenerated by pip-compile with Python 3.9
3
3
  # by the following command:
4
4
  #
5
- # pip-compile --no-emit-index-url
5
+ # pip-compile --no-emit-index-url --strip-extras
6
6
  #
7
- aiohttp==3.8.3
8
- # via devpi-server
9
- aiosignal==1.2.0
10
- # via aiohttp
11
- argon2-cffi==21.3.0
7
+ anyio==4.9.0
8
+ # via httpx
9
+ argon2-cffi==23.1.0
12
10
  # via
13
11
  # devpi-server
14
12
  # passlib
15
13
  argon2-cffi-bindings==21.2.0
16
14
  # via argon2-cffi
17
- async-timeout==4.0.2
18
- # via aiohttp
19
- attrs==21.4.0
15
+ attrs==25.3.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==2022.12.7
30
- # via requests
31
- cffi==1.15.0
32
- # via argon2-cffi-bindings
33
- charset-normalizer==2.0.12
20
+ build==1.2.2.post1
34
21
  # via
35
- # aiohttp
22
+ # check-manifest
23
+ # devpi-client
24
+ certifi==2025.1.31
25
+ # via
26
+ # httpcore
27
+ # httpx
36
28
  # requests
37
- check-manifest==0.48
29
+ cffi==1.17.1
30
+ # via argon2-cffi-bindings
31
+ charset-normalizer==3.4.1
32
+ # via requests
33
+ check-manifest==0.50
38
34
  # via devpi-client
39
- coverage[toml]==6.4.1
35
+ coverage==7.8.0
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.2.18
40
+ # via headerparser
41
+ devpi-client==7.2.0
44
42
  # via devpi-plumber
45
- devpi-common==3.6.0
43
+ devpi-common==4.0.4
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.14.0
54
52
  # via devpi-plumber
55
- distlib==0.3.4
56
- # via virtualenv
57
- docutils==0.19
53
+ docutils==0.21.2
58
54
  # via readme-renderer
59
- entry-points-txt==0.1.0
55
+ entry-points-txt==0.2.1
60
56
  # via wheel-inspect
61
- filelock==3.7.1
62
- # via
63
- # tox
64
- # virtualenv
65
- frozenlist==1.3.3
57
+ exceptiongroup==1.2.2
66
58
  # via
67
- # aiohttp
68
- # aiosignal
69
- headerparser==0.4.0
59
+ # anyio
60
+ # pytest
61
+ h11==0.16.0
62
+ # via httpcore
63
+ headerparser==0.5.2
70
64
  # via wheel-inspect
71
- hupper==1.10.3
65
+ httpcore==1.0.9
66
+ # via httpx
67
+ httpx==0.28.1
68
+ # via devpi-server
69
+ hupper==1.12.1
72
70
  # via pyramid
73
- idna==3.3
71
+ idna==3.10
74
72
  # via
73
+ # anyio
74
+ # httpx
75
75
  # requests
76
- # yarl
77
- iniconfig==1.1.1
78
- # via pytest
79
- itsdangerous==2.1.2
76
+ importlib-metadata==8.6.1
77
+ # via
78
+ # build
79
+ # setuptools-scm
80
+ iniconfig==2.1.0
81
+ # via
82
+ # devpi-client
83
+ # pytest
84
+ itsdangerous==2.2.0
80
85
  # via devpi-server
81
86
  junit-xml==1.9
82
87
  # via -r core-requirements.txt
83
- lazy==1.4
88
+ lazy==1.6
84
89
  # via
85
90
  # devpi-common
86
91
  # devpi-server
87
- mock==4.0.3
92
+ legacy-cgi==2.6.4
88
93
  # via -r requirements.in
89
- multidict==6.0.2
90
- # via
91
- # aiohttp
92
- # yarl
93
- packaging==21.3
94
+ mock==5.2.0
95
+ # via -r requirements.in
96
+ nh3==0.2.21
97
+ # via readme-renderer
98
+ packaging==25.0
94
99
  # via
95
100
  # build
101
+ # packaging-legacy
102
+ # pip-requirements-parser
96
103
  # pytest
97
104
  # setuptools-scm
98
- # tox
105
+ # wheel
99
106
  # wheel-inspect
100
- passlib[argon2]==1.7.4
107
+ packaging-legacy==23.0.post0
108
+ # via devpi-common
109
+ passlib==1.7.4
101
110
  # via devpi-server
102
- pastedeploy==2.1.1
111
+ pastedeploy==3.1.0
103
112
  # via plaster-pastedeploy
104
- pep517==0.12.0
105
- # via build
106
- pkginfo==1.8.2
113
+ pip-requirements-parser==32.0.1
114
+ # via -r core-requirements.txt
115
+ pkginfo==1.12.1.2
107
116
  # via devpi-client
108
- plaster==1.0
117
+ plaster==1.1.2
109
118
  # via
110
119
  # plaster-pastedeploy
111
120
  # pyramid
112
- plaster-pastedeploy==0.7
121
+ plaster-pastedeploy==1.0.1
113
122
  # via pyramid
114
- platformdirs==2.5.2
115
- # via
116
- # devpi-server
117
- # virtualenv
118
- pluggy==1.0.0
123
+ platformdirs==4.3.7
119
124
  # via
120
125
  # devpi-client
121
126
  # devpi-server
122
- # pytest
123
- # tox
124
- py==1.11.0
127
+ pluggy==1.5.0
125
128
  # via
126
129
  # devpi-client
127
- # devpi-common
128
130
  # devpi-server
129
131
  # pytest
130
- # tox
131
- pycparser==2.21
132
+ py==1.11.0
133
+ # via devpi-server
134
+ pycparser==2.22
132
135
  # via cffi
133
- pygments==2.13.0
136
+ pygments==2.19.1
134
137
  # via readme-renderer
135
- pyparsing==3.0.9
136
- # via packaging
137
- pyramid==2.0
138
+ pyparsing==3.2.3
139
+ # via pip-requirements-parser
140
+ pyproject-hooks==1.2.0
141
+ # via build
142
+ pyramid==2.0.2
138
143
  # via devpi-server
139
- pytest==7.1.2
144
+ pytest==8.3.5
140
145
  # via
141
146
  # -r requirements.in
142
147
  # pytest-cov
143
148
  # pytest-mock
144
- pytest-cov==3.0.0
149
+ pytest-cov==6.1.1
145
150
  # via -r requirements.in
146
- pytest-mock==3.10.0
151
+ pytest-mock==3.14.0
147
152
  # via -r requirements.in
148
- python-dateutil==2.8.2
153
+ python-dateutil==2.9.0.post0
149
154
  # via strictyaml
150
- readme-renderer==37.3
155
+ readme-renderer==44.0
151
156
  # via wheel-inspect
152
157
  repoze-lru==0.7
153
158
  # via devpi-server
154
- requests==2.31.0
159
+ requests==2.32.4
155
160
  # via
156
161
  # devpi-common
157
162
  # devpi-plumber
158
- ruamel-yaml==0.17.21
163
+ ruamel-yaml==0.18.10
159
164
  # via devpi-server
160
- setuptools-scm==6.4.2
165
+ ruamel-yaml-clib==0.2.12
166
+ # via ruamel-yaml
167
+ setuptools-scm==8.3.1
161
168
  # via -r requirements.in
162
- six==1.16.0
169
+ six==1.17.0
163
170
  # via
164
- # bleach
165
- # headerparser
166
171
  # junit-xml
167
172
  # python-dateutil
168
- # tox
169
- # virtualenv
170
- strictyaml==1.6.1
173
+ sniffio==1.3.1
174
+ # via anyio
175
+ strictyaml==1.7.3
171
176
  # via devpi-server
172
- toml==0.10.2
173
- # via tox
174
- tomli==2.0.1
177
+ tomli==2.2.1
175
178
  # via
179
+ # build
176
180
  # check-manifest
177
- # pep517
181
+ # coverage
182
+ # devpi-client
178
183
  # pytest
179
184
  # setuptools-scm
180
- tox==3.25.0
181
- # via devpi-client
182
185
  translationstring==1.4
183
186
  # via pyramid
184
187
  twitter-common-contextutil==0.3.11
@@ -187,31 +190,33 @@ twitter-common-dirutil==0.3.11
187
190
  # via twitter-common-contextutil
188
191
  twitter-common-lang==0.3.11
189
192
  # via twitter-common-dirutil
190
- urllib3==1.26.9
193
+ typing-extensions==4.13.2
194
+ # via
195
+ # anyio
196
+ # setuptools-scm
197
+ urllib3==2.6.3
191
198
  # via requests
192
- venusian==3.0.0
199
+ venusian==3.1.1
193
200
  # via pyramid
194
- virtualenv==20.14.1
195
- # via tox
196
- waitress==2.1.2
201
+ waitress==3.0.2
197
202
  # via devpi-server
198
- webencodings==0.5.1
199
- # via bleach
200
- webob==1.8.7
203
+ webob==1.8.9
201
204
  # via pyramid
202
- wheel==0.38.4
205
+ wheel==0.46.2
203
206
  # via -r core-requirements.txt
204
- wheel-filename==1.4.1
207
+ wheel-filename==1.4.2
205
208
  # via
206
209
  # -r core-requirements.txt
207
210
  # wheel-inspect
208
- wheel-inspect==1.7.1
211
+ wheel-inspect==1.7.2
209
212
  # via -r core-requirements.txt
210
- yarl==1.8.2
211
- # via aiohttp
212
- zope-deprecation==4.4.0
213
+ wrapt==1.17.2
214
+ # via deprecated
215
+ zipp==3.21.0
216
+ # via importlib-metadata
217
+ zope-deprecation==5.1
213
218
  # via pyramid
214
- zope-interface==5.4.0
219
+ zope-interface==7.2
215
220
  # via pyramid
216
221
 
217
222
  # The following packages are considered to be unsafe in a requirements file:
@@ -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.9',
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
31
  'Programming Language :: Python :: 3.9',
37
32
  'Programming Language :: Python :: 3.10',
38
33
  'Programming Language :: Python :: 3.11',
34
+ 'Programming Language :: Python :: 3.12',
35
+ 'Programming Language :: Python :: 3.13',
39
36
  ],
40
37
  entry_points={
41
38
  'console_scripts': [
@@ -0,0 +1,3 @@
1
+ requests @ git+https://github.com/kennethreitz/requests@master
2
+ requests @ git+ssh://github.com/kennethreitz/requests@master
3
+ requests @ git+https://github.com/kennethreitz/requests@2.16.0
@@ -3,6 +3,7 @@
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
@@ -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
@@ -162,7 +163,7 @@ def _assert_junit_xml_content(junit_filename, run_id=None):
162
163
  root = ET.parse(junit_filename)
163
164
  ET.dump(root)
164
165
 
165
- _assert_test_case(root, 'failure', 'package-that-hopefully-not-exists 99.999' + run_id_str)
166
+ _assert_test_case(root, 'failure', 'package_that_hopefully_not_exists 99.999' + run_id_str)
166
167
  _assert_test_case(root, 'skipped', 'test-package 0.1.dev1' + run_id_str)
167
168
 
168
169
  pb_elems = root.findall(".//testcase[@name='progressbar 2.2{}']".format(run_id_str))
@@ -187,20 +188,28 @@ 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_handles_non_ascii_build_output(tmpdir, monkeypatch):
192
192
 
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')
193
+ with TestServer(USERS, {
194
+ PURE_INDEX: {'bases': '/root/pypi'},
195
+ INDEX: {'bases': ''},
196
+ }) as devpi:
197
+ sdist_index = devpi.url + '/' + PURE_INDEX
197
198
 
198
- junit_filename = str(tmpdir.join('junit.xml'))
199
+ monkeypatch.setenv('PIP_INDEX_URL', sdist_index)
199
200
 
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])
201
+ # trigger retrieval of setuptools from upstream as that can take forever
202
+ requests.get(sdist_index + '/+simple/setuptools/', timeout=300).raise_for_status()
203
+
204
+ with DevpiClient(sdist_index, USER, PASSWORD) as client:
205
+ client.upload('tests/fixture/non-ascii_package/dist/non-ascii-package-0.1.dev1.tar.gz')
206
+
207
+ junit_filename = str(tmpdir.join('junit.xml'))
208
+
209
+ # our main assertion is that the main does not fail
210
+ main(['tests/fixture/sample_non-ascii.txt', devpi.url + '/' + INDEX,
211
+ '--user={}'.format(USER),
212
+ '--password={}'.format(PASSWORD), '--junit-xml', junit_filename])
204
213
 
205
214
  # check that the build failure shows up in the build output
206
215
  assert 'No non-ascii 4 you!' in open(junit_filename).read()
@@ -8,10 +8,19 @@ from devpi_builder import requirements
8
8
  def test_read_requirements():
9
9
  expected = [
10
10
  ('progressbar', '2.2'),
11
- ('six', '1.7.3')
11
+ ('six', '1.7.3'),
12
12
  ]
13
13
  assert expected == requirements.read_exact_versions('tests/fixture/sample_simple.txt')
14
14
 
15
+ def test_read_vcs_requirements():
16
+ expected = [
17
+ ('requests @ git+https://github.com/kennethreitz/requests@master', None),
18
+ ('requests @ git+ssh://github.com/kennethreitz/requests@master', None),
19
+ ('requests @ git+https://github.com/kennethreitz/requests@2.16.0', None),
20
+ ]
21
+ assert expected == requirements.read_exact_versions('tests/fixture/sample_vcs.txt')
22
+
23
+
15
24
 
16
25
  def test_multiple_versions():
17
26
  expected = [
@@ -9,9 +9,19 @@ from devpi_builder import wheeler
9
9
 
10
10
 
11
11
  class TestBuilder:
12
- def test_build(self):
12
+ @pytest.mark.parametrize(
13
+ 'args', (
14
+ ('progressbar', '2.2'),
15
+ ('progressbar', None),
16
+ ('requests @ git+https://github.com/kennethreitz/requests@2.16.0', None),
17
+ ('requests @ git+https://github.com/kennethreitz/requests@master', None),
18
+ ('zope-event', '5.0'),
19
+ ('devpi-common', '3.6.0'),
20
+ )
21
+ )
22
+ def test_build(self, args):
13
23
  with wheeler.Builder() as builder:
14
- wheel_file = builder('progressbar', '2.2')
24
+ wheel_file = builder(*args)
15
25
  assert re.match(r'.*\.whl$', wheel_file)
16
26
  assert path.exists(wheel_file)
17
27
 
@@ -1,7 +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
@@ -1,7 +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
@@ -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
-
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes