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
This commit is contained in:
parent
76ede9e892
commit
1f197e240e
@ -22,6 +22,24 @@
|
|||||||
# # pythonRemoveDeps = true;
|
# # pythonRemoveDeps = true;
|
||||||
# …
|
# …
|
||||||
# }
|
# }
|
||||||
|
#
|
||||||
|
# IMPLEMENTATION NOTES:
|
||||||
|
#
|
||||||
|
# The "Requires-Dist" dependency specification format is described in PEP 508.
|
||||||
|
# Examples that the regular expressions in this hook needs to support:
|
||||||
|
#
|
||||||
|
# Requires-Dist: foo
|
||||||
|
# -> foo
|
||||||
|
# Requires-Dist: foo[optional]
|
||||||
|
# -> foo[optional]
|
||||||
|
# Requires-Dist: foo[optional]~=1.2.3
|
||||||
|
# -> foo[optional]
|
||||||
|
# Requires-Dist: foo[optional, xyz] (~=1.2.3)
|
||||||
|
# -> foo[optional, xyz]
|
||||||
|
# Requires-Dist: foo[optional]~=1.2.3 ; os_name = "posix"
|
||||||
|
# -> foo[optional] ; os_name = "posix"
|
||||||
|
#
|
||||||
|
# Currently unsupported: URL specs (foo @ https://example.com/a.zip).
|
||||||
|
|
||||||
_pythonRelaxDeps() {
|
_pythonRelaxDeps() {
|
||||||
local -r metadata_file="$1"
|
local -r metadata_file="$1"
|
||||||
@ -30,11 +48,11 @@ _pythonRelaxDeps() {
|
|||||||
return
|
return
|
||||||
elif [[ "$pythonRelaxDeps" == 1 ]]; then
|
elif [[ "$pythonRelaxDeps" == 1 ]]; then
|
||||||
sed -i "$metadata_file" -r \
|
sed -i "$metadata_file" -r \
|
||||||
-e 's/(Requires-Dist: \S*) \(.*\)/\1/'
|
-e 's/(Requires-Dist: [a-zA-Z0-9_.-]+\s*(\[[^]]+\])?)[^;]*(;.*)?/\1\3/'
|
||||||
else
|
else
|
||||||
for dep in $pythonRelaxDeps; do
|
for dep in $pythonRelaxDeps; do
|
||||||
sed -i "$metadata_file" -r \
|
sed -i "$metadata_file" -r \
|
||||||
-e "s/(Requires-Dist: $dep) \(.*\)/\1/"
|
-e "s/(Requires-Dist: $dep\s*(\[[^]]+\])?)[^;]*(;.*)?/\1\3/"
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user