| |
@@ -49,20 +49,29 @@
|
| |
|
| |
class Requirements:
|
| |
"""Requirement printer"""
|
| |
- def __init__(self, get_installed_version, extras='',
|
| |
+ def __init__(self, get_installed_version, extras=None,
|
| |
generate_extras=False, python3_pkgversion='3'):
|
| |
self.get_installed_version = get_installed_version
|
| |
+ self.extras = set()
|
| |
|
| |
if extras:
|
| |
- self.marker_envs = [{'extra': e.strip()} for e in extras.split(',')]
|
| |
- else:
|
| |
- self.marker_envs = [{'extra': ''}]
|
| |
+ for extra in extras:
|
| |
+ self.add_extras(*extra.split(','))
|
| |
|
| |
self.missing_requirements = False
|
| |
|
| |
self.generate_extras = generate_extras
|
| |
self.python3_pkgversion = python3_pkgversion
|
| |
|
| |
+ def add_extras(self, *extras):
|
| |
+ self.extras |= set(e.strip() for e in extras)
|
| |
+
|
| |
+ @property
|
| |
+ def marker_envs(self):
|
| |
+ if self.extras:
|
| |
+ return [{'extra': e} for e in sorted(self.extras)]
|
| |
+ return [{'extra': ''}]
|
| |
+
|
| |
def evaluate_all_environamnets(self, requirement):
|
| |
for marker_env in self.marker_envs:
|
| |
if requirement.marker.evaluate(environment=marker_env):
|
| |
@@ -226,18 +235,20 @@
|
| |
f'WARNING: Skipping dependency line: {line}\n'
|
| |
+ f' tox deps options other than -r are not supported (yet).',
|
| |
)
|
| |
- else:
|
| |
+ elif line:
|
| |
packages.append(line)
|
| |
return packages
|
| |
|
| |
|
| |
def generate_tox_requirements(toxenv, requirements):
|
| |
- requirements.add('tox-current-env >= 0.0.2', source='tox itself')
|
| |
+ requirements.add('tox-current-env >= 0.0.3', source='tox itself')
|
| |
requirements.check(source='tox itself')
|
| |
- with tempfile.NamedTemporaryFile('r') as depfile:
|
| |
+ with tempfile.NamedTemporaryFile('r') as deps, tempfile.NamedTemporaryFile('r') as extras:
|
| |
r = subprocess.run(
|
| |
- [sys.executable, '-m', 'tox', '--print-deps-to-file',
|
| |
- depfile.name, '-qre', toxenv],
|
| |
+ [sys.executable, '-m', 'tox',
|
| |
+ '--print-deps-to', deps.name,
|
| |
+ '--print-extras-to', extras.name,
|
| |
+ '-qre', toxenv],
|
| |
check=False,
|
| |
encoding='utf-8',
|
| |
stdout=subprocess.PIPE,
|
| |
@@ -247,8 +258,9 @@
|
| |
print_err(r.stdout, end='')
|
| |
r.check_returncode()
|
| |
|
| |
- deplines = depfile.read().splitlines()
|
| |
+ deplines = deps.read().splitlines()
|
| |
packages = parse_tox_requires_lines(deplines)
|
| |
+ requirements.add_extras(*extras.read().splitlines())
|
| |
requirements.extend(packages,
|
| |
source=f'tox --print-deps-only: {toxenv}')
|
| |
|
| |
@@ -265,7 +277,7 @@
|
| |
|
| |
|
| |
def generate_requires(
|
| |
- *, include_runtime=False, toxenv=None, extras='',
|
| |
+ *, include_runtime=False, toxenv=None, extras=None,
|
| |
get_installed_version=importlib_metadata.version, # for dep injection
|
| |
generate_extras=False, python3_pkgversion="3",
|
| |
):
|
| |
@@ -274,7 +286,7 @@
|
| |
This is the main Python entry point.
|
| |
"""
|
| |
requirements = Requirements(
|
| |
- get_installed_version, extras=extras,
|
| |
+ get_installed_version, extras=extras or [],
|
| |
generate_extras=generate_extras,
|
| |
python3_pkgversion=python3_pkgversion
|
| |
)
|
| |
@@ -310,9 +322,9 @@
|
| |
'(implies --runtime)'),
|
| |
)
|
| |
parser.add_argument(
|
| |
- '-x', '--extras', metavar='EXTRAS', default='',
|
| |
+ '-x', '--extras', metavar='EXTRAS', action='append',
|
| |
help='comma separated list of "extras" for runtime requirements '
|
| |
- '(e.g. -x testing,feature-x) (implies --runtime)',
|
| |
+ '(e.g. -x testing,feature-x) (implies --runtime, can be repeated)',
|
| |
)
|
| |
parser.add_argument(
|
| |
'--generate-extras', action='store_true',
|
| |
Depends-on: https://src.fedoraproject.org/rpms/python-tox-current-env/pull-request/2