8000 [issue-503] fix: correct type for LicenseInfoFromFiles in Package · HarshvMahawar/tools-python@dcfc471 · GitHub
[go: up one dir, main page]

Skip to content

Commit dcfc471

Browse files
committed
[issue-503] fix: correct type for LicenseInfoFromFiles in Package
Signed-off-by: Meret Behrens <meret.behrens@tngtech.com>
1 parent 66a3355 commit dcfc471

File tree

15 files changed

+46
-90
lines changed

15 files changed

+46
-90
lines changed

src/spdx/jsonschema/package_converter.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,7 @@ def _get_property_value(self, package: Package, package_property: PackagePropert
8585
elif package_property == PackageProperty.LICENSE_DECLARED:
8686
return apply_if_present(str, package.license_declared)
8787
elif package_property == PackageProperty.LICENSE_INFO_FROM_FILES:
88-
if isinstance(package.license_info_from_files, list):
89-
return [str(license_expression) for license_expression in package.license_info_from_files] or None
90-
return apply_if_present(str, package.license_info_from_files)
88+
return [str(license_expression) for license_expression in package.license_info_from_files] or None
9189
elif package_property == PackageProperty.NAME:
9290
return package.name
9391
elif package_property == PackageProperty.ORIGINATOR:

src/spdx/model/package.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,7 @@ class Package:
9292
homepage: Optional[Union[str, SpdxNoAssertion, SpdxNone]] = None
9393
source_info: Optional[str] = None
9494
license_concluded: Optional[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = None
95-
license_info_from_files: Optional[Union[List[LicenseExpression], SpdxNoAssertion, SpdxNone]] = field(
96-
default_factory=list)
95+
license_info_from_files: List[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = field(default_factory=list)
9796
license_declared: Optional[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = None
9897
license_comment: Optional[str] = None
9998
copyright_text: Optional[Union[str, SpdxNoAssertion, SpdxNone]] = None
@@ -115,7 +114,7 @@ def __init__(self, spdx_id: str, name: str, download_location: Union[str, SpdxNo
115114
checksums: List[Checksum] = None, homepage: Optional[Union[str, SpdxNoAssertion, SpdxNone]] = None,
116115
source_info: Optional[str] = None,
117116
license_concluded: Optional[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = None,
118-
license_info_from_files: Optional[Union[List[LicenseExpression], SpdxNoAssertion, SpdxNone]] = None,
117+
license_info_from_files: List[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = None,
119118
license_declared: Optional[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = None,
120119
license_comment: Optional[str] = None,
121120
copyright_text: Optional[Union[str, SpdxNoAssertion, SpdxNone]] = None,

src/spdx/parser/jsonlikedict/package_parser.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ def parse_package(self, package_dict: Dict) -> Package:
6262

6363
files_analyzed: Optional[Union[bool, str]] = package_dict.get("filesAnalyzed")
6464

65-
if files_analyzed is None: # default value is True
65+
if files_analyzed is None: # default value is True
6666
files_analyzed = True
67-
elif isinstance(files_analyzed, str): # XML does not support boolean typed values
67+
elif isinstance(files_analyzed, str): # XML does not support boolean typed values
6868
if files_analyzed.lower() == "true":
6969
files_analyzed = True
7070
elif files_analyzed.lower() == "false":
@@ -73,19 +73,14 @@ def parse_package(self, package_dict: Dict) -> Package:
7373
homepage: Optional[str] = package_dict.get("homepage")
7474
license_comments: Optional[str] = package_dict.get("licenseComments")
7575
license_concluded = parse_field_or_log_error(
76-
logger, package_dict.get("licenseConcluded"),
77-
lambda x: parse_field_or_no_assertion_or_none(x, self.license_expression_parser.parse_license_expression),
78-
None)
76+
logger, package_dict.get("licenseConcluded"), self.license_expression_parser.parse_license_expression)
7977

8078
license_declared: Optional[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = parse_field_or_log_error(
81-
logger, package_dict.get("licenseDeclared"),
82-
lambda x: parse_field_or_no_assertion_or_none(x, self.license_expression_parser.parse_license_expression))
83-
84-
license_info_from_file: Optional[Union[List[LicenseExpression], SpdxNoAssertion, SpdxNone]] = \
85-
parse_field_or_log_error(
86-
logger, package_dict.get("licenseInfoFromFiles"),
87-
lambda x: parse_field_or_no_assertion_or_none(x,
88-
self.license_expression_parser.parse_license_expressions))
79+
logger, package_dict.get("licenseDeclared"), self.license_expression_parser.parse_license_expression)
80+
81+
license_info_from_file: List[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = parse_field_or_log_error(
82+
logger, package_dict.get("licenseInfoFromFiles"), self.license_expression_parser.parse_license_expression,
83+
field_is_list=True)
8984
originator: Optional[Union[Actor, SpdxNoAssertion]] = parse_field_or_log_error(
9085
logger, package_dict.get("originator"),
9186
lambda x: parse_field_or_no_assertion(x, self.actor_parser.parse_actor))

src/spdx/parser/tagvalue/parser.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -342,11 +342,7 @@ def p_pkg_external_refs(self, p):
342342

343343
@grammar_rule("pkg_license_info : PKG_LICENSE_INFO license_or_no_assertion_or_none")
344344
def p_pkg_license_info_from_file(self, p):
345-
if not self.check_that_current_element_matches_class_for_value(Package, p.lineno(1)):
346-
return
347-
if p[2] == SpdxNone() or p[2] == SpdxNoAssertion():
348-
self.current_element["license_info_from_files"] = p[2]
349-
else:
345+
if self.check_that_current_element_matches_class_for_value(Package, p.lineno(1)):
350346
self.current_element.setdefault("license_info_from_files", []).append(p[2])
351347

352348
@grammar_rule("pkg_checksum : PKG_CHECKSUM CHECKSUM")

tests/spdx/fixtures.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def package_fixture(spdx_id="SPDXRef-Package", name="packageName", download_loca
8787
valid_until_date=datetime(2022, 12, 3)) -> Package:
8888
checksums = [checksum_fixture()] if checksums is None else checksums
8989
license_info_from_files = [get_spdx_licensing().parse("MIT"), get_spdx_licensing().parse(
90-
"GPL-2.0")] if license_info_from_files is None else license_info_from_files
90+
"GPL-2.0"), SpdxNoAssertion()] if license_info_from_files is None else license_info_from_files
9191
external_references = [external_package_ref_fixture()] if external_references is None else external_references
9292
attribution_texts = ["packageAttributionText"] if attribution_texts is None else attribution_texts
9393
return Package(spdx_id=spdx_id, name=name, download_location=download_location, version=version,

tests/spdx/jsonschema/test_package_converter.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def test_null_values(converter: PackageConverter):
188188
def test_spdx_no_assertion(converter: PackageConverter):
189189
package = package_fixture(download_location=SpdxNoAssertion(), supplier=SpdxNoAssertion(),
190190
originator=SpdxNoAssertion(), homepage=SpdxNoAssertion(),
191-
license_concluded=SpdxNoAssertion(), license_info_from_files=SpdxNoAssertion(),
191+
license_concluded=SpdxNoAssertion(), license_info_from_files=[SpdxNoAssertion()],
192192
license_declared=SpdxNoAssertion(), copyright_text=SpdxNoAssertion())
193193

194194
document = Document(creation_info_fixture(), packages=[package])
@@ -201,14 +201,14 @@ def test_spdx_no_assertion(converter: PackageConverter):
201201
assert converted_dict[converter.json_property_name(PackageProperty.HOMEPAGE)] == SPDX_NO_ASSERTION_STRING
202202
assert converted_dict[converter.json_property_name(PackageProperty.LICENSE_CONCLUDED)] == SPDX_NO_ASSERTION_STRING
203203
assert converted_dict[
204-
converter.json_property_name(PackageProperty.LICENSE_INFO_FROM_FILES)] == SPDX_NO_ASSERTION_STRING
204+
converter.json_property_name(PackageProperty.LICENSE_INFO_FROM_FILES)] == [SPDX_NO_ASSERTION_STRING]
205205
assert converted_dict[converter.json_property_name(PackageProperty.LICENSE_DECLARED)] == SPDX_NO_ASSERTION_STRING
206206
assert converted_dict[converter.json_property_name(PackageProperty.COPYRIGHT_TEXT)] == SPDX_NO_ASSERTION_STRING
207207

208208

209209
def test_spdx_none(converter: PackageConverter):
210210
package = package_fixture(download_location=SpdxNone(), homepage=SpdxNone(),
211-
license_concluded=SpdxNone(), license_info_from_files=SpdxNone(),
211+
license_concluded=SpdxNone(), license_info_from_files=[SpdxNone()],
212212
license_declared=SpdxNone(), copyright_text=SpdxNone())
213213

214214
document = Document(creation_info_fixture(), packages=[package])
@@ -218,7 +218,7 @@ def test_spdx_none(converter: PackageConverter):
218218
assert converted_dict[converter.json_property_name(PackageProperty.DOWNLOAD_LOCATION)] == SPDX_NONE_STRING
219219
assert converted_dict[converter.json_property_name(PackageProperty.HOMEPAGE)] == SPDX_NONE_STRING
220220
assert converted_dict[converter.json_property_name(PackageProperty.LICENSE_CONCLUDED)] == SPDX_NONE_STRING
221-
assert converted_dict[converter.json_property_name(PackageProperty.LICENSE_INFO_FROM_FILES)] == SPDX_NONE_STRING
221+
assert converted_dict[converter.json_property_name(PackageProperty.LICENSE_INFO_FROM_FILES)] == [SPDX_NONE_STRING]
222222
assert converted_dict[converter.json_property_name(PackageProperty.LICENSE_DECLARED)] == SPDX_NONE_STRING
223223
assert converted_dict[converter.json_property_name(PackageProperty.COPYRIGHT_TEXT)] == SPDX_NONE_STRING
224224

tests/spdx/model/test_package.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616
@mock.patch('spdx.model.actor.Actor', autospec=True)
1717
def test_correct_initialization(actor, verif_code, checksum, ext_ref):
1818
package = Package("id", "name", SpdxNoAssertion(), "version", "file_name", SpdxNoAssertion(), actor, True,
19-
verif_code, [checksum], "homepage", "source_info", None, [Licensing().parse("license and expression")],
20-
SpdxNone(), "comment on license", "copyright", "summary", "description", "comment",
21-
[ext_ref, ext_ref], ["text"], PackagePurpose.OTHER, datetime(2022, 1, 1), None, None)
19+
verif_code, [checksum], "homepage", "source_info", None,
20+
[Licensing().parse("license and expression"), SpdxNoAssertion()], SpdxNone(),
21+
"comment on license", "copyright", "summary", "description", "comment", [ext_ref, ext_ref],
22+
["text"], PackagePurpose.OTHER, datetime(2022, 1, 1), None, None)
2223
assert package.spdx_id == "id"
2324
assert package.name == "name"
2425
assert package.download_location == SpdxNoAssertion()
@@ -32,7 +33,7 @@ def test_correct_initialization(actor, verif_code, checksum, ext_ref):
3233
assert package.homepage == "homepage"
3334
assert package.source_info == "source_info"
3435
assert package.license_concluded is None
35-
assert package.license_info_from_files == [Licensing().parse("license and expression")]
36+
assert package.license_info_from_files == [Licensing().parse("license and expression"), SpdxNoAssertion()]
3637
assert package.license_declared == SpdxNone()
3738
assert package.license_comment == "comment on license"
3839
assert package.copyright_text == "copyright"

tests/spdx/parser/jsonlikedict/test_package_parser.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from spdx.model.checksum import Checksum, ChecksumAlgorithm
1818
from license_expression import Licensing
1919
from spdx.model.package import PackageVerificationCode, ExternalPackageRef, ExternalPackageRefCategory, PackagePurpose
20+
from spdx.model.spdx_no_assertion import SpdxNoAssertion
2021
from spdx.parser.error import SPDXParsingError
2122
from spdx.parser.jsonlikedict.dict_parsing_functions import parse_list_of_elements
2223
from spdx.parser.jsonlikedict.package_parser import PackageParser
@@ -62,7 +63,7 @@ def test_parse_package():
6263
"licenseComments": "The license for this project changed with the release of version x.y. The version of the project included here post-dates the license change.",
6364
"licenseConcluded": "(LGPL-2.0-only OR LicenseRef-3)",
6465
"licenseDeclared": "(LGPL-2.0-only AND LicenseRef-3)",
65-
"licenseInfoFromFiles": ["GPL-2.0-only", "LicenseRef-2", "LicenseRef-1"],
66+
"licenseInfoFromFiles": ["GPL-2.0-only", "LicenseRef-2", "LicenseRef-1", "NOASSERTION"],
6667
"name": "glibc",
6768
"originator": "Organization: ExampleCodeInspect (contact@example.com)",
6869
"packageFileName": "glibc-2.11.1.tar.gz",
@@ -104,7 +105,7 @@ def test_parse_package():
104105
assert package.license_concluded == Licensing().parse("(LGPL-2.0-only OR LicenseRef-3)")
105106
TestCase().assertCountEqual(package.license_info_from_files,
106107
[Licensing().parse("GPL-2.0-only"), 10000 Licensing().parse("LicenseRef-2"),
107-
Licensing().parse("LicenseRef-1")])
108+
Licensing().parse("LicenseRef-1"), SpdxNoAssertion()])
108109
assert package.license_declared == Licensing().parse("(LGPL-2.0-only AND LicenseRef-3)")
109110
assert package.license_comment == "The license for this project changed with the release of version x.y. The version of the project included here post-dates the license change."
110111
assert package.copyright_text == "Copyright 2008-2010 John Smith"

tests/spdx/parser/rdf/data/file_to_test_rdf_parser.rdf.xml

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
<spdx:downloadLocation>https://download.com</spdx:downloadLocation>
9494
<spdx:licenseInfoFromFiles rdf:resource="http://spdx.org/licenses/GPL-2.0-only"/>
9595
<spdx:licenseInfoFromFiles rdf:resource="http://spdx.org/licenses/MIT"/>
96+
<spdx:licenseInfoFromFiles rdf:resource="http://spdx.org/rdf/terms#noassertion"/>
9697
<spdx:originator>Person: originatorName (some@mail.com)</spdx:originator>
9798
<spdx:licenseDeclared>
9899
<spdx:ConjunctiveLicenseSet rdf:nodeID="Nf293aa1ae6044fa4886ffb2d30f8408b">
@@ -138,48 +139,7 @@
138139
</spdx:Package>
139140
<spdx:Package rdf:about="https://some.namespace#SPDXRef-Package2">
140141
<spdx:name>packageName</spdx:name>
141-
<spdx:releaseDate>2022-12-01T00:00:00Z</spdx:releaseDate>
142-
<spdx:supplier>Person: supplierName (some@mail.com)</spdx:supplier>
143-
<spdx:checksum>
144-
<spdx:Checksum rdf:nodeID="Ncea50ab695654c5c836a1769f2ecc7da">
145-
<spdx:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/>
146-
<spdx:checksumValue>71c4025dd9897b364f3ebbb42c484ff43d00791c</spdx:checksumValue>
147-
</spdx:Checksum>
148-
</spdx:checksum>
149-
<spdx:versionInfo>12.2</spdx:versionInfo>
150-
<spdx:licenseInfoFromFiles rdf:resource="http://spdx.org/licenses/GPL-2.0-only"/>
151-
<spdx:licenseInfoFromFiles rdf:resource="http://spdx.org/licenses/MIT"/>
152-
<spdx:validUntilDate>2022-12-03T00:00:00Z</spdx:validUntilDate>
153-
<doap:homepage>https://homepage.com</doap:homepage>
154-
<spdx:filesAnalyzed rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</spdx:filesAnalyzed>
155-
<spdx:packageFileName>./packageFileName</spdx:packageFileName>
156-
<spdx:licenseConcluded>
157-
<spdx:ConjunctiveLicenseSet rdf:nodeID="Nb1961a379900444b9a3928372bc5c47e">
158-
<spdx:member rdf:resource="http://spdx.org/licenses/GPL-2.0-only"/>
159-
<spdx:member rdf:resource="http://spdx.org/licenses/MIT"/>
160-
</spdx:ConjunctiveLicenseSet>
161-
</spdx:licenseConcluded>
162-
<spdx:packageVerificationCode>
163-
<spdx:PackageVerificationCode rdf:nodeID="N9af9c290416a4718966a16036f746049">
164-
<spdx:packageVerificationCodeExcludedFile>./exclude.py</spdx:packageVerificationCodeExcludedFile>
165-
<spdx:packageVerificationCodeValue>85ed0817af83a24ad8da68c2b5094de69833983c
166-
</spdx:packageVerificationCodeValue>
167-
</spdx:PackageVerificationCode>
168-
</spdx:packageVerificationCode>
169-
<spdx:copyrightText>packageCopyrightText</spdx:copyrightText>
170142
<spdx:downloadLocation>http://differentdownload.com</spdx:downloadLocation>
171-
<spdx:sourceInfo>sourceInfo</spdx:sourceInfo>
172-
<spdx:summary>packageSummary</spdx:summary>
173-
<spdx:attributionText>packageAttributionText</spdx:attributionText>
174-
<spdx:description>packageDescription</spdx:description>
175-
<spdx:licenseDeclared>
176-
<spdx:ConjunctiveLicenseSet rdf:nodeID="Nd9785e84b6a247a7b38c07b9151c007d">
177-
<spdx:member rdf:resource="http://spdx.org/licenses/GPL-2.0-only"/>
178-
<spdx:member rdf:resource="http://spdx.org/licenses/MIT"/>
179-
</spdx:ConjunctiveLicenseSet>
180-
</spdx:licenseDeclared>
181-
<spdx:originator>Person: originatorName (some@mail.com)</spdx:originator>
182-
<spdx:primaryPackagePurpose rdf:resource="http://spdx.org/rdf/terms#purpose_source"/>
183143
<spdx:externalRef>
184144
<spdx:ExternalRef rdf:nodeID="Nda50d273cd134f45b1ca926a378b8db4">
185145
<spdx:referenceCategory rdf:resource="http://spdx.org/rdf/terms#referenceCategory_other"/>
@@ -188,9 +148,6 @@
188148
<spdx:referenceType rdf:resource="https://some.namespace#LocationRef-acmeforge"/>
189149
</spdx:ExternalRef>
190150
</spdx:externalRef>
191-
<rdfs:comment>packageComment</rdfs:comment>
192-
<spdx:builtDate>2022-12-02T00:00:00Z</spdx:builtDate>
193-
<spdx:licenseComments>packageLicenseComment</spdx:licenseComments>
194151
</spdx:Package>
195152
<spdx:Snippet rdf:about="https://some.namespace#SPDXRef-Snippet">
196153
<spdx:range>

tests/spdx/parser/rdf/test_package_parser.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818
from spdx.model.actor import Actor, ActorType
1919
from spdx.model.checksum import ChecksumAlgorithm, Checksum
2020
from spdx.model.package import PackagePurpose, PackageVerificationCode, ExternalPackageRefCategory
21+
from spdx.model.spdx_no_assertion import SpdxNoAssertion
2122
from spdx.parser.rdf.package_parser import parse_package, parse_external_package_ref
2223
from spdx.rdfschema.namespace import SPDX_NAMESPACE
2324

2425

2526
def test_package_parser():
2627
graph = Graph().parse(os.path.join(os.path.dirname(__file__), "data/file_to_test_rdf_parser.rdf.xml"))
28+
# we have two packages in the test file, graph.value() will return the first package
2729
package_node = graph.value(predicate=RDF.type, object=SPDX_NAMESPACE.Package)
2830
doc_namespace = "https://some.namespace"
2931

@@ -41,7 +43,8 @@ def test_package_parser():
4143
assert package.license_concluded == get_spdx_licensing().parse("MIT AND GPL-2.0")
4244
assert package.license_declared == get_spdx_licensing().parse("MIT AND GPL-2.0")
4345
TestCase().assertCountEqual(package.license_info_from_files,
44-
[get_spdx_licensing().parse("MIT"), get_spdx_licensing().parse("GPL-2.0")])
46+
[get_spdx_licensing().parse("MIT"), get_spdx_licensing().parse("GPL-2.0"),
47+
SpdxNoAssertion()])
4548
assert package.license_comment == "packageLicenseComment"
4649
assert package.copyright_text == "packageCopyrightText"
4750
assert package.verification_code == PackageVerificationCode(value="85ed0817af83a24ad8da68c2b5094de69833983c",

0 commit comments

Comments
 (0)
0