Commit Graph

13 Commits

Author SHA1 Message Date
Yueh-Shun Li
29c08adae1 pythonRelaxDepsHook: lint with ShellCheck
Ignore SC2164 at this moment, as it will be gone when adding `set -e`.
2024-11-05 10:47:22 +08:00
Yueh-Shun Li
3a79bc3aee pythonRelaxDepsHook: handle attributes __structuredAttrs-agnostically
Make the interation across pythonRelaxDeps and pythonRemoveDeps work
regardless of __structuredAttrs.
2024-11-05 10:47:22 +08:00
Yueh-Shun Li
57c2e5683d buildPython hooks: format with shfmt 2024-10-08 07:42:21 +08:00
Martin Weinelt
ad9505ddce python3Packages.pythonRelaxDepsHook: update example 2024-07-07 22:36:56 +02:00
Sandro Jäckel
be51056b85 pythonRelaxDepsHook: don't rely on pname as that could be normalized already
according to the language docs
2024-03-15 11:27:27 +01:00
Martin Weinelt
48b43e51e5 pythonRelaxDepsHook: make distribution name matching case insensitive
Is it PyOpenSSL or pyOpenSSL or pyopenssl? With this change you don't
have to care. Write it as pYoPeNSsL for all I care¹.

Can we do it like that? Yes, we can. Distribution names should be matched
with `re.IGNORECASE` according to the wheel specification².

[1] https://packaging.python.org/en/latest/specifications/core-metadata/#name
[2] Just kidding, please make it look sane.
2023-12-20 20:46:12 +01:00
Theodore Ni
dd1256d2ca python3.pkgs.pythonRelaxDepsHook: don't propagate wheel
The usage of wheel should be restricted to the hook. I discovered this
when trying to remove wheel from the Python bootstrap. Some packages
that needed wheel did not need it added explicitly because they use this
hook. This implicit change to the dependency tree shouldn't happen (even
though it is mostly harmless).
2023-08-20 11:00:51 +02:00
Thiago Kenji Okada
98de48fc8f pythonRelaxDepsHook: remove version from pkg_name
Since the wheel file name is based on the package metadata instead of
what we set in the derivation, if you set the version as `unstable-YYYYMMDD`,
for example, the hook would silently fail. We will ignore the version
now and just use a glob instead to match anything that has the package
name in its path.

Fixes #248185.
2023-08-11 14:56:14 +01:00
Pierre Bourdon
1f197e240e pythonRelaxDepsHook: improve Requires-Dist parsing
Prior to this commit, pythonRelaxDeps would only support removing
version constraints from "Requires-Dist" lines formatted in a particular
way ("foo (>= 1.2.3)"). This way is deprecated as per PyPA Core Metadata
Specs v2.1 [1]:

> Tools parsing the format should accept optional parentheses around
> this, but tools generating it should not use parentheses.

Additionally, a "Requires-Dist" dependency specification can contain
other metadata than just package name and version (extra names,
environment marker). These were being silently dropped by the prior
version of pythonRelaxDeps, or the version could not be relaxed.

The actual grammar is defined in PEP 508 [2]. Our tool of choice here is
sed extended regexps, so there's only so much we can do to be correct
with this parser. The regexp implemented in this commit makes an attempt
at supporting [extra] names, ; env_markers, as well as version specs
without parentheses. There are still unsupported features (URL specs) as
well as unhandled edge cases, but at some point trying to make the
regexp better is bound to awake ZALGO [3].

[1] https://packaging.python.org/en/latest/specifications/core-metadata/#requires-dist-multiple-use
[2] https://peps.python.org/pep-0508/#grammar
[3] https://stackoverflow.com/a/1732454/179806
2022-10-31 17:05:12 +01:00
Frederik Rietdijk
de5951f3c2 pythonPackages.pythonRelaxDepsHook: cleanup unpacked folder
or it will end up in the dist output.
2022-10-04 15:34:46 +02:00
Thiago Kenji Okada
15491e727d pythonRelaxDepsHook: correct handles multiple wheels 2022-06-12 11:48:52 +01:00
Thiago Kenji Okada
61223d51de pythonRelaxDepsHook: fix usage in packages with - in pname 2022-06-07 21:24:48 +01:00
Thiago Kenji Okada
e19019fe32 pythonRelaxDepsHook: init
We have a common pattern here in nixpkgs for Python applications: when a
Python package ships with either a requirements.txt or setup.py file, we
generally end up having to modify its version restriction, otherwise we have
build failures since we package only one specific version of each package
normally.

However, this end up being done in a completely ad-hoc way: some people
use substituteInPlace, some others use sed, others uses patches, etc.
In many cases, the code ends up being buggy, so it may work in one
version and breaks on the next one. We can instead implement one
standard way of doing this, and trying to be a correct as possible.

So this is what this commit does: it implements a new build hook, that
when called will automatically patch the wheel file. This is one of the
most generic ways to patch Python dependencies, and should work in
multiple cases.
2022-04-30 13:19:30 +01:00