Skip to content

Commit 350fa60

Browse files
committed
Fix Poetry lock optional dependency parsing
Signed-off-by: Adnan Raza <imadnanraza4@gmail.com>
1 parent 3c532f0 commit 350fa60

6 files changed

Lines changed: 53 additions & 17 deletions

File tree

AUTHORS.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ The following organizations or individuals have contributed to ScanCode:
22

33
- Abhigyan Kumar Singh @Abhigyankrsingh
44
- Abhishek Kumar @Abhishek-Dev09
5+
- Adnan Raza @Mars-60
56
- Aditya Viki @adityaviki
67
- Adrian Braemer @abraemer
78
- Agni Bhattacharyya @PyAgni

CHANGELOG.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ Changelog
44
Next release
55
--------------
66

7+
- Fix incorrect optional dependency reporting when parsing Poetry lockfiles.
8+
https://github.com/aboutcode-org/scancode-toolkit/issues/5294
9+
710
- Fix the optional ``licenses`` extra dependency typo to install
811
``licensedcode-data``.
912
https://github.com/aboutcode-org/scancode-toolkit/pull/5056

src/packagedcode/pypi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,7 @@ def parse(cls, location, package_only=False):
806806
)
807807
resolved_package = models.PackageData.from_data(package_data, package_only)
808808

809-
is_optional = package.get("is_optional") or True
809+
is_optional = package.get("optional", False)
810810
dependency = models.DependentPackage(
811811
purl=resolved_package.purl,
812812
extracted_requirement=None,

tests/packagedcode/data/pypi/poetry/univers-package-assembly-expected.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@
146146
"extracted_requirement": null,
147147
"scope": null,
148148
"is_runtime": true,
149-
"is_optional": true,
149+
"is_optional": false,
150150
"is_pinned": true,
151151
"is_direct": false,
152152
"resolved_package": {
@@ -579,7 +579,7 @@
579579
"extracted_requirement": null,
580580
"scope": null,
581581
"is_runtime": true,
582-
"is_optional": true,
582+
"is_optional": false,
583583
"is_pinned": true,
584584
"is_direct": false,
585585
"resolved_package": {
@@ -649,7 +649,7 @@
649649
"extracted_requirement": null,
650650
"scope": null,
651651
"is_runtime": true,
652-
"is_optional": true,
652+
"is_optional": false,
653653
"is_pinned": true,
654654
"is_direct": false,
655655
"resolved_package": {
@@ -730,7 +730,7 @@
730730
"extracted_requirement": null,
731731
"scope": null,
732732
"is_runtime": true,
733-
"is_optional": true,
733+
"is_optional": false,
734734
"is_pinned": true,
735735
"is_direct": false,
736736
"resolved_package": {
@@ -921,7 +921,7 @@
921921
"extracted_requirement": null,
922922
"scope": null,
923923
"is_runtime": true,
924-
"is_optional": true,
924+
"is_optional": false,
925925
"is_pinned": true,
926926
"is_direct": false,
927927
"resolved_package": {
@@ -1033,7 +1033,7 @@
10331033
"extracted_requirement": null,
10341034
"scope": null,
10351035
"is_runtime": true,
1036-
"is_optional": true,
1036+
"is_optional": false,
10371037
"is_pinned": true,
10381038
"is_direct": false,
10391039
"resolved_package": {
@@ -1462,7 +1462,7 @@
14621462
"extracted_requirement": null,
14631463
"scope": null,
14641464
"is_runtime": true,
1465-
"is_optional": true,
1465+
"is_optional": false,
14661466
"is_pinned": true,
14671467
"is_direct": false,
14681468
"resolved_package": {
@@ -1528,7 +1528,7 @@
15281528
"extracted_requirement": null,
15291529
"scope": null,
15301530
"is_runtime": true,
1531-
"is_optional": true,
1531+
"is_optional": false,
15321532
"is_pinned": true,
15331533
"is_direct": false,
15341534
"resolved_package": {
@@ -1605,7 +1605,7 @@
16051605
"extracted_requirement": null,
16061606
"scope": null,
16071607
"is_runtime": true,
1608-
"is_optional": true,
1608+
"is_optional": false,
16091609
"is_pinned": true,
16101610
"is_direct": false,
16111611
"resolved_package": {
@@ -1792,7 +1792,7 @@
17921792
"extracted_requirement": null,
17931793
"scope": null,
17941794
"is_runtime": true,
1795-
"is_optional": true,
1795+
"is_optional": false,
17961796
"is_pinned": true,
17971797
"is_direct": false,
17981798
"resolved_package": {

tests/packagedcode/data/pypi/poetry/univers-poetry.lock-expected.json

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/packagedcode/test_pypi.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,39 @@ def test_parse_poetry_lock_univers(self):
398398
expected_loc = self.get_test_loc('pypi/poetry/univers-poetry.lock-expected.json')
399399
self.check_packages_data(package, expected_loc, regen=REGEN_TEST_FIXTURES)
400400

401+
def test_parse_poetry_lock_package_optional(self):
402+
test_file = self.get_temp_file('poetry.lock')
403+
with open(test_file, 'w') as lockfile:
404+
lockfile.write('''\
405+
[[package]]
406+
name = "required-dep"
407+
version = "1.0.0"
408+
description = "required dependency"
409+
optional = false
410+
python-versions = ">=3.8"
411+
412+
[[package]]
413+
name = "optional-dep"
414+
version = "2.0.0"
415+
description = "optional dependency"
416+
optional = true
417+
python-versions = ">=3.8"
418+
419+
[metadata]
420+
lock-version = "2.0"
421+
python-versions = ">=3.8"
422+
content-hash = "test"
423+
''')
424+
425+
package_data = list(pypi.PoetryLockHandler.parse(test_file))[0]
426+
dependencies_by_purl = {
427+
dependency['purl']: dependency
428+
for dependency in package_data.dependencies
429+
}
430+
431+
assert dependencies_by_purl['pkg:pypi/required-dep@1.0.0']['is_optional'] is False
432+
assert dependencies_by_purl['pkg:pypi/optional-dep@2.0.0']['is_optional'] is True
433+
401434
def test_parse_pyproject_toml_poetry_univers(self):
402435
test_file = self.get_test_loc('pypi/poetry/univers/pyproject.toml')
403436
package = pypi.PoetryPyprojectTomlHandler.parse(test_file)
@@ -805,4 +838,3 @@ def test_parse_setup_py(test_loc):
805838
)
806839
def test_parse_more_setup_py(test_loc):
807840
check_setup_py_parsing(test_loc)
808-

0 commit comments

Comments
 (0)