From 210c91e2c9ae9d8acb1c51af7abaeea8729be9a5 Mon Sep 17 00:00:00 2001 From: Om Santosh Suneri <142336291+omsuneri@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:12:38 +0530 Subject: [PATCH 1/6] fix: prevent 'NoneType' error when scanning single Cargo.toml files Signed-off-by: Om Santosh Suneri <142336291+omsuneri@users.noreply.github.com> --- src/packagedcode/cargo.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/packagedcode/cargo.py b/src/packagedcode/cargo.py index 8cd087c2cc..3b2d342d82 100644 --- a/src/packagedcode/cargo.py +++ b/src/packagedcode/cargo.py @@ -67,7 +67,13 @@ def assemble(cls, package_data, resource, codebase, package_adder): package_data.extra_data[attribute] = 'workspace' workspace_package_data[attribute] = getattr(package_data, attribute) - workspace_root_path = resource.parent(codebase).path + workspace_root = resource.parent(codebase) + if not workspace_root: + # If there's no parent (e.g., scanning a single file), use the directory part of the resource path + workspace_root_path = os.path.dirname(resource.path) + else: + workspace_root_path = workspace_root.path + if workspace_package_data and workspace_members: # TODO: support glob patterns found in cargo workspaces @@ -103,12 +109,14 @@ def assemble(cls, package_data, resource, codebase, package_adder): package_adder=package_adder, ) else: - yield from cls.assemble_from_many_datafiles( - datafile_name_patterns=('Cargo.toml', 'cargo.toml', 'Cargo.lock', 'cargo.lock'), - directory=resource.parent(codebase), - codebase=codebase, - package_adder=package_adder, - ) + parent_resource = resource.parent(codebase) + if parent_resource: + yield from cls.assemble_from_many_datafiles( + datafile_name_patterns=('Cargo.toml', 'cargo.toml', 'Cargo.lock', 'cargo.lock'), + directory=parent_resource, + codebase=codebase, + package_adder=package_adder, + ) @classmethod def update_resource_package_data(cls, workspace, workspace_package_data, resource_package_data, mapping=None): From 84034f9b0564fb20b84f1887d60c77b57e8c8af0 Mon Sep 17 00:00:00 2001 From: Om Santosh Suneri <142336291+omsuneri@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:13:26 +0530 Subject: [PATCH 2/6] fix: use cached parent resource instead of redundant parent() call Signed-off-by: Om Santosh Suneri <142336291+omsuneri@users.noreply.github.com> --- src/packagedcode/npm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packagedcode/npm.py b/src/packagedcode/npm.py index 779ff28166..0532d08694 100644 --- a/src/packagedcode/npm.py +++ b/src/packagedcode/npm.py @@ -125,7 +125,7 @@ def assemble(cls, package_data, resource, codebase, package_adder): workspace_root = package_resource.parent(codebase) workspace_root_path = None if workspace_root: - workspace_root_path = package_resource.parent(codebase).path + workspace_root_path = workspace_root.path workspaces = pkg_data.extra_data.get('workspaces') or [] # Also look for pnpm workspaces From ee7f8e458ed01fc207072678ed24c2fe9d3ccbff Mon Sep 17 00:00:00 2001 From: Om Santosh Suneri <142336291+omsuneri@users.noreply.github.com> Date: Thu, 16 Oct 2025 02:11:46 +0530 Subject: [PATCH 3/6] Add regression test for single Cargo.toml file scan Signed-off-by: Om Santosh Suneri <142336291+omsuneri@users.noreply.github.com> --- .../cargo_toml/single-file-scan/Cargo.toml | 38 ++++++ .../single-file-scan/Cargo.toml.expected | 114 ++++++++++++++++++ tests/packagedcode/test_cargo.py | 6 + 3 files changed, 158 insertions(+) create mode 100644 tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml create mode 100644 tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected diff --git a/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml b/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml new file mode 100644 index 0000000000..eb5c15cbc2 --- /dev/null +++ b/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "constant_time_eq" +version = "0.4.2" +edition = "2024" +authors = ["Cesar Eduardo Barros "] +description = "Compares two equal-sized byte strings in constant time." +documentation = "https://docs.rs/constant_time_eq" +repository = "https://github.com/cesarb/constant_time_eq" +readme = "README" +keywords = ["constant_time"] +categories = ["cryptography", "no-std"] +license = "CC0-1.0 OR MIT-0 OR Apache-2.0" +rust-version = "1.85.0" + +[dev-dependencies] +criterion = { version = "0.5.1", features = ["cargo_bench_support", "html_reports"] } +count_instructions = "0.2.0" + +[features] +default = ["std"] + +# Necessary to detect at runtime whether DIT is available on aarch64. +std = [] + +# Enables tests which depend on the count_instructions crate. +count_instructions_test = [] + +[[bench]] +name = "bench" +harness = false + +[[bench]] +name = "bench_generic" +harness = false + +[[bench]] +name = "bench_classic" +harness = false \ No newline at end of file diff --git a/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected b/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected new file mode 100644 index 0000000000..96f1c56fde --- /dev/null +++ b/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected @@ -0,0 +1,114 @@ +[ + { + "type": "cargo", + "namespace": null, + "name": "constant_time_eq", + "version": "0.4.2", + "qualifiers": {}, + "subpath": null, + "primary_language": "Rust", + "description": "Compares two equal-sized byte strings in constant time.", + "release_date": null, + "parties": [ + { + "type": "person", + "role": "author", + "name": "Cesar Eduardo Barros", + "email": "cesarb@cesarb.eti.br", + "url": null + } + ], + "keywords": [ + "constant_time", + "cryptography", + "no-std" + ], + "homepage_url": null, + "download_url": null, + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": "https://github.com/cesarb/constant_time_eq", + "copyright": null, + "holder": null, + "declared_license_expression": "cc0-1.0 OR mit-0 OR apache-2.0", + "declared_license_expression_spdx": "CC0-1.0 OR MIT-0 OR Apache-2.0", + "license_detections": [ + { + "license_expression": "cc0-1.0 OR mit-0 OR apache-2.0", + "license_expression_spdx": "CC0-1.0 OR MIT-0 OR Apache-2.0", + "matches": [ + { + "license_expression": "cc0-1.0 OR mit-0 OR apache-2.0", + "license_expression_spdx": "CC0-1.0 OR MIT-0 OR Apache-2.0", + "from_file": null, + "start_line": 1, + "end_line": 1, + "matcher": "1-spdx-id", + "score": 100.0, + "matched_length": 10, + "match_coverage": 100.0, + "rule_relevance": 100, + "rule_identifier": "spdx-license-identifier-cc0_1_0_or_mit_0_or_apache_2_0-f44a2ec174eb034bd3c662f728664281e507b20d", + "rule_url": null, + "matched_text": "CC0-1.0 OR MIT-0 OR Apache-2.0" + } + ], + "identifier": "cc0_1_0_or_mit_0_or_apache_2_0-3f14dd48-7cd8-cf28-d4e1-3b0174a587ee" + } + ], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": "CC0-1.0 OR MIT-0 OR Apache-2.0", + "notice_text": null, + "source_packages": [], + "file_references": [], + "is_private": false, + "is_virtual": false, + "extra_data": { + "documentation_url": "https://docs.rs/constant_time_eq", + "rust_version": "1.85.0", + "rust_edition": "2024" + }, + "dependencies": [ + { + "purl": "pkg:cargo/criterion", + "extracted_requirement": "0.5.1", + "scope": "dev-dependencies", + "is_runtime": false, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": { + "version": "0.5.1", + "features": [ + "cargo_bench_support", + "html_reports" + ] + } + }, + { + "purl": "pkg:cargo/count_instructions", + "extracted_requirement": "0.2.0", + "scope": "dev-dependencies", + "is_runtime": false, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://crates.io/crates/constant_time_eq", + "repository_download_url": "https://crates.io/api/v1/crates/constant_time_eq/0.4.2/download", + "api_data_url": "https://crates.io/api/v1/crates/constant_time_eq", + "datasource_id": "cargo_toml", + "purl": "pkg:cargo/constant_time_eq@0.4.2" + } +] \ No newline at end of file diff --git a/tests/packagedcode/test_cargo.py b/tests/packagedcode/test_cargo.py index b71634aa8a..429b67ce70 100644 --- a/tests/packagedcode/test_cargo.py +++ b/tests/packagedcode/test_cargo.py @@ -83,6 +83,12 @@ def test_parse_cargo_toml_workspace_with_dependencies_child(self): packages_data = cargo.CargoTomlHandler.parse(test_file) self.check_packages_data(packages_data, expected_loc, regen=REGEN_TEST_FIXTURES) + def test_parse_cargo_toml_single_file_no_crash(self): + test_file = self.get_test_loc('cargo/cargo_toml/single-file-scan/Cargo.toml') + expected_loc = self.get_test_loc('cargo/cargo_toml/single-file-scan/Cargo.toml.expected') + packages_data = cargo.CargoTomlHandler.parse(test_file) + self.check_packages_data(packages_data, expected_loc, regen=REGEN_TEST_FIXTURES) + def test_parse_cargo_toml_tauri_workspace_in_version(self): test_file = self.get_test_loc('cargo/cargo_toml/tauri-examples/Cargo.toml') expected_loc = self.get_test_loc('cargo/cargo_toml/tauri-examples/Cargo.toml.expected') From b09b68bdf049e90cea62f56ca0e4750211056597 Mon Sep 17 00:00:00 2001 From: Om Santosh Suneri <142336291+omsuneri@users.noreply.github.com> Date: Tue, 28 Oct 2025 22:59:27 +0530 Subject: [PATCH 4/6] refactor: remove unnecessary portion of test file Cargo.toml Signed-off-by: Om Santosh Suneri <142336291+omsuneri@users.noreply.github.com> --- .../cargo_toml/single-file-scan/Cargo.toml | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml b/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml index eb5c15cbc2..cbfee53902 100644 --- a/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml +++ b/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml @@ -14,25 +14,4 @@ rust-version = "1.85.0" [dev-dependencies] criterion = { version = "0.5.1", features = ["cargo_bench_support", "html_reports"] } -count_instructions = "0.2.0" - -[features] -default = ["std"] - -# Necessary to detect at runtime whether DIT is available on aarch64. -std = [] - -# Enables tests which depend on the count_instructions crate. -count_instructions_test = [] - -[[bench]] -name = "bench" -harness = false - -[[bench]] -name = "bench_generic" -harness = false - -[[bench]] -name = "bench_classic" -harness = false \ No newline at end of file +count_instructions = "0.2.0" \ No newline at end of file From 52499671f8d4269223ec0cfccebfd419b1aef016 Mon Sep 17 00:00:00 2001 From: Om Santosh Suneri <142336291+omsuneri@users.noreply.github.com> Date: Tue, 28 Oct 2025 23:27:37 +0530 Subject: [PATCH 5/6] refactor: test with a full --package scan Signed-off-by: Om Santosh Suneri <142336291+omsuneri@users.noreply.github.com> --- .../single-file-scan/Cargo.toml.expected | 266 ++++++++++-------- tests/packagedcode/test_cargo.py | 9 +- 2 files changed, 161 insertions(+), 114 deletions(-) diff --git a/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected b/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected index 96f1c56fde..b5cfaf25f8 100644 --- a/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected +++ b/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected @@ -1,114 +1,158 @@ -[ - { - "type": "cargo", - "namespace": null, - "name": "constant_time_eq", - "version": "0.4.2", - "qualifiers": {}, - "subpath": null, - "primary_language": "Rust", - "description": "Compares two equal-sized byte strings in constant time.", - "release_date": null, - "parties": [ - { - "type": "person", - "role": "author", - "name": "Cesar Eduardo Barros", - "email": "cesarb@cesarb.eti.br", - "url": null - } - ], - "keywords": [ - "constant_time", - "cryptography", - "no-std" - ], - "homepage_url": null, - "download_url": null, - "size": null, - "sha1": null, - "md5": null, - "sha256": null, - "sha512": null, - "bug_tracking_url": null, - "code_view_url": null, - "vcs_url": "https://github.com/cesarb/constant_time_eq", - "copyright": null, - "holder": null, - "declared_license_expression": "cc0-1.0 OR mit-0 OR apache-2.0", - "declared_license_expression_spdx": "CC0-1.0 OR MIT-0 OR Apache-2.0", - "license_detections": [ - { - "license_expression": "cc0-1.0 OR mit-0 OR apache-2.0", - "license_expression_spdx": "CC0-1.0 OR MIT-0 OR Apache-2.0", - "matches": [ - { - "license_expression": "cc0-1.0 OR mit-0 OR apache-2.0", - "license_expression_spdx": "CC0-1.0 OR MIT-0 OR Apache-2.0", - "from_file": null, - "start_line": 1, - "end_line": 1, - "matcher": "1-spdx-id", - "score": 100.0, - "matched_length": 10, - "match_coverage": 100.0, - "rule_relevance": 100, - "rule_identifier": "spdx-license-identifier-cc0_1_0_or_mit_0_or_apache_2_0-f44a2ec174eb034bd3c662f728664281e507b20d", - "rule_url": null, - "matched_text": "CC0-1.0 OR MIT-0 OR Apache-2.0" - } +{ + "headers": [ + { + "tool_name": "scancode-toolkit", + "tool_version": "32.4.1", + "options": { + "input": [ + "/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml" ], - "identifier": "cc0_1_0_or_mit_0_or_apache_2_0-3f14dd48-7cd8-cf28-d4e1-3b0174a587ee" - } - ], - "other_license_expression": null, - "other_license_expression_spdx": null, - "other_license_detections": [], - "extracted_license_statement": "CC0-1.0 OR MIT-0 OR Apache-2.0", - "notice_text": null, - "source_packages": [], - "file_references": [], - "is_private": false, - "is_virtual": false, - "extra_data": { - "documentation_url": "https://docs.rs/constant_time_eq", - "rust_version": "1.85.0", - "rust_edition": "2024" - }, - "dependencies": [ - { - "purl": "pkg:cargo/criterion", - "extracted_requirement": "0.5.1", - "scope": "dev-dependencies", - "is_runtime": false, - "is_optional": false, - "is_pinned": false, - "is_direct": true, - "resolved_package": {}, - "extra_data": { - "version": "0.5.1", - "features": [ - "cargo_bench_support", - "html_reports" - ] - } + "--json-pp": "/tmp/cargo-full-scan.json", + "--package": true }, - { - "purl": "pkg:cargo/count_instructions", - "extracted_requirement": "0.2.0", - "scope": "dev-dependencies", - "is_runtime": false, - "is_optional": false, - "is_pinned": false, - "is_direct": true, - "resolved_package": {}, - "extra_data": {} + "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.", + "start_timestamp": "2025-10-28T175155.400609", + "end_timestamp": "2025-10-28T175201.660855", + "output_format_version": "4.1.0", + "duration": 6.26029896736145, + "message": null, + "errors": [], + "warnings": [], + "extra_data": { + "system_environment": { + "operating_system": "linux", + "cpu_architecture": "64", + "platform": "Linux-6.10.14-linuxkit-x86_64-with-glibc2.36", + "platform_version": "#1 SMP Tue Oct 14 07:32:13 UTC 2025", + "python_version": "3.12.12 (main, Oct 21 2025, 02:11:48) [GCC 12.2.0]" + }, + "spdx_license_list_version": "3.27", + "files_count": 1 } - ], - "repository_homepage_url": "https://crates.io/crates/constant_time_eq", - "repository_download_url": "https://crates.io/api/v1/crates/constant_time_eq/0.4.2/download", - "api_data_url": "https://crates.io/api/v1/crates/constant_time_eq", - "datasource_id": "cargo_toml", - "purl": "pkg:cargo/constant_time_eq@0.4.2" - } -] \ No newline at end of file + } + ], + "packages": [], + "dependencies": [], + "files": [ + { + "path": "Cargo.toml", + "type": "file", + "package_data": [ + { + "type": "cargo", + "namespace": null, + "name": "constant_time_eq", + "version": "0.4.2", + "qualifiers": {}, + "subpath": null, + "primary_language": "Rust", + "description": "Compares two equal-sized byte strings in constant time.", + "release_date": null, + "parties": [ + { + "type": "person", + "role": "author", + "name": "Cesar Eduardo Barros", + "email": "cesarb@cesarb.eti.br", + "url": null + } + ], + "keywords": [ + "constant_time", + "cryptography", + "no-std" + ], + "homepage_url": null, + "download_url": null, + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": "https://github.com/cesarb/constant_time_eq", + "copyright": null, + "holder": null, + "declared_license_expression": "cc0-1.0 OR mit-0 OR apache-2.0", + "declared_license_expression_spdx": "CC0-1.0 OR MIT-0 OR Apache-2.0", + "license_detections": [ + { + "license_expression": "cc0-1.0 OR mit-0 OR apache-2.0", + "license_expression_spdx": "CC0-1.0 OR MIT-0 OR Apache-2.0", + "matches": [ + { + "license_expression": "cc0-1.0 OR mit-0 OR apache-2.0", + "license_expression_spdx": "CC0-1.0 OR MIT-0 OR Apache-2.0", + "from_file": "Cargo.toml", + "start_line": 1, + "end_line": 1, + "matcher": "1-spdx-id", + "score": 100.0, + "matched_length": 10, + "match_coverage": 100.0, + "rule_relevance": 100, + "rule_identifier": "spdx-license-identifier-cc0_1_0_or_mit_0_or_apache_2_0-f44a2ec174eb034bd3c662f728664281e507b20d", + "rule_url": null, + "matched_text": "CC0-1.0 OR MIT-0 OR Apache-2.0" + } + ], + "identifier": "cc0_1_0_or_mit_0_or_apache_2_0-3f14dd48-7cd8-cf28-d4e1-3b0174a587ee" + } + ], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": "CC0-1.0 OR MIT-0 OR Apache-2.0", + "notice_text": null, + "source_packages": [], + "file_references": [], + "is_private": false, + "is_virtual": false, + "extra_data": { + "documentation_url": "https://docs.rs/constant_time_eq", + "rust_version": "1.85.0", + "rust_edition": "2024" + }, + "dependencies": [ + { + "purl": "pkg:cargo/criterion", + "extracted_requirement": "0.5.1", + "scope": "dev-dependencies", + "is_runtime": false, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": { + "version": "0.5.1", + "features": [ + "cargo_bench_support", + "html_reports" + ] + } + }, + { + "purl": "pkg:cargo/count_instructions", + "extracted_requirement": "0.2.0", + "scope": "dev-dependencies", + "is_runtime": false, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://crates.io/crates/constant_time_eq", + "repository_download_url": "https://crates.io/api/v1/crates/constant_time_eq/0.4.2/download", + "api_data_url": "https://crates.io/api/v1/crates/constant_time_eq", + "datasource_id": "cargo_toml", + "purl": "pkg:cargo/constant_time_eq@0.4.2" + } + ], + "for_packages": [], + "scan_errors": [] + } + ] +} \ No newline at end of file diff --git a/tests/packagedcode/test_cargo.py b/tests/packagedcode/test_cargo.py index 429b67ce70..e3309a438e 100644 --- a/tests/packagedcode/test_cargo.py +++ b/tests/packagedcode/test_cargo.py @@ -85,9 +85,12 @@ def test_parse_cargo_toml_workspace_with_dependencies_child(self): def test_parse_cargo_toml_single_file_no_crash(self): test_file = self.get_test_loc('cargo/cargo_toml/single-file-scan/Cargo.toml') - expected_loc = self.get_test_loc('cargo/cargo_toml/single-file-scan/Cargo.toml.expected') - packages_data = cargo.CargoTomlHandler.parse(test_file) - self.check_packages_data(packages_data, expected_loc, regen=REGEN_TEST_FIXTURES) + expected_file = self.get_test_loc('cargo/cargo_toml/single-file-scan/Cargo.toml.expected') + result_file = self.get_temp_file('results.json') + run_scan_click(['--package', test_file, '--json', result_file]) + check_json_scan( + expected_file, result_file, remove_uuid=True, regen=REGEN_TEST_FIXTURES + ) def test_parse_cargo_toml_tauri_workspace_in_version(self): test_file = self.get_test_loc('cargo/cargo_toml/tauri-examples/Cargo.toml') From 58e2e2bdef6b6a8eb79e0042d7c8541b96e167b2 Mon Sep 17 00:00:00 2001 From: Om Santosh Suneri Date: Wed, 29 Oct 2025 00:45:15 +0530 Subject: [PATCH 6/6] refactor: removing header from the ```cargo.toml.expected``` Signed-off-by: Om Santosh Suneri <142336291+omsuneri@users.noreply.github.com> --- .../single-file-scan/Cargo.toml.expected | 34 +------------------ 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected b/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected index b5cfaf25f8..ff00223cc8 100644 --- a/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected +++ b/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml.expected @@ -1,36 +1,4 @@ { - "headers": [ - { - "tool_name": "scancode-toolkit", - "tool_version": "32.4.1", - "options": { - "input": [ - "/tests/packagedcode/data/cargo/cargo_toml/single-file-scan/Cargo.toml" - ], - "--json-pp": "/tmp/cargo-full-scan.json", - "--package": true - }, - "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.", - "start_timestamp": "2025-10-28T175155.400609", - "end_timestamp": "2025-10-28T175201.660855", - "output_format_version": "4.1.0", - "duration": 6.26029896736145, - "message": null, - "errors": [], - "warnings": [], - "extra_data": { - "system_environment": { - "operating_system": "linux", - "cpu_architecture": "64", - "platform": "Linux-6.10.14-linuxkit-x86_64-with-glibc2.36", - "platform_version": "#1 SMP Tue Oct 14 07:32:13 UTC 2025", - "python_version": "3.12.12 (main, Oct 21 2025, 02:11:48) [GCC 12.2.0]" - }, - "spdx_license_list_version": "3.27", - "files_count": 1 - } - } - ], "packages": [], "dependencies": [], "files": [ @@ -155,4 +123,4 @@ "scan_errors": [] } ] -} \ No newline at end of file +}