diff --git a/src/spdx_tools/spdx/parser/tagvalue/parser.py b/src/spdx_tools/spdx/parser/tagvalue/parser.py
index ec843ccb9..a11f08679 100644
--- a/src/spdx_tools/spdx/parser/tagvalue/parser.py
+++ b/src/spdx_tools/spdx/parser/tagvalue/parser.py
@@ -427,7 +427,14 @@ def p_pkg_files_analyzed(self, p):
if "files_analyzed" in self.current_element:
self.current_element["logger"].append(f"Multiple values for {p[1]} found. Line: {p.lineno(1)}")
return
- self.current_element["files_analyzed"] = p[2] in ["true", "True"]
+ if p[2] == "true":
+ self.current_element["files_analyzed"] = True
+ elif p[2] == "false":
+ self.current_element["files_analyzed"] = False
+ else:
+ self.current_element["logger"].append(
+ f'The value of FilesAnalyzed must be either "true" or "false", but is: {p[2]}'
+ )
@grammar_rule("primary_package_purpose : PRIMARY_PACKAGE_PURPOSE LINE")
def p_primary_package_purpose(self, p):
diff --git a/src/spdx_tools/spdx/writer/tagvalue/package_writer.py b/src/spdx_tools/spdx/writer/tagvalue/package_writer.py
index 9be4ec46f..f61474fa6 100644
--- a/src/spdx_tools/spdx/writer/tagvalue/package_writer.py
+++ b/src/spdx_tools/spdx/writer/tagvalue/package_writer.py
@@ -33,7 +33,7 @@ def write_package(package: Package, text_output: TextIO):
write_actor("PackageOriginator", package.originator, text_output)
write_value("PackageDownloadLocation", package.download_location, text_output)
- write_value("FilesAnalyzed", package.files_analyzed, text_output)
+ write_value("FilesAnalyzed", str(package.files_analyzed).lower(), text_output)
if package.verification_code:
package_verification_code = get_package_verification_code_string(package.verification_code)
write_value("PackageVerificationCode", package_verification_code, text_output)
diff --git a/tests/spdx/parser/tagvalue/test_package_parser.py b/tests/spdx/parser/tagvalue/test_package_parser.py
index e38351b48..470f1e2f7 100644
--- a/tests/spdx/parser/tagvalue/test_package_parser.py
+++ b/tests/spdx/parser/tagvalue/test_package_parser.py
@@ -22,7 +22,7 @@ def test_parse_package():
"SPDXID: SPDXRef-Package",
"PackageVersion: 1:22.36.1-8+deb11u1",
"PackageDownloadLocation: http://example.com/test",
- "FilesAnalyzed: True",
+ "FilesAnalyzed: true",
"PackageSummary: Test package",
"PackageSourceInfo: Version 1.0 of test",
"PackageFileName: test-1.0.zip",
@@ -123,6 +123,12 @@ def test_parse_package():
"match specified grammar rule. Line: 2', 'Error while parsing "
"ValidUntilDate: Token did not match specified grammar rule. Line: 3']",
),
+ (
+ f"SPDXID:{DOCUMENT_SPDX_ID}\nPackageName: TestPackage\nSPDXID:SPDXRef-Package\n"
+ "PackageDownloadLocation: download.com\nFilesAnalyzed: FALSE",
+ "Error while parsing Package: "
+ '[\'The value of FilesAnalyzed must be either "true" or "false", but is: FALSE\']',
+ ),
],
)
def test_parse_invalid_package(package_str, expected_message):
diff --git a/tests/spdx/writer/tagvalue/test_package_writer.py b/tests/spdx/writer/tagvalue/test_package_writer.py
index 26c8f9a61..994931ead 100644
--- a/tests/spdx/writer/tagvalue/test_package_writer.py
+++ b/tests/spdx/writer/tagvalue/test_package_writer.py
@@ -27,7 +27,7 @@ def test_package_writer():
call(f"PackageSupplier: Person: {package.supplier.name} ({package.supplier.email})\n"),
call(f"PackageOriginator: Person: {package.originator.name} ({package.originator.email})\n"),
call(f"PackageDownloadLocation: {package.download_location}\n"),
- call("FilesAnalyzed: True\n"),
+ call("FilesAnalyzed: true\n"),
call(f"PackageVerificationCode: {package.verification_code.value} (excludes: ./exclude.py)\n"),
call("PackageChecksum: SHA1: 71c4025dd9897b364f3ebbb42c484ff43d00791c\n"),
call(f"PackageHomePage: {package.homepage}\n"),
diff --git a/tests/spdx/writer/tagvalue/test_tagvalue_writer.py b/tests/spdx/writer/tagvalue/test_tagvalue_writer.py
index 86e7a2f92..487ee0dca 100644
--- a/tests/spdx/writer/tagvalue/test_tagvalue_writer.py
+++ b/tests/spdx/writer/tagvalue/test_tagvalue_writer.py
@@ -114,7 +114,7 @@ def test_correct_order_of_elements():
call("PackageName: Test Package A\n"),
call("SPDXID: SPDXRef-Package-A\n"),
call("PackageDownloadLocation: \n"),
- call("FilesAnalyzed: True\n"),
+ call("FilesAnalyzed: true\n"),
call("\n"),
call("## File Information\n"),
call("FileName: Test File B\n"),
@@ -130,7 +130,7 @@ def test_correct_order_of_elements():
call("PackageName: Test Package B\n"),
call("SPDXID: SPDXRef-Package-B\n"),
call("PackageDownloadLocation: \n"),
- call("FilesAnalyzed: True\n"),
+ call("FilesAnalyzed: true\n"),
call("\n"),
call("\n"),
]
@@ -199,7 +199,7 @@ def test_same_file_in_multiple_packages():
call("PackageName: Example package A\n"),
call("SPDXID: SPDXRef-Package-A\n"),
call("PackageDownloadLocation: https://download.com\n"),
- call("FilesAnalyzed: True\n"),
+ call("FilesAnalyzed: true\n"),
call("\n"),
call("## File Information\n"),
call("FileName: Example file\n"),
@@ -210,7 +210,7 @@ def test_same_file_in_multiple_packages():
call("PackageName: Example package B\n"),
call("SPDXID: SPDXRef-Package-B\n"),
call("PackageDownloadLocation: https://download.com\n"),
- call("FilesAnalyzed: True\n"),
+ call("FilesAnalyzed: true\n"),
call("\n"),
call("## Relationships\n"),
call("Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-Package-A\n"),