Skip to content

Commit e6edbc2

Browse files
Only contain version ranges in extracted_requirement
Signed-off-by: Ayan Sinha Mahapatra <ayansmahapatra@gmail.com>
1 parent fc4ada9 commit e6edbc2

File tree

52 files changed

+997
-538
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+997
-538
lines changed

src/packagedcode/pypi.py

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,10 +615,11 @@ def parse(cls, location, package_only=False):
615615

616616
for package_metadata in installed_packages:
617617
package_metadata_dep = package_metadata.get('metadata')
618+
is_requested = package_metadata.get('requested')
618619

619620
# `direct_url` is only present for root package
620621
# `requested` is true for root package and direct dependencies only
621-
if package_metadata.get('requested') and 'direct_url' in package_metadata:
622+
if is_requested and 'direct_url' in package_metadata:
622623
main_package_metadata = package_metadata_dep
623624
main_package_requires = main_package_metadata.get('requires_dist')
624625
dependencies_for_main = get_requires_dependencies(
@@ -645,6 +646,8 @@ def parse(cls, location, package_only=False):
645646
is_resolved=True,
646647
resolved_package=package_data_dep.to_dict()
647648
)
649+
if is_requested:
650+
dependency.is_direct = True
648651
dependencies.append(dependency)
649652

650653
dependency_mappings = []
@@ -1650,6 +1653,15 @@ def get_requires_dependencies(requires, default_scope='install', is_direct=True)
16501653
extra = get_extra(req.marker)
16511654
scope = extra or default_scope
16521655

1656+
extra_data = {}
1657+
if req.marker:
1658+
platform = get_python_version_os(req.marker)
1659+
if platform:
1660+
extra_data = platform
1661+
1662+
extracted_requirement = None
1663+
if requirement:
1664+
extracted_requirement = requirement
16531665
dependent_packages.append(
16541666
models.DependentPackage(
16551667
purl=purl.to_string(),
@@ -1658,7 +1670,8 @@ def get_requires_dependencies(requires, default_scope='install', is_direct=True)
16581670
is_optional=True if bool(extra) else False,
16591671
is_resolved=is_resolved,
16601672
is_direct=is_direct,
1661-
extracted_requirement=str(req),
1673+
extracted_requirement=extracted_requirement,
1674+
extra_data=extra_data,
16621675
))
16631676

16641677
return dependent_packages
@@ -1690,6 +1703,47 @@ def get_extra(marker):
16901703
return value.value
16911704

16921705

1706+
def get_python_version_os(marker):
1707+
"""
1708+
Return the "python_version" or "os related values of a ``marker``
1709+
requirement Marker or None.
1710+
"""
1711+
platform_data = {}
1712+
python_version_operators = ['<', '>=', '==', '<=', '<']
1713+
1714+
if not marker or not isinstance(marker, markers.Marker):
1715+
return platform_data
1716+
1717+
marks = getattr(marker, '_markers', [])
1718+
1719+
for mark in marks:
1720+
# filter for variable(extra) == value tuples of (Variable, Op, Value)
1721+
if not isinstance(mark, tuple) and not len(mark) == 3:
1722+
continue
1723+
1724+
variable, operator, value = mark
1725+
1726+
if (
1727+
isinstance(variable, markers.Variable)
1728+
and variable.value == 'python_version'
1729+
and isinstance(operator, markers.Op)
1730+
and operator.value in python_version_operators
1731+
and isinstance(value, markers.Value)
1732+
):
1733+
platform_data["python_version"] = f"{operator.value} {value.value}"
1734+
1735+
if (
1736+
isinstance(variable, markers.Variable)
1737+
and variable.value == 'sys_platform'
1738+
and isinstance(operator, markers.Op)
1739+
and operator.value == '=='
1740+
and isinstance(value, markers.Value)
1741+
):
1742+
platform_data["sys_platform"] = f"{operator.value} {value.value}"
1743+
1744+
return platform_data
1745+
1746+
16931747
def get_dparse2_supported_file_name(file_name):
16941748
"""
16951749
Return the file_name if this is supported or None given a `file_name`

tests/formattedcode/data/common/manifests-expected.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1695,7 +1695,7 @@
16951695
"dependencies": [
16961696
{
16971697
"purl": "pkg:pypi/numpy",
1698-
"extracted_requirement": "numpy>=1.6",
1698+
"extracted_requirement": ">=1.6",
16991699
"scope": "install",
17001700
"is_runtime": true,
17011701
"is_optional": false,
@@ -1706,7 +1706,7 @@
17061706
},
17071707
{
17081708
"purl": "pkg:pypi/pandas",
1709-
"extracted_requirement": "pandas>=0.18",
1709+
"extracted_requirement": ">=0.18",
17101710
"scope": "install",
17111711
"is_runtime": true,
17121712
"is_optional": false,
@@ -1717,7 +1717,7 @@
17171717
},
17181718
{
17191719
"purl": "pkg:pypi/deap",
1720-
"extracted_requirement": "deap",
1720+
"extracted_requirement": null,
17211721
"scope": "install",
17221722
"is_runtime": true,
17231723
"is_optional": false,
@@ -1728,7 +1728,7 @@
17281728
},
17291729
{
17301730
"purl": "pkg:pypi/efel",
1731-
"extracted_requirement": "efel>=2.13",
1731+
"extracted_requirement": ">=2.13",
17321732
"scope": "install",
17331733
"is_runtime": true,
17341734
"is_optional": false,
@@ -1739,7 +1739,7 @@
17391739
},
17401740
{
17411741
"purl": "pkg:pypi/ipyparallel",
1742-
"extracted_requirement": "ipyparallel",
1742+
"extracted_requirement": null,
17431743
"scope": "install",
17441744
"is_runtime": true,
17451745
"is_optional": false,
@@ -1750,7 +1750,7 @@
17501750
},
17511751
{
17521752
"purl": "pkg:pypi/pickleshare",
1753-
"extracted_requirement": "pickleshare>=0.7.3",
1753+
"extracted_requirement": ">=0.7.3",
17541754
"scope": "install",
17551755
"is_runtime": true,
17561756
"is_optional": false,
@@ -1761,7 +1761,7 @@
17611761
},
17621762
{
17631763
"purl": "pkg:pypi/jinja2",
1764-
"extracted_requirement": "Jinja2>=2.8",
1764+
"extracted_requirement": ">=2.8",
17651765
"scope": "install",
17661766
"is_runtime": true,
17671767
"is_optional": false,
@@ -1772,7 +1772,7 @@
17721772
},
17731773
{
17741774
"purl": "pkg:pypi/future",
1775-
"extracted_requirement": "future",
1775+
"extracted_requirement": null,
17761776
"scope": "install",
17771777
"is_runtime": true,
17781778
"is_optional": false,
@@ -1783,7 +1783,7 @@
17831783
},
17841784
{
17851785
"purl": "pkg:pypi/pebble",
1786-
"extracted_requirement": "Pebble>=4.3.10",
1786+
"extracted_requirement": ">=4.3.10",
17871787
"scope": "install",
17881788
"is_runtime": true,
17891789
"is_optional": false,
@@ -1794,7 +1794,7 @@
17941794
},
17951795
{
17961796
"purl": "pkg:pypi/scoop",
1797-
"extracted_requirement": "scoop>=0.7",
1797+
"extracted_requirement": ">=0.7",
17981798
"scope": "all",
17991799
"is_runtime": true,
18001800
"is_optional": false,
@@ -1805,7 +1805,7 @@
18051805
},
18061806
{
18071807
"purl": "pkg:pypi/scoop",
1808-
"extracted_requirement": "scoop>=0.7",
1808+
"extracted_requirement": ">=0.7",
18091809
"scope": "scoop",
18101810
"is_runtime": true,
18111811
"is_optional": false,

tests/formattedcode/data/common/manifests-expected.jsonlines

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"--package": true
1313
},
1414
"notice": "Generated with ScanCode and provided on an \"AS IS\" BASIS, WITHOUT WARRANTIES\nOR CONDITIONS OF ANY KIND, either express or implied. No content created from\nScanCode should be considered or used as legal advice. Consult an Attorney\nfor any legal advice.\nScanCode is a free software code scanning tool from nexB Inc. and others.\nVisit https://github.com/nexB/scancode-toolkit/ for support and download.",
15-
"output_format_version": "3.1.0",
15+
"output_format_version": "3.2.0",
1616
"message": null,
1717
"errors": [],
1818
"warnings": [],
@@ -24,7 +24,7 @@
2424
"platform_version": "#122-Ubuntu SMP Thu May 23 07:48:21 UTC 2024",
2525
"python_version": "3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]"
2626
},
27-
"spdx_license_list_version": "3.23",
27+
"spdx_license_list_version": "3.24",
2828
"files_count": 4
2929
}
3030
}
@@ -1765,7 +1765,7 @@
17651765
"dependencies": [
17661766
{
17671767
"purl": "pkg:pypi/numpy",
1768-
"extracted_requirement": "numpy>=1.6",
1768+
"extracted_requirement": ">=1.6",
17691769
"scope": "install",
17701770
"is_runtime": true,
17711771
"is_optional": false,
@@ -1776,7 +1776,7 @@
17761776
},
17771777
{
17781778
"purl": "pkg:pypi/pandas",
1779-
"extracted_requirement": "pandas>=0.18",
1779+
"extracted_requirement": ">=0.18",
17801780
"scope": "install",
17811781
"is_runtime": true,
17821782
"is_optional": false,
@@ -1787,7 +1787,7 @@
17871787
},
17881788
{
17891789
"purl": "pkg:pypi/deap",
1790-
"extracted_requirement": "deap",
1790+
"extracted_requirement": null,
17911791
"scope": "install",
17921792
"is_runtime": true,
17931793
"is_optional": false,
@@ -1798,7 +1798,7 @@
17981798
},
17991799
{
18001800
"purl": "pkg:pypi/efel",
1801-
"extracted_requirement": "efel>=2.13",
1801+
"extracted_requirement": ">=2.13",
18021802
"scope": "install",
18031803
"is_runtime": true,
18041804
"is_optional": false,
@@ -1809,7 +1809,7 @@
18091809
},
18101810
{
18111811
"purl": "pkg:pypi/ipyparallel",
1812-
"extracted_requirement": "ipyparallel",
1812+
"extracted_requirement": null,
18131813
"scope": "install",
18141814
"is_runtime": true,
18151815
"is_optional": false,
@@ -1820,7 +1820,7 @@
18201820
},
18211821
{
18221822
"purl": "pkg:pypi/pickleshare",
1823-
"extracted_requirement": "pickleshare>=0.7.3",
1823+
"extracted_requirement": ">=0.7.3",
18241824
"scope": "install",
18251825
"is_runtime": true,
18261826
"is_optional": false,
@@ -1831,7 +1831,7 @@
18311831
},
18321832
{
18331833
"purl": "pkg:pypi/jinja2",
1834-
"extracted_requirement": "Jinja2>=2.8",
1834+
"extracted_requirement": ">=2.8",
18351835
"scope": "install",
18361836
"is_runtime": true,
18371837
"is_optional": false,
@@ -1842,7 +1842,7 @@
18421842
},
18431843
{
18441844
"purl": "pkg:pypi/future",
1845-
"extracted_requirement": "future",
1845+
"extracted_requirement": null,
18461846
"scope": "install",
18471847
"is_runtime": true,
18481848
"is_optional": false,
@@ -1853,7 +1853,7 @@
18531853
},
18541854
{
18551855
"purl": "pkg:pypi/pebble",
1856-
"extracted_requirement": "Pebble>=4.3.10",
1856+
"extracted_requirement": ">=4.3.10",
18571857
"scope": "install",
18581858
"is_runtime": true,
18591859
"is_optional": false,
@@ -1864,7 +1864,7 @@
18641864
},
18651865
{
18661866
"purl": "pkg:pypi/scoop",
1867-
"extracted_requirement": "scoop>=0.7",
1867+
"extracted_requirement": ">=0.7",
18681868
"scope": "all",
18691869
"is_runtime": true,
18701870
"is_optional": false,
@@ -1875,7 +1875,7 @@
18751875
},
18761876
{
18771877
"purl": "pkg:pypi/scoop",
1878-
"extracted_requirement": "scoop>=0.7",
1878+
"extracted_requirement": ">=0.7",
18791879
"scope": "scoop",
18801880
"is_runtime": true,
18811881
"is_optional": false,

0 commit comments

Comments
 (0)