Compare commits
No commits in common. "c9-beta" and "c10s" have entirely different histories.
1
.gitignore
vendored
1
.gitignore
vendored
@ -0,0 +1 @@
|
|||||||
|
__pycache__/
|
@ -79,8 +79,21 @@ using the `-R` flag:
|
|||||||
%generate_buildrequires
|
%generate_buildrequires
|
||||||
%pyproject_buildrequires -R
|
%pyproject_buildrequires -R
|
||||||
|
|
||||||
Alternatively, the runtime dependencies can be obtained by building the wheel and reading the metadata from the built wheel.
|
Alternatively, if the project specifies its dependencies in the pyproject.toml
|
||||||
This can be enabled by using the `-w` flag.
|
`[project]` table (as defined in [PEP 621](https://www.python.org/dev/peps/pep-0621/)),
|
||||||
|
the runtime dependencies can be obtained by reading that metadata.
|
||||||
|
|
||||||
|
This can be enabled by using the `-p` flag.
|
||||||
|
This flag supports reading both the runtime dependencies, and the selected extras
|
||||||
|
(see the `-x` flag described below).
|
||||||
|
|
||||||
|
Please note that not all build backends which use pyproject.toml support the
|
||||||
|
`[project]` table scheme.
|
||||||
|
For example, poetry-core (at least in 1.9.0) defines package metadata in the
|
||||||
|
custom `[tool.poetry]` table which is not supported by the `%pyproject_buildrequires` macro.
|
||||||
|
|
||||||
|
Finally, the runtime dependencies can be obtained by building the wheel and reading the metadata from the built wheel.
|
||||||
|
This can be enabled with the `-w` flag and cannot be combined with `-p`.
|
||||||
Support for building wheels with `%pyproject_buildrequires -w` is **provisional** and the behavior might change.
|
Support for building wheels with `%pyproject_buildrequires -w` is **provisional** and the behavior might change.
|
||||||
Please subscribe to Fedora's [python-devel list] if you use the option.
|
Please subscribe to Fedora's [python-devel list] if you use the option.
|
||||||
|
|
||||||
@ -111,6 +124,14 @@ For example, if upstream suggests installing test dependencies with
|
|||||||
%generate_buildrequires
|
%generate_buildrequires
|
||||||
%pyproject_buildrequires -x testing
|
%pyproject_buildrequires -x testing
|
||||||
|
|
||||||
|
For projects that specify test requirements using [PEP 735] dependency groups,
|
||||||
|
these can be added using the `-g` flag.
|
||||||
|
Multiple groups can be supplied by repeating the flag or as a comma separated list.
|
||||||
|
For example, if upstream uses a dependency group called `tests`, the test deps would be generated by:
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires -g tests
|
||||||
|
|
||||||
For projects that specify test requirements in their [tox] configuration,
|
For projects that specify test requirements in their [tox] configuration,
|
||||||
these can be added using the `-t` flag (default tox environment)
|
these can be added using the `-t` flag (default tox environment)
|
||||||
or the `-e` flag followed by the tox environment.
|
or the `-e` flag followed by the tox environment.
|
||||||
@ -134,20 +155,26 @@ The `-e` option redefines `%{toxenv}` for further reuse.
|
|||||||
Use `%{default_toxenv}` to get the default value.
|
Use `%{default_toxenv}` to get the default value.
|
||||||
|
|
||||||
The `-t`/`-e` option uses [tox-current-env]'s `--print-deps-to-file` behind the scenes.
|
The `-t`/`-e` option uses [tox-current-env]'s `--print-deps-to-file` behind the scenes.
|
||||||
|
It generates dependencies listed directly in `deps`,
|
||||||
|
dependencies defined through `extras`,
|
||||||
|
and on tox 4.22+ also dependencies defined through `dependency_groups`.
|
||||||
|
|
||||||
If your package specifies some tox plugins in `tox.requires`,
|
If your package specifies some tox plugins in `tox.requires`,
|
||||||
such plugins will be BuildRequired as well.
|
such plugins will be BuildRequired as well.
|
||||||
Not all plugins are guaranteed to play well with [tox-current-env],
|
Not all plugins are guaranteed to play well with [tox-current-env],
|
||||||
in worst case, patch/sed the requirement out from the tox configuration.
|
in worst case, patch/sed the requirement out from the tox configuration.
|
||||||
|
|
||||||
Note that neither `-x` or `-t` can be used with `-R`,
|
Note that neither `-x` or `-t` can be used with `-R` or `-N`,
|
||||||
because runtime dependencies are always required for testing.
|
because runtime dependencies are always required for testing.
|
||||||
You can only use those options if the build backend supports the [prepare-metadata-for-build-wheel hook],
|
You can only use those options if the build backend supports the [prepare-metadata-for-build-wheel hook],
|
||||||
or together with `-w`.
|
or together with `-p` or `-w`.
|
||||||
|
However, using `-g` with `-R` or `-N` is supported because dependency groups don't need to be used for testing
|
||||||
|
and can be obtained by reading `pyproject.toml` only.
|
||||||
|
|
||||||
[tox]: https://tox.readthedocs.io/
|
[tox]: https://tox.readthedocs.io/
|
||||||
[tox-current-env]: https://github.com/fedora-python/tox-current-env/
|
[tox-current-env]: https://github.com/fedora-python/tox-current-env/
|
||||||
[prepare-metadata-for-build-wheel hook]: https://www.python.org/dev/peps/pep-0517/#prepare-metadata-for-build-wheel
|
[prepare-metadata-for-build-wheel hook]: https://www.python.org/dev/peps/pep-0517/#prepare-metadata-for-build-wheel
|
||||||
|
[python-devel list]: https://lists.fedoraproject.org/archives/list/python-devel@lists.fedoraproject.org/
|
||||||
|
|
||||||
Additionally to generated requirements you can supply multiple file names to `%pyproject_buildrequires` macro.
|
Additionally to generated requirements you can supply multiple file names to `%pyproject_buildrequires` macro.
|
||||||
Dependencies will be loaded from them:
|
Dependencies will be loaded from them:
|
||||||
@ -157,7 +184,7 @@ Dependencies will be loaded from them:
|
|||||||
For packages not using build system you can use `-N` to entirely skip automatical
|
For packages not using build system you can use `-N` to entirely skip automatical
|
||||||
generation of requirements and install requirements only from manually specified files.
|
generation of requirements and install requirements only from manually specified files.
|
||||||
`-N` option implies `-R` and cannot be used in combination with other options mentioned above
|
`-N` option implies `-R` and cannot be used in combination with other options mentioned above
|
||||||
(`-w`, `-e`, `-t`, `-x`).
|
(`-w`, `-e`, `-t`, `-x`, `-p`).
|
||||||
|
|
||||||
The `%pyproject_buildrequires` macro also accepts the `-r` flag for backward compatibility;
|
The `%pyproject_buildrequires` macro also accepts the `-r` flag for backward compatibility;
|
||||||
it means "include runtime dependencies" which has been the default since version 0-53.
|
it means "include runtime dependencies" which has been the default since version 0-53.
|
||||||
@ -287,7 +314,7 @@ However, in Fedora packages, always list executables explicitly to avoid uninten
|
|||||||
`%pyproject_save_files` can automatically mark license files with `%license` macro
|
`%pyproject_save_files` can automatically mark license files with `%license` macro
|
||||||
and language (`*.mo`) files with `%lang` macro and appropriate language code.
|
and language (`*.mo`) files with `%lang` macro and appropriate language code.
|
||||||
Only license files declared via [PEP 639] `License-File` field are detected.
|
Only license files declared via [PEP 639] `License-File` field are detected.
|
||||||
[PEP 639] is still a draft and can be changed in the future.
|
[PEP 639] is still provisional and can be changed in the future.
|
||||||
It is possible to use the `-l` flag to declare that a missing license should
|
It is possible to use the `-l` flag to declare that a missing license should
|
||||||
terminate the build or `-L` (the default) to explicitly disable this check.
|
terminate the build or `-L` (the default) to explicitly disable this check.
|
||||||
Packagers are encouraged to use the `-l` flag when the `%license` file is not manually listed in `%files`
|
Packagers are encouraged to use the `-l` flag when the `%license` file is not manually listed in `%files`
|
||||||
@ -385,6 +412,78 @@ These arguments are still required:
|
|||||||
Multiple subpackages are generated when multiple names are provided.
|
Multiple subpackages are generated when multiple names are provided.
|
||||||
|
|
||||||
|
|
||||||
|
Provisional: Declarative Buildsystem (RPM 4.20+)
|
||||||
|
------------------------------------------------
|
||||||
|
|
||||||
|
It is possible to reduce some of the spec boilerplate by using the provided
|
||||||
|
pyproject [declarative buildsystem].
|
||||||
|
This option is only available with RPM 4.20+ (e.g. in Fedora 41+).
|
||||||
|
The declarative buildsystem is **provisional** and the behavior might change.
|
||||||
|
Please subscribe to Fedora's [python-devel list] if you use the feature.
|
||||||
|
|
||||||
|
To enable the pyproject declarative buildsystem, use the following:
|
||||||
|
|
||||||
|
BuildSystem: pyproject
|
||||||
|
BuildOption(install): <options for %%pyproject_save_files>
|
||||||
|
|
||||||
|
That way, RPM will automatically fill-in the `%prep`, `%generate_buildrequires`,
|
||||||
|
`%build`, `%install`, and `%check` sections the following defaults:
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -C
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files <options from BuildOption(install)>
|
||||||
|
|
||||||
|
%check
|
||||||
|
%pyproject_check_import
|
||||||
|
|
||||||
|
To pass options to the individual macros, use `BuildOption` (see the [documentation of declarative buildsystems][declarative buildsystem]).
|
||||||
|
|
||||||
|
# pass options for %%pyproject_save_files (mandatory when not overriding %%install)
|
||||||
|
BuildOption(install): -l _module +auto
|
||||||
|
|
||||||
|
# replace the default options for %%autosetup
|
||||||
|
BuildOption(prep): -S git_am -C
|
||||||
|
|
||||||
|
# pass options to %%pyproject_buildrequires
|
||||||
|
BuildOption(generate_buildrequires): docs-requirements.txt -t
|
||||||
|
|
||||||
|
# pass options to %%pyproject_wheel
|
||||||
|
BuildOption(build): -C--global-option=--no-cython-compile
|
||||||
|
|
||||||
|
# pass options to %%pyproject_check_import
|
||||||
|
BuildOption(check): -e '*.test*'
|
||||||
|
|
||||||
|
Alternatively, you can supply your own sections to override the automatic ones:
|
||||||
|
|
||||||
|
BuildOption(generate_buildrequires): -w
|
||||||
|
...
|
||||||
|
%build
|
||||||
|
# do nothing, the wheel was built in %%generate_buildrequires
|
||||||
|
|
||||||
|
You can append to end of the automatic sections:
|
||||||
|
|
||||||
|
%check -a
|
||||||
|
# run %%pytest after %%pyproject_check_import
|
||||||
|
%pytest
|
||||||
|
|
||||||
|
Or prepend to the beginning of them:
|
||||||
|
|
||||||
|
%prep -p
|
||||||
|
# run %%gpgverify before %%autosetup
|
||||||
|
%gpgverify -k2 -s1 -d0
|
||||||
|
|
||||||
|
[declarative buildsystem]: https://rpm-software-management.github.io/rpm/manual/buildsystem.html
|
||||||
|
|
||||||
|
|
||||||
Limitations
|
Limitations
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
@ -434,6 +533,7 @@ so be prepared for problems.
|
|||||||
[PEP 517]: https://www.python.org/dev/peps/pep-0517/
|
[PEP 517]: https://www.python.org/dev/peps/pep-0517/
|
||||||
[PEP 518]: https://www.python.org/dev/peps/pep-0518/
|
[PEP 518]: https://www.python.org/dev/peps/pep-0518/
|
||||||
[PEP 639]: https://www.python.org/dev/peps/pep-0639/
|
[PEP 639]: https://www.python.org/dev/peps/pep-0639/
|
||||||
|
[PEP 735]: https://www.python.org/dev/peps/pep-0735/
|
||||||
[pip's documentation]: https://pip.pypa.io/en/stable/cli/pip_install/#vcs-support
|
[pip's documentation]: https://pip.pypa.io/en/stable/cli/pip_install/#vcs-support
|
||||||
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
|||||||
# This file is called macros.aaa-pyproject-srpm
|
|
||||||
# to sort alphabetically before macros.pyproject.
|
|
||||||
# When this file is installed but macros.pyproject is not
|
|
||||||
# this macro will cause the package with the real macro to be installed.
|
|
||||||
# When macros.pyproject is installed, it overrides this macro.
|
|
||||||
# Note: This needs to maintain the same set of options as the real macro.
|
|
||||||
%pyproject_buildrequires(rRxtNwe:C:) echo 'pyproject-rpm-macros' && exit 0
|
|
4
gating.yaml
Normal file
4
gating.yaml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
--- !Policy
|
||||||
|
decision_context: osci_compose_gate
|
||||||
|
rules:
|
||||||
|
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}
|
17
macros.aaa-pyproject-srpm
Normal file
17
macros.aaa-pyproject-srpm
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# This file is called macros.aaa-pyproject-srpm
|
||||||
|
# to sort alphabetically before macros.pyproject.
|
||||||
|
# When this file is installed but macros.pyproject is not
|
||||||
|
# this macro will cause the package with the real macro to be installed.
|
||||||
|
# When macros.pyproject is installed, it overrides this macro.
|
||||||
|
# Note: This needs to maintain the same set of options as the real macro.
|
||||||
|
%pyproject_buildrequires(rRxtNwpe:g:C:) echo 'pyproject-rpm-macros' && exit 0
|
||||||
|
|
||||||
|
|
||||||
|
# Declarative buildsystem, requires RPM 4.20+ to work
|
||||||
|
# https://rpm-software-management.github.io/rpm/manual/buildsystem.html
|
||||||
|
# This is the minimal implementation to be in the srpm package,
|
||||||
|
# as required even before the BuildRequires are installed
|
||||||
|
%buildsystem_pyproject_conf() %nil
|
||||||
|
%buildsystem_pyproject_generate_buildrequires() %pyproject_buildrequires %*
|
||||||
|
%buildsystem_pyproject_build() %nil
|
||||||
|
%buildsystem_pyproject_install() %nil
|
@ -25,6 +25,11 @@
|
|||||||
%_pyproject_record %{_builddir}/%{_pyproject_files_prefix}-pyproject-record
|
%_pyproject_record %{_builddir}/%{_pyproject_files_prefix}-pyproject-record
|
||||||
%_pyproject_buildrequires %{_builddir}/%{_pyproject_files_prefix}-pyproject-buildrequires
|
%_pyproject_buildrequires %{_builddir}/%{_pyproject_files_prefix}-pyproject-buildrequires
|
||||||
|
|
||||||
|
# Internal macro, takes %%set_build_flags and strips all the exports
|
||||||
|
# TODO: Make such a list an actual source of %%set_build_flags (in redhat-rpm-config)
|
||||||
|
# Cannot use %%gsub directly to preserve EL 9 compatibility
|
||||||
|
%_pyproject_build_flags %{lua:local exports = rpm.expand('%{set_build_flags} ;'); print((exports:gsub('%s*;+%s+export%s+[%u_]+%s*;+%s*', ' ')))}
|
||||||
|
|
||||||
# Avoid leaking %%{_pyproject_builddir} to pytest collection
|
# Avoid leaking %%{_pyproject_builddir} to pytest collection
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1935212
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1935212
|
||||||
# The value is read and used by the %%pytest and %%tox macros:
|
# The value is read and used by the %%pytest and %%tox macros:
|
||||||
@ -33,7 +38,8 @@
|
|||||||
%pyproject_wheel(C:) %{expand:\\\
|
%pyproject_wheel(C:) %{expand:\\\
|
||||||
%_set_pytest_addopts
|
%_set_pytest_addopts
|
||||||
mkdir -p "%{_pyproject_builddir}"
|
mkdir -p "%{_pyproject_builddir}"
|
||||||
CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}" TMPDIR="%{_pyproject_builddir}" \\\
|
%{_pyproject_build_flags} \\\
|
||||||
|
TMPDIR="%{_pyproject_builddir}" \\\
|
||||||
%{__python3} -Bs %{_rpmconfigdir}/redhat/pyproject_wheel.py %{?**} %{_pyproject_wheeldir}
|
%{__python3} -Bs %{_rpmconfigdir}/redhat/pyproject_wheel.py %{?**} %{_pyproject_wheeldir}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,15 +115,15 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
# Note: the three times nested questionmarked -i -f -F pattern means: If none of those options was used -- in that case, we inject our own -f
|
# Note: the three times nested questionmarked -i -f -F pattern means: If none of those options was used -- in that case, we inject our own -f
|
||||||
%pyproject_extras_subpkg(n:i:f:F) %{expand:%{?python_extras_subpkg:%{python_extras_subpkg%{?!-i:%{?!-f:%{?!-F: -f %{_pyproject_ghost_distinfo}}}} %**}}}
|
%pyproject_extras_subpkg(n:i:f:FaA) %{expand:%{?python_extras_subpkg:%{python_extras_subpkg%{?!-i:%{?!-f:%{?!-F: -f %{_pyproject_ghost_distinfo}}}} %**}}}
|
||||||
|
|
||||||
|
|
||||||
# Escaping an actual percentage sign in path by 8 signs has been verified in RPM 4.16 and 4.17.
|
# Escaping shell-globs, percentage signs and spaces was reworked in RPM 4.19+
|
||||||
# See this thread http://lists.rpm.org/pipermail/rpm-list/2021-June/002048.html
|
# https://github.com/rpm-software-management/rpm/issues/1749#issuecomment-1020420616
|
||||||
# Since RPM 4.19, 2 signs are needed instead. 4.18.90+ is a pre-release of RPM 4.19.
|
# Since we support both ways, we pass either 4.19 or 4.18 to the script, so it knows which one to use
|
||||||
# On the CI, we build tests/escape_percentages.spec to verify the assumptions.
|
# Rather than passing the actual version, we let RPM compare the versions, as it is easier done here than in Python
|
||||||
%pyproject_save_files(lL) %{expand:\\\
|
%pyproject_save_files(lL) %{expand:\\\
|
||||||
%{expr:v"0%{?rpmversion}" >= v"4.18.90" ? "RPM_PERCENTAGES_COUNT=2" : "RPM_PERCENTAGES_COUNT=8" } \\
|
%{expr:v"0%{?rpmversion}" >= v"4.18.90" ? "RPM_FILES_ESCAPE=4.19" : "RPM_FILES_ESCAPE=4.18" } \\
|
||||||
%{__python3} %{_rpmconfigdir}/redhat/pyproject_save_files.py \\
|
%{__python3} %{_rpmconfigdir}/redhat/pyproject_save_files.py \\
|
||||||
--output-files "%{pyproject_files}" \\
|
--output-files "%{pyproject_files}" \\
|
||||||
--output-modules "%{_pyproject_modules}" \\
|
--output-modules "%{_pyproject_modules}" \\
|
||||||
@ -152,13 +158,17 @@ fi
|
|||||||
%default_toxenv py%{python3_version_nodots}
|
%default_toxenv py%{python3_version_nodots}
|
||||||
%toxenv %{default_toxenv}
|
%toxenv %{default_toxenv}
|
||||||
|
|
||||||
|
%_pyproject_tomlidep %["%{python3_pkgversion}" == "3"\
|
||||||
|
? "echo '(python%{python3_pkgversion}dist(tomli) if python%{python3_pkgversion}-devel < 3.11)'"\
|
||||||
|
: "%[v"%{python3_pkgversion}" < v"3.11"\
|
||||||
|
? "echo 'python%{python3_pkgversion}dist(tomli)'"\
|
||||||
|
: "true # will use tomllib, echo nothing"\
|
||||||
|
]"\
|
||||||
|
]
|
||||||
|
|
||||||
# Note: Keep the options in sync with this macro from macros.aaa-pyproject-srpm
|
# Note: Keep the options in sync with this macro from macros.aaa-pyproject-srpm
|
||||||
%pyproject_buildrequires(rRxtNwe:C:) %{expand:\\\
|
%pyproject_buildrequires(rRxtNwpe:g:C:) %{expand:\\\
|
||||||
%_set_pytest_addopts
|
%_set_pytest_addopts
|
||||||
# The _auto_set_build_flags feature does not do this in %%generate_buildrequires section,
|
|
||||||
# but we want to get an environment consistent with %%build:
|
|
||||||
%{?_auto_set_build_flags:%set_build_flags}
|
|
||||||
# The default flags expect the package note file to exist
|
# The default flags expect the package note file to exist
|
||||||
# see https://bugzilla.redhat.com/show_bug.cgi?id=2097535
|
# see https://bugzilla.redhat.com/show_bug.cgi?id=2097535
|
||||||
%{?_package_note_flags:%_generate_package_note_file}
|
%{?_package_note_flags:%_generate_package_note_file}
|
||||||
@ -168,6 +178,7 @@ fi
|
|||||||
%{-e:%{error:The -R and -e options are mutually exclusive}}
|
%{-e:%{error:The -R and -e options are mutually exclusive}}
|
||||||
%{-t:%{error:The -R and -t options are mutually exclusive}}
|
%{-t:%{error:The -R and -t options are mutually exclusive}}
|
||||||
%{-w:%{error:The -R and -w options are mutually exclusive}}
|
%{-w:%{error:The -R and -w options are mutually exclusive}}
|
||||||
|
%{-p:%{error:The -R and -p options are mutually exclusive}}
|
||||||
}
|
}
|
||||||
%{-N:
|
%{-N:
|
||||||
%{-r:%{error:The -N and -r options are mutually exclusive}}
|
%{-r:%{error:The -N and -r options are mutually exclusive}}
|
||||||
@ -175,25 +186,25 @@ fi
|
|||||||
%{-e:%{error:The -N and -e options are mutually exclusive}}
|
%{-e:%{error:The -N and -e options are mutually exclusive}}
|
||||||
%{-t:%{error:The -N and -t options are mutually exclusive}}
|
%{-t:%{error:The -N and -t options are mutually exclusive}}
|
||||||
%{-w:%{error:The -N and -w options are mutually exclusive}}
|
%{-w:%{error:The -N and -w options are mutually exclusive}}
|
||||||
|
%{-p:%{error:The -N and -p options are mutually exclusive}}
|
||||||
%{-C:%{error:The -N and -C options are mutually exclusive}}
|
%{-C:%{error:The -N and -C options are mutually exclusive}}
|
||||||
|
%{-g:if [ -f pyproject.toml ]; then
|
||||||
|
%_pyproject_tomlidep
|
||||||
|
fi}
|
||||||
|
}
|
||||||
|
%{-w:
|
||||||
|
%{-p:%{error:The -w and -p options are mutually exclusive}}
|
||||||
}
|
}
|
||||||
%{-e:%{expand:%global toxenv %(%{__python3} -s %{_rpmconfigdir}/redhat/pyproject_construct_toxenv.py %{?**})}}
|
%{-e:%{expand:%global toxenv %(%{__python3} -s %{_rpmconfigdir}/redhat/pyproject_construct_toxenv.py %{?**})}}
|
||||||
echo 'pyproject-rpm-macros' # first stdout line matches the implementation in macros.aaa-pyproject-srpm
|
echo 'pyproject-rpm-macros' # first stdout line matches the implementation in macros.aaa-pyproject-srpm
|
||||||
echo 'python%{python3_pkgversion}-devel'
|
echo 'python%{python3_pkgversion}-devel'
|
||||||
echo 'python%{python3_pkgversion}dist(pip) >= 19'
|
|
||||||
echo 'python%{python3_pkgversion}dist(packaging)'
|
echo 'python%{python3_pkgversion}dist(packaging)'
|
||||||
%{!-N:if [ -f pyproject.toml ]; then
|
%{!-N:echo 'python%{python3_pkgversion}dist(pip) >= 19'
|
||||||
%["%{python3_pkgversion}" == "3"
|
if [ -f pyproject.toml ]; then
|
||||||
? "echo '(python%{python3_pkgversion}dist(tomli) if python%{python3_pkgversion}-devel < 3.11)'"
|
%_pyproject_tomlidep
|
||||||
: "%[v"%{python3_pkgversion}" < v"3.11"
|
|
||||||
? "echo 'python%{python3_pkgversion}dist(tomli)'"
|
|
||||||
: "true # will use tomllib, echo nothing"
|
|
||||||
]"
|
|
||||||
]
|
|
||||||
elif [ -f setup.py ]; then
|
elif [ -f setup.py ]; then
|
||||||
# Note: If the default requirements change, also change them in the script!
|
# Note: If the default requirements change, also change them in the script!
|
||||||
echo 'python%{python3_pkgversion}dist(setuptools) >= 40.8'
|
echo 'python%{python3_pkgversion}dist(setuptools) >= 40.8'
|
||||||
echo 'python%{python3_pkgversion}dist(wheel)'
|
|
||||||
else
|
else
|
||||||
echo 'ERROR: Neither pyproject.toml nor setup.py found, consider using %%%%pyproject_buildrequires -N <requirements-file> if this is not a Python package.' >&2
|
echo 'ERROR: Neither pyproject.toml nor setup.py found, consider using %%%%pyproject_buildrequires -N <requirements-file> if this is not a Python package.' >&2
|
||||||
exit 1
|
exit 1
|
||||||
@ -203,7 +214,8 @@ rm -rfv *.dist-info/ >&2
|
|||||||
if [ -f %{__python3} ]; then
|
if [ -f %{__python3} ]; then
|
||||||
mkdir -p "%{_pyproject_builddir}"
|
mkdir -p "%{_pyproject_builddir}"
|
||||||
echo -n > %{_pyproject_buildrequires}
|
echo -n > %{_pyproject_buildrequires}
|
||||||
CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}" TMPDIR="%{_pyproject_builddir}" \\\
|
%{_pyproject_build_flags} \\\
|
||||||
|
TMPDIR="%{_pyproject_builddir}" \\\
|
||||||
RPM_TOXENV="%{toxenv}" HOSTNAME="rpmbuild" %{__python3} -Bs %{_rpmconfigdir}/redhat/pyproject_buildrequires.py %{?!_python_no_extras_requires:--generate-extras} --python3_pkgversion %{python3_pkgversion} --wheeldir %{_pyproject_wheeldir} --output %{_pyproject_buildrequires} %{?**} >&2
|
RPM_TOXENV="%{toxenv}" HOSTNAME="rpmbuild" %{__python3} -Bs %{_rpmconfigdir}/redhat/pyproject_buildrequires.py %{?!_python_no_extras_requires:--generate-extras} --python3_pkgversion %{python3_pkgversion} --wheeldir %{_pyproject_wheeldir} --output %{_pyproject_buildrequires} %{?**} >&2
|
||||||
cat %{_pyproject_buildrequires}
|
cat %{_pyproject_buildrequires}
|
||||||
fi
|
fi
|
||||||
@ -221,3 +233,13 @@ PYTHONPATH="${PYTHONPATH:-%{buildroot}%{python3_sitearch}:%{buildroot}%{python3_
|
|||||||
HOSTNAME="rpmbuild" \\
|
HOSTNAME="rpmbuild" \\
|
||||||
%{__python3} -m tox --current-env -q --recreate -e "%{-e:%{-e*}}%{!-e:%{toxenv}}" %{?*}
|
%{__python3} -m tox --current-env -q --recreate -e "%{-e:%{-e*}}%{!-e:%{toxenv}}" %{?*}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Declarative buildsystem, requires RPM 4.20+ to work
|
||||||
|
# https://rpm-software-management.github.io/rpm/manual/buildsystem.html
|
||||||
|
%buildsystem_pyproject_conf() %nil
|
||||||
|
%buildsystem_pyproject_generate_buildrequires() %pyproject_buildrequires %*
|
||||||
|
%buildsystem_pyproject_build() %pyproject_wheel %*
|
||||||
|
%buildsystem_pyproject_install() %["%{shrink:%*}" == "" ? "%{error:BuildOption(install) is mandatory with pyproject BuildSystem.}" : "%pyproject_install \
|
||||||
|
%pyproject_save_files %*"]
|
||||||
|
%buildsystem_pyproject_check() %pyproject_check_import %*
|
11
pyproject-rpm-macros.rpmlintrc
Normal file
11
pyproject-rpm-macros.rpmlintrc
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# RPM macros, this is expected
|
||||||
|
addFilter(r'only-non-binary-in-usr-lib')
|
||||||
|
|
||||||
|
# we mention macro names in the descriptions and summaries
|
||||||
|
addFilter(r'[EW]: unexpanded-macro (%description|Summary).+ %(py3_|(generate|pyproject)_buildrequires)')
|
||||||
|
|
||||||
|
# terms, not spelling errors
|
||||||
|
addFilter(r"[EW]: spelling-error .+'(cfg|toml|setuptools|buildrequires)'")
|
||||||
|
|
||||||
|
# the documentation is in the other subpackage
|
||||||
|
addFilter(r'pyproject-srpm-macros.noarch: [EW]: no-documentation')
|
@ -1,5 +1,6 @@
|
|||||||
Name: pyproject-rpm-macros
|
Name: pyproject-rpm-macros
|
||||||
Summary: RPM macros for PEP 517 Python packages
|
Summary: RPM macros for PEP 517 Python packages
|
||||||
|
# SPDX
|
||||||
License: MIT
|
License: MIT
|
||||||
|
|
||||||
%bcond tests 1
|
%bcond tests 1
|
||||||
@ -13,7 +14,7 @@ License: MIT
|
|||||||
# Increment Y and reset Z when new macros or features are added
|
# Increment Y and reset Z when new macros or features are added
|
||||||
# Increment Z when this is a bugfix or a cosmetic change
|
# Increment Z when this is a bugfix or a cosmetic change
|
||||||
# Dropping support for EOL Fedoras is *not* considered a breaking change
|
# Dropping support for EOL Fedoras is *not* considered a breaking change
|
||||||
Version: 1.12.0
|
Version: 1.16.2
|
||||||
Release: 1%{?dist}
|
Release: 1%{?dist}
|
||||||
|
|
||||||
# Macro files
|
# Macro files
|
||||||
@ -62,21 +63,6 @@ BuildRequires: python3dist(tox-current-env) >= 0.0.6
|
|||||||
%endif
|
%endif
|
||||||
BuildRequires: python3dist(wheel)
|
BuildRequires: python3dist(wheel)
|
||||||
BuildRequires: (python3dist(tomli) if python3 < 3.11)
|
BuildRequires: (python3dist(tomli) if python3 < 3.11)
|
||||||
|
|
||||||
# RHEL 9: We also run pytest with Python 3.11 and 3.12
|
|
||||||
BuildRequires: python3.11dist(pytest)
|
|
||||||
BuildRequires: python3.11dist(pyyaml)
|
|
||||||
BuildRequires: python3.11dist(packaging)
|
|
||||||
BuildRequires: python3.11dist(pip)
|
|
||||||
BuildRequires: python3.11dist(setuptools)
|
|
||||||
BuildRequires: python3.11dist(wheel)
|
|
||||||
|
|
||||||
BuildRequires: python3.12dist(pytest)
|
|
||||||
BuildRequires: python3.12dist(pyyaml)
|
|
||||||
BuildRequires: python3.12dist(packaging)
|
|
||||||
BuildRequires: python3.12dist(pip)
|
|
||||||
BuildRequires: python3.12dist(setuptools)
|
|
||||||
BuildRequires: python3.12dist(wheel)
|
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
# We build on top of those:
|
# We build on top of those:
|
||||||
@ -95,7 +81,8 @@ Requires: /usr/bin/sed
|
|||||||
# This package requires the %%generate_buildrequires functionality.
|
# This package requires the %%generate_buildrequires functionality.
|
||||||
# It has been introduced in RPM 4.15 (4.14.90 is the alpha of 4.15).
|
# It has been introduced in RPM 4.15 (4.14.90 is the alpha of 4.15).
|
||||||
# What we need is rpmlib(DynamicBuildRequires), but that is impossible to (Build)Require.
|
# What we need is rpmlib(DynamicBuildRequires), but that is impossible to (Build)Require.
|
||||||
Requires: (rpm-build >= 4.14.90 if rpm-build)
|
# Also, we need to avoid 4.19.90..4.19.91-7 due to rhbz#2284187
|
||||||
|
Requires: ((rpm-build >= 4.14.90 with (rpm-build < 4.19.90 or rpm-build >= 4.19.91-8)) if rpm-build)
|
||||||
BuildRequires: rpm-build >= 4.14.90
|
BuildRequires: rpm-build >= 4.14.90
|
||||||
|
|
||||||
%description
|
%description
|
||||||
@ -162,14 +149,6 @@ test "$signature1" != ""
|
|||||||
export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856356
|
export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856356
|
||||||
%pytest -vv --doctest-modules %{?with_pytest_xdist:-n auto} %{!?with_tox_tests:-k "not tox"}
|
%pytest -vv --doctest-modules %{?with_pytest_xdist:-n auto} %{!?with_tox_tests:-k "not tox"}
|
||||||
|
|
||||||
# RHEL 9 only:
|
|
||||||
%global __pytest pytest-3.11
|
|
||||||
%pytest -vv --doctest-modules -k "not tox"
|
|
||||||
|
|
||||||
# RHEL 9 only:
|
|
||||||
%global __pytest pytest-3.12
|
|
||||||
%pytest -vv --doctest-modules -k "not tox"
|
|
||||||
|
|
||||||
# brp-compress is provided as an argument to get the right directory macro expansion
|
# brp-compress is provided as an argument to get the right directory macro expansion
|
||||||
%{python3} compare_mandata.py -f %{_rpmconfigdir}/brp-compress
|
%{python3} compare_mandata.py -f %{_rpmconfigdir}/brp-compress
|
||||||
%endif
|
%endif
|
||||||
@ -194,11 +173,58 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Nov 13 2024 Miro Hrončok <mhroncok@redhat.com> - 1.16.2-1
|
||||||
|
- Fix one remaining test for setuptools 70+
|
||||||
|
|
||||||
|
* Thu Nov 07 2024 Miro Hrončok <miro@hroncok.cz> - 1.16.1-1
|
||||||
|
- Support for setuptools 70+
|
||||||
|
- wheel is no longer generated as a dependency of the default build system
|
||||||
|
|
||||||
|
* Mon Nov 04 2024 Miro Hrončok <mhroncok@redhat.com> - 1.16.0-1
|
||||||
|
- %%pyproject_buildrequires: Add support for dependency groups (PEP 735), via the -g flag
|
||||||
|
- This is implied when used tox testenvs depend on dependency groups (requires tox 4.22+)
|
||||||
|
- Fixes: rhbz#2318849
|
||||||
|
|
||||||
|
* Thu Oct 03 2024 Karolina Surma <ksurma@redhat.com> - 1.15.1-1
|
||||||
|
- Fix handling of self-referencing extras when reading pyproject.toml
|
||||||
|
|
||||||
|
* Tue Sep 17 2024 Python Maint <python-maint@redhat.com> - 1.15.0-1
|
||||||
|
- Add a possibility to read runtime requirements from pyproject.toml [project] table
|
||||||
|
- Fixes: rhbz#2261939
|
||||||
|
- Don't generate a dependency on pip when %%pyproject_buildrequires -N is used
|
||||||
|
- Fixes: rhbz#2294510
|
||||||
|
- Even when %%_auto_set_build_flags is disabled, set all compiler flags when building wheels
|
||||||
|
- Fixes: rhbz#2293616
|
||||||
|
|
||||||
|
* Tue Jul 23 2024 Miro Hrončok <mhroncok@redhat.com> - 1.14.0-1
|
||||||
|
- Add a provisional RPM Declarative Buildsystem (RPM 4.20+)
|
||||||
|
|
||||||
|
* Fri Jul 19 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.13.0-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Jul 02 2024 Miro Hrončok <mhroncok@redhat.com> - 1.13.0-1
|
||||||
|
- Properly escape weird characters from paths in %%{pyproject_files} (RPM 4.19+ only)
|
||||||
|
- Revert the temporary workaround for RPM 4.20 alpha 2 leaking \x1f (unit separators)
|
||||||
|
- Fixes: rhbz#1990879
|
||||||
|
|
||||||
|
* Tue Jun 25 2024 Cristian Le <fedora@lecris.me> - 1.12.2-1
|
||||||
|
- %%pyproject_extras_subpkg: Allow passing -a or -A to %%python_extras_subpkg
|
||||||
|
|
||||||
|
* Tue Jun 04 2024 Miro Hrončok <mhroncok@redhat.com> - 1.12.1-1
|
||||||
|
- Add a temporary workaround for RPM 4.20 alpha 2 leaking \x1f (unit separators)
|
||||||
|
- Related: rhbz#2284187
|
||||||
|
|
||||||
* Fri Jan 26 2024 Miro Hrončok <miro@hroncok.cz> - 1.12.0-1
|
* Fri Jan 26 2024 Miro Hrončok <miro@hroncok.cz> - 1.12.0-1
|
||||||
- Namespace pyproject-rpm-macros generated text files with %%{python3_pkgversion}
|
- Namespace pyproject-rpm-macros generated text files with %%{python3_pkgversion}
|
||||||
- That way, a single-spec can be used to build packages for multiple Python versions
|
- That way, a single-spec can be used to build packages for multiple Python versions
|
||||||
- Fixes: rhbz#2209055
|
- Fixes: rhbz#2209055
|
||||||
|
|
||||||
|
* Fri Jan 26 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.11.0-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.11.0-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||||
|
|
||||||
* Wed Sep 27 2023 Miro Hrončok <mhroncok@redhat.com> - 1.11.0-1
|
* Wed Sep 27 2023 Miro Hrončok <mhroncok@redhat.com> - 1.11.0-1
|
||||||
- Add the -l/-L flag to %%pyproject_save_files
|
- Add the -l/-L flag to %%pyproject_save_files
|
||||||
- The -l flag can be used to assert at least 1 License-File was detected
|
- The -l flag can be used to assert at least 1 License-File was detected
|
||||||
@ -215,8 +241,12 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856
|
|||||||
- Fix handling of tox 4 provision without an explicit tox minversion
|
- Fix handling of tox 4 provision without an explicit tox minversion
|
||||||
- Fixes: rhbz#2240590
|
- Fixes: rhbz#2240590
|
||||||
|
|
||||||
|
* Fri Jul 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1.9.0-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
|
||||||
|
|
||||||
* Wed May 31 2023 Maxwell G <maxwell@gtmx.me> - 1.9.0-1
|
* Wed May 31 2023 Maxwell G <maxwell@gtmx.me> - 1.9.0-1
|
||||||
- Allow passing config_settings to the build backend.
|
- Allow passing config_settings to the build backend.
|
||||||
|
- Resolves: rhbz#2192581
|
||||||
|
|
||||||
* Wed May 31 2023 Miro Hrončok <mhroncok@redhat.com> - 1.8.1-1
|
* Wed May 31 2023 Miro Hrončok <mhroncok@redhat.com> - 1.8.1-1
|
||||||
- On Python older than 3.11, use tomli instead of deprecated toml
|
- On Python older than 3.11, use tomli instead of deprecated toml
|
||||||
@ -227,12 +257,14 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856
|
|||||||
|
|
||||||
* Thu Apr 27 2023 Miro Hrončok <mhroncok@redhat.com> - 1.8.0-1
|
* Thu Apr 27 2023 Miro Hrončok <mhroncok@redhat.com> - 1.8.0-1
|
||||||
- %%pyproject_buildrequires: Add support for self-referential extras requirements
|
- %%pyproject_buildrequires: Add support for self-referential extras requirements
|
||||||
|
Fixes: rhbz#2171343
|
||||||
- Deprecate the provisional %%{pyproject_build_lib} macro
|
- Deprecate the provisional %%{pyproject_build_lib} macro
|
||||||
See https://lists.fedoraproject.org/archives/list/python-devel@lists.fedoraproject.org/thread/HMLOPAU3RZLXD4BOJHTIPKI3I4U6U7OE/
|
See https://lists.fedoraproject.org/archives/list/python-devel@lists.fedoraproject.org/thread/HMLOPAU3RZLXD4BOJHTIPKI3I4U6U7OE/
|
||||||
|
|
||||||
* Fri Mar 31 2023 Miro Hrončok <mhroncok@redhat.com> - 1.7.0-1
|
* Fri Mar 31 2023 Miro Hrončok <mhroncok@redhat.com> - 1.7.0-1
|
||||||
- %%pyproject_buildrequires: Redirect stdout to stderr via Shell
|
- %%pyproject_buildrequires: Redirect stdout to stderr via Shell
|
||||||
- Dependencies are recorded to a text file that is catted at the end
|
- Dependencies are recorded to a text file that is catted at the end
|
||||||
|
- Fixes: rhbz#2183519
|
||||||
|
|
||||||
* Mon Feb 13 2023 Lumír Balhar <lbalhar@redhat.com> - 1.6.3-1
|
* Mon Feb 13 2023 Lumír Balhar <lbalhar@redhat.com> - 1.6.3-1
|
||||||
- Remove .dist-info directory at the end of %%pyproject_buildrequires
|
- Remove .dist-info directory at the end of %%pyproject_buildrequires
|
||||||
@ -240,24 +272,31 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856
|
|||||||
|
|
||||||
* Wed Feb 08 2023 Lumír Balhar <lbalhar@redhat.com> - 1.6.2-1
|
* Wed Feb 08 2023 Lumír Balhar <lbalhar@redhat.com> - 1.6.2-1
|
||||||
- Improve detection of lang files
|
- Improve detection of lang files
|
||||||
|
- Fixes: rhbz#2166295
|
||||||
|
|
||||||
* Fri Feb 03 2023 Miro Hrončok <mhroncok@redhat.com> - 1.6.1-1
|
* Fri Feb 03 2023 Miro Hrončok <mhroncok@redhat.com> - 1.6.1-1
|
||||||
- %%pyproject_buildrequires: Avoid leaking stdout from subprocesses
|
- %%pyproject_buildrequires: Avoid leaking stdout from subprocesses
|
||||||
|
- Fixes: rhbz#2166888
|
||||||
|
|
||||||
* Fri Jan 20 2023 Miro Hrončok <miro@hroncok.cz> - 1.6.0-1
|
* Fri Jan 20 2023 Miro Hrončok <miro@hroncok.cz> - 1.6.0-1
|
||||||
- Add pyproject-srpm-macros with a minimal %%pyproject_buildrequires macro
|
- Add pyproject-srpm-macros with a minimal %%pyproject_buildrequires macro
|
||||||
|
|
||||||
|
* Fri Jan 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1.5.1-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
|
||||||
|
|
||||||
* Fri Jan 13 2023 Miro Hrončok <mhroncok@redhat.com> - 1.5.1-1
|
* Fri Jan 13 2023 Miro Hrončok <mhroncok@redhat.com> - 1.5.1-1
|
||||||
- Adjusts %%pyproject_buildrequires tests for tox 4
|
- Adjusts %%pyproject_buildrequires tests for tox 4
|
||||||
|
- Fixes: rhbz#2160687
|
||||||
|
|
||||||
* Mon Nov 28 2022 Miro Hrončok <mhroncok@redhat.com> - 1.5.0-1
|
* Mon Nov 28 2022 Miro Hrončok <mhroncok@redhat.com> - 1.5.0-1
|
||||||
- Use %%py3_test_envvars in %%tox when available
|
- Use %%py3_test_envvars in %%tox when available
|
||||||
|
|
||||||
* Mon Sep 19 2022 Python Maint <python-maint@redhat.com> - 1.4.0-1
|
* Mon Sep 19 2022 Python Maint <python-maint@redhat.com> - 1.4.0-1
|
||||||
- %%pyproject_save_files: Support License-Files installed into the *Root License Directory* from PEP 639
|
- %%pyproject_save_files: Support License-Files installed into the *Root License Directory* from PEP 639
|
||||||
|
- Fixes: rhbz#2127946
|
||||||
- %%pyproject_check_import: Import only the modules whose top-level names
|
- %%pyproject_check_import: Import only the modules whose top-level names
|
||||||
match any of the globs provided to %%pyproject_save_files
|
match any of the globs provided to %%pyproject_save_files
|
||||||
|
- Fixes: rhbz#2127958
|
||||||
|
|
||||||
* Tue Aug 30 2022 Otto Liljalaakso <otto.liljalaakso@iki.fi> - 1.3.4-1
|
* Tue Aug 30 2022 Otto Liljalaakso <otto.liljalaakso@iki.fi> - 1.3.4-1
|
||||||
- Fix typo in internal function name
|
- Fix typo in internal function name
|
||||||
@ -265,10 +304,15 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856
|
|||||||
* Tue Aug 09 2022 Karolina Surma <ksurma@redhat.com> - 1.3.3-1
|
* Tue Aug 09 2022 Karolina Surma <ksurma@redhat.com> - 1.3.3-1
|
||||||
- Don't fail %%pyproject_save_files '*' if no modules are detected
|
- Don't fail %%pyproject_save_files '*' if no modules are detected
|
||||||
|
|
||||||
|
* Fri Jul 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1.3.2-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
|
||||||
|
|
||||||
* Wed Jun 15 2022 Benjamin A. Beasley <code@musicinmybrain.net> - 1.3.2-1
|
* Wed Jun 15 2022 Benjamin A. Beasley <code@musicinmybrain.net> - 1.3.2-1
|
||||||
- Update %%pyproject_build_lib to support setuptools 62.1.0 and later
|
- Update %%pyproject_build_lib to support setuptools 62.1.0 and later
|
||||||
|
- Fixes: rhbz#2097158
|
||||||
- %%pyproject_buildrequires: When extension modules are built,
|
- %%pyproject_buildrequires: When extension modules are built,
|
||||||
support https://fedoraproject.org/wiki/Changes/Package_information_on_ELF_objects
|
support https://fedoraproject.org/wiki/Changes/Package_information_on_ELF_objects
|
||||||
|
- Fixes: rhbz#2097535
|
||||||
|
|
||||||
* Fri May 27 2022 Owen Taylor <otaylor@redhat.com> - 1.3.1-1
|
* Fri May 27 2022 Owen Taylor <otaylor@redhat.com> - 1.3.1-1
|
||||||
- %%pyproject_install: pass %%{_prefix} explicitly to pip install
|
- %%pyproject_install: pass %%{_prefix} explicitly to pip install
|
||||||
@ -281,9 +325,11 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856
|
|||||||
prepare_metadata_for_build_wheel hook
|
prepare_metadata_for_build_wheel hook
|
||||||
When used, the wheel is built in %%pyproject_buildrequires
|
When used, the wheel is built in %%pyproject_buildrequires
|
||||||
and information about runtime requires and extras is read from that wheel.
|
and information about runtime requires and extras is read from that wheel.
|
||||||
|
- Fixes: rhbz#2076994
|
||||||
|
|
||||||
* Tue Apr 12 2022 Miro Hrončok <mhroncok@redhat.com> - 1.1.0-1
|
* Tue Apr 12 2022 Miro Hrončok <mhroncok@redhat.com> - 1.1.0-1
|
||||||
- %%pyproject_save_files: Support nested directories in dist-info
|
- %%pyproject_save_files: Support nested directories in dist-info
|
||||||
|
- Fixes: rhbz#1985340
|
||||||
|
|
||||||
* Tue Mar 22 2022 Miro Hrončok <mhroncok@redhat.com> - 1.0.1-1
|
* Tue Mar 22 2022 Miro Hrončok <mhroncok@redhat.com> - 1.0.1-1
|
||||||
- Prefix paths of intermediate files (such as %%{pyproject_files}) with NVRA
|
- Prefix paths of intermediate files (such as %%{pyproject_files}) with NVRA
|
||||||
@ -303,6 +349,7 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856
|
|||||||
|
|
||||||
* Wed Jan 19 2022 Karolina Surma <ksurma@redhat.com> - 0-54
|
* Wed Jan 19 2022 Karolina Surma <ksurma@redhat.com> - 0-54
|
||||||
- Include compressed manpages to the package if flag '+auto' is provided to %%pyproject_save_files
|
- Include compressed manpages to the package if flag '+auto' is provided to %%pyproject_save_files
|
||||||
|
- Fixes: rhbz#2033254
|
||||||
|
|
||||||
* Fri Jan 14 2022 Miro Hrončok <mhroncok@redhat.com> - 0-53
|
* Fri Jan 14 2022 Miro Hrončok <mhroncok@redhat.com> - 0-53
|
||||||
- %%pyproject_buildrequires: Make -r (include runtime) the default, use -R to opt-out
|
- %%pyproject_buildrequires: Make -r (include runtime) the default, use -R to opt-out
|
||||||
@ -325,6 +372,7 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856
|
|||||||
|
|
||||||
* Sat Oct 16 2021 Miro Hrončok <mhroncok@redhat.com> - 0-48
|
* Sat Oct 16 2021 Miro Hrončok <mhroncok@redhat.com> - 0-48
|
||||||
- %%pyproject_buildrequires: Accept installed pre-releases for all requirements
|
- %%pyproject_buildrequires: Accept installed pre-releases for all requirements
|
||||||
|
- Fixes: rhbz#2014639
|
||||||
|
|
||||||
* Thu Sep 09 2021 Miro Hrončok <mhroncok@redhat.com> - 0-47
|
* Thu Sep 09 2021 Miro Hrončok <mhroncok@redhat.com> - 0-47
|
||||||
- %%pyproject_save_files: Expand the namespace error message, also display it with /
|
- %%pyproject_save_files: Expand the namespace error message, also display it with /
|
||||||
@ -332,6 +380,7 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856
|
|||||||
|
|
||||||
* Fri Jul 23 2021 Miro Hrončok <miro@hroncok.cz> - 0-46
|
* Fri Jul 23 2021 Miro Hrončok <miro@hroncok.cz> - 0-46
|
||||||
- %%pyproject_buildrequires now fails when it encounters an invalid requirement
|
- %%pyproject_buildrequires now fails when it encounters an invalid requirement
|
||||||
|
- Fixes: rhbz#1983053
|
||||||
- Rename %%_pyproject_ghost_distinfo and %%_pyproject_record to indicate they are private
|
- Rename %%_pyproject_ghost_distinfo and %%_pyproject_record to indicate they are private
|
||||||
- Automatically detect LICENSE files and mark them with %%license macro
|
- Automatically detect LICENSE files and mark them with %%license macro
|
||||||
|
|
||||||
@ -340,36 +389,34 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856
|
|||||||
|
|
||||||
* Fri Jul 09 2021 Python Maint <python-maint@redhat.com> - 0-44
|
* Fri Jul 09 2021 Python Maint <python-maint@redhat.com> - 0-44
|
||||||
- Escape weird paths generated by %%pyproject_save_files
|
- Escape weird paths generated by %%pyproject_save_files
|
||||||
|
- Fixes rhbz#1976363
|
||||||
- Support x.* versions in %%pyproject_buildrequires
|
- Support x.* versions in %%pyproject_buildrequires
|
||||||
|
- Fixes rhbz#1981558
|
||||||
- %%pyproject_buildrequires fallbacks to setuptools only if setup.py exists
|
- %%pyproject_buildrequires fallbacks to setuptools only if setup.py exists
|
||||||
|
- Fixes: rhbz#1976459
|
||||||
- Explicitly require the "basic" Python RPM macros
|
- Explicitly require the "basic" Python RPM macros
|
||||||
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
|
|
||||||
Related: rhbz#1991688
|
|
||||||
|
|
||||||
* Thu Jul 01 2021 Tomas Hrnciar <thrnciar@redhat.com> - 0-43
|
* Thu Jul 01 2021 Tomas Hrnciar <thrnciar@redhat.com> - 0-43
|
||||||
- Generate BuildRequires from file
|
- Generate BuildRequires from file
|
||||||
|
- Fixes: rhbz#1936448
|
||||||
|
|
||||||
* Tue Jun 29 2021 Miro Hrončok <mhroncok@redhat.com> - 0-42
|
* Tue Jun 29 2021 Miro Hrončok <mhroncok@redhat.com> - 0-42
|
||||||
- Don't accidentally treat "~= X.0" requirement as "~= X"
|
- Don't accidentally treat "~= X.0" requirement as "~= X"
|
||||||
- Fixes rhzb#1977060
|
- Fixes rhbz#1977060
|
||||||
|
|
||||||
* Mon Jun 28 2021 Miro Hrončok <mhroncok@redhat.com> - 0-41
|
* Mon Jun 28 2021 Miro Hrončok <mhroncok@redhat.com> - 0-41
|
||||||
- Don't leak %%{_pyproject_builddir} to pytest collection
|
- Don't leak %%{_pyproject_builddir} to pytest collection
|
||||||
|
- Fixes rhbz#1935212
|
||||||
|
|
||||||
* Thu May 27 2021 Miro Hrončok <mhroncok@redhat.com> - 0-40
|
* Thu May 27 2021 Miro Hrončok <mhroncok@redhat.com> - 0-40
|
||||||
- Don't leak $TMPDIR outside of pyproject macros
|
- Don't leak $TMPDIR outside of pyproject macros
|
||||||
- Set %%_pyproject_wheeldir and %%_pyproject_builddir relative to the source tree, not $PWD
|
- Set %%_pyproject_wheeldir and %%_pyproject_builddir relative to the source tree, not $PWD
|
||||||
|
|
||||||
* Thu Apr 22 2021 Miro Hrončok <mhroncok@redhat.com> - 0-39.2
|
* Mon Mar 29 2021 Miro Hrončok <mhroncok@redhat.com> - 0-39
|
||||||
- Handle tox provision (tox.requires / tox.minversion)
|
- Handle tox provision (tox.requires / tox.minversion)
|
||||||
|
- Fixes: rhbz#1922495
|
||||||
- Generate BuildRequires on extras in lower case
|
- Generate BuildRequires on extras in lower case
|
||||||
- Fixes: rhbz#1947074
|
- Fixes: rhbz#1937944
|
||||||
|
|
||||||
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 0-39.1
|
|
||||||
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
|
|
||||||
|
|
||||||
* Mon Mar 08 2021 Charalampos Stratakis <cstratak@redhat.com> - 0-38.1
|
|
||||||
- Disable tests on RHEL9 to remove tox dependency
|
|
||||||
|
|
||||||
* Sun Feb 07 2021 Miro Hrončok <mhroncok@redhat.com> - 0-38
|
* Sun Feb 07 2021 Miro Hrončok <mhroncok@redhat.com> - 0-38
|
||||||
- Include nested __pycache__ directories in %%pyproject_save_files
|
- Include nested __pycache__ directories in %%pyproject_save_files
|
@ -10,6 +10,7 @@ import subprocess
|
|||||||
import re
|
import re
|
||||||
import tempfile
|
import tempfile
|
||||||
import email.parser
|
import email.parser
|
||||||
|
import functools
|
||||||
import pathlib
|
import pathlib
|
||||||
import zipfile
|
import zipfile
|
||||||
|
|
||||||
@ -34,6 +35,7 @@ def print_err(*args, **kwargs):
|
|||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
from packaging.markers import Marker
|
||||||
from packaging.requirements import Requirement, InvalidRequirement
|
from packaging.requirements import Requirement, InvalidRequirement
|
||||||
from packaging.utils import canonicalize_name
|
from packaging.utils import canonicalize_name
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
@ -99,15 +101,20 @@ class Requirements:
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def add(self, requirement_str, *, package_name=None, source=None):
|
def add(self, requirement, *, package_name=None, source=None, extra=None):
|
||||||
"""Output a Python-style requirement string as RPM dep"""
|
"""Output a Python-style requirement string as RPM dep"""
|
||||||
|
|
||||||
|
requirement_str = str(requirement)
|
||||||
print_err(f'Handling {requirement_str} from {source}')
|
print_err(f'Handling {requirement_str} from {source}')
|
||||||
|
|
||||||
|
# requirements read initially from the metadata are strings
|
||||||
|
# further on we work with them as Requirement instances
|
||||||
|
if not isinstance(requirement, Requirement):
|
||||||
try:
|
try:
|
||||||
requirement = Requirement(requirement_str)
|
requirement = Requirement(requirement)
|
||||||
except InvalidRequirement:
|
except InvalidRequirement:
|
||||||
hint = guess_reason_for_invalid_requirement(requirement_str)
|
hint = guess_reason_for_invalid_requirement(requirement)
|
||||||
message = f'Requirement {requirement_str!r} from {source} is invalid.'
|
message = f'Requirement {requirement!r} from {source} is invalid.'
|
||||||
if hint:
|
if hint:
|
||||||
message += f' Hint: {hint}'
|
message += f' Hint: {hint}'
|
||||||
raise ValueError(message)
|
raise ValueError(message)
|
||||||
@ -118,10 +125,17 @@ class Requirements:
|
|||||||
)
|
)
|
||||||
|
|
||||||
name = canonicalize_name(requirement.name)
|
name = canonicalize_name(requirement.name)
|
||||||
|
|
||||||
|
if extra is not None:
|
||||||
|
extra_str = f'extra == "{extra}"'
|
||||||
|
if requirement.marker is not None:
|
||||||
|
extra_str = f'({requirement.marker}) and {extra_str}'
|
||||||
|
requirement.marker = Marker(extra_str)
|
||||||
|
|
||||||
if (requirement.marker is not None and
|
if (requirement.marker is not None and
|
||||||
not self.evaluate_all_environments(requirement)):
|
not self.evaluate_all_environments(requirement)):
|
||||||
print_err(f'Ignoring alien requirement:', requirement_str)
|
print_err(f'Ignoring alien requirement:', requirement_str)
|
||||||
self.ignored_alien_requirements.append(requirement_str)
|
self.ignored_alien_requirements.append(requirement)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Handle self-referencing requirements
|
# Handle self-referencing requirements
|
||||||
@ -215,7 +229,8 @@ def toml_load(opened_binary_file):
|
|||||||
return tomllib.load(opened_binary_file)
|
return tomllib.load(opened_binary_file)
|
||||||
|
|
||||||
|
|
||||||
def get_backend(requirements):
|
@functools.cache
|
||||||
|
def load_pyproject():
|
||||||
try:
|
try:
|
||||||
f = open('pyproject.toml', 'rb')
|
f = open('pyproject.toml', 'rb')
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
@ -223,6 +238,11 @@ def get_backend(requirements):
|
|||||||
else:
|
else:
|
||||||
with f:
|
with f:
|
||||||
pyproject_data = toml_load(f)
|
pyproject_data = toml_load(f)
|
||||||
|
return pyproject_data
|
||||||
|
|
||||||
|
|
||||||
|
def get_backend(requirements):
|
||||||
|
pyproject_data = load_pyproject()
|
||||||
|
|
||||||
buildsystem_data = pyproject_data.get('build-system', {})
|
buildsystem_data = pyproject_data.get('build-system', {})
|
||||||
requirements.extend(
|
requirements.extend(
|
||||||
@ -248,7 +268,6 @@ def get_backend(requirements):
|
|||||||
# with pyproject.toml without a specified build backend.
|
# with pyproject.toml without a specified build backend.
|
||||||
# If the default requirements change, also change them in the macro!
|
# If the default requirements change, also change them in the macro!
|
||||||
requirements.add('setuptools >= 40.8', source='default build backend')
|
requirements.add('setuptools >= 40.8', source='default build backend')
|
||||||
requirements.add('wheel', source='default build backend')
|
|
||||||
|
|
||||||
requirements.check(source='build backend')
|
requirements.check(source='build backend')
|
||||||
|
|
||||||
@ -302,7 +321,9 @@ def generate_run_requirements_hook(backend, requirements):
|
|||||||
raise ValueError(
|
raise ValueError(
|
||||||
'The build backend cannot provide build metadata '
|
'The build backend cannot provide build metadata '
|
||||||
'(incl. runtime requirements) before build. '
|
'(incl. runtime requirements) before build. '
|
||||||
'Use the provisional -w flag to build the wheel and parse the metadata from it, '
|
'If the dependencies are specified in the pyproject.toml [project] '
|
||||||
|
'table, you can use the -p flag to read them.'
|
||||||
|
'Alternatively, use the provisional -w flag to build the wheel and parse the metadata from it, '
|
||||||
'or use the -R flag not to generate runtime dependencies.'
|
'or use the -R flag not to generate runtime dependencies.'
|
||||||
)
|
)
|
||||||
dir_basename = prepare_metadata('.', config_settings=requirements.config_settings)
|
dir_basename = prepare_metadata('.', config_settings=requirements.config_settings)
|
||||||
@ -360,8 +381,35 @@ def generate_run_requirements_wheel(backend, requirements, wheeldir):
|
|||||||
raise RuntimeError('Could not find *.dist-info/METADATA in built wheel.')
|
raise RuntimeError('Could not find *.dist-info/METADATA in built wheel.')
|
||||||
|
|
||||||
|
|
||||||
def generate_run_requirements(backend, requirements, *, build_wheel, wheeldir):
|
def generate_run_requirements_pyproject(requirements):
|
||||||
if build_wheel:
|
pyproject_data = load_pyproject()
|
||||||
|
|
||||||
|
if not (project_table := pyproject_data.get('project', {})):
|
||||||
|
raise ValueError('Could not find the [project] table in pyproject.toml.')
|
||||||
|
|
||||||
|
dynamic_fields = project_table.get('dynamic', [])
|
||||||
|
if 'dependencies' in dynamic_fields or 'optional-dependencies' in dynamic_fields:
|
||||||
|
raise ValueError('Could not read the dependencies or optional-dependencies '
|
||||||
|
'from the [project] table in pyproject.toml, as the field is dynamic.')
|
||||||
|
|
||||||
|
dependencies = project_table.get('dependencies', [])
|
||||||
|
name = project_table.get('name')
|
||||||
|
requirements.extend(dependencies,
|
||||||
|
package_name=name,
|
||||||
|
source=f'pyproject.toml generated metadata: [dependencies] ({name})')
|
||||||
|
|
||||||
|
optional_dependencies = project_table.get('optional-dependencies', {})
|
||||||
|
for extra, dependencies in optional_dependencies.items():
|
||||||
|
requirements.extend(dependencies,
|
||||||
|
package_name=name,
|
||||||
|
source=f'pyproject.toml generated metadata: [optional-dependencies] {extra} ({name})',
|
||||||
|
extra=extra)
|
||||||
|
|
||||||
|
|
||||||
|
def generate_run_requirements(backend, requirements, *, build_wheel, read_pyproject_dependencies, wheeldir):
|
||||||
|
if read_pyproject_dependencies:
|
||||||
|
generate_run_requirements_pyproject(requirements)
|
||||||
|
elif build_wheel:
|
||||||
generate_run_requirements_wheel(backend, requirements, wheeldir)
|
generate_run_requirements_wheel(backend, requirements, wheeldir)
|
||||||
else:
|
else:
|
||||||
generate_run_requirements_hook(backend, requirements)
|
generate_run_requirements_hook(backend, requirements)
|
||||||
@ -411,6 +459,103 @@ def generate_tox_requirements(toxenv, requirements):
|
|||||||
source=f'tox --print-deps-only: {toxenv}')
|
source=f'tox --print-deps-only: {toxenv}')
|
||||||
|
|
||||||
|
|
||||||
|
def tox_dependency_groups(toxenv):
|
||||||
|
# We call this command separately instead of folding it into the previous one
|
||||||
|
# becasue --print-dependency-groups-to only works with tox 4.22+ and tox-current-env 0.0.14+.
|
||||||
|
# We handle failure gracefully: upstreams using dependency_groups should require tox >= 4.22.
|
||||||
|
toxenv = ','.join(toxenv)
|
||||||
|
with tempfile.NamedTemporaryFile('r') as groups:
|
||||||
|
r = subprocess.run(
|
||||||
|
[sys.executable, '-m', 'tox',
|
||||||
|
'--print-dependency-groups-to', groups.name,
|
||||||
|
'-q', '-e', toxenv],
|
||||||
|
check=False,
|
||||||
|
encoding='utf-8',
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.STDOUT,
|
||||||
|
)
|
||||||
|
if r.returncode == 0:
|
||||||
|
if r.stdout:
|
||||||
|
print_err(r.stdout, end='')
|
||||||
|
if output := groups.read().strip():
|
||||||
|
return output.splitlines()
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
def generate_dependency_groups(requested_groups, requirements):
|
||||||
|
"""Adapted from https://peps.python.org/pep-0735/#reference-implementation (public domain)"""
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
def _normalize_name(name: str) -> str:
|
||||||
|
return re.sub(r"[-_.]+", "-", name).lower()
|
||||||
|
|
||||||
|
def _normalize_group_names(dependency_groups: dict) -> dict:
|
||||||
|
original_names = defaultdict(list)
|
||||||
|
normalized_groups = {}
|
||||||
|
|
||||||
|
for group_name, value in dependency_groups.items():
|
||||||
|
normed_group_name = _normalize_name(group_name)
|
||||||
|
original_names[normed_group_name].append(group_name)
|
||||||
|
normalized_groups[normed_group_name] = value
|
||||||
|
|
||||||
|
errors = []
|
||||||
|
for normed_name, names in original_names.items():
|
||||||
|
if len(names) > 1:
|
||||||
|
errors.append(f"{normed_name} ({', '.join(names)})")
|
||||||
|
if errors:
|
||||||
|
raise ValueError(f"Duplicate dependency group names: {', '.join(errors)}")
|
||||||
|
|
||||||
|
return normalized_groups
|
||||||
|
|
||||||
|
def _resolve_dependency_group(
|
||||||
|
dependency_groups: dict, group: str, past_groups: tuple[str, ...] = ()
|
||||||
|
) -> list[str]:
|
||||||
|
if group in past_groups:
|
||||||
|
raise ValueError(f"Cyclic dependency group include: {group} -> {past_groups}")
|
||||||
|
|
||||||
|
if group not in dependency_groups:
|
||||||
|
raise LookupError(f"Dependency group '{group}' not found")
|
||||||
|
|
||||||
|
raw_group = dependency_groups[group]
|
||||||
|
if not isinstance(raw_group, list):
|
||||||
|
raise ValueError(f"Dependency group '{group}' is not a list")
|
||||||
|
|
||||||
|
realized_group = []
|
||||||
|
for item in raw_group:
|
||||||
|
if isinstance(item, str):
|
||||||
|
realized_group.append(item)
|
||||||
|
elif isinstance(item, dict):
|
||||||
|
if tuple(item.keys()) != ("include-group",):
|
||||||
|
raise ValueError(f"Invalid dependency group item: {item}")
|
||||||
|
|
||||||
|
include_group = _normalize_name(next(iter(item.values())))
|
||||||
|
realized_group.extend(
|
||||||
|
_resolve_dependency_group(
|
||||||
|
dependency_groups, include_group, past_groups + (group,)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Invalid dependency group item: {item}")
|
||||||
|
|
||||||
|
return realized_group
|
||||||
|
|
||||||
|
def resolve(dependency_groups: dict, group: str) -> list[str]:
|
||||||
|
if not isinstance(dependency_groups, dict):
|
||||||
|
raise TypeError("Dependency Groups table is not a dict")
|
||||||
|
return _resolve_dependency_group(dependency_groups, _normalize_name(group))
|
||||||
|
|
||||||
|
pyproject_data = load_pyproject()
|
||||||
|
dependency_groups_raw = pyproject_data.get("dependency-groups", {})
|
||||||
|
dependency_groups = _normalize_group_names(dependency_groups_raw)
|
||||||
|
|
||||||
|
for group_names in requested_groups:
|
||||||
|
for group_name in group_names.split(","):
|
||||||
|
requirements.extend(
|
||||||
|
resolve(dependency_groups, group_name),
|
||||||
|
source=f"Dependency group {group_name}",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def python3dist(name, op=None, version=None, python3_pkgversion="3"):
|
def python3dist(name, op=None, version=None, python3_pkgversion="3"):
|
||||||
prefix = f"python{python3_pkgversion}dist"
|
prefix = f"python{python3_pkgversion}dist"
|
||||||
|
|
||||||
@ -423,9 +568,10 @@ def python3dist(name, op=None, version=None, python3_pkgversion="3"):
|
|||||||
|
|
||||||
|
|
||||||
def generate_requires(
|
def generate_requires(
|
||||||
*, include_runtime=False, build_wheel=False, wheeldir=None, toxenv=None, extras=None,
|
*, include_runtime=False, build_wheel=False, wheeldir=None, toxenv=None, extras=None, dependency_groups=None,
|
||||||
get_installed_version=importlib.metadata.version, # for dep injection
|
get_installed_version=importlib.metadata.version, # for dep injection
|
||||||
generate_extras=False, python3_pkgversion="3", requirement_files=None, use_build_system=True,
|
generate_extras=False, python3_pkgversion="3", requirement_files=None, use_build_system=True,
|
||||||
|
read_pyproject_dependencies=False,
|
||||||
output, config_settings=None,
|
output, config_settings=None,
|
||||||
):
|
):
|
||||||
"""Generate the BuildRequires for the project in the current directory
|
"""Generate the BuildRequires for the project in the current directory
|
||||||
@ -441,9 +587,10 @@ def generate_requires(
|
|||||||
config_settings=config_settings,
|
config_settings=config_settings,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
dependency_groups = dependency_groups or []
|
||||||
try:
|
try:
|
||||||
if (include_runtime or toxenv) and not use_build_system:
|
if (include_runtime or toxenv or read_pyproject_dependencies) and not use_build_system:
|
||||||
raise ValueError('-N option cannot be used in combination with -r, -e, -t, -x options')
|
raise ValueError('-N option cannot be used in combination with -r, -e, -t, -x, -p options')
|
||||||
if requirement_files:
|
if requirement_files:
|
||||||
for req_file in requirement_files:
|
for req_file in requirement_files:
|
||||||
requirements.extend(
|
requirements.extend(
|
||||||
@ -457,8 +604,12 @@ def generate_requires(
|
|||||||
if toxenv:
|
if toxenv:
|
||||||
include_runtime = True
|
include_runtime = True
|
||||||
generate_tox_requirements(toxenv, requirements)
|
generate_tox_requirements(toxenv, requirements)
|
||||||
|
dependency_groups.extend(tox_dependency_groups(toxenv))
|
||||||
|
if dependency_groups:
|
||||||
|
generate_dependency_groups(dependency_groups, requirements)
|
||||||
if include_runtime:
|
if include_runtime:
|
||||||
generate_run_requirements(backend, requirements, build_wheel=build_wheel, wheeldir=wheeldir)
|
generate_run_requirements(backend, requirements, build_wheel=build_wheel,
|
||||||
|
read_pyproject_dependencies=read_pyproject_dependencies, wheeldir=wheeldir)
|
||||||
except EndPass:
|
except EndPass:
|
||||||
return
|
return
|
||||||
finally:
|
finally:
|
||||||
@ -485,7 +636,7 @@ def main(argv):
|
|||||||
help=argparse.SUPPRESS,
|
help=argparse.SUPPRESS,
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-p', '--python3_pkgversion', metavar='PYTHON3_PKGVERSION',
|
'--python3_pkgversion', metavar='PYTHON3_PKGVERSION',
|
||||||
default="3", help=argparse.SUPPRESS,
|
default="3", help=argparse.SUPPRESS,
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
@ -500,6 +651,11 @@ def main(argv):
|
|||||||
help='comma separated list of "extras" for runtime requirements '
|
help='comma separated list of "extras" for runtime requirements '
|
||||||
'(e.g. -x testing,feature-x) (implies --runtime, can be repeated)',
|
'(e.g. -x testing,feature-x) (implies --runtime, can be repeated)',
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'-g', '--dependency-groups', metavar='GROUPS', action='append',
|
||||||
|
help='comma separated list of dependency groups (PEP 735) for requirements '
|
||||||
|
'(e.g. -g tests,docs) (can be repeated)',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-t', '--tox', action='store_true',
|
'-t', '--tox', action='store_true',
|
||||||
help=('generate test tequirements from tox environment '
|
help=('generate test tequirements from tox environment '
|
||||||
@ -515,6 +671,11 @@ def main(argv):
|
|||||||
help=('Generate run-time requirements by building the wheel '
|
help=('Generate run-time requirements by building the wheel '
|
||||||
'(useful for build backends without the prepare_metadata_for_build_wheel hook)'),
|
'(useful for build backends without the prepare_metadata_for_build_wheel hook)'),
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'-p', '--read-pyproject-dependencies', action='store_true', default=False,
|
||||||
|
help=('Generate dependencies from [project] table of pyproject.toml '
|
||||||
|
'instead of calling prepare_metadata_for_build_wheel hook)'),
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-R', '--no-runtime', action='store_false', dest='runtime',
|
'-R', '--no-runtime', action='store_false', dest='runtime',
|
||||||
help="Don't generate run-time requirements (implied by -N)",
|
help="Don't generate run-time requirements (implied by -N)",
|
||||||
@ -563,10 +724,12 @@ def main(argv):
|
|||||||
wheeldir=args.wheeldir,
|
wheeldir=args.wheeldir,
|
||||||
toxenv=args.toxenv,
|
toxenv=args.toxenv,
|
||||||
extras=args.extras,
|
extras=args.extras,
|
||||||
|
dependency_groups=args.dependency_groups,
|
||||||
generate_extras=args.generate_extras,
|
generate_extras=args.generate_extras,
|
||||||
python3_pkgversion=args.python3_pkgversion,
|
python3_pkgversion=args.python3_pkgversion,
|
||||||
requirement_files=args.requirement_files,
|
requirement_files=args.requirement_files,
|
||||||
use_build_system=args.use_build_system,
|
use_build_system=args.use_build_system,
|
||||||
|
read_pyproject_dependencies=args.read_pyproject_dependencies,
|
||||||
output=args.output,
|
output=args.output,
|
||||||
config_settings=parse_config_settings_args(args.config_settings),
|
config_settings=parse_config_settings_args(args.config_settings),
|
||||||
)
|
)
|
@ -23,7 +23,6 @@ Insufficient version of setuptools:
|
|||||||
setup.py: |
|
setup.py: |
|
||||||
expected: |
|
expected: |
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
result: 0
|
result: 0
|
||||||
|
|
||||||
No pyproject.toml, empty setup.py:
|
No pyproject.toml, empty setup.py:
|
||||||
@ -32,9 +31,11 @@ No pyproject.toml, empty setup.py:
|
|||||||
wheel: 1
|
wheel: 1
|
||||||
include_runtime: false
|
include_runtime: false
|
||||||
setup.py: |
|
setup.py: |
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
result: 0
|
result: 0
|
||||||
|
|
||||||
@ -47,9 +48,11 @@ Default build system, empty setup.py:
|
|||||||
pyproject.toml: |
|
pyproject.toml: |
|
||||||
# empty
|
# empty
|
||||||
setup.py: |
|
setup.py: |
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
result: 0
|
result: 0
|
||||||
|
|
||||||
@ -212,9 +215,14 @@ Default build system, build dependencies in setup.py:
|
|||||||
setup_requires=['foo', 'bar!=2', 'baz~=1.1.1'],
|
setup_requires=['foo', 'bar!=2', 'baz~=1.1.1'],
|
||||||
install_requires=['inst'],
|
install_requires=['inst'],
|
||||||
)
|
)
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
python3dist(foo)
|
||||||
|
(python3dist(bar) < 2 or python3dist(bar) > 2)
|
||||||
|
(python3dist(baz) >= 1.1.1 with python3dist(baz) < 1.2)
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(foo)
|
python3dist(foo)
|
||||||
(python3dist(bar) < 2 or python3dist(bar) > 2)
|
(python3dist(bar) < 2 or python3dist(bar) > 2)
|
||||||
@ -234,9 +242,14 @@ Default build system, run dependencies in setup.py:
|
|||||||
setup_requires=['pyyaml'], # nb. setuptools will try to install this
|
setup_requires=['pyyaml'], # nb. setuptools will try to install this
|
||||||
install_requires=['inst > 1', 'inst2 < 3'],
|
install_requires=['inst > 1', 'inst2 < 3'],
|
||||||
)
|
)
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
python3dist(pyyaml)
|
||||||
|
python3dist(inst) > 1.0
|
||||||
|
python3dist(inst2) < 3~~
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(pyyaml)
|
python3dist(pyyaml)
|
||||||
python3dist(inst) > 1.0
|
python3dist(inst) > 1.0
|
||||||
@ -287,9 +300,19 @@ Run dependencies with extras (not selected):
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
python3dist(setuptools) >= 40
|
||||||
|
python3dist(py) >= 1.5
|
||||||
|
python3dist(six) >= 1.10
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(attrs) >= 17.4
|
||||||
|
python3dist(atomicwrites) >= 1
|
||||||
|
python3dist(pluggy) >= 0.11
|
||||||
|
python3dist(more-itertools) >= 4
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(setuptools) >= 40
|
python3dist(setuptools) >= 40
|
||||||
python3dist(py) >= 1.5
|
python3dist(py) >= 1.5
|
||||||
@ -310,9 +333,23 @@ Run dependencies with extras (selected):
|
|||||||
extras:
|
extras:
|
||||||
- testing
|
- testing
|
||||||
setup.py: *pytest_setup_py
|
setup.py: *pytest_setup_py
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
python3dist(setuptools) >= 40
|
||||||
|
python3dist(py) >= 1.5
|
||||||
|
python3dist(six) >= 1.10
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(attrs) >= 17.4
|
||||||
|
python3dist(atomicwrites) >= 1
|
||||||
|
python3dist(pluggy) >= 0.11
|
||||||
|
python3dist(more-itertools) >= 4
|
||||||
|
python3dist(argcomplete)
|
||||||
|
python3dist(hypothesis) >= 3.56
|
||||||
|
python3dist(nose)
|
||||||
|
python3dist(requests)
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(setuptools) >= 40
|
python3dist(setuptools) >= 40
|
||||||
python3dist(py) >= 1.5
|
python3dist(py) >= 1.5
|
||||||
@ -348,9 +385,17 @@ Run dependencies with multiple extras:
|
|||||||
'cool-feature': ['dep4[FOO,BAR]'],
|
'cool-feature': ['dep4[FOO,BAR]'],
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
python3dist(dep4)
|
||||||
|
python3dist(dep4[bar])
|
||||||
|
python3dist(dep4[foo])
|
||||||
|
python3dist(dep3)
|
||||||
|
python3dist(dep2)
|
||||||
|
python3dist(dep1)
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(dep4)
|
python3dist(dep4)
|
||||||
python3dist(dep4[bar])
|
python3dist(dep4[bar])
|
||||||
@ -371,9 +416,24 @@ Run dependencies with extras and build wheel option:
|
|||||||
extras:
|
extras:
|
||||||
- testing
|
- testing
|
||||||
setup.py: *pytest_setup_py
|
setup.py: *pytest_setup_py
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
python3dist(setuptools) >= 40
|
||||||
|
python3dist(pip) >= 19
|
||||||
|
python3dist(py) >= 1.5
|
||||||
|
python3dist(six) >= 1.10
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(attrs) >= 17.4
|
||||||
|
python3dist(atomicwrites) >= 1
|
||||||
|
python3dist(pluggy) >= 0.11
|
||||||
|
python3dist(more-itertools) >= 4
|
||||||
|
python3dist(argcomplete)
|
||||||
|
python3dist(hypothesis) >= 3.56
|
||||||
|
python3dist(nose)
|
||||||
|
python3dist(requests)
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(setuptools) >= 40
|
python3dist(setuptools) >= 40
|
||||||
python3dist(pip) >= 19
|
python3dist(pip) >= 19
|
||||||
@ -416,17 +476,22 @@ tox dependencies:
|
|||||||
commands =
|
commands =
|
||||||
true
|
true
|
||||||
expected:
|
expected:
|
||||||
- | # tox 3
|
- | # tox 3 with setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(tox-current-env) >= 0.0.6
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
python3dist(toxdep1)
|
python3dist(toxdep1)
|
||||||
python3dist(toxdep2)
|
python3dist(toxdep2)
|
||||||
python3dist(inst)
|
python3dist(inst)
|
||||||
- | # tox 4
|
- | # tox 4 with setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
|
python3dist(tox)
|
||||||
|
python3dist(toxdep1)
|
||||||
|
python3dist(toxdep2)
|
||||||
|
python3dist(inst)
|
||||||
|
- | # tox 4 with setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(tox-current-env) >= 0.0.6
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
python3dist(tox)
|
python3dist(tox)
|
||||||
@ -468,10 +533,9 @@ tox extras:
|
|||||||
commands =
|
commands =
|
||||||
true
|
true
|
||||||
expected:
|
expected:
|
||||||
- | # tox 3
|
- | # tox 3 with setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(tox-current-env) >= 0.0.6
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
python3dist(toxdep)
|
python3dist(toxdep)
|
||||||
python3dist(inst)
|
python3dist(inst)
|
||||||
@ -482,9 +546,21 @@ tox extras:
|
|||||||
python3dist(dep23)
|
python3dist(dep23)
|
||||||
python3dist(extra-dep)
|
python3dist(extra-dep)
|
||||||
python3dist(extra-dep[extra_dep])
|
python3dist(extra-dep[extra_dep])
|
||||||
- | # tox 4
|
- | # tox 4 with setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
|
python3dist(tox)
|
||||||
|
python3dist(toxdep)
|
||||||
|
python3dist(inst)
|
||||||
|
python3dist(dep11) > 11.0
|
||||||
|
python3dist(dep12)
|
||||||
|
python3dist(dep21)
|
||||||
|
python3dist(dep22)
|
||||||
|
python3dist(dep23)
|
||||||
|
python3dist(extra-dep)
|
||||||
|
python3dist(extra-dep[extra_dep])
|
||||||
|
- | # tox 4 with setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(tox-current-env) >= 0.0.6
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
python3dist(tox)
|
python3dist(tox)
|
||||||
@ -525,17 +601,22 @@ tox provision unsatisfied:
|
|||||||
toxdep1
|
toxdep1
|
||||||
toxdep2
|
toxdep2
|
||||||
expected:
|
expected:
|
||||||
- | # tox 3
|
- | # tox 3 with setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(tox-current-env) >= 0.0.6
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
python3dist(tox) >= 3.999
|
python3dist(tox) >= 3.999
|
||||||
python3dist(setuptools) > 40.0
|
python3dist(setuptools) > 40.0
|
||||||
python3dist(wheel) > 2.0
|
python3dist(wheel) > 2.0
|
||||||
- | # tox 4
|
- | # tox 4 with setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
|
python3dist(tox) >= 3.999
|
||||||
|
python3dist(setuptools) > 40.0
|
||||||
|
python3dist(wheel) > 2.0
|
||||||
|
python3dist(tox) >= 3.999
|
||||||
|
- | # tox 4 with setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(tox-current-env) >= 0.0.6
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
python3dist(tox) >= 3.999
|
python3dist(tox) >= 3.999
|
||||||
@ -569,19 +650,25 @@ tox provision satisfied:
|
|||||||
toxdep1
|
toxdep1
|
||||||
toxdep2
|
toxdep2
|
||||||
expected:
|
expected:
|
||||||
- | # tox 3
|
- | # tox 3 with setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(tox-current-env) >= 0.0.6
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
python3dist(tox) >= 3.5
|
python3dist(tox) >= 3.5
|
||||||
python3dist(setuptools) > 40.0
|
python3dist(setuptools) > 40.0
|
||||||
python3dist(toxdep1)
|
python3dist(toxdep1)
|
||||||
python3dist(toxdep2)
|
python3dist(toxdep2)
|
||||||
python3dist(inst)
|
python3dist(inst)
|
||||||
- | # tox 4
|
- | # tox 4 with setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
|
python3dist(setuptools) > 40.0
|
||||||
|
python3dist(tox) >= 3.5
|
||||||
|
python3dist(toxdep1)
|
||||||
|
python3dist(toxdep2)
|
||||||
|
python3dist(inst)
|
||||||
|
- | # tox 4 with setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(tox-current-env) >= 0.0.6
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
python3dist(setuptools) > 40.0
|
python3dist(setuptools) > 40.0
|
||||||
@ -611,16 +698,20 @@ tox provision no minversion:
|
|||||||
setuptools > 40
|
setuptools > 40
|
||||||
wheel > 2
|
wheel > 2
|
||||||
expected:
|
expected:
|
||||||
- | # tox 3
|
- | # tox 3 with setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(tox-current-env) >= 0.0.6
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
python3dist(setuptools) > 40.0
|
python3dist(setuptools) > 40.0
|
||||||
python3dist(wheel) > 2.0
|
python3dist(wheel) > 2.0
|
||||||
- | # tox 4
|
- | # tox 4 with setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
|
python3dist(setuptools) > 40.0
|
||||||
|
python3dist(wheel) > 2.0
|
||||||
|
python3dist(tox)
|
||||||
|
- | # tox 4 with setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(tox-current-env) >= 0.0.6
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
python3dist(setuptools) > 40.0
|
python3dist(setuptools) > 40.0
|
||||||
@ -677,14 +768,21 @@ Default build system, met deps in requirements file:
|
|||||||
SQLAlchemy>=1.0.10,<1.1.0 # Zebra protocol service
|
SQLAlchemy>=1.0.10,<1.1.0 # Zebra protocol service
|
||||||
requirement_files:
|
requirement_files:
|
||||||
- requirements.txt
|
- requirements.txt
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
((python3dist(lxml) < 3.7 or python3dist(lxml) > 3.7) with python3dist(lxml) >= 2.3)
|
||||||
|
python3dist(ncclient)
|
||||||
|
(python3dist(cryptography) < 1.5.2 or python3dist(cryptography) > 1.5.2)
|
||||||
|
python3dist(paramiko)
|
||||||
|
(python3dist(sqlalchemy) < 1.1~~ with python3dist(sqlalchemy) >= 1.0.10)
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
- | # setuptools < 70
|
||||||
((python3dist(lxml) < 3.7 or python3dist(lxml) > 3.7) with python3dist(lxml) >= 2.3)
|
((python3dist(lxml) < 3.7 or python3dist(lxml) > 3.7) with python3dist(lxml) >= 2.3)
|
||||||
python3dist(ncclient)
|
python3dist(ncclient)
|
||||||
(python3dist(cryptography) < 1.5.2 or python3dist(cryptography) > 1.5.2)
|
(python3dist(cryptography) < 1.5.2 or python3dist(cryptography) > 1.5.2)
|
||||||
python3dist(paramiko)
|
python3dist(paramiko)
|
||||||
(python3dist(sqlalchemy) < 1.1~~ with python3dist(sqlalchemy) >= 1.0.10)
|
(python3dist(sqlalchemy) < 1.1~~ with python3dist(sqlalchemy) >= 1.0.10)
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
result: 0
|
result: 0
|
||||||
|
|
||||||
@ -850,7 +948,12 @@ Pre-releases are accepted:
|
|||||||
"cffi",
|
"cffi",
|
||||||
]
|
]
|
||||||
build-backend = "setuptools.build_meta"
|
build-backend = "setuptools.build_meta"
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(wheel)
|
||||||
|
python3dist(cffi)
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools)
|
python3dist(setuptools)
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(cffi)
|
python3dist(cffi)
|
||||||
@ -869,9 +972,11 @@ Stdout from wrapped subprocess does not appear in output:
|
|||||||
os.system('echo LEAK?')
|
os.system('echo LEAK?')
|
||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
setup(name='test', version='0.1')
|
setup(name='test', version='0.1')
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools) >= 40.8
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools) >= 40.8
|
python3dist(setuptools) >= 40.8
|
||||||
python3dist(wheel)
|
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
result: 0
|
result: 0
|
||||||
|
|
||||||
@ -892,7 +997,11 @@ pyproject.toml with runtime dependencies:
|
|||||||
"foo",
|
"foo",
|
||||||
'importlib-metadata; python_version<"3.8"',
|
'importlib-metadata; python_version<"3.8"',
|
||||||
]
|
]
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(foo)
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools)
|
python3dist(setuptools)
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(foo)
|
python3dist(foo)
|
||||||
@ -906,7 +1015,7 @@ pyproject.toml with runtime dependencies and partially selected extras:
|
|||||||
tomli: 1
|
tomli: 1
|
||||||
extras:
|
extras:
|
||||||
- tests
|
- tests
|
||||||
pyproject.toml: |
|
pyproject.toml: &pyproject_with_extras |
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["setuptools"]
|
requires = ["setuptools"]
|
||||||
build-backend = "setuptools.build_meta"
|
build-backend = "setuptools.build_meta"
|
||||||
@ -920,7 +1029,13 @@ pyproject.toml with runtime dependencies and partially selected extras:
|
|||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
tests = ["pytest>=5", "pytest-mock"]
|
tests = ["pytest>=5", "pytest-mock"]
|
||||||
docs = ["sphinx", "python-docs-theme"]
|
docs = ["sphinx", "python-docs-theme"]
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(foo)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools)
|
python3dist(setuptools)
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(foo)
|
python3dist(foo)
|
||||||
@ -951,7 +1066,15 @@ Self-referencing extras (sooner):
|
|||||||
tests = pytest>=5; pytest-mock
|
tests = pytest>=5; pytest-mock
|
||||||
docs = sphinx; python-docs-theme
|
docs = sphinx; python-docs-theme
|
||||||
dev = my_package[docs,tests]
|
dev = my_package[docs,tests]
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(foo)
|
||||||
|
python3dist(sphinx)
|
||||||
|
python3dist(python-docs-theme)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools)
|
python3dist(setuptools)
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(foo)
|
python3dist(foo)
|
||||||
@ -984,7 +1107,15 @@ Self-referencing extras (later):
|
|||||||
tests = pytest>=5; pytest-mock
|
tests = pytest>=5; pytest-mock
|
||||||
docs = sphinx; python-docs-theme
|
docs = sphinx; python-docs-theme
|
||||||
xdev = my_package[docs,tests]
|
xdev = my_package[docs,tests]
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(foo)
|
||||||
|
python3dist(sphinx)
|
||||||
|
python3dist(python-docs-theme)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools)
|
python3dist(setuptools)
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(foo)
|
python3dist(foo)
|
||||||
@ -1016,7 +1147,15 @@ Self-referencing extras (maze):
|
|||||||
forward = my_package[backward]; forwarddep
|
forward = my_package[backward]; forwarddep
|
||||||
backward = my_package[left,right]; backwarddep
|
backward = my_package[left,right]; backwarddep
|
||||||
never = my_package[forward]; neverdep
|
never = my_package[forward]; neverdep
|
||||||
expected: |
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(backwarddep)
|
||||||
|
python3dist(forwarddep)
|
||||||
|
python3dist(leftdep)
|
||||||
|
python3dist(rightdep)
|
||||||
|
python3dist(startdep)
|
||||||
|
- | # setuptools < 70
|
||||||
python3dist(setuptools)
|
python3dist(setuptools)
|
||||||
python3dist(wheel)
|
python3dist(wheel)
|
||||||
python3dist(backwarddep)
|
python3dist(backwarddep)
|
||||||
@ -1062,3 +1201,410 @@ config_settings:
|
|||||||
expected: |
|
expected: |
|
||||||
python3dist(test-config-setting)
|
python3dist(test-config-setting)
|
||||||
result: 0
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with runtime dependencies read from it:
|
||||||
|
skipif: not SETUPTOOLS_60
|
||||||
|
read_pyproject_dependencies: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tomli: 1
|
||||||
|
pyproject.toml: |
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
[project]
|
||||||
|
name = "my_package"
|
||||||
|
version = "0.1"
|
||||||
|
dependencies = [
|
||||||
|
"foo",
|
||||||
|
'importlib-metadata; python_version<"3.8"',
|
||||||
|
]
|
||||||
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(foo)
|
||||||
|
- | # setuptools < 70
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(wheel)
|
||||||
|
python3dist(foo)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with extras - only runtime dependencies read from it:
|
||||||
|
skipif: not SETUPTOOLS_60
|
||||||
|
read_pyproject_dependencies: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tomli: 1
|
||||||
|
pyproject.toml: *pyproject_with_extras
|
||||||
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(foo)
|
||||||
|
- | # setuptools < 70
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(wheel)
|
||||||
|
python3dist(foo)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with runtime dependencies and partially selected extras read from it:
|
||||||
|
skipif: not SETUPTOOLS_60
|
||||||
|
read_pyproject_dependencies: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tomli: 1
|
||||||
|
extras:
|
||||||
|
- tests
|
||||||
|
pyproject.toml: *pyproject_with_extras
|
||||||
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(foo)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
- | # setuptools < 70
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(wheel)
|
||||||
|
python3dist(foo)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with runtime dependencies and all extras read from it:
|
||||||
|
skipif: not SETUPTOOLS_60
|
||||||
|
read_pyproject_dependencies: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tomli: 1
|
||||||
|
extras:
|
||||||
|
- tests
|
||||||
|
- docs
|
||||||
|
pyproject.toml: *pyproject_with_extras
|
||||||
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(foo)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
python3dist(sphinx)
|
||||||
|
python3dist(python-docs-theme)
|
||||||
|
- | # setuptools < 70
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(wheel)
|
||||||
|
python3dist(foo)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
python3dist(sphinx)
|
||||||
|
python3dist(python-docs-theme)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml without dependencies:
|
||||||
|
skipif: not SETUPTOOLS_60
|
||||||
|
read_pyproject_dependencies: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tomli: 1
|
||||||
|
pyproject.toml: |
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
[project]
|
||||||
|
name = "my_package"
|
||||||
|
version = "0.1"
|
||||||
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
- | # setuptools < 70
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(wheel)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml without project table:
|
||||||
|
skipif: not SETUPTOOLS_60
|
||||||
|
read_pyproject_dependencies: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
pyproject.toml: |
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
except: ValueError
|
||||||
|
|
||||||
|
no pyproject.toml:
|
||||||
|
read_pyproject_dependencies: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
except: FileNotFoundError
|
||||||
|
|
||||||
|
pyproject.toml with dynamic dependencies:
|
||||||
|
skipif: not SETUPTOOLS_60
|
||||||
|
read_pyproject_dependencies: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tomli: 1
|
||||||
|
pyproject.toml: |
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
[project]
|
||||||
|
name = "my_package"
|
||||||
|
version = "0.1"
|
||||||
|
dynamic = ["dependencies"]
|
||||||
|
[tool.setuptools.dynamic]
|
||||||
|
dependencies = { file = ["deps.txt"] }
|
||||||
|
deps.txt: |
|
||||||
|
foo < 7.0
|
||||||
|
sphinx
|
||||||
|
except: ValueError
|
||||||
|
|
||||||
|
pyproject.toml with dynamic optional dependencies:
|
||||||
|
skipif: not SETUPTOOLS_60
|
||||||
|
read_pyproject_dependencies: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tomli: 1
|
||||||
|
extras:
|
||||||
|
- docs
|
||||||
|
pyproject.toml: |
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
[project]
|
||||||
|
name = "my_package"
|
||||||
|
version = "0.1"
|
||||||
|
dynamic = ["optional-dependencies"]
|
||||||
|
[tool.setuptools.dynamic.optional-dependencies.docs]
|
||||||
|
file = ["deps.txt"]
|
||||||
|
deps.txt: |
|
||||||
|
sphinx~=7.0.1
|
||||||
|
except: ValueError
|
||||||
|
|
||||||
|
pyproject.toml with dynamic table and no deps:
|
||||||
|
skipif: not SETUPTOOLS_60
|
||||||
|
read_pyproject_dependencies: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tomli: 1
|
||||||
|
pyproject.toml: |
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
[project]
|
||||||
|
name = "my_package"
|
||||||
|
version = "0.1"
|
||||||
|
dynamic = ["readme"]
|
||||||
|
[tool.setuptools.dynamic]
|
||||||
|
readme = { file = ["readme.txt"] }
|
||||||
|
readme.txt: |
|
||||||
|
nothing interesting here
|
||||||
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
- | # setuptools < 70
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(wheel)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with self-referencing extras:
|
||||||
|
skipif: not SETUPTOOLS_60
|
||||||
|
read_pyproject_dependencies: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tomli: 1
|
||||||
|
extras:
|
||||||
|
- test
|
||||||
|
pyproject.toml: |
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
[project]
|
||||||
|
name = "contourpy"
|
||||||
|
version = "0.1"
|
||||||
|
dependencies = ["numpy >= 1.23"]
|
||||||
|
[project.optional-dependencies]
|
||||||
|
bokeh = ["bokeh", "selenium"]
|
||||||
|
test = ["contourpy[test-no-images]", "matplotlib", "Pillow"]
|
||||||
|
test-no-images = ["pytest", "pytest-rerunfailures", "wurlitzer"]
|
||||||
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(numpy) >= 1.23
|
||||||
|
python3dist(matplotlib)
|
||||||
|
python3dist(pillow)
|
||||||
|
python3dist(pytest)
|
||||||
|
python3dist(pytest-rerunfailures)
|
||||||
|
python3dist(wurlitzer)
|
||||||
|
- | # setuptools < 70
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(wheel)
|
||||||
|
python3dist(numpy) >= 1.23
|
||||||
|
python3dist(matplotlib)
|
||||||
|
python3dist(pillow)
|
||||||
|
python3dist(pytest)
|
||||||
|
python3dist(pytest-rerunfailures)
|
||||||
|
python3dist(wurlitzer)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with dependency-groups not requested:
|
||||||
|
use_build_system: false
|
||||||
|
pyproject.toml: |
|
||||||
|
[dependency-groups]
|
||||||
|
tests = ["pytest>=5", "pytest-mock"]
|
||||||
|
docs = ["sphinx", "python-docs-theme"]
|
||||||
|
expected: "\n"
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with dependency-groups and build system:
|
||||||
|
skipif: not SETUPTOOLS_60
|
||||||
|
use_build_system: true
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tomli: 1
|
||||||
|
dependency_groups:
|
||||||
|
- tests
|
||||||
|
pyproject.toml: |
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
[project]
|
||||||
|
name = "my_package"
|
||||||
|
version = "0.1"
|
||||||
|
[dependency-groups]
|
||||||
|
tests = ["pytest>=5", "pytest-mock"]
|
||||||
|
docs = ["sphinx", "python-docs-theme"]
|
||||||
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
- | # setuptools < 70
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(wheel)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with dependency-groups one requested:
|
||||||
|
use_build_system: false
|
||||||
|
dependency_groups:
|
||||||
|
- tests
|
||||||
|
pyproject.toml: |
|
||||||
|
[dependency-groups]
|
||||||
|
tests = ["pytest>=5", "pytest-mock"]
|
||||||
|
docs = ["sphinx", "python-docs-theme"]
|
||||||
|
expected: |
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with dependency-groups two requested:
|
||||||
|
use_build_system: false
|
||||||
|
dependency_groups:
|
||||||
|
- tests
|
||||||
|
- docs
|
||||||
|
pyproject.toml: |
|
||||||
|
[dependency-groups]
|
||||||
|
tests = ["pytest>=5", "pytest-mock"]
|
||||||
|
docs = ["sphinx", "python-docs-theme"]
|
||||||
|
expected: |
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
python3dist(sphinx)
|
||||||
|
python3dist(python-docs-theme)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with dependency-groups two requested via comma:
|
||||||
|
use_build_system: false
|
||||||
|
dependency_groups:
|
||||||
|
- tests,docs
|
||||||
|
pyproject.toml: |
|
||||||
|
[dependency-groups]
|
||||||
|
tests = ["pytest>=5", "pytest-mock"]
|
||||||
|
docs = ["sphinx", "python-docs-theme"]
|
||||||
|
expected: |
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
python3dist(sphinx)
|
||||||
|
python3dist(python-docs-theme)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with include-group:
|
||||||
|
use_build_system: false
|
||||||
|
dependency_groups:
|
||||||
|
- tests_docs
|
||||||
|
pyproject.toml: |
|
||||||
|
[dependency-groups]
|
||||||
|
tests = ["pytest>=5", "pytest-mock"]
|
||||||
|
docs = ["sphinx", "python-docs-theme"]
|
||||||
|
typing = ["mypy"]
|
||||||
|
tests-docs = [{include-group = "tests"}, {include-group = "docs"}, "pytest-sphinx"]
|
||||||
|
expected: |
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
python3dist(sphinx)
|
||||||
|
python3dist(python-docs-theme)
|
||||||
|
python3dist(pytest-sphinx)
|
||||||
|
result: 0
|
||||||
|
|
||||||
|
pyproject.toml with dependency-groups nonexisting requested:
|
||||||
|
use_build_system: false
|
||||||
|
dependency_groups:
|
||||||
|
- typing
|
||||||
|
pyproject.toml: |
|
||||||
|
[dependency-groups]
|
||||||
|
tests = ["pytest>=5", "pytest-mock"]
|
||||||
|
docs = ["sphinx", "python-docs-theme"]
|
||||||
|
except: LookupError
|
||||||
|
|
||||||
|
tox with dependency_groups:
|
||||||
|
skipif: not (SETUPTOOLS_60 and TOX_4_22)
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tox: 4.22
|
||||||
|
tox-current-env: 0.0.14
|
||||||
|
toxenv:
|
||||||
|
- py3
|
||||||
|
pyproject.toml: |
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
[project]
|
||||||
|
name = "my_package"
|
||||||
|
version = "0.1"
|
||||||
|
[dependency-groups]
|
||||||
|
tests = ["pytest>=5", "pytest-mock"]
|
||||||
|
docs = ["sphinx", "python-docs-theme"]
|
||||||
|
[tool.tox]
|
||||||
|
requires = ["tox>=4.22"]
|
||||||
|
[tool.tox.env_run_base]
|
||||||
|
dependency_groups = ["tests"]
|
||||||
|
commands = [["pytest"]]
|
||||||
|
expected:
|
||||||
|
- | # setuptools 70+
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
|
python3dist(tox) >= 4.22
|
||||||
|
python3dist(tox)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
- | # setuptools < 70
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(wheel)
|
||||||
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
|
python3dist(tox) >= 4.22
|
||||||
|
python3dist(tox)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
result: 0
|
@ -2,6 +2,7 @@ import argparse
|
|||||||
import fnmatch
|
import fnmatch
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from keyword import iskeyword
|
from keyword import iskeyword
|
||||||
@ -11,9 +12,15 @@ from importlib.metadata import Distribution
|
|||||||
|
|
||||||
# From RPM's build/files.c strtokWithQuotes delim argument
|
# From RPM's build/files.c strtokWithQuotes delim argument
|
||||||
RPM_FILES_DELIMETERS = ' \n\t'
|
RPM_FILES_DELIMETERS = ' \n\t'
|
||||||
|
RPM_GLOB_SYMBOLS = '[]{}*?!'
|
||||||
|
# Combined for escape_rpm_path_4_19()
|
||||||
|
RPM_SPECIAL_SYMBOLS = RPM_FILES_DELIMETERS + RPM_GLOB_SYMBOLS + '"' + "\\"
|
||||||
|
RPM_ESCAPE_REGEX = re.compile(f"([{re.escape(RPM_SPECIAL_SYMBOLS)}])")
|
||||||
|
|
||||||
# See the comment in the macro that wraps this script
|
# See the comment in the macro that wraps this script
|
||||||
RPM_PERCENTAGES_COUNT = int(os.getenv('RPM_PERCENTAGES_COUNT', '2'))
|
RPM_FILES_ESCAPE = os.getenv('RPM_FILES_ESCAPE', '4.19')
|
||||||
|
|
||||||
|
PYCACHED_SUFFIX = '{,.opt-?}.pyc'
|
||||||
|
|
||||||
# RPM hardcodes the lists of manpage extensions and directories,
|
# RPM hardcodes the lists of manpage extensions and directories,
|
||||||
# so we have to maintain separate ones :(
|
# so we have to maintain separate ones :(
|
||||||
@ -118,8 +125,9 @@ def pycached(script, python_version):
|
|||||||
"""
|
"""
|
||||||
assert script.suffix == ".py"
|
assert script.suffix == ".py"
|
||||||
pyver = "".join(python_version.split(".")[:2])
|
pyver = "".join(python_version.split(".")[:2])
|
||||||
pycname = f"{script.stem}.cpython-{pyver}{{,.opt-?}}.pyc"
|
pycname = f"{script.stem}.cpython-{pyver}{PYCACHED_SUFFIX}"
|
||||||
pyc = pycache_dir(script) / pycname
|
pyc = pycache_dir(script) / pycname
|
||||||
|
pyc.glob_suffix_len = len(PYCACHED_SUFFIX)
|
||||||
return [script, pyc]
|
return [script, pyc]
|
||||||
|
|
||||||
|
|
||||||
@ -212,10 +220,12 @@ def normalize_manpage_filename(prefix, path):
|
|||||||
if fnmatch.fnmatch(str(path.parent), mandir) and path.name != "dir":
|
if fnmatch.fnmatch(str(path.parent), mandir) and path.name != "dir":
|
||||||
# "abc.1.gz2" -> "abc.1*"
|
# "abc.1.gz2" -> "abc.1*"
|
||||||
if path.suffix[1:] in MANPAGE_EXTENSIONS:
|
if path.suffix[1:] in MANPAGE_EXTENSIONS:
|
||||||
return BuildrootPath(path.parent / (path.stem + "*"))
|
path = BuildrootPath(path.parent / (path.stem + "*"))
|
||||||
# "abc.1 -> abc.1*"
|
# "abc.1 -> abc.1*"
|
||||||
else:
|
else:
|
||||||
return BuildrootPath(path.parent / (path.name + "*"))
|
path = BuildrootPath(path.parent / (path.name + "*"))
|
||||||
|
path.glob_suffix_len = 1
|
||||||
|
return path
|
||||||
else:
|
else:
|
||||||
return path
|
return path
|
||||||
|
|
||||||
@ -424,60 +434,139 @@ def classify_paths(
|
|||||||
return paths
|
return paths
|
||||||
|
|
||||||
|
|
||||||
def escape_rpm_path(path):
|
def escape_rpm_path_4_19(path):
|
||||||
|
r"""
|
||||||
|
Escape special characters in string-paths or BuildrootPaths, RPM >= 4.19
|
||||||
|
|
||||||
|
E.g. a space in path otherwise makes RPM think it's multiple paths,
|
||||||
|
unless we escape it.
|
||||||
|
Or a literal % symbol in path might be expanded as a macro if not escaped by %%.
|
||||||
|
|
||||||
|
See https://github.com/rpm-software-management/rpm/pull/2103
|
||||||
|
and https://github.com/rpm-software-management/rpm/pull/2206
|
||||||
|
|
||||||
|
If the path ends with a glob produced by our other functions,
|
||||||
|
we cannot escape that part.
|
||||||
|
The BuildrootPath.glob_suffix_len attribute is used to indicate such globs.
|
||||||
|
When such suffix exists, it is not escaped.
|
||||||
|
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
>>> escape_rpm_path_4_19(BuildrootPath('/usr/lib/python3.9/site-packages/setuptools'))
|
||||||
|
'/usr/lib/python3.9/site-packages/setuptools'
|
||||||
|
|
||||||
|
>>> escape_rpm_path_4_19('/usr/lib/python3.9/site-packages/setuptools/script (dev).tmpl')
|
||||||
|
'/usr/lib/python3.9/site-packages/setuptools/script\\ (dev).tmpl'
|
||||||
|
|
||||||
|
>>> escape_rpm_path_4_19('/usr/share/data/100%valid.path')
|
||||||
|
'/usr/share/data/100%%valid.path'
|
||||||
|
|
||||||
|
>>> escape_rpm_path_4_19('/usr/share/data/100 % valid.path')
|
||||||
|
'/usr/share/data/100\\ %%\\ valid.path'
|
||||||
|
|
||||||
|
>>> escape_rpm_path_4_19('/usr/share/data/1000 %% valid.path')
|
||||||
|
'/usr/share/data/1000\\ %%%%\\ valid.path'
|
||||||
|
|
||||||
|
>>> escape_rpm_path_4_19('/usr/share/data/spaces and "quotes" and ?')
|
||||||
|
'/usr/share/data/spaces\\ and\\ \\"quotes\\"\\ and\\ \\?'
|
||||||
|
|
||||||
|
>>> escape_rpm_path_4_19('/usr/share/data/spaces and [square brackets]')
|
||||||
|
'/usr/share/data/spaces\\ and\\ \\[square\\ brackets\\]'
|
||||||
|
|
||||||
|
>>> path = BuildrootPath('/whatever/__pycache__/bar.cpython-38{,.opt-?}.pyc')
|
||||||
|
>>> path.glob_suffix_len = len('{,.opt-?}.pyc')
|
||||||
|
>>> escape_rpm_path_4_19(path)
|
||||||
|
'/whatever/__pycache__/bar.cpython-38{,.opt-?}.pyc'
|
||||||
|
|
||||||
|
>>> path = BuildrootPath('/spa ces/__pycache__/bar.cpython-38{,.opt-?}.pyc')
|
||||||
|
>>> path.glob_suffix_len = len('{,.opt-?}.pyc')
|
||||||
|
>>> escape_rpm_path_4_19(path)
|
||||||
|
'/spa\\ ces/__pycache__/bar.cpython-38{,.opt-?}.pyc'
|
||||||
|
|
||||||
|
>>> path = BuildrootPath('/usr/man/man5/ipykernel.5*')
|
||||||
|
>>> path.glob_suffix_len = 1
|
||||||
|
>>> escape_rpm_path_4_19(path)
|
||||||
|
'/usr/man/man5/ipykernel.5*'
|
||||||
"""
|
"""
|
||||||
Escape special characters in string-paths or BuildrootPaths
|
glob_suffix_len = getattr(path, "glob_suffix_len", 0)
|
||||||
|
suffix = ""
|
||||||
|
path = str(path)
|
||||||
|
if glob_suffix_len:
|
||||||
|
suffix = path[-glob_suffix_len:]
|
||||||
|
path = path[:-glob_suffix_len]
|
||||||
|
if "%" in path:
|
||||||
|
path = path.replace("%", "%%")
|
||||||
|
# Prepend all matched/special characters (\1) with a backslash (escaped, hence \\):
|
||||||
|
return RPM_ESCAPE_REGEX.sub(r'\\\1', path) + suffix
|
||||||
|
|
||||||
|
|
||||||
|
def escape_rpm_path_4_18(path):
|
||||||
|
"""
|
||||||
|
Escape special characters in string-paths or BuildrootPaths, RPM < 4.19
|
||||||
|
|
||||||
E.g. a space in path otherwise makes RPM think it's multiple paths,
|
E.g. a space in path otherwise makes RPM think it's multiple paths,
|
||||||
unless we put it in "quotes".
|
unless we put it in "quotes".
|
||||||
Or a literal % symbol in path might be expanded as a macro if not escaped.
|
Or a literal % symbol in path might be expanded as a macro if not escaped.
|
||||||
|
|
||||||
Due to limitations in RPM,
|
Due to limitations in RPM < 4.19,
|
||||||
some paths with spaces and other special characters are not supported.
|
some paths with spaces and other special characters are not supported.
|
||||||
|
|
||||||
|
See this thread http://lists.rpm.org/pipermail/rpm-list/2021-June/002048.html
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
>>> escape_rpm_path(BuildrootPath('/usr/lib/python3.9/site-packages/setuptools'))
|
>>> escape_rpm_path_4_18(BuildrootPath('/usr/lib/python3.9/site-packages/setuptools'))
|
||||||
'/usr/lib/python3.9/site-packages/setuptools'
|
'/usr/lib/python3.9/site-packages/setuptools'
|
||||||
|
|
||||||
>>> escape_rpm_path('/usr/lib/python3.9/site-packages/setuptools/script (dev).tmpl')
|
>>> escape_rpm_path_4_18('/usr/lib/python3.9/site-packages/setuptools/script (dev).tmpl')
|
||||||
'"/usr/lib/python3.9/site-packages/setuptools/script (dev).tmpl"'
|
'"/usr/lib/python3.9/site-packages/setuptools/script (dev).tmpl"'
|
||||||
|
|
||||||
>>> escape_rpm_path('/usr/share/data/100%valid.path')
|
>>> escape_rpm_path_4_18('/usr/share/data/100%valid.path')
|
||||||
'/usr/share/data/100%%valid.path'
|
'/usr/share/data/100%%%%%%%%valid.path'
|
||||||
|
|
||||||
>>> escape_rpm_path('/usr/share/data/100 % valid.path')
|
>>> escape_rpm_path_4_18('/usr/share/data/100 % valid.path')
|
||||||
'"/usr/share/data/100 %% valid.path"'
|
'"/usr/share/data/100 %%%%%%%% valid.path"'
|
||||||
|
|
||||||
>>> escape_rpm_path('/usr/share/data/1000 %% valid.path')
|
>>> escape_rpm_path_4_18('/usr/share/data/1000 %% valid.path')
|
||||||
'"/usr/share/data/1000 %%%% valid.path"'
|
'"/usr/share/data/1000 %%%%%%%%%%%%%%%% valid.path"'
|
||||||
|
|
||||||
>>> escape_rpm_path('/usr/share/data/spaces and "quotes"')
|
>>> escape_rpm_path_4_18('/usr/share/data/spaces and "quotes"')
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
NotImplementedError: ...
|
NotImplementedError: ...
|
||||||
|
|
||||||
>>> escape_rpm_path('/usr/share/data/spaces and [square brackets]')
|
>>> escape_rpm_path_4_18('/usr/share/data/spaces and [square brackets]')
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
NotImplementedError: ...
|
NotImplementedError: ...
|
||||||
"""
|
"""
|
||||||
orig_path = path = str(path)
|
orig_path = path = str(path)
|
||||||
if "%" in path:
|
if "%" in path:
|
||||||
path = path.replace("%", "%" * RPM_PERCENTAGES_COUNT)
|
# Escaping an actual percentage sign in path by 8 signs
|
||||||
|
# has been verified in RPM 4.16 and 4.17:
|
||||||
|
path = path.replace("%", "%" * 8)
|
||||||
if any(symbol in path for symbol in RPM_FILES_DELIMETERS):
|
if any(symbol in path for symbol in RPM_FILES_DELIMETERS):
|
||||||
if '"' in path:
|
if '"' in path:
|
||||||
# As far as we know, RPM cannot list such file individually
|
# As far as we know, RPM < 4.19 cannot list such file individually
|
||||||
# See this thread http://lists.rpm.org/pipermail/rpm-list/2021-June/002048.html
|
# See this thread http://lists.rpm.org/pipermail/rpm-list/2021-June/002048.html
|
||||||
raise NotImplementedError(f'" symbol in path with spaces is not supported by %pyproject_save_files: {orig_path!r}')
|
raise NotImplementedError(f'" symbol in path with spaces is not supported by %pyproject_save_files on RPM < 4.19: {orig_path!r}')
|
||||||
if "[" in path or "]" in path:
|
if "[" in path or "]" in path:
|
||||||
# See https://bugzilla.redhat.com/show_bug.cgi?id=1990879
|
# See https://bugzilla.redhat.com/show_bug.cgi?id=1990879
|
||||||
# and https://github.com/rpm-software-management/rpm/issues/1749
|
# and https://github.com/rpm-software-management/rpm/issues/1749
|
||||||
raise NotImplementedError(f'[ or ] symbol in path with spaces is not supported by %pyproject_save_files: {orig_path!r}')
|
raise NotImplementedError(f'[ or ] symbol in path with spaces is not supported by %pyproject_save_files on RPM < 4.19: {orig_path!r}')
|
||||||
return f'"{path}"'
|
return f'"{path}"'
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
if RPM_FILES_ESCAPE == "4.19":
|
||||||
|
escape_rpm_path = escape_rpm_path_4_19
|
||||||
|
elif RPM_FILES_ESCAPE == "4.18":
|
||||||
|
escape_rpm_path = escape_rpm_path_4_18
|
||||||
|
else:
|
||||||
|
raise RuntimeError("RPM_FILES_ESCAPE must be 4.18 or 4.19")
|
||||||
|
|
||||||
|
|
||||||
def generate_file_list(paths_dict, module_globs, include_others=False):
|
def generate_file_list(paths_dict, module_globs, include_others=False):
|
||||||
"""
|
"""
|
||||||
This function takes the classified paths_dict and turns it into lines
|
This function takes the classified paths_dict and turns it into lines
|
@ -457,7 +457,7 @@ classified:
|
|||||||
- /usr/lib/python3.7/site-packages/comic2pdf-3.1.0.dist-info/top_level.txt
|
- /usr/lib/python3.7/site-packages/comic2pdf-3.1.0.dist-info/top_level.txt
|
||||||
- /usr/lib/python3.7/site-packages/comic2pdf-3.1.0.dist-info/zip-safe
|
- /usr/lib/python3.7/site-packages/comic2pdf-3.1.0.dist-info/zip-safe
|
||||||
licenses: []
|
licenses: []
|
||||||
modules: []
|
modules: {}
|
||||||
other:
|
other:
|
||||||
files:
|
files:
|
||||||
- /usr/bin/comic2pdf.py
|
- /usr/bin/comic2pdf.py
|
7
rpminspect.yaml
Normal file
7
rpminspect.yaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# completely disabled inspections:
|
||||||
|
inspections:
|
||||||
|
# there is no upstream and we regularly change all files
|
||||||
|
addedfiles: off
|
||||||
|
changedfiles: off
|
||||||
|
filesize: off
|
||||||
|
upstream: off
|
@ -6,16 +6,36 @@ import pytest
|
|||||||
import setuptools
|
import setuptools
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
from pyproject_buildrequires import generate_requires
|
from pyproject_buildrequires import generate_requires, load_pyproject
|
||||||
|
|
||||||
SETUPTOOLS_VERSION = packaging.version.parse(setuptools.__version__)
|
SETUPTOOLS_VERSION = packaging.version.parse(setuptools.__version__)
|
||||||
SETUPTOOLS_60 = SETUPTOOLS_VERSION >= packaging.version.parse('60')
|
SETUPTOOLS_60 = SETUPTOOLS_VERSION >= packaging.version.parse('60')
|
||||||
|
|
||||||
|
try:
|
||||||
|
import tox
|
||||||
|
except ImportError:
|
||||||
|
TOX_4_22 = False
|
||||||
|
else:
|
||||||
|
TOX_VERSION = packaging.version.parse(tox.__version__)
|
||||||
|
TOX_4_22 = TOX_VERSION >= packaging.version.parse('4.22')
|
||||||
|
|
||||||
testcases = {}
|
testcases = {}
|
||||||
with Path(__file__).parent.joinpath('pyproject_buildrequires_testcases.yaml').open() as f:
|
with Path(__file__).parent.joinpath('pyproject_buildrequires_testcases.yaml').open() as f:
|
||||||
testcases = yaml.safe_load(f)
|
testcases = yaml.safe_load(f)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def clear_pyproject_data():
|
||||||
|
"""
|
||||||
|
Clear pyproject data before each test.
|
||||||
|
In reality we build one RPM package at a time, so we can keep the once-loaded
|
||||||
|
pyproject.toml contents.
|
||||||
|
When testing, the cached data would leak the once-loaded data to all the
|
||||||
|
following test cases.
|
||||||
|
"""
|
||||||
|
load_pyproject.cache_clear()
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('case_name', testcases)
|
@pytest.mark.parametrize('case_name', testcases)
|
||||||
def test_data(case_name, capfd, tmp_path, monkeypatch):
|
def test_data(case_name, capfd, tmp_path, monkeypatch):
|
||||||
case = testcases[case_name]
|
case = testcases[case_name]
|
||||||
@ -51,6 +71,7 @@ def test_data(case_name, capfd, tmp_path, monkeypatch):
|
|||||||
requirement_files = case.get('requirement_files', [])
|
requirement_files = case.get('requirement_files', [])
|
||||||
requirement_files = [open(f) for f in requirement_files]
|
requirement_files = [open(f) for f in requirement_files]
|
||||||
use_build_system = case.get('use_build_system', True)
|
use_build_system = case.get('use_build_system', True)
|
||||||
|
read_pyproject_dependencies = case.get('read_pyproject_dependencies', False)
|
||||||
try:
|
try:
|
||||||
generate_requires(
|
generate_requires(
|
||||||
get_installed_version=get_installed_version,
|
get_installed_version=get_installed_version,
|
||||||
@ -58,10 +79,12 @@ def test_data(case_name, capfd, tmp_path, monkeypatch):
|
|||||||
build_wheel=case.get('build_wheel', False),
|
build_wheel=case.get('build_wheel', False),
|
||||||
wheeldir=str(wheeldir),
|
wheeldir=str(wheeldir),
|
||||||
extras=case.get('extras', []),
|
extras=case.get('extras', []),
|
||||||
|
dependency_groups=case.get('dependency_groups', []),
|
||||||
toxenv=case.get('toxenv', None),
|
toxenv=case.get('toxenv', None),
|
||||||
generate_extras=case.get('generate_extras', False),
|
generate_extras=case.get('generate_extras', False),
|
||||||
requirement_files=requirement_files,
|
requirement_files=requirement_files,
|
||||||
use_build_system=use_build_system,
|
use_build_system=use_build_system,
|
||||||
|
read_pyproject_dependencies=read_pyproject_dependencies,
|
||||||
output=output,
|
output=output,
|
||||||
config_settings=case.get('config_settings'),
|
config_settings=case.get('config_settings'),
|
||||||
)
|
)
|
@ -25,6 +25,21 @@ TEST_RECORDS = yaml_data["records"]
|
|||||||
TEST_METADATAS = yaml_data["metadata"]
|
TEST_METADATAS = yaml_data["metadata"]
|
||||||
|
|
||||||
|
|
||||||
|
# insert glob_suffix_len for .pyc files and man pages globs
|
||||||
|
for paths_dict in EXPECTED_DICT.values():
|
||||||
|
for modules in paths_dict["modules"].values():
|
||||||
|
for module in modules:
|
||||||
|
for idx, file in enumerate(module["files"]):
|
||||||
|
if file.endswith(".pyc"):
|
||||||
|
module["files"][idx] = BuildrootPath(file)
|
||||||
|
module["files"][idx].glob_suffix_len = len("{,.opt-?}.pyc")
|
||||||
|
if "other" in paths_dict and "files" in paths_dict["other"]:
|
||||||
|
for idx, file in enumerate(paths_dict["other"]["files"]):
|
||||||
|
if file.endswith("*"):
|
||||||
|
paths_dict["other"]["files"][idx] = BuildrootPath(file)
|
||||||
|
paths_dict["other"]["files"][idx].glob_suffix_len = len("*")
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def tldr_root(tmp_path):
|
def tldr_root(tmp_path):
|
||||||
prepare_pyproject_record(tmp_path, package="tldr")
|
prepare_pyproject_record(tmp_path, package="tldr")
|
50
tests/config-settings-test.spec
Normal file
50
tests/config-settings-test.spec
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
Name: config-settings-test
|
||||||
|
Version: 1.0.0
|
||||||
|
Release: 1%{?dist}
|
||||||
|
Summary: Test config_settings support
|
||||||
|
|
||||||
|
License: MIT
|
||||||
|
URL: ...
|
||||||
|
Source0: config_settings_test_backend.py
|
||||||
|
|
||||||
|
|
||||||
|
%description
|
||||||
|
%{summary}.
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -cT
|
||||||
|
|
||||||
|
cp -p %{sources} .
|
||||||
|
|
||||||
|
cat <<'EOF' >config_settings.py
|
||||||
|
"""
|
||||||
|
This is a test package
|
||||||
|
"""
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<'EOF' >pyproject.toml
|
||||||
|
[build-system]
|
||||||
|
build-backend = "config_settings_test_backend"
|
||||||
|
backend-path = ["."]
|
||||||
|
requires = ["flit-core", "packaging", "pip"]
|
||||||
|
|
||||||
|
[project]
|
||||||
|
name = "config_settings"
|
||||||
|
version = "%{version}"
|
||||||
|
dynamic = ["description"]
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires -C abc=123 -C xyz=456 -C--option-with-dashes=1 -C--option-with-dashes=2
|
||||||
|
%{!?el9:%pyproject_buildrequires -C abc=123 -C xyz=456 -C--option-with-dashes=1 -C--option-with-dashes=2 -w}
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%{!?el9:%pyproject_wheel -C abc=123 -C xyz=456 -C--option-with-dashes=1 -C--option-with-dashes=2}
|
||||||
|
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Fri May 19 2023 Maxwell G <maxwell@gtmx.me>
|
||||||
|
- Initial package
|
40
tests/config_settings_test_backend.py
Normal file
40
tests/config_settings_test_backend.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
"""
|
||||||
|
This is a test backend for pyproject-rpm-macros' integration tests
|
||||||
|
It is not compliant with PEP 517 and omits some required hooks.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from flit_core import buildapi
|
||||||
|
from packaging.version import parse
|
||||||
|
from pip import __version__ as pip_version
|
||||||
|
|
||||||
|
EXPECTED_CONFIG_SETTINGS = [{"abc": "123", "xyz": "456", "--option-with-dashes": ["1", "2"]}]
|
||||||
|
# Older pip did not accept multiple values,
|
||||||
|
# but we might backport that later,
|
||||||
|
# hence we accept it both ways with older pips
|
||||||
|
if parse(pip_version) < parse("23.1"):
|
||||||
|
EXPECTED_CONFIG_SETTINGS.append(
|
||||||
|
EXPECTED_CONFIG_SETTINGS[0] | {"--option-with-dashes": "2"}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _verify_config_settings(config_settings):
|
||||||
|
print(f"config_settings={config_settings}")
|
||||||
|
if config_settings not in EXPECTED_CONFIG_SETTINGS:
|
||||||
|
raise ValueError(
|
||||||
|
f"{config_settings!r} does not match expected {EXPECTED_CONFIG_SETTINGS!r}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def build_wheel(wheel_directory, config_settings=None, metadata_directory=None):
|
||||||
|
_verify_config_settings(config_settings)
|
||||||
|
return buildapi.build_wheel(wheel_directory, None, metadata_directory)
|
||||||
|
|
||||||
|
|
||||||
|
def get_requires_for_build_wheel(config_settings=None):
|
||||||
|
_verify_config_settings(config_settings)
|
||||||
|
return buildapi.get_requires_for_build_wheel(None)
|
||||||
|
|
||||||
|
|
||||||
|
def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None):
|
||||||
|
_verify_config_settings(config_settings)
|
||||||
|
return buildapi.prepare_metadata_for_build_wheel(metadata_directory, None)
|
71
tests/double-install.spec
Normal file
71
tests/double-install.spec
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
Name: double-install
|
||||||
|
Version: 0
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Install 2 wheels
|
||||||
|
License: BSD and MIT
|
||||||
|
%global markupsafe_version 2.0.1
|
||||||
|
%global tldr_version 0.4.4
|
||||||
|
Source1: https://github.com/pallets/markupsafe/archive/%{markupsafe_version}/MarkupSafe-%{markupsafe_version}.tar.gz
|
||||||
|
Source2: %{pypi_source tldr %{tldr_version}}
|
||||||
|
|
||||||
|
BuildRequires: gcc
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package tests that we can build and install 2 wheels at once.
|
||||||
|
One of them is "noarch" and one has an extension module.
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%setup -Tc
|
||||||
|
tar xf %{SOURCE1}
|
||||||
|
tar xf %{SOURCE2}
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
cd markupsafe-%{markupsafe_version}
|
||||||
|
%pyproject_buildrequires -R
|
||||||
|
cd ../tldr-%{tldr_version}
|
||||||
|
%pyproject_buildrequires -R
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
cd markupsafe-%{markupsafe_version}
|
||||||
|
%pyproject_wheel
|
||||||
|
cd ../tldr-%{tldr_version}
|
||||||
|
%pyproject_wheel
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
# This should install both the wheels:
|
||||||
|
%pyproject_install
|
||||||
|
#pyproject_save_files is not possible with 2 dist-infos
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# Internal check for the value of %%{pyproject_build_lib}
|
||||||
|
%if 0%{?rhel} == 9
|
||||||
|
for dir in . markupsafe-%{markupsafe_version} tldr-%{tldr_version}; do
|
||||||
|
(cd $dir && test "%{pyproject_build_lib}" == "$(echo %{_pyproject_builddir}/pip-req-build-*/build/lib.%{python3_platform}-%{python3_version}):$(echo %{_pyproject_builddir}/pip-req-build-*/build/lib)")
|
||||||
|
done
|
||||||
|
%else
|
||||||
|
cd markupsafe-%{markupsafe_version}
|
||||||
|
%if 0%{?fedora} == 36
|
||||||
|
test "%{pyproject_build_lib}" == "%{_builddir}/%{buildsubdir}/markupsafe-%{markupsafe_version}/build/lib.%{python3_platform}-%{python3_version}"
|
||||||
|
%else
|
||||||
|
test "%{pyproject_build_lib}" == "%{_builddir}/%{buildsubdir}/markupsafe-%{markupsafe_version}/build/lib.%{python3_platform}-cpython-%{python3_version_nodots}"
|
||||||
|
%endif
|
||||||
|
cd ../tldr-%{tldr_version}
|
||||||
|
test "%{pyproject_build_lib}" == "%{_builddir}/%{buildsubdir}/tldr-%{tldr_version}/build/lib"
|
||||||
|
cd ..
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%files
|
||||||
|
%{_bindir}/tldr*
|
||||||
|
%pycached %{python3_sitelib}/tldr.py
|
||||||
|
%{python3_sitelib}/tldr-%{tldr_version}.dist-info/
|
||||||
|
%{python3_sitearch}/MarkupSafe-%{markupsafe_version}.dist-info/
|
||||||
|
%{python3_sitearch}/markupsafe/
|
88
tests/escape_paths.spec
Normal file
88
tests/escape_paths.spec
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
Name: escape_paths
|
||||||
|
Version: 0.1
|
||||||
|
Release: 0
|
||||||
|
Summary: ...
|
||||||
|
License: MIT
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
%description
|
||||||
|
This spec file verifies that escaping percentage signs in paths is possible via
|
||||||
|
exactly 8 (or 2) percentage signs in a filelist and directly in the %%files section.
|
||||||
|
It also verifies other path escaping assumptions on RPM 4.19+.
|
||||||
|
It serves as a regression test for pyproject_save_files:escape_rpm_path().
|
||||||
|
When this breaks, the function needs to be adapted.
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
cat > pyproject.toml << EOF
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > setup.cfg << EOF
|
||||||
|
[metadata]
|
||||||
|
name = escape_paths
|
||||||
|
version = 0.1
|
||||||
|
[options]
|
||||||
|
packages =
|
||||||
|
escape_paths
|
||||||
|
[options.package_data]
|
||||||
|
escape_paths =
|
||||||
|
*
|
||||||
|
EOF
|
||||||
|
|
||||||
|
mkdir -p escape_paths
|
||||||
|
touch escape_paths/__init__.py
|
||||||
|
# the paths on disk will have 1 percentage sign if we type 2 in the spec
|
||||||
|
# we use the word 'version' after the sign, as that is a known existing macro
|
||||||
|
touch 'escape_paths/one%%version'
|
||||||
|
%if v"0%{?rpmversion}" >= v"4.18.90"
|
||||||
|
touch 'escape_paths/path with spaces'
|
||||||
|
touch 'escape_paths/path with spaces and "quotes'
|
||||||
|
touch 'escape_paths/path_with_?*[!globs]!'
|
||||||
|
touch 'escape_paths/path_with_\backslash'
|
||||||
|
touch 'escape_paths/path_with_{curly,brackets}'
|
||||||
|
touch 'escape_paths/path with spaces and ?*[!globs]! and \backslash'
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -L escape_paths
|
||||||
|
touch '%{buildroot}/two%%version'
|
||||||
|
%if v"0%{?rpmversion}" >= v"4.18.90"
|
||||||
|
touch '%{buildroot}/another_path with spaces'
|
||||||
|
touch '%{buildroot}/another_path with spaces and "quotes'
|
||||||
|
touch '%{buildroot}/another_path_with_?*[!globs]!'
|
||||||
|
touch '%{buildroot}/another_path_with_\backslash'
|
||||||
|
touch '%{buildroot}/another_path_with_{curly,brackets}'
|
||||||
|
touch '%{buildroot}/another_path with spaces and ?*[!globs]! and \backslash'
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
grep '/escape_paths/one' %{pyproject_files}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
%files -f %{pyproject_files}
|
||||||
|
%if v"0%{?rpmversion}" >= v"4.18.90"
|
||||||
|
/two%%version
|
||||||
|
/another_path\ with\ spaces
|
||||||
|
/another_path\ with\ spaces\ and\ \"quotes
|
||||||
|
/another_path_with_\?\*\[\!globs\]\!
|
||||||
|
/another_path_with_\\backslash
|
||||||
|
/another_path_with_\{curly,brackets\}
|
||||||
|
/another_path\ with\ spaces\ and\ \?\*\[\!globs\]\!\ and\ \\backslash
|
||||||
|
%else
|
||||||
|
/two%%%%%%%%version
|
||||||
|
%endif
|
30
tests/fake-requirements.spec
Normal file
30
tests/fake-requirements.spec
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
Name: fake-requirements
|
||||||
|
Version: 0
|
||||||
|
Release: 0%{?dist}
|
||||||
|
|
||||||
|
Summary: ...
|
||||||
|
License: MIT
|
||||||
|
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
|
||||||
|
%description
|
||||||
|
Fake spec file to test %%pyproject_buildrequires -N works as expected
|
||||||
|
|
||||||
|
%prep
|
||||||
|
cat > requirements.txt <<EOF
|
||||||
|
click!=5.0.0,>=4.1 # comment to increase test complexity
|
||||||
|
tomli>=0.10.0
|
||||||
|
EOF
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires requirements.txt -N
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
grep '^((python3dist(click) < 5 or python3dist(click) > 5) with python3dist(click) >= 4.1)$' %{_pyproject_buildrequires}
|
||||||
|
grep '^python3dist(tomli) >= 0.10$' %{_pyproject_buildrequires}
|
||||||
|
|
||||||
|
grep 'python3dist(pip)' %{_pyproject_buildrequires} && exit 1 || true
|
||||||
|
grep 'python3dist(wheel)' %{_pyproject_buildrequires} && exit 1 || true
|
||||||
|
test -f /usr/bin/pip && exit 1 || true
|
85
tests/mocktest.sh
Executable file
85
tests/mocktest.sh
Executable file
@ -0,0 +1,85 @@
|
|||||||
|
#!/usr/bin/bash -eux
|
||||||
|
if [ -z "${VERSION_ID-}" ] && [ -z "${NAME-}" ]; then
|
||||||
|
. /etc/os-release
|
||||||
|
fi
|
||||||
|
|
||||||
|
version=$(echo "${VERSION_ID}" | cut -d. -f1)
|
||||||
|
arch="x86_64"
|
||||||
|
|
||||||
|
case $NAME in
|
||||||
|
"Fedora Linux"|"Fedora")
|
||||||
|
mock="fedora-${version}-${arch}"
|
||||||
|
repos="local"
|
||||||
|
;;
|
||||||
|
|
||||||
|
"CentOS Stream"|"Red Hat Enterprise Linux")
|
||||||
|
case $version in
|
||||||
|
9)
|
||||||
|
mock="centos-stream+epel-next-${version}-${arch}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
mock="centos-stream+epel-${version}-${arch}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
repos="local,local-centos-stream"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Not supported OS" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
pkgname=${1}
|
||||||
|
shift
|
||||||
|
|
||||||
|
config="/tmp/${mock}-ci.cfg"
|
||||||
|
|
||||||
|
# create mock config if not present
|
||||||
|
# this makes sure tested version of pyproject-rpm-macros is available
|
||||||
|
# TODO: check if it has precedence if the release was not bumped in tested PR
|
||||||
|
if [ ! -f $config ]; then
|
||||||
|
original="/etc/mock/${mock}.cfg"
|
||||||
|
cp $original $config
|
||||||
|
|
||||||
|
echo -e '\n\n' >> $config
|
||||||
|
echo -e 'config_opts["package_manager_max_attempts"] = 10' >> $config
|
||||||
|
echo -e 'config_opts["package_manager_attempt_delay"] = 60' >> $config
|
||||||
|
echo -e '\n\nconfig_opts["dnf.conf"] += """' >> $config
|
||||||
|
|
||||||
|
# The zuul CI has zuul-build.repo
|
||||||
|
# The Jenkins CI has test-<pkgname>.repo
|
||||||
|
# We run this code from various packages, so we support any <pkgname>
|
||||||
|
if [ -f /etc/yum.repos.d/zuul-build.repo ]; then
|
||||||
|
cat /etc/yum.repos.d/zuul-build.repo >> $config
|
||||||
|
else
|
||||||
|
cat /etc/yum.repos.d/test-*.repo >> $config
|
||||||
|
fi
|
||||||
|
echo -e '\n"""\n' >> $config
|
||||||
|
fi
|
||||||
|
|
||||||
|
# prepare the rpmbuild folders, make sure nothing relevant is there
|
||||||
|
mkdir -p ~/rpmbuild/SRPMS
|
||||||
|
rm -f ~/rpmbuild/SRPMS/${pkgname}-*.src.rpm
|
||||||
|
|
||||||
|
# download the sources and create SRPM
|
||||||
|
spectool -g ${pkgname}.spec
|
||||||
|
rpmbuild -bs --define '_sourcedir .' ${pkgname}.spec
|
||||||
|
|
||||||
|
# build the SRPM in mock
|
||||||
|
res=0
|
||||||
|
mock --verbose --isolation=simple -r $config --enablerepo="$repos" init
|
||||||
|
mock --verbose --isolation=simple -r $config --enablerepo="$repos" "$@" ~/rpmbuild/SRPMS/${pkgname}-*.src.rpm || res=$?
|
||||||
|
|
||||||
|
# move the results to the artifacts directory, so we can examine them
|
||||||
|
artifacts=${TEST_ARTIFACTS:-/tmp/artifacts}
|
||||||
|
|
||||||
|
# on Fedora Rawhide, the directory contains "rawhide" instead of the actual version
|
||||||
|
pushd /var/lib/mock/${mock}/result || pushd /var/lib/mock/${mock/${version}/rawhide}/result
|
||||||
|
mv *.rpm ${artifacts}/ || :
|
||||||
|
for log in *.log; do
|
||||||
|
mv ${log} ${artifacts}/${pkgname}-${log}
|
||||||
|
done
|
||||||
|
popd
|
||||||
|
|
||||||
|
exit $res
|
54
tests/printrun.spec
Normal file
54
tests/printrun.spec
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
Name: printrun
|
||||||
|
Version: 2.0.0~rc6
|
||||||
|
%global upstream_version 2.0.0rc6
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: RepRap printer interface and tools
|
||||||
|
License: GPLv3+ and FSFAP
|
||||||
|
URL: https://github.com/kliment/Printrun
|
||||||
|
Source0: https://github.com/kliment/Printrun/archive/%{name}-%{upstream_version}.tar.gz
|
||||||
|
|
||||||
|
# fix locale location
|
||||||
|
Patch0: https://github.com/kliment/Printrun/pull/1101.patch
|
||||||
|
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: gcc
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package contains lang files outside of printrun module.
|
||||||
|
Building this tests that lang files are marked with %%lang in filelist.
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n Printrun-printrun-%{upstream_version}
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires -R
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l printrun +auto
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# Internal check if generated lang entries are same as
|
||||||
|
# the ones generated using %%find_lang
|
||||||
|
%find_lang pronterface
|
||||||
|
%find_lang plater
|
||||||
|
|
||||||
|
grep '^%%lang' %{pyproject_files} | sort > tested.lang
|
||||||
|
sort pronterface.lang plater.lang > expected.lang
|
||||||
|
diff tested.lang expected.lang
|
||||||
|
|
||||||
|
# Internal check that generated files contain nested __pycache__ directories
|
||||||
|
grep -E '/printrun/__pycache__$' %{pyproject_files}
|
||||||
|
|
||||||
|
|
||||||
|
%files -f %{pyproject_files}
|
||||||
|
%doc README*
|
65
tests/python-clikit.spec
Normal file
65
tests/python-clikit.spec
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
%global pypi_name clikit
|
||||||
|
Name: python-%{pypi_name}
|
||||||
|
Version: 0.3.1
|
||||||
|
Release: 1%{?dist}
|
||||||
|
Summary: Builds beautiful and testable command line interfaces
|
||||||
|
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/sdispater/clikit
|
||||||
|
Source0: %{pypi_source}
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
|
||||||
|
%description
|
||||||
|
Tests building with the poetry(-core) build backend.
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-%{pypi_name}
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-%{pypi_name}
|
||||||
|
%{summary}.
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n %{pypi_name}-%{version}
|
||||||
|
%if 0%{?rhel}
|
||||||
|
# force the poetry-core build backend, as that is available rather than full poetry
|
||||||
|
sed -i 's/"poetry>=0.12"/"poetry-core"/' pyproject.toml
|
||||||
|
sed -i 's/"poetry.masonry.api"/"poetry.core.masonry.api"/' pyproject.toml
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
# this runtime-requires pastel<0.2 which is no longer available in Fedora
|
||||||
|
%pyproject_buildrequires -R
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
# Internal check that $TMPDIR is not changed
|
||||||
|
TPMDIR_original="$TMPDIR"
|
||||||
|
|
||||||
|
%pyproject_install
|
||||||
|
|
||||||
|
# Internal check that $TMPDIR is not changed
|
||||||
|
test "$TMPDIR" == "$TPMDIR_original"
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# Internal check that the RECORD and REQUESTED files are
|
||||||
|
# always removed in %%pyproject_wheel
|
||||||
|
test ! $(find %{buildroot}%{python3_sitelib}/ | grep -E "\.dist-info/RECORD$")
|
||||||
|
test ! $(find %{buildroot}%{python3_sitelib}/ | grep -E "\.dist-info/REQUESTED$")
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-%{pypi_name}
|
||||||
|
%doc README.md
|
||||||
|
%license LICENSE
|
||||||
|
%{python3_sitelib}/%{pypi_name}/
|
||||||
|
%{python3_sitelib}/%{pypi_name}-%{version}.dist-info/
|
54
tests/python-distroinfo.spec
Normal file
54
tests/python-distroinfo.spec
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
Name: python-distroinfo
|
||||||
|
Version: 0.3.2
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Parsing and querying distribution metadata stored in text/YAML files
|
||||||
|
License: ASL 2.0
|
||||||
|
URL: https://github.com/softwarefactory-project/distroinfo
|
||||||
|
Source0: %{pypi_source distroinfo}
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: python3-pytest
|
||||||
|
BuildRequires: git-core
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package uses setuptools and pbr.
|
||||||
|
It has setup_requires and tests that %%pyproject_buildrequires correctly
|
||||||
|
handles that including runtime requirements.
|
||||||
|
Run %%pyproject_check_import with top-level modules filtering.
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-distroinfo
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-distroinfo
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n distroinfo-%{version}
|
||||||
|
# we don't need pytest-runner
|
||||||
|
sed -Ei "s/(, )?'pytest-runner'//" setup.py
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l distroinfo
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
%pytest
|
||||||
|
%pyproject_check_import -t
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-distroinfo -f %{pyproject_files}
|
||||||
|
%doc README.rst AUTHORS
|
60
tests/python-django.spec
Normal file
60
tests/python-django.spec
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
Name: python-django
|
||||||
|
Version: 3.0.7
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: A high-level Python Web framework
|
||||||
|
License: BSD
|
||||||
|
URL: https://www.djangoproject.com/
|
||||||
|
Source0: %{pypi_source Django}
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package contains lang files.
|
||||||
|
Building this tests that lang files are marked with %%lang in filelist.
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-django
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-django
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n Django-%{version}
|
||||||
|
%py3_shebang_fix django/conf/project_template/manage.py-tpl django/bin/django-admin.py
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires -R
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
# remove .po files (in ideal world, we would rebuild the .mo files first)
|
||||||
|
find -name "*.po" | xargs rm -f
|
||||||
|
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l django
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# Internal check if generated lang entries are same as
|
||||||
|
# the ones generated using %%find_lang
|
||||||
|
%find_lang django
|
||||||
|
%find_lang djangojs
|
||||||
|
|
||||||
|
grep '^%%lang' %{pyproject_files} | sort > tested.lang
|
||||||
|
sort django.lang djangojs.lang > expected.lang
|
||||||
|
diff tested.lang expected.lang
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-django -f %{pyproject_files}
|
||||||
|
%doc README.rst
|
||||||
|
%{_bindir}/django-admin
|
||||||
|
%{_bindir}/django-admin.py
|
71
tests/python-dns-lexicon.spec
Normal file
71
tests/python-dns-lexicon.spec
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
Name: python-dns-lexicon
|
||||||
|
Version: 3.8.1
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Manipulate DNS records on various DNS providers in a standardized/agnostic way
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/AnalogJ/lexicon
|
||||||
|
Source0: %{url}/archive/v%{version}/lexicon-%{version}.tar.gz
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
|
||||||
|
# Upstream does not declare this dependency
|
||||||
|
# They dropped it later: https://github.com/AnalogJ/lexicon/issues/1240
|
||||||
|
BuildRequires: python3-pkg_resources
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package has extras specified in tox configuration,
|
||||||
|
we test that the extras are installed when -e is used.
|
||||||
|
This package also uses a custom toxenv and creates several extras subpackages.
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-dns-lexicon
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-dns-lexicon
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
%pyproject_extras_subpackage -n python3-dns-lexicon plesk route53
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -n lexicon-%{version}
|
||||||
|
# The tox configuration lists a [dev] extra, but that installs nothing (is missing).
|
||||||
|
# The test requirements are only specified via poetry.dev-dependencies.
|
||||||
|
# Here we amend the data a bit so we can test more things, adding the tests deps to the dev extra:
|
||||||
|
sed -i \
|
||||||
|
's/\[tool.poetry.extras\]/'\
|
||||||
|
'pytest = {version = ">3", optional = true}\n'\
|
||||||
|
'vcrpy = {version = ">1", optional = true}\n\n'\
|
||||||
|
'[tool.poetry.extras]\n'\
|
||||||
|
'dev = ["pytest", "vcrpy"]/' pyproject.toml
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
# We use the "light" toxenv because the default one installs the [full] extra and we don't have all the deps.
|
||||||
|
# Note that [full] contains [plesk] and [route53] but we specify them manually instead:
|
||||||
|
%pyproject_buildrequires -e light -x plesk -x route53
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
# the license is not marked as License-File by poetry-core, hence -L
|
||||||
|
%pyproject_save_files -L lexicon
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# we cannot use %%tox here, because the configured commands call poetry directly :/
|
||||||
|
# we use %%pytest instead, running a subset of tests not to waste CI time
|
||||||
|
%pytest -k "test_route53 or test_plesk"
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-dns-lexicon -f %{pyproject_files}
|
||||||
|
%license LICENSE
|
||||||
|
%doc README.rst
|
||||||
|
%{_bindir}/lexicon
|
58
tests/python-entrypoints.spec
Normal file
58
tests/python-entrypoints.spec
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
%global pypi_name entrypoints
|
||||||
|
Name: python-%{pypi_name}
|
||||||
|
Version: 0.3
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Discover and load entry points from installed packages
|
||||||
|
License: MIT
|
||||||
|
URL: https://entrypoints.readthedocs.io/
|
||||||
|
Source0: %{pypi_source}
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package contains one .py module
|
||||||
|
Building this tests the flit(_core) build backend.
|
||||||
|
This package also has no explicit BuildRequires for python or the macros,
|
||||||
|
testing the minimal implementation of %%pyproject_buildrequires
|
||||||
|
from pyproject-srpm-macros.
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-%{pypi_name}
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-%{pypi_name}
|
||||||
|
%{summary}.
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n %{pypi_name}-%{version}
|
||||||
|
%if 0%{?rhel}
|
||||||
|
# force the flit-core build backend, as that is available rather than full flit
|
||||||
|
sed -i 's/"flit/"flit_core/' pyproject.toml
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
# the license is not marked as License-File, hence -L
|
||||||
|
%pyproject_save_files entrypoints -L
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# Internal check: Top level __pycache__ is never owned
|
||||||
|
grep -E '/__pycache__$' %{pyproject_files} && exit 1 || true
|
||||||
|
grep -E '/__pycache__/$' %{pyproject_files} && exit 1 || true
|
||||||
|
grep -F '/__pycache__/' %{pyproject_files}
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-%{pypi_name} -f %{pyproject_files}
|
||||||
|
%doc README.rst
|
||||||
|
%license LICENSE
|
54
tests/python-flit-core.spec
Normal file
54
tests/python-flit-core.spec
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
Name: python-flit-core
|
||||||
|
Version: 3.0.0
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Distribution-building parts of Flit
|
||||||
|
|
||||||
|
License: BSD
|
||||||
|
URL: https://pypi.org/project/flit-core/
|
||||||
|
Source0: https://github.com/takluyver/flit/archive/%{version}/flit-%{version}.tar.gz
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
%description
|
||||||
|
Test a wheel built from a subdirectory.
|
||||||
|
Test a build with pyproject.toml backend-path = .
|
||||||
|
flit-core builds with flit-core.
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-flit-core
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-flit-core
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n flit-%{version}
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
cd flit_core
|
||||||
|
# this runtime-requires pytoml which is no longer available in Fedora
|
||||||
|
%pyproject_buildrequires -R
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
%build
|
||||||
|
cd flit_core
|
||||||
|
%pyproject_wheel
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
# there is no license file marked as License-File, hence not using -l
|
||||||
|
%pyproject_save_files flit_core
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# internal check for our macros, we assume there is no license
|
||||||
|
grep -F %%license %{pyproject_files} && exit 1 || true
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-flit-core -f %{pyproject_files}
|
79
tests/python-getmac.spec
Normal file
79
tests/python-getmac.spec
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
Name: python-getmac
|
||||||
|
Version: 0.8.3
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Get MAC addresses of remote hosts and local interfaces
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/GhostofGoes/getmac
|
||||||
|
Source0: %{pypi_source getmac}
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
|
||||||
|
%global _description %{expand:
|
||||||
|
Test that manpages are correctly processed by %%%%%%%%pyproject_save_files '*' +auto.
|
||||||
|
Run %%%%%%%%_pyproject_check_import_allow_no_modules twice
|
||||||
|
- exclude all modules and test the check still passes thanks to -M option
|
||||||
|
- regression test: test that check imports all modules even if -M option is set}
|
||||||
|
|
||||||
|
|
||||||
|
%description %_description
|
||||||
|
|
||||||
|
%package -n python3-getmac
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-getmac %_description
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n getmac-%{version}
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires -r
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l '*' +auto
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# Internal check for our macros, assert the behavior of the import check macros
|
||||||
|
# Both of the macros should succeed
|
||||||
|
%pyproject_check_import
|
||||||
|
%_pyproject_check_import_allow_no_modules
|
||||||
|
(%{pyproject_check_import}) 2>pyproject_check_import.stderr
|
||||||
|
(%{_pyproject_check_import_allow_no_modules}) 2>_pyproject_check_import_allow_no_modules.stderr
|
||||||
|
|
||||||
|
# Modules were found, stderrs should include getmac.getmac
|
||||||
|
grep '^Check import: getmac\.getmac$' pyproject_check_import.stderr
|
||||||
|
grep '^Check import: getmac\.getmac$' _pyproject_check_import_allow_no_modules.stderr
|
||||||
|
|
||||||
|
# Now let's pretend no modules were found at all
|
||||||
|
echo -e '' > %{_pyproject_modules}
|
||||||
|
|
||||||
|
# This should fail
|
||||||
|
(%{pyproject_check_import}) && exit 1 || true
|
||||||
|
|
||||||
|
# This should succeed and say something about no modules found
|
||||||
|
%{_pyproject_check_import_allow_no_modules}
|
||||||
|
(%{_pyproject_check_import_allow_no_modules}) 2>_pyproject_check_import_allow_no_modules.stderr
|
||||||
|
grep '\bNo modules to check found\b' _pyproject_check_import_allow_no_modules.stderr
|
||||||
|
|
||||||
|
# We want to ensure the rest of the %%check section is still executed
|
||||||
|
# (To avoid a temptation to call `exit 0` from %%_pyproject_check_import_allow_no_modules)
|
||||||
|
# We'll touch a marker file here and assert its presence in %%files
|
||||||
|
touch %{buildroot}/check-completed-entirely
|
||||||
|
|
||||||
|
# Internal check for our macros, assert there is a manpage:
|
||||||
|
test -f %{buildroot}%{_mandir}/man1/getmac.1*
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-getmac -f %{pyproject_files}
|
||||||
|
/check-completed-entirely
|
77
tests/python-httpbin.spec
Normal file
77
tests/python-httpbin.spec
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
Name: python-httpbin
|
||||||
|
Version: 0.7.0
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: HTTP Request & Response Service, written in Python + Flask
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/Runscope/httpbin
|
||||||
|
Source0: %{url}/archive/v%{version}/httpbin-%{version}.tar.gz
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
%if 0%{?fedora} >= 37 || 0%{?rhel} >= 10
|
||||||
|
# Wekrzeug in Fedora 37 isn't compatible with our httpbin
|
||||||
|
Patch: https://src.fedoraproject.org/rpms/python-httpbin/raw/0e4a7e2812/f/0001-Fix-disabling-of-location-header-autocorrect-for-wer.patch
|
||||||
|
%endif
|
||||||
|
|
||||||
|
# no flask, itsdangerous, raven, werkzeug packaged for EPEL 9 yet
|
||||||
|
# cannot run tests on EPEL and also cannot BuildRequire runtime deps
|
||||||
|
%if 0%{?fedora}
|
||||||
|
%bcond_without tests
|
||||||
|
%else
|
||||||
|
%bcond_with tests
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package buildrequires a package with extra: raven[flask].
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-httpbin
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-httpbin
|
||||||
|
%{summary}.
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -n httpbin-%{version} -p1
|
||||||
|
|
||||||
|
# brotlipy wrapper is not packaged, httpbin works fine with brotli
|
||||||
|
sed -i s/brotlipy/brotli/ setup.py
|
||||||
|
|
||||||
|
# update test_httpbin.py to reflect new behavior of werkzeug
|
||||||
|
sed -i /Content-Length/d test_httpbin.py
|
||||||
|
|
||||||
|
# https://github.com/postmanlabs/httpbin/issues/647
|
||||||
|
sed -Ei 's/\bdef (test_(relative_)?redirect_(to_post|n_(equals_to|higher_than)_1))/def no\1/' test_httpbin.py
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires %{?with_tests:-t}%{?!with_tests:-R}
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l httpbin
|
||||||
|
|
||||||
|
|
||||||
|
%if %{with tests}
|
||||||
|
%check
|
||||||
|
%if 0%{?fedora} < 40 && 0%{?rhel} < 10
|
||||||
|
# this version of httpbin is not compatible with werkzeug 3+
|
||||||
|
%tox
|
||||||
|
%endif
|
||||||
|
|
||||||
|
# Internal check for our macros
|
||||||
|
# The runtime dependencies contain raven[flask], we assert we got them.
|
||||||
|
# The %%tox above also dies without it, but this makes it more explicit
|
||||||
|
%{python3} -c 'import blinker, flask' # transitive deps
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-httpbin -f %{pyproject_files}
|
||||||
|
%doc README*
|
53
tests/python-ipykernel.spec
Normal file
53
tests/python-ipykernel.spec
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
Name: python-ipykernel
|
||||||
|
Version: 6.11.0
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: IPython Kernel for Jupyter
|
||||||
|
License: BSD
|
||||||
|
URL: https://github.com/ipython/ipykernel
|
||||||
|
Source0: https://github.com/ipython/ipykernel/archive/v%{version}/ipykernel-%{version}.tar.gz
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package contains data files.
|
||||||
|
Building this tests that data files are not listed when +auto is not used
|
||||||
|
with %%pyproject_save_files.
|
||||||
|
Run %%pyproject_check_import on installed package and exclude unwanted modules
|
||||||
|
(if they're not excluded, build fails).
|
||||||
|
- We don't want to pull test dependencies just to check import
|
||||||
|
- The others fail to find `gi` and `matplotlib` which weren't declared
|
||||||
|
in the upstream metadata
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-ipykernel
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-ipykernel
|
||||||
|
...
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n ipykernel-%{version}
|
||||||
|
|
||||||
|
# Remove the dependency on debugpy.
|
||||||
|
# See https://github.com/ipython/ipykernel/pull/767
|
||||||
|
sed -i '/"debugpy/d' pyproject.toml setup.py
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires -r
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l 'ipykernel*' +auto
|
||||||
|
|
||||||
|
%check
|
||||||
|
%pyproject_check_import -e '*.test*' -e 'ipykernel.gui*' -e 'ipykernel.pylab.*' -e 'ipykernel.trio*' -e 'ipykernel.datapub' -e 'ipykernel.pickleutil' -e 'ipykernel.serialize'
|
||||||
|
|
||||||
|
%files -n python3-ipykernel -f %{pyproject_files}
|
||||||
|
%doc README.md
|
||||||
|
|
125
tests/python-isort.spec
Normal file
125
tests/python-isort.spec
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
%global modname isort
|
||||||
|
|
||||||
|
Name: python-%{modname}
|
||||||
|
Version: 4.3.21
|
||||||
|
Release: 7%{?dist}
|
||||||
|
Summary: Python utility / library to sort Python imports
|
||||||
|
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/timothycrosley/%{modname}
|
||||||
|
Source0: %{url}/archive/%{version}-2/%{modname}-%{version}-2.tar.gz
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package contains executables.
|
||||||
|
Building this tests that executables are not listed when +auto is not used
|
||||||
|
with %%pyproject_save_files.
|
||||||
|
|
||||||
|
This package also uses %%{python3_pkgversion} in name and has a very limited
|
||||||
|
set of dependencies -- allows to set a different value for it repeatedly.
|
||||||
|
|
||||||
|
%package -n python%{python3_pkgversion}-%{modname}
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python%{python3_pkgversion}-%{modname}
|
||||||
|
%{summary}.
|
||||||
|
|
||||||
|
%if 0%{?rhel} == 9
|
||||||
|
%global python3_pkgversion 3.11
|
||||||
|
%package -n python%{python3_pkgversion}-%{modname}
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python%{python3_pkgversion}-%{modname}
|
||||||
|
%{summary}.
|
||||||
|
|
||||||
|
%global python3_pkgversion 3.12
|
||||||
|
%package -n python%{python3_pkgversion}-%{modname}
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python%{python3_pkgversion}-%{modname}
|
||||||
|
%{summary}.
|
||||||
|
|
||||||
|
%global python3_pkgversion 3
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -n %{modname}-%{version}-2
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires
|
||||||
|
%if 0%{?rhel} == 9
|
||||||
|
%global python3_pkgversion 3.11
|
||||||
|
%pyproject_buildrequires
|
||||||
|
%global python3_pkgversion 3.12
|
||||||
|
%pyproject_buildrequires
|
||||||
|
%global python3_pkgversion 3
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
%if 0%{?rhel} == 9
|
||||||
|
%global python3_pkgversion 3.11
|
||||||
|
%pyproject_wheel
|
||||||
|
%global python3_pkgversion 3.12
|
||||||
|
%pyproject_wheel
|
||||||
|
%global python3_pkgversion 3
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%if 0%{?rhel} == 9
|
||||||
|
%global python3_pkgversion 3.11
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l isort
|
||||||
|
%global python3_pkgversion 3.12
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l isort
|
||||||
|
%global python3_pkgversion 3
|
||||||
|
%endif
|
||||||
|
# we keep this one last so /usr/bin/isort is installed with python3 shebang
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l isort
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# Internal check if the instalation outputs expected result
|
||||||
|
test -d %{buildroot}%{python3_sitelib}/%{modname}/
|
||||||
|
test -d %{buildroot}%{python3_sitelib}/%{modname}-%{version}.dist-info/
|
||||||
|
|
||||||
|
# Internal check that executables are not present when +auto was not used with %%pyproject_save_files
|
||||||
|
grep -F %{_bindir}/%{modname} %{pyproject_files} && exit 1 || true
|
||||||
|
|
||||||
|
%if 0%{?rhel} == 9
|
||||||
|
# Internal check that correct versions are in correct %%{pyproject_files}s
|
||||||
|
diff %{pyproject_files} <(grep -F python3.9/site-packages %{pyproject_files})
|
||||||
|
|
||||||
|
%global python3_pkgversion 3.11
|
||||||
|
test -d %{buildroot}%{_usr}/lib/python3.11/site-packages/%{modname}/
|
||||||
|
test -d %{buildroot}%{_usr}/lib/python3.11/site-packages/%{modname}-%{version}.dist-info/
|
||||||
|
diff %{pyproject_files} <(grep -F python3.11/site-packages %{pyproject_files})
|
||||||
|
|
||||||
|
%global python3_pkgversion 3.12
|
||||||
|
test -d %{buildroot}%{_usr}/lib/python3.12/site-packages/%{modname}/
|
||||||
|
test -d %{buildroot}%{_usr}/lib/python3.12/site-packages/%{modname}-%{version}.dist-info/
|
||||||
|
diff %{pyproject_files} <(grep -F python3.12/site-packages %{pyproject_files})
|
||||||
|
%global python3_pkgversion 3
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python%{python3_pkgversion}-%{modname} -f %{pyproject_files}
|
||||||
|
%doc README.rst *.md
|
||||||
|
%{_bindir}/%{modname}
|
||||||
|
%if 0%{?rhel} == 9
|
||||||
|
%global python3_pkgversion 3.11
|
||||||
|
%files -n python%{python3_pkgversion}-%{modname} -f %{pyproject_files}
|
||||||
|
%doc README.rst *.md
|
||||||
|
%global python3_pkgversion 3.12
|
||||||
|
%files -n python%{python3_pkgversion}-%{modname} -f %{pyproject_files}
|
||||||
|
%doc README.rst *.md
|
||||||
|
%global python3_pkgversion 3
|
||||||
|
%endif
|
110
tests/python-ldap.spec
Normal file
110
tests/python-ldap.spec
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
Name: python-ldap
|
||||||
|
Version: 3.3.0
|
||||||
|
Release: 0%{?dist}
|
||||||
|
License: Python
|
||||||
|
Summary: An object-oriented API to access LDAP directory servers
|
||||||
|
Source0: %{pypi_source}
|
||||||
|
|
||||||
|
# OpenLDAP 2.5+ is not yet supported by python-ldap
|
||||||
|
# https://github.com/python-ldap/python-ldap/issues/432
|
||||||
|
# Fedora has this patch to make it build, but the tests will fail anyway
|
||||||
|
Patch0: https://src.fedoraproject.org/rpms/python-ldap/raw/a237d9b212bd1581e07f4f1a8f54c26a7190843c/f/python-ldap-always-use-ldap-library.patch
|
||||||
|
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
BuildRequires: cyrus-sasl-devel
|
||||||
|
BuildRequires: gcc
|
||||||
|
BuildRequires: openldap-clients
|
||||||
|
BuildRequires: openldap-devel
|
||||||
|
BuildRequires: openldap-servers
|
||||||
|
BuildRequires: openssl-devel
|
||||||
|
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package contains extension modules. Does not contain pyproject.toml.
|
||||||
|
Has multiple files and directories.
|
||||||
|
Building this tests:
|
||||||
|
- the proper files are installed in the proper places
|
||||||
|
- module glob in %%pyproject_save_files (some modules are included, some not)
|
||||||
|
- combined manual and generated Buildrequires
|
||||||
|
- building an extension module via %%pyproject_buildrequires -w
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-ldap
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-ldap
|
||||||
|
%{summary}
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup
|
||||||
|
# Hack: We remove tests that are broken by OpenLDAP 2.5+
|
||||||
|
# Don't do this in the regular Fedora package, please
|
||||||
|
rm Tests/t_ldapobject.py Tests/t_cext.py Tests/t_edit.py Tests/t_ldap_sasl.py Tests/t_ldap_syncrepl.py Tests/t_slapdobject.py Tests/t_bind.py Tests/t_ldap_options.py Tests/t_ldap_schema_subentry.py
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
# -w is not required with this package, but we test that we can use it anyway
|
||||||
|
%pyproject_buildrequires -t -w
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
#%%pyproject_wheel -- this is done via %%pyproject_buildrequires -w
|
||||||
|
|
||||||
|
# Internal check that we can import the built extension modules from %%{pyproject_build_lib}
|
||||||
|
%{python3} -c 'import _ldap' && exit 1 || true
|
||||||
|
PYTHONPATH=%{pyproject_build_lib} %{python3} -c 'import _ldap'
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
# We can pass multiple globs
|
||||||
|
%pyproject_save_files -l 'ldap*' '*ldap'
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
%tox
|
||||||
|
|
||||||
|
# Internal check if the instalation outputs expected files
|
||||||
|
test -d %{buildroot}%{python3_sitearch}/__pycache__/
|
||||||
|
test -d %{buildroot}%{python3_sitearch}/python_ldap-%{version}.dist-info/
|
||||||
|
test -d %{buildroot}%{python3_sitearch}/ldap/
|
||||||
|
test -f %{buildroot}%{python3_sitearch}/ldapurl.py
|
||||||
|
test -f %{buildroot}%{python3_sitearch}/ldif.py
|
||||||
|
test -d %{buildroot}%{python3_sitearch}/slapdtest/
|
||||||
|
test -f %{buildroot}%{python3_sitearch}/_ldap.cpython-*.so
|
||||||
|
|
||||||
|
# Internal check: Unmatched modules are not supposed to be listed in %%{pyproject_files}
|
||||||
|
# We'll list them explicitly
|
||||||
|
grep -F %{python3_sitearch}/ldif.py %{pyproject_files} && exit 1 || true
|
||||||
|
grep -F %{python3_sitearch}/__pycache__/ldif.cpython-%{python3_version_nodots}.pyc %{pyproject_files} && exit 1 || true
|
||||||
|
grep -F %{python3_sitearch}/__pycache__/ldif.cpython-%{python3_version_nodots}.opt-1.pyc %{pyproject_files} && exit 1 || true
|
||||||
|
grep -F %{python3_sitearch}/slapdtest %{pyproject_files} && exit 1 || true
|
||||||
|
|
||||||
|
# Internal check: Unmatched modules are not supposed to be listed in %%{_pyproject_modules}
|
||||||
|
grep -F slapdtest %{_pyproject_modules} && exit 1 || true
|
||||||
|
grep -F ldif %{_pyproject_modules} && exit 1 || true
|
||||||
|
# Let's check that at least one module is listed in %%{_pyproject_modules}
|
||||||
|
grep -F ldapurl %{_pyproject_modules}
|
||||||
|
|
||||||
|
# Internal check: Top level __pycache__ is never owned
|
||||||
|
grep -E '/site-packages/__pycache__$' %{pyproject_files} && exit 1 || true
|
||||||
|
grep -E '/site-packages/__pycache__/$' %{pyproject_files} && exit 1 || true
|
||||||
|
|
||||||
|
# Internal check for the value of %%{pyproject_build_lib} in an archful package
|
||||||
|
%if 0%{?rhel} == 9
|
||||||
|
test "%{pyproject_build_lib}" == "$(echo %{_pyproject_builddir}/pip-req-build-*/build/lib.%{python3_platform}-%{python3_version})"
|
||||||
|
%elif 0%{?fedora} == 36
|
||||||
|
test "%{pyproject_build_lib}" == "%{_builddir}/%{buildsubdir}/build/lib.%{python3_platform}-%{python3_version}"
|
||||||
|
%else
|
||||||
|
test "%{pyproject_build_lib}" == "%{_builddir}/%{buildsubdir}/build/lib.%{python3_platform}-cpython-%{python3_version_nodots}"
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-ldap -f %{pyproject_files}
|
||||||
|
%doc CHANGES README TODO Demo
|
||||||
|
# Explicitly listed files can be combined with automation
|
||||||
|
%pycached %{python3_sitearch}/ldif.py
|
||||||
|
%{python3_sitearch}/slapdtest/
|
50
tests/python-markdown-it-py.spec
Normal file
50
tests/python-markdown-it-py.spec
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
Name: python-markdown-it-py
|
||||||
|
Version: 3.0.0
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Python port of markdown-it
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/executablebooks/markdown-it-py
|
||||||
|
Source0: %{url}/archive/v%{version}/markdown-it-py-%{version}.tar.gz
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package tests generating of runtime requirements from pyproject.toml
|
||||||
|
Upstream has got many more extras than we package,
|
||||||
|
so it's a good example to test it's filtered correctly.
|
||||||
|
|
||||||
|
%package -n python3-markdown-it-py
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-markdown-it-py
|
||||||
|
...
|
||||||
|
|
||||||
|
%pyproject_extras_subpkg -n python3-markdown-it-py linkify
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n markdown-it-py-%{version}
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires -x testing,linkify -p
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files markdown_it -L
|
||||||
|
|
||||||
|
%check
|
||||||
|
# sphinx-copybutton is in [rtd] extra, should not appear
|
||||||
|
grep "python3dist(sphinx-copybutton)" %_pyproject_buildrequires && exit 1 || true
|
||||||
|
# "pytest-benchmark" is in [benchmarking] extra, should not appear
|
||||||
|
grep "python3dist(pytest-benchmark)" %_pyproject_buildrequires && exit 1 || true
|
||||||
|
# "pytest-regressions" is in [testing] extra, should appear
|
||||||
|
grep "python3dist(pytest-regressions)" %_pyproject_buildrequires
|
||||||
|
# "linkify-it-py" is in [linkify] extra, should appear
|
||||||
|
grep "python3dist(linkify-it-py)" %_pyproject_buildrequires
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-markdown-it-py -f %{pyproject_files}
|
||||||
|
%{_bindir}/markdown-it
|
61
tests/python-markupsafe.spec
Normal file
61
tests/python-markupsafe.spec
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
Name: python-markupsafe
|
||||||
|
Version: 2.0.1
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Implements a XML/HTML/XHTML Markup safe string for Python
|
||||||
|
License: BSD
|
||||||
|
URL: https://github.com/pallets/markupsafe
|
||||||
|
Source0: %{url}/archive/%{version}/MarkupSafe-%{version}.tar.gz
|
||||||
|
|
||||||
|
BuildRequires: gcc
|
||||||
|
BuildRequires: make
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package installs test- and docs-requirements from files
|
||||||
|
and uses them to run tests and build documentation.
|
||||||
|
It also has a less common order of the %%files section.
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-markupsafe
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-markupsafe
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
# In this spec, we put %%files early to test it still works
|
||||||
|
%files -n python3-markupsafe -f %{pyproject_files}
|
||||||
|
%doc CHANGES.rst README.rst
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -n markupsafe-%{version}
|
||||||
|
|
||||||
|
# we don't have pip-tools packaged in Fedora yet
|
||||||
|
sed -i /pip-tools/d requirements/dev.in
|
||||||
|
|
||||||
|
# help the macros understand the URL in requirements/docs.in
|
||||||
|
sed -Ei 's/sphinx\.git@([0-9a-f]+)/sphinx.git@\1#egg=sphinx/' requirements/docs.in
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
# requirements/dev.in recursively includes tests.in and docs.in
|
||||||
|
# we also list tests.in manually to verify we can pass multiple arguments,
|
||||||
|
# but it should be redundant if this was a real package
|
||||||
|
%pyproject_buildrequires requirements/dev.in requirements/tests.in
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
%make_build -C docs html SPHINXOPTS='-n %{?_smp_mflags}'
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l markupsafe
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
%pytest
|
||||||
|
|
63
tests/python-mistune.spec
Normal file
63
tests/python-mistune.spec
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
Name: python-mistune
|
||||||
|
Version: 0.8.3
|
||||||
|
Release: 11%{?dist}
|
||||||
|
Summary: Markdown parser for Python
|
||||||
|
|
||||||
|
License: BSD
|
||||||
|
URL: https://github.com/lepture/mistune
|
||||||
|
Source0: %{url}/archive/v%{version}.tar.gz
|
||||||
|
|
||||||
|
BuildRequires: gcc
|
||||||
|
BuildRequires: python%{python3_pkgversion}-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
# optional dependency, listed explicitly to have the extension module:
|
||||||
|
BuildRequires: python%{python3_pkgversion}-Cython
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package contains an extension module. Does not contain pyproject.toml.
|
||||||
|
Has a script (.py) and extension (.so) with identical name.
|
||||||
|
Building this tests:
|
||||||
|
- installing both a script and an extension with the same name
|
||||||
|
- default build backend without pyproject.toml
|
||||||
|
Check %%pyproject_check_import basic functionality.
|
||||||
|
|
||||||
|
This package also uses %%{python3_pkgversion} in name and has a very limited
|
||||||
|
set of dependencies -- allows to set a different value for it in the CI.
|
||||||
|
|
||||||
|
%package -n python%{python3_pkgversion}-mistune
|
||||||
|
Summary: %summary
|
||||||
|
|
||||||
|
%description -n python%{python3_pkgversion}-mistune
|
||||||
|
%{summary}
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -n mistune-%{version}
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l mistune
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
%pyproject_check_import
|
||||||
|
|
||||||
|
# Internal check for our macros
|
||||||
|
# making sure that pyproject_install outputs these files so that we can test behaviour of %%pyproject_save_files
|
||||||
|
# when a package has multiple files with the same name (here script and extension)
|
||||||
|
test -f %{buildroot}%{python3_sitearch}/mistune.py
|
||||||
|
test -f %{buildroot}%{python3_sitearch}/mistune.cpython-*.so
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python%{python3_pkgversion}-mistune -f %{pyproject_files}
|
||||||
|
%doc README.rst
|
56
tests/python-openqa_client.spec
Normal file
56
tests/python-openqa_client.spec
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
%global pypi_name openqa_client
|
||||||
|
Name: python-%{pypi_name}
|
||||||
|
Version: 4.0.0
|
||||||
|
Release: 1%{?dist}
|
||||||
|
Summary: Python client library for openQA API
|
||||||
|
|
||||||
|
License: GPLv2+
|
||||||
|
URL: https://github.com/os-autoinst/openQA-python-client
|
||||||
|
Source0: %{pypi_source}
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package uses tox.ini file with recursive deps (via the -r option).
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-%{pypi_name}
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-%{pypi_name}
|
||||||
|
%{summary}.
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n %{pypi_name}-%{version}
|
||||||
|
# setuptools-git is needed to build the source distribution, but not
|
||||||
|
# for packaging, which *starts* from the source distribution
|
||||||
|
# we sed it out to save ourselves a dependency, but that is not strictly required
|
||||||
|
sed -i -e 's., "setuptools-git"..g' pyproject.toml
|
||||||
|
|
||||||
|
# the tests don't actually need mock, they use unittest.mock
|
||||||
|
# https://github.com/os-autoinst/openQA-python-client/pull/21
|
||||||
|
sed -i '/mock/d' tests.requires
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires -t
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l %{pypi_name}
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
%tox
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-%{pypi_name} -f %{pyproject_files}
|
||||||
|
%doc README.*
|
51
tests/python-pello.spec
Normal file
51
tests/python-pello.spec
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
Name: python-pello
|
||||||
|
Version: 1.0.4
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Example Python library
|
||||||
|
|
||||||
|
License: MIT-0
|
||||||
|
URL: https://github.com/fedora-python/Pello
|
||||||
|
Source: %{url}/archive/v%{version}/Pello-%{version}.tar.gz
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
# we use this specfile for 2 different tests, this bcond controls it
|
||||||
|
# a build --with options tests custom BuildOptions(generate_buildrequires)
|
||||||
|
%bcond options 0
|
||||||
|
|
||||||
|
# unfortunately, the following is not even parsable on RPM < 4.20
|
||||||
|
%if v"0%{?rpmversion}" >= v"4.19.90"
|
||||||
|
BuildSystem: pyproject
|
||||||
|
BuildOption(install): -l pello
|
||||||
|
%if %{with options}
|
||||||
|
BuildOption(generate_buildrequires): -t
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%description
|
||||||
|
We use this specfile to test the declarative buildsystem.
|
||||||
|
On older RPM version the build succeeds but builds nothing.
|
||||||
|
|
||||||
|
Note that due to the "automagic" it's a bit challenging to actually assert
|
||||||
|
anything here. Manually inspecting the logs and results when doing changes
|
||||||
|
to the declarative buildsystem is still advised.
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-pello
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-pello
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
%if %{with options} && v"0%{?rpmversion}" >= v"4.19.90"
|
||||||
|
%check -a
|
||||||
|
%tox
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%if v"0%{?rpmversion}" >= v"4.19.90"
|
||||||
|
%files -n python3-pello -f %{pyproject_files}
|
||||||
|
%doc README.md
|
||||||
|
%{_bindir}/pello_greeting
|
||||||
|
%endif
|
57
tests/python-pluggy.spec
Normal file
57
tests/python-pluggy.spec
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
%global pypi_name pluggy
|
||||||
|
Name: python-%{pypi_name}
|
||||||
|
Version: 0.13.0
|
||||||
|
Release: 1%{?dist}
|
||||||
|
Summary: The plugin manager stripped of pytest specific details
|
||||||
|
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/pytest-dev/pluggy
|
||||||
|
Source0: %{pypi_source}
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
# we don't BR python3-devel here just for test purposes, but we recommend you do it
|
||||||
|
|
||||||
|
%description
|
||||||
|
A pure Python library. The package contains tox.ini. Does not contain executables.
|
||||||
|
Building this tests:
|
||||||
|
- generating runtime and testing dependencies
|
||||||
|
- running tests with %%tox
|
||||||
|
- the %%pyproject_save_files +auto option works without actual executables
|
||||||
|
- pyproject.toml with the setuptools backend and setuptools-scm
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-%{pypi_name}
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-%{pypi_name}
|
||||||
|
%{summary}.
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n %{pypi_name}-%{version}
|
||||||
|
# Avoid pytest 8 for now.
|
||||||
|
# Once the compat package is removed from Fedora, we will update pluggy.
|
||||||
|
sed -i 's/{env:_PYTEST_DEP:pytest}$/{env:_PYTEST_DEP:pytest<8}/' tox.ini
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires -t
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
# There are no executables, but we are allowed to pass +auto anyway
|
||||||
|
%pyproject_save_files pluggy +auto -l
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
%tox
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-%{pypi_name} -f %{pyproject_files}
|
||||||
|
%doc README.rst
|
48
tests/python-poetry-core.spec
Normal file
48
tests/python-poetry-core.spec
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
Name: python-poetry-core
|
||||||
|
Version: 1.1.0
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Poetry PEP 517 Build Backend
|
||||||
|
|
||||||
|
License: MIT
|
||||||
|
URL: https://pypi.org/project/poetry-core/
|
||||||
|
Source0: %{pypi_source poetry-core}
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
%description
|
||||||
|
Test a build with pyproject.toml backend-path = [.]
|
||||||
|
poetry-core builds with poetry-core.
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-poetry-core
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-poetry-core
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n poetry-core-%{version}
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
# the license is not marked as License-File by poetry-core, hence -L
|
||||||
|
%pyproject_save_files -L poetry
|
||||||
|
|
||||||
|
# internal check for our macros, -l must fail:
|
||||||
|
%pyproject_save_files -l poetry && exit 1 || true
|
||||||
|
|
||||||
|
%files -n python3-poetry-core -f %{pyproject_files}
|
||||||
|
%doc README.md
|
||||||
|
%license LICENSE
|
70
tests/python-pytest.spec
Normal file
70
tests/python-pytest.spec
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
%global pypi_name pytest
|
||||||
|
Name: python-%{pypi_name}
|
||||||
|
Version: 7.2.0
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Simple powerful testing with Python
|
||||||
|
License: MIT
|
||||||
|
URL: https://pytest.org
|
||||||
|
Source0: %{pypi_source}
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
# no xmlschema packaged for EPEL 10 yet, cannot run tests on EPEL
|
||||||
|
%if 0%{?fedora}
|
||||||
|
%bcond_without tests
|
||||||
|
%else
|
||||||
|
%bcond_with tests
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%description
|
||||||
|
This is a pure Python package with executables. It has a test suite in tox.ini
|
||||||
|
and test dependencies specified via the [test] extra.
|
||||||
|
Building this tests:
|
||||||
|
- generating runtime and test dependencies by both tox.ini and extras
|
||||||
|
- pyproject.toml with the setuptools backend and setuptools-scm
|
||||||
|
- passing arguments into %%tox
|
||||||
|
|
||||||
|
%package -n python3-%{pypi_name}
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-%{pypi_name}
|
||||||
|
%{summary}.
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n %{pypi_name}-%{version}
|
||||||
|
# remove optional test dependencies we don't like to pull in
|
||||||
|
sed -E -i '/mock|nose/d' setup.cfg
|
||||||
|
# internal check for our macros: insert a subprocess echo to setup.py
|
||||||
|
# to ensure it's not generated as BuildRequires
|
||||||
|
echo 'import os; os.system("echo if-this-is-generated-the-build-will-fail")' >> setup.py
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires %{?with_tests:-x testing -t}
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l '*pytest' py +auto
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
%if %{with tests}
|
||||||
|
# Only run one test (which uses a test-only dependency, hypothesis)
|
||||||
|
# See how to pass options trough the macro to tox, trough tox to pytest
|
||||||
|
%tox -- -- -k "metafunc and not test_parametrize_" -Wdefault
|
||||||
|
%else
|
||||||
|
%pyproject_check_import
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-%{pypi_name} -f %{pyproject_files}
|
||||||
|
%doc README.rst
|
||||||
|
%doc CHANGELOG.rst
|
110
tests/python-setuptools.spec
Normal file
110
tests/python-setuptools.spec
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
Name: python-setuptools
|
||||||
|
# on the CI we test different version of setuptools on different Fedora versions
|
||||||
|
# don't package software like this in Fedora please
|
||||||
|
%if 0%{?fedora} || 0%{?rhel} >= 10
|
||||||
|
Version: 67.7.2
|
||||||
|
%else
|
||||||
|
Version: 59.6.0
|
||||||
|
%endif
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Easily build and distribute Python packages
|
||||||
|
# see the real Fedora package for explanation:
|
||||||
|
License: MIT and (BSD or ASL 2.0)
|
||||||
|
URL: https://pypi.python.org/pypi/setuptools
|
||||||
|
Source: %{pypi_source setuptools %{version}}
|
||||||
|
|
||||||
|
# Patch from Fedora proper
|
||||||
|
%if 0%{?fedora} || 0%{?rhel} >= 10
|
||||||
|
Patch: https://src.fedoraproject.org/rpms/python-setuptools/raw/8ae9b2a777c/f/Remove-optional-or-unpackaged-test-deps.patch
|
||||||
|
%else
|
||||||
|
Patch: https://src.fedoraproject.org/rpms/python-setuptools/raw/6fc093d6b3d/f/0001-Remove-optional-or-unpackaged-test-deps.patch
|
||||||
|
%endif
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
BuildRequires: gcc
|
||||||
|
|
||||||
|
# too many missing tests deps in EPEL 9
|
||||||
|
%if 0%{?fedora}
|
||||||
|
%bcond_without tests
|
||||||
|
%else
|
||||||
|
%bcond_with tests
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package tests 2 things:
|
||||||
|
|
||||||
|
- %%{_pyproject_builddir} does not leak to pytest collection (rhzb#1935212)
|
||||||
|
- TODO %%{pyproject_files} has escaped spaces (rhzb#1976363)
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-setuptools
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
# For users who might see ModuleNotFoundError: No module named 'pkg_resoureces'
|
||||||
|
%py_provides python3-pkg_resources
|
||||||
|
%py_provides python3-pkg-resources
|
||||||
|
|
||||||
|
%description -n python3-setuptools
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n setuptools-%{version}
|
||||||
|
|
||||||
|
%if 0%{?rhel} && 0%{?rhel} < 10
|
||||||
|
# The following test deps are optional and either not desired or not available in Fedora:
|
||||||
|
sed -Ei setup.cfg -e '/\bpytest-(checkdocs|black|cov|mypy|enabler)\b/d' \
|
||||||
|
-e '/\bflake8\b/d' \
|
||||||
|
-e '/\bpaver\b/d'
|
||||||
|
# Strip pytest options from the above
|
||||||
|
sed -i pytest.ini -e 's/ --flake8//' \
|
||||||
|
-e 's/ --cov//'
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires -r %{?with_tests:-x testing}
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files setuptools pkg_resources _distutils_hack -l
|
||||||
|
|
||||||
|
# https://github.com/pypa/setuptools/issues/2709
|
||||||
|
rm -rf %{buildroot}%{python3_sitelib}/pkg_resources/tests/
|
||||||
|
sed -i '/tests/d' %{pyproject_files}
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# https://github.com/pypa/setuptools/discussions/2607
|
||||||
|
rm pyproject.toml
|
||||||
|
|
||||||
|
%if %{with tests}
|
||||||
|
# We only run a subset of tests to speed things up and be less fragile
|
||||||
|
PRE_BUILT_SETUPTOOLS_WHEEL=%{_pyproject_wheeldir}/setuptools-%{version}-py3-none-any.whl \
|
||||||
|
PYTHONPATH=$(pwd) %pytest --ignore=pavement.py \
|
||||||
|
--ignore=setuptools/tests/test_develop.py \
|
||||||
|
--ignore=setuptools/tests/test_editable_install.py \
|
||||||
|
--ignore=setuptools/tests/config/test_apply_pyprojecttoml.py \
|
||||||
|
-k "sdist" -n %{_smp_build_ncpus}
|
||||||
|
%else
|
||||||
|
%pyproject_check_import
|
||||||
|
%endif
|
||||||
|
|
||||||
|
# Internal check that license file was recognized correctly
|
||||||
|
grep '^%%license' %{pyproject_files} > tested.license
|
||||||
|
echo '%%license %{python3_sitelib}/setuptools-%{version}.dist-info/LICENSE' > expected.license
|
||||||
|
diff tested.license expected.license
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-setuptools -f %{pyproject_files}
|
||||||
|
%doc docs/* CHANGES.rst README.rst
|
||||||
|
%{python3_sitelib}/distutils-precedence.pth
|
75
tests/python-setuptools_scm.spec
Normal file
75
tests/python-setuptools_scm.spec
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
Name: python-setuptools_scm
|
||||||
|
Version: 6.3.2
|
||||||
|
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: The blessed package to manage your versions by SCM tags
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/pypa/setuptools_scm/
|
||||||
|
Source0: %{pypi_source setuptools_scm}
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
BuildRequires: /usr/bin/git
|
||||||
|
|
||||||
|
# flake8 is still missing tests deps in EPEL 9/10
|
||||||
|
%if 0%{?fedora}
|
||||||
|
%bcond_without flake8
|
||||||
|
%else
|
||||||
|
%bcond_with flake8
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%description
|
||||||
|
Here we test that %%pyproject_extras_subpkg works and generates
|
||||||
|
setuptools_scm[toml] extra subpackage.
|
||||||
|
|
||||||
|
We also check passing multiple -e flags to %%pyproject_buildrequires.
|
||||||
|
The tox environments also have a dependency on an extra ("toml").
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-setuptools_scm
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-setuptools_scm
|
||||||
|
...
|
||||||
|
|
||||||
|
%pyproject_extras_subpkg -n python3-setuptools_scm toml
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n setuptools_scm-%{version}
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
# Note that you should not run flake8-like linters in Fedora spec files,
|
||||||
|
# here we do it solely to check the *ability* to use multiple toxenvs.
|
||||||
|
%pyproject_buildrequires -e %{default_toxenv}-test %{?with_flake8:-e flake8}
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l setuptools_scm
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# This tox should run all the toxenvs specified via -e in %%pyproject_buildrequires
|
||||||
|
# We only run some of the tests (running all of them requires network connection and is slow)
|
||||||
|
%tox -- -- -k test_version -Wdefault --ignore testing/test_hg_git.py | tee toxlog
|
||||||
|
|
||||||
|
# Internal check for our macros: Assert both toxenvs were executed.
|
||||||
|
grep -E 'py%{python3_version_nodots}-test: (OK|commands succeeded)' toxlog
|
||||||
|
grep -E 'flake8: (OK|commands succeeded)' toxlog %{?!with_flake8:&& exit 1 || true}
|
||||||
|
|
||||||
|
# Internal check for our macros
|
||||||
|
# making sure that %%{_pyproject_ghost_distinfo} has the right content
|
||||||
|
test -f %{_pyproject_ghost_distinfo}
|
||||||
|
test "$(cat %{_pyproject_ghost_distinfo})" == "%ghost %{python3_sitelib}/setuptools_scm-%{version}.dist-info"
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-setuptools_scm -f %{pyproject_files}
|
||||||
|
%doc README.rst
|
||||||
|
%doc CHANGELOG.rst
|
61
tests/python-userpath.spec
Normal file
61
tests/python-userpath.spec
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
Name: python-userpath
|
||||||
|
Version: 1.8.0
|
||||||
|
Release: 1%{?dist}
|
||||||
|
Summary: Cross-platform tool for adding locations to the user PATH
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/ofek/userpath
|
||||||
|
Source: %{pypi_source userpath}
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package uses hatchling as build backend.
|
||||||
|
This package is tested because:
|
||||||
|
|
||||||
|
- the prepare_metadata_for_build_wheel hook does not exist,
|
||||||
|
%%pyproject_buildrequires -w is used
|
||||||
|
https://github.com/ofek/hatch/issues/128
|
||||||
|
- the licenses are stored in a dist-info subdirectory
|
||||||
|
https://bugzilla.redhat.com/1985340
|
||||||
|
(as of hatchling 0.22.0, not yet marked as License-File)
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-userpath
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-userpath
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n userpath-%{version}
|
||||||
|
sed -Ei '/^(coverage)$/d' requirements-dev.txt
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires requirements-dev.txt -w
|
||||||
|
|
||||||
|
|
||||||
|
## %%pyproject_buildrequires -w makes this redundant:
|
||||||
|
# %%build
|
||||||
|
# %%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l userpath
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
%pytest
|
||||||
|
|
||||||
|
%if 0%{?fedora} || 0%{?rhel} > 9
|
||||||
|
# Internal check that license file was recognized correctly with hatchling 1.9.0+
|
||||||
|
grep '^%%license' %{pyproject_files} > tested.license
|
||||||
|
echo '%%license %{python3_sitelib}/userpath-%{version}.dist-info/licenses/LICENSE.txt' > expected.license
|
||||||
|
diff tested.license expected.license
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-userpath -f %{pyproject_files}
|
||||||
|
%{_bindir}/userpath
|
73
tests/python-virtualenv.spec
Normal file
73
tests/python-virtualenv.spec
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
Name: python-virtualenv
|
||||||
|
Version: 20.19.0
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Tool to create isolated Python environments
|
||||||
|
|
||||||
|
License: MIT
|
||||||
|
URL: http://pypi.python.org/pypi/virtualenv
|
||||||
|
Source: %{pypi_source virtualenv}
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: python3-pytest
|
||||||
|
|
||||||
|
%description
|
||||||
|
This specfile was added as a regression test to
|
||||||
|
https://src.fedoraproject.org/rpms/pyproject-rpm-macros/pull-request/363
|
||||||
|
|
||||||
|
It uses hatchling without %%pyproject_buildrequires -w.
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-virtualenv
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-virtualenv
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n virtualenv-%{version}
|
||||||
|
# Relax the upper bounds of some dependencies to their known available versions in EL 9
|
||||||
|
sed -i -e 's/distlib<1,>=0.3.6/distlib<1,>=0.3.2/' \
|
||||||
|
-e 's/filelock<4,>=3.4.1/filelock<4,>=3.3.1/' \
|
||||||
|
-e 's/platformdirs<4,>=2.4/platformdirs<5,>=2.3/' \
|
||||||
|
-e 's/hatchling>=1.12.2/hatchling>=0.25/' \
|
||||||
|
-e 's/hatch-vcs>=0.3/hatch-vcs>=0.2.1/' \
|
||||||
|
pyproject.toml
|
||||||
|
# Drop the option for flaky
|
||||||
|
sed -i 's/--no-success-flaky-report//' pyproject.toml
|
||||||
|
# Hacky backport of https://src.fedoraproject.org/rpms/python-virtualenv/c/87b1f95664
|
||||||
|
%if 0%{?fedora} >= 39 || 0%{?rhel} >= 10
|
||||||
|
sed -i 's/_nonwrappers/_hookimpls/' tests/conftest.py
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires -w
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
# %%pyproject_buildrequires -w makes this redundant
|
||||||
|
# %%pyproject_wheel
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l virtualenv
|
||||||
|
%{?el9:
|
||||||
|
# old version of setuptools_scm produces files incompatible with
|
||||||
|
# assumptions in virtualenv code, we append the expected attributes:
|
||||||
|
echo '__version__, __version_tuple__ = version, version_tuple' >> %{buildroot}%{python3_sitelib}/virtualenv/version.py
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
%check
|
||||||
|
# test_main fails when .dist-info is not deleted at the end of %%pyproject_buildrequires
|
||||||
|
# tests/integration/test_zipapp.py imports flaky
|
||||||
|
PIP_CERT=/etc/pki/tls/certs/ca-bundle.crt \
|
||||||
|
%pytest -v -k test_main --ignore tests/integration/test_zipapp.py
|
||||||
|
|
||||||
|
|
||||||
|
%files -n python3-virtualenv -f %{pyproject_files}
|
||||||
|
%doc README.md
|
||||||
|
%{_bindir}/virtualenv
|
45
tests/python-zope-event.spec
Normal file
45
tests/python-zope-event.spec
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
Name: python-zope-event
|
||||||
|
Version: 4.2.0
|
||||||
|
Release: 0%{?dist}
|
||||||
|
Summary: Zope Event Publication
|
||||||
|
License: ZPLv2.1
|
||||||
|
URL: https://pypi.python.org/pypi/zope.event/
|
||||||
|
Source0: %{pypi_source zope.event}
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
|
||||||
|
%description
|
||||||
|
This package contains .pth files.
|
||||||
|
Building this tests that .pth files are not listed when +auto is not used
|
||||||
|
with %%pyproject_save_files.
|
||||||
|
|
||||||
|
%package -n python3-zope-event
|
||||||
|
Summary: %{summary}
|
||||||
|
|
||||||
|
%description -n python3-zope-event
|
||||||
|
...
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%setup -q -n zope.event-%{version}
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l zope +auto
|
||||||
|
|
||||||
|
%check
|
||||||
|
# Internal check that the RECORD and REQUESTED files are
|
||||||
|
# always removed in %%pyproject_wheel
|
||||||
|
test ! $(find %{buildroot}%{python3_sitelib}/ | grep -E "\.dist-info/RECORD$")
|
||||||
|
test ! $(find %{buildroot}%{python3_sitelib}/ | grep -E "\.dist-info/REQUESTED$")
|
||||||
|
|
||||||
|
%files -n python3-zope-event -f %{pyproject_files}
|
||||||
|
%doc README.rst
|
||||||
|
|
132
tests/tests.yml
Normal file
132
tests/tests.yml
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
---
|
||||||
|
- hosts: localhost
|
||||||
|
tags:
|
||||||
|
- classic
|
||||||
|
tasks:
|
||||||
|
- dnf:
|
||||||
|
name: "*"
|
||||||
|
state: latest
|
||||||
|
|
||||||
|
- hosts: localhost
|
||||||
|
roles:
|
||||||
|
- role: standard-test-basic
|
||||||
|
tags:
|
||||||
|
- classic
|
||||||
|
tests:
|
||||||
|
- pytest:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-pytest
|
||||||
|
- entrypoints:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-entrypoints
|
||||||
|
- pluggy:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-pluggy
|
||||||
|
- clikit:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-clikit
|
||||||
|
- distroinfo:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-distroinfo
|
||||||
|
# No matching package to install: 'python3dist(termcolor)'
|
||||||
|
#- tldr:
|
||||||
|
# dir: .
|
||||||
|
# run: ./mocktest.sh tldr
|
||||||
|
# No matching package to install: 'python3dist(freezegun)'
|
||||||
|
#- openqa_client:
|
||||||
|
# dir: .
|
||||||
|
# run: ./mocktest.sh python-openqa_client
|
||||||
|
- httpbin:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-httpbin
|
||||||
|
# No matching package to install: 'openldap-servers'
|
||||||
|
#- ldap:
|
||||||
|
# dir: .
|
||||||
|
# run: ./mocktest.sh python-ldap
|
||||||
|
- isort:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-isort
|
||||||
|
- mistune:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-mistune
|
||||||
|
- setuptools_scm:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-setuptools_scm
|
||||||
|
# No matching package to install: 'python3dist(ipython) >= 5'
|
||||||
|
# No matching package to install: 'python3dist(jupyter-client)'
|
||||||
|
# No matching package to install: 'python3dist(jupyter-core) >= 4.2'
|
||||||
|
#- ipykernel:
|
||||||
|
# dir: .
|
||||||
|
# run: ./mocktest.sh python-ipykernel
|
||||||
|
- zope:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-zope-event
|
||||||
|
- django:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-django
|
||||||
|
- printrun:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh printrun
|
||||||
|
# No matching package to install: 'python3dist(vcrpy) > 1.0'
|
||||||
|
#- dns_lexicon:
|
||||||
|
# dir: .
|
||||||
|
# run: ./mocktest.sh python-dns-lexicon
|
||||||
|
- flit_core:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-flit-core
|
||||||
|
- poetry_core:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-poetry-core
|
||||||
|
- setuptools:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-setuptools
|
||||||
|
# No matching package to install: 'python3dist(mypy)'
|
||||||
|
# No matching package to install: 'python3dist(pallets-sphinx-themes)'
|
||||||
|
# No matching package to install: 'python3dist(pre-commit)'
|
||||||
|
# No matching package to install: 'python3dist(sphinx-issues)'
|
||||||
|
# No matching package to install: 'python3dist(sphinxcontrib-log-cabinet)'
|
||||||
|
#- markupsafe:
|
||||||
|
# dir: .
|
||||||
|
# run: ./mocktest.sh python-markupsafe
|
||||||
|
- getmac:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-getmac
|
||||||
|
- userpath:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-userpath
|
||||||
|
# No matching package to install: 'python3dist(pytest-cov)' [testing]
|
||||||
|
# No matching package to install: 'python3dist(pytest-regressions)' [testing]
|
||||||
|
# No matching package to install: 'python3dist(linkify-it-py)' [linkify]
|
||||||
|
# No matching package to install: 'python3dist(mdurl)'
|
||||||
|
#- markdown_it_py:
|
||||||
|
# dir: .
|
||||||
|
# run: ./mocktest.sh python-markdown-it-py
|
||||||
|
- double_install:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh double-install
|
||||||
|
- fake_requirements:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh fake-requirements
|
||||||
|
- virtualenv:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-virtualenv
|
||||||
|
- pello:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-pello
|
||||||
|
- pello_with_options:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh python-pello --with options
|
||||||
|
- escape_paths:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh escape_paths
|
||||||
|
- config-settings-test:
|
||||||
|
dir: .
|
||||||
|
run: ./mocktest.sh config-settings-test
|
||||||
|
- isort_c9s:
|
||||||
|
dir: .
|
||||||
|
run: NAME="CentOS Stream" VERSION_ID=9 ./mocktest.sh python-isort
|
||||||
|
required_packages:
|
||||||
|
- 'https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm'
|
||||||
|
- mock
|
||||||
|
- rpmdevtools
|
||||||
|
- rpm-build
|
65
tests/tldr.spec
Normal file
65
tests/tldr.spec
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
Name: tldr
|
||||||
|
Version: 0.4.4
|
||||||
|
Release: 1%{?dist}
|
||||||
|
Summary: Simplified and community-driven man pages
|
||||||
|
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/tldr-pages/tldr-python-client
|
||||||
|
Source0: %{pypi_source}
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: pyproject-rpm-macros
|
||||||
|
|
||||||
|
%if 0%{?rhel} != 9
|
||||||
|
# Internal check for our macros: test that we can install to a custom prefix
|
||||||
|
BuildRequires: python3-rpm-macros >= 3.10-18
|
||||||
|
%global _prefix /app
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%description
|
||||||
|
A Python package containing executables.
|
||||||
|
Building this tests:
|
||||||
|
- there are no bytecompiled files in %%{_bindir}
|
||||||
|
- the executable's shebang is adjusted properly
|
||||||
|
- file direct_url.json isn't created
|
||||||
|
- installation to custom prefix works
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -n %{name}-%{version}
|
||||||
|
|
||||||
|
%generate_buildrequires
|
||||||
|
%pyproject_buildrequires
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%pyproject_save_files -l tldr +auto
|
||||||
|
|
||||||
|
%check
|
||||||
|
# Internal check for our macros: tests we don't ship __pycache__ in bindir
|
||||||
|
test ! -d %{buildroot}%{_bindir}/__pycache__
|
||||||
|
|
||||||
|
# Internal check for our macros: tests we have a proper shebang line
|
||||||
|
head -n1 %{buildroot}%{_bindir}/%{name}.py | grep -E '#!\s*%{python3}\s+%{py3_shbang_opts}\s*$'
|
||||||
|
|
||||||
|
# Internal check for our macros: tests that direct_url.json file wasn't created
|
||||||
|
test ! -e %{buildroot}%{python3_sitelib}/*.dist-info/direct_url.json
|
||||||
|
|
||||||
|
# Internal check for the value of %%{pyproject_build_lib} in a noarch package
|
||||||
|
%if 0%{?rhel} == 9
|
||||||
|
test "%{pyproject_build_lib}" == "$(echo %{_pyproject_builddir}/pip-req-build-*/build/lib)"
|
||||||
|
%else
|
||||||
|
test "%{pyproject_build_lib}" == "${PWD}/build/lib"
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?rhel} != 9
|
||||||
|
# Internal check for custom prefix
|
||||||
|
grep '^/usr' %{pyproject_files} && exit 1 || true
|
||||||
|
grep '^/app' %{pyproject_files}
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%files -f %pyproject_files
|
||||||
|
%doc README.md
|
Loading…
Reference in New Issue
Block a user