From 763d24cc5cadd38959177e0c68c9315fd33f19e0 Mon Sep 17 00:00:00 2001 From: Miro Hrončok Date: Jul 08 2020 22:49:15 +0000 Subject: [PATCH 1/2] Add %python_extras_subpkg See https://fedoraproject.org/wiki/Changes/PythonExtras --- diff --git a/macros.python-srpm b/macros.python-srpm index 15a7193..ff1c372 100644 --- a/macros.python-srpm +++ b/macros.python-srpm @@ -175,3 +175,51 @@ print('Provides: ' .. provide .. '\\n') end } + +%python_extras_subpkg(n:i:f:F) %{expand:%{lua: + local option_n = '-n (name of the base package)' + local option_i = '-i (buildroot path to metadata)' + local option_f = '-f (builddir path to a filelist)' + local option_F = '-F (skip %%files section)' + local value_n = rpm.expand('%{-n*}') + local value_i = rpm.expand('%{-i*}') + local value_f = rpm.expand('%{-f*}') + local value_F = rpm.expand('%{-F}') + local args = rpm.expand('%{*}') + if value_n == '' then + rpm.expand('%{error:%%%0: missing option ' .. option_n .. '}') + end + if value_i == '' and value_f == '' and value_F == '' then + rpm.expand('%{error:%%%0: missing option ' .. option_i .. ' or ' .. option_f .. ' or ' .. option_F .. '}') + end + if value_i ~= '' and value_f ~= '' then + rpm.expand('%{error:%%%0: simultaneous ' .. option_i .. ' and ' .. option_f .. ' options are not possible}') + end + if value_i ~= '' and value_F ~= '' then + rpm.expand('%{error:%%%0: simultaneous ' .. option_i .. ' and ' .. option_F .. ' options are not possible}') + end + if value_f ~= '' and value_F ~= '' then + rpm.expand('%{error:%%%0: simultaneous ' .. option_f .. ' and ' .. option_F .. ' options are not possible}') + end + if args == '' then + rpm.expand('%{error:%%%0 requires at least one argument with "extras" name}') + end + local requires = 'Requires: ' .. value_n .. ' = %{?epoch:%{epoch}:}%{version}-%{release}' + for extras in args:gmatch('%w+') do + local rpmname = value_n .. '+' .. extras + local pkgdef = '%package -n ' .. rpmname + local summary = 'Summary: Metapackage for ' .. value_n .. ': ' .. extras .. ' extras' + local description = '%description -n ' .. rpmname .. '\\\n' .. + 'This is a metapackage bringing in ' .. extras .. ' extras requires for ' .. value_n .. '.\\\n' .. + 'It contains no code, just makes sure the dependencies are installed.\\\n' + local files = '' + if value_i ~= '' then + files = '%files -n ' .. rpmname .. '\\\n' .. '%ghost ' .. value_i + elseif value_f ~= '' then + files = '%files -n ' .. rpmname .. ' -f ' .. value_f + end + for i, line in ipairs({pkgdef, summary, requires, description, files, ''}) do + print(line .. '\\\n') + end + end +}} diff --git a/python-rpm-macros.spec b/python-rpm-macros.spec index 523d314..5b6a64c 100644 --- a/python-rpm-macros.spec +++ b/python-rpm-macros.spec @@ -1,6 +1,6 @@ Name: python-rpm-macros Version: 3.9 -Release: 4%{?dist} +Release: 5%{?dist} Summary: The common Python RPM macros # macros and lua: MIT, compileall2.py: PSFv2 @@ -107,6 +107,10 @@ install -m 644 compileall2.py %{buildroot}%{_rpmconfigdir}/redhat/ %changelog +* Wed Jul 08 2020 Miro Hrončok - 3.9-5 +- Introduce %%python_extras_subpkg +- https://fedoraproject.org/wiki/Changes/PythonExtras + * Tue Jun 16 2020 Lumír Balhar - 3.9-4 - Use compileall from stdlib for Python >= 3.9 diff --git a/tests/test_evals.py b/tests/test_evals.py index fbe76b5..70c7f9f 100644 --- a/tests/test_evals.py +++ b/tests/test_evals.py @@ -1,6 +1,7 @@ import os import subprocess import sys +import textwrap X_Y = f'{sys.version_info[0]}.{sys.version_info[1]}' XY = f'{sys.version_info[0]}{sys.version_info[1]}' @@ -260,3 +261,78 @@ def test_pycached_with_exclude(): def test_pycached_fails_with_extension_glob(): lines = rpm_eval('%pycached %{python3_sitelib}/foo.py*', fails=True) assert lines[0] == 'error: %pycached can only be used with paths explicitly ending with .py' + + +def test_python_extras_subpkg_i(): + lines = rpm_eval('%python_extras_subpkg -n python3-setuptools_scm -i %{python3_sitelib}/*.egg-info toml yaml', + version='6', release='7') + expected = textwrap.dedent(f""" + %package -n python3-setuptools_scm+toml + Summary: Metapackage for python3-setuptools_scm: toml extras + Requires: python3-setuptools_scm = 6-7 + %description -n python3-setuptools_scm+toml + This is a metapackage bringing in toml extras requires for python3-setuptools_scm. + It contains no code, just makes sure the dependencies are installed. + + %files -n python3-setuptools_scm+toml + %ghost /usr/lib/python{X_Y}/site-packages/*.egg-info + + %package -n python3-setuptools_scm+yaml + Summary: Metapackage for python3-setuptools_scm: yaml extras + Requires: python3-setuptools_scm = 6-7 + %description -n python3-setuptools_scm+yaml + This is a metapackage bringing in yaml extras requires for python3-setuptools_scm. + It contains no code, just makes sure the dependencies are installed. + + %files -n python3-setuptools_scm+yaml + %ghost /usr/lib/python{X_Y}/site-packages/*.egg-info + """).lstrip().splitlines() + assert lines == expected + + +def test_python_extras_subpkg_f(): + lines = rpm_eval('%python_extras_subpkg -n python3-setuptools_scm -f ghost_filelist toml yaml', + version='6', release='7') + expected = textwrap.dedent(f""" + %package -n python3-setuptools_scm+toml + Summary: Metapackage for python3-setuptools_scm: toml extras + Requires: python3-setuptools_scm = 6-7 + %description -n python3-setuptools_scm+toml + This is a metapackage bringing in toml extras requires for python3-setuptools_scm. + It contains no code, just makes sure the dependencies are installed. + + %files -n python3-setuptools_scm+toml -f ghost_filelist + + %package -n python3-setuptools_scm+yaml + Summary: Metapackage for python3-setuptools_scm: yaml extras + Requires: python3-setuptools_scm = 6-7 + %description -n python3-setuptools_scm+yaml + This is a metapackage bringing in yaml extras requires for python3-setuptools_scm. + It contains no code, just makes sure the dependencies are installed. + + %files -n python3-setuptools_scm+yaml -f ghost_filelist + """).lstrip().splitlines() + assert lines == expected + + +def test_python_extras_subpkg_F(): + lines = rpm_eval('%python_extras_subpkg -n python3-setuptools_scm -F toml yaml', + version='6', release='7') + expected = textwrap.dedent(f""" + %package -n python3-setuptools_scm+toml + Summary: Metapackage for python3-setuptools_scm: toml extras + Requires: python3-setuptools_scm = 6-7 + %description -n python3-setuptools_scm+toml + This is a metapackage bringing in toml extras requires for python3-setuptools_scm. + It contains no code, just makes sure the dependencies are installed. + + + + %package -n python3-setuptools_scm+yaml + Summary: Metapackage for python3-setuptools_scm: yaml extras + Requires: python3-setuptools_scm = 6-7 + %description -n python3-setuptools_scm+yaml + This is a metapackage bringing in yaml extras requires for python3-setuptools_scm. + It contains no code, just makes sure the dependencies are installed. + """).lstrip().splitlines() + assert lines == expected From 59abe832d4d489da3b9f09f280cda098aee39d1b Mon Sep 17 00:00:00 2001 From: Miro Hrončok Date: Jul 10 2020 13:58:00 +0000 Subject: [PATCH 2/2] Adapt %%py_dist_name to keep square brackets So %{py3_dist foo[bar]} works as expected. Add tests. --- diff --git a/macros.python-srpm b/macros.python-srpm index ff1c372..c0d31b0 100644 --- a/macros.python-srpm +++ b/macros.python-srpm @@ -70,7 +70,7 @@ # Converts Python dist name to a canonical format %py_dist_name() %{lua:\ name = rpm.expand("%{?1:%{1}}");\ - canonical = string.gsub(string.lower(name), "%W+", "-");\ + canonical = string.gsub(string.lower(name), "[^%w%[%]]+", "-");\ print(canonical);\ } diff --git a/python-rpm-macros.spec b/python-rpm-macros.spec index 5b6a64c..eb381a8 100644 --- a/python-rpm-macros.spec +++ b/python-rpm-macros.spec @@ -109,6 +109,7 @@ install -m 644 compileall2.py %{buildroot}%{_rpmconfigdir}/redhat/ %changelog * Wed Jul 08 2020 Miro Hrončok - 3.9-5 - Introduce %%python_extras_subpkg +- Adapt %%py_dist_name to keep square brackets - https://fedoraproject.org/wiki/Changes/PythonExtras * Tue Jun 16 2020 Lumír Balhar - 3.9-4 diff --git a/tests/test_evals.py b/tests/test_evals.py index 70c7f9f..ce38793 100644 --- a/tests/test_evals.py +++ b/tests/test_evals.py @@ -3,6 +3,8 @@ import subprocess import sys import textwrap +import pytest + X_Y = f'{sys.version_info[0]}.{sys.version_info[1]}' XY = f'{sys.version_info[0]}{sys.version_info[1]}' @@ -24,6 +26,30 @@ def rpm_eval(expression, fails=False, **kwargs): return cp.stdout.strip().splitlines() +@pytest.mark.parametrize('argument, result', [ + ('a', 'a'), + ('a-a', 'a-a'), + ('a_a', 'a-a'), + ('a.a', 'a-a'), + ('a---a', 'a-a'), + ('a-_-a', 'a-a'), + ('a-_-a', 'a-a'), + ('a[b]', 'a[b]'), + ('Aha[Boom]', 'aha[boom]'), + ('a.a[b.b]', 'a-a[b-b]'), +]) +def test_pydist_name(argument, result): + assert rpm_eval(f'%py_dist_name {argument}') == [result] + + +def test_py2_dist(): + assert rpm_eval(f'%py2_dist Aha[Boom] a') == ['python2dist(aha[boom]) python2dist(a)'] + + +def test_py3_dist(): + assert rpm_eval(f'%py3_dist Aha[Boom] a') == ['python3dist(aha[boom]) python3dist(a)'] + + def test_python_provide_python(): assert rpm_eval('%python_provide python-foo') == []