From d9776db8c839e18398479b872b0694706df598ae Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Tue, 28 May 2024 18:57:16 +0530 Subject: [PATCH 01/14] Add support for Swift package manager Signed-off-by: Keshav Priyadarshi --- src/packagedcode/__init__.py | 4 + src/packagedcode/swift.py | 282 +++++++++++++++++++++++++++++++++++ 2 files changed, 286 insertions(+) create mode 100644 src/packagedcode/swift.py diff --git a/src/packagedcode/__init__.py b/src/packagedcode/__init__.py index 752710c2850..85757e4c21e 100644 --- a/src/packagedcode/__init__.py +++ b/src/packagedcode/__init__.py @@ -39,6 +39,7 @@ from packagedcode import readme from packagedcode import rpm from packagedcode import rubygems +from packagedcode import swift from packagedcode import win_pe from packagedcode import windows @@ -196,6 +197,9 @@ rubygems.GemspecInExtractedGemHandler, rubygems.GemspecHandler, + swift.SwiftManifestJsonHandler, + swift.SwiftPackageResolvedHandler, + windows.MicrosoftUpdateManifestHandler, win_pe.WindowsExecutableHandler, diff --git a/src/packagedcode/swift.py b/src/packagedcode/swift.py new file mode 100644 index 00000000000..2cf04915eb5 --- /dev/null +++ b/src/packagedcode/swift.py @@ -0,0 +1,282 @@ +# Copyright (c) nexB Inc. and others. All rights reserved. +# ScanCode is a trademark of nexB Inc. +# SPDX-License-Identifier: Apache-2.0 +# See http://www.apache.org/licenses/LICENSE-2.0 for the license text. +# See https://github.com/nexB/scancode-toolkit for support or download. +# See https://aboutcode.org for more information about nexB OSS projects. +# + +import io +import json +import logging +import os +from urllib import parse + +from packagedcode import models +from packageurl import PackageURL + +""" +Handle the resolved file and JSON dump of the manifest for Swift packages. +https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html + +Run the command below before running the scan: +``swift package dump-package > Package.swift.json`` +""" + + +SCANCODE_DEBUG_PACKAGE = os.environ.get("SCANCODE_DEBUG_PACKAGE", False) + +TRACE = SCANCODE_DEBUG_PACKAGE + + +def logger_debug(*args): + pass + + +logger = logging.getLogger(__name__) + +if TRACE: + import sys + + logging.basicConfig(stream=sys.stdout) + logger.setLevel(logging.DEBUG) + + def logger_debug(*args): + return logger.debug(" ".join(isinstance(a, str) and a or repr(a) for a in args)) + + +class SwiftManifestJsonHandler(models.DatafileHandler): + datasource_id = "swift_package_manifest_json" + path_patterns = ("*/Package.swift.json",) + default_package_type = "swift" + default_primary_language = "swift" + description = "json dump of swift manifest" + documentation_url = "https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html" + + @classmethod + def _parse(cls, swift_manifest, package_only=False): + + if TRACE: + logger_debug( + f"SwiftManifestJsonHandler: manifest: package: {swift_manifest}" + ) + + dependencies = get_dependencies(swift_manifest.get("dependencies")) + + package_data = dict( + datasource_id=cls.datasource_id, + type=cls.default_package_type, + primary_language=cls.default_primary_language, + namespace=None, + name=swift_manifest.get("name"), + dependencies=dependencies, + ) + + return models.PackageData.from_data(package_data, package_only) + + @classmethod + def parse(cls, location, package_only=False): + with io.open(location, encoding="utf-8") as loc: + swift_manifest = json.load(loc) + + yield cls._parse(swift_manifest, package_only) + + @classmethod + def assemble( + cls, + package_data, + resource, + codebase, + package_adder=models.add_to_package, + ): + """ + Use the dependencies from `Package.resolved` to create the + top-level package with resolved dependencies. + """ + siblings = resource.siblings(codebase) + swift_resolved_package_resource = [ + r for r in siblings if r.name == "Package.resolved" + ] + dependencies_from_manifest = package_data.dependencies + + processed_dependencies = [] + if swift_resolved_package_resource: + swift_resolved_package_resource = swift_resolved_package_resource[0] + swift_resolved_package_data = swift_resolved_package_resource.package_data + + for package in swift_resolved_package_data: + version = package.get("version") + name = package.get("name") + + purl = PackageURL( + type=cls.default_package_type, name=name, version=version + ) + processed_dependencies.append( + models.DependentPackage( + purl=purl.to_string(), + scope="install", + is_runtime=True, + is_optional=False, + is_resolved=True, + extracted_requirement=version, + ) + ) + + for dependency in dependencies_from_manifest[:]: + dependency_purl = PackageURL.from_string(dependency.purl) + + if dependency_purl.name == name: + dependencies_from_manifest.remove(dependency) + + processed_dependencies.extend(dependencies_from_manifest) + + datafile_path = resource.path + if package_data.purl: + package = models.Package.from_package_data( + package_data=package_data, + datafile_path=datafile_path, + ) + + if swift_resolved_package_resource: + package.datafile_paths.append(swift_resolved_package_resource.path) + package.datasource_ids.append(SwiftPackageResolvedHandler.datasource_id) + + package.populate_license_fields() + yield package + + parent = resource.parent(codebase) + cls.assign_package_to_resources( + package=package, + resource=parent, + codebase=codebase, + package_adder=package_adder, + ) + + if processed_dependencies: + yield from models.Dependency.from_dependent_packages( + dependent_packages=processed_dependencies, + datafile_path=datafile_path, + datasource_id=package_data.datasource_id, + package_uid=package.package_uid, + ) + yield resource + + +class SwiftPackageResolvedHandler(models.DatafileHandler): + datasource_id = "swift_package_resolved" + path_patterns = ("*/Package.resolved",) + default_package_type = "swift" + default_primary_language = "swift" + description = "resolved dependency for swift package" + documentation_url = ( + "https://docs.swift.org/package-manager/PackageDescription/" + "PackageDescription.html#package-dependency" + ) + + @classmethod + def parse(cls, location, package_only=False): + with io.open(location, encoding="utf-8") as loc: + package_resolved = json.load(loc) + + pinned = package_resolved.get("pins", []) + + for dependency in pinned: + name = dependency.get("identity") + kind = dependency.get("kind") + location = dependency.get("location") + state = dependency.get("state", {}) + version = None + + if location and kind == "remoteSourceControl": + name = get_canonical_name(location) + + version = state.get("version") + + if not version: + version = state.get("revision") + + package_data = dict( + datasource_id=cls.datasource_id, + type=cls.default_package_type, + primary_language=cls.default_primary_language, + namespace=None, + name=name, + version=version, + ) + yield models.PackageData.from_data(package_data, package_only) + + @classmethod + def assemble( + cls, package_data, resource, codebase, package_adder=models.add_to_package + ): + siblings = resource.siblings(codebase) + swift_manifest_resource = [ + r for r in siblings if r.name == "Package.swift.json" + ] + + # Skip the assembly if the ``Package.swift.json`` manifest is present. + # SwiftManifestJsonHandler's assembly will take care of the resolved + # dependencies from Package.resolved file. + if swift_manifest_resource: + return [] + + yield from super(SwiftPackageResolvedHandler, cls).assemble( + package_data=package_data, + resource=resource, + codebase=codebase, + package_adder=package_adder, + ) + + +def get_dependencies(dependencies): + dependent_packages = [] + for dependency in dependencies or []: + source = dependency.get("sourceControl") + if not source: + continue + + source = source[0] + name = source.get("identity") + version = None + is_resolved = False + + location = source.get("location") + if remote := location.get("remote"): + name = get_canonical_name(remote[0].get("urlString")) + + requirement = source.get("requirement") + if exact := requirement.get("exact"): + version = exact[0] + is_resolved = True + elif range := requirement.get("range"): + bound = range[0] + lower_bound = bound.get("lowerBound") + upper_bound = bound.get("upperBound") + version = f"vers:swift/>={lower_bound}|<{upper_bound}" + + purl = PackageURL( + type="swift", + name=name, + version=version if is_resolved else None, + ) + + dependent_packages.append( + models.DependentPackage( + purl=purl.to_string(), + scope="install", + is_runtime=True, + is_optional=False, + is_resolved=is_resolved, + extracted_requirement=version, + ) + ) + return dependent_packages + + +def get_canonical_name(url): + parsed_url = parse.urlparse(url) + hostname = parsed_url.hostname + path = parsed_url.path.removesuffix(".git") + + return parse.quote(hostname + path, safe="") + From dafa9b9696caacc22a65121561242631444a734a Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Tue, 28 May 2024 18:58:16 +0530 Subject: [PATCH 02/14] Update the available package parsers doc Signed-off-by: Keshav Priyadarshi --- .../reference/available_package_parsers.rst | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/source/reference/available_package_parsers.rst b/docs/source/reference/available_package_parsers.rst index 5b435abaa1f..833dd99462c 100644 --- a/docs/source/reference/available_package_parsers.rst +++ b/docs/source/reference/available_package_parsers.rst @@ -233,6 +233,7 @@ parsers in scancode-toolkit during documentation builds. - https://r-pkgs.org/description.html * - Debian control file - extracted layout - ``*/control.tar.gz-extract/control`` + ``*/control.tar.xz-extract/control`` - ``deb`` - ``debian_control_extracted_deb`` - None @@ -716,6 +717,19 @@ parsers in scancode-toolkit during documentation builds. - ``rpm_installed_database_sqlite`` - None - https://fedoraproject.org/wiki/Changes/Sqlite_Rpmdb + * - RPM mariner distroless package manifest + - ``*var/lib/rpmmanifest/container-manifest-2`` + - ``rpm`` + - ``rpm_mariner_manifest`` + - None + - https://github.com/microsoft/marinara/ + * - RPM mariner distroless package license files + - ``*usr/share/licenses/*/COPYING*`` + ``*usr/share/licenses/*/LICENSE*`` + - ``rpm`` + - ``rpm_package_licenses`` + - None + - https://github.com/microsoft/marinara/ * - RPM specfile - ``*.spec`` - ``rpm`` @@ -734,6 +748,18 @@ parsers in scancode-toolkit during documentation builds. - ``squashfs_disk_image`` - None - https://en.wikipedia.org/wiki/SquashFS + * - json dump of swift manifest + - ``*/Package.swift.json`` + - ``swift`` + - ``swift_package_manifest_json`` + - swift + - https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html + * - resolved dependency for swift package + - ``*/Package.resolved`` + - ``swift`` + - ``swift_package_resolved`` + - swift + - https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html#package-dependency * - Java Web Application Archive - ``*.war`` - ``war`` From 12ee23b8cc13a8a53eb24428a9bd754f66306885 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Tue, 28 May 2024 19:34:32 +0530 Subject: [PATCH 03/14] Regen test fixture for help.txt Signed-off-by: Keshav Priyadarshi --- tests/packagedcode/data/plugin/help.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/packagedcode/data/plugin/help.txt b/tests/packagedcode/data/plugin/help.txt index 8fb8389b38f..ff87045349c 100755 --- a/tests/packagedcode/data/plugin/help.txt +++ b/tests/packagedcode/data/plugin/help.txt @@ -804,6 +804,20 @@ Package type: squashfs description: Squashfs disk image path_patterns: -------------------------------------------- +Package type: swift + datasource_id: swift_package_manifest_json + documentation URL: https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html + primary language: swift + description: json dump of swift manifest + path_patterns: '*/Package.swift.json' +-------------------------------------------- +Package type: swift + datasource_id: swift_package_resolved + documentation URL: https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html#package-dependency + primary language: swift + description: resolved dependency for swift package + path_patterns: '*/Package.resolved' +-------------------------------------------- Package type: war datasource_id: java_war_archive documentation URL: https://en.wikipedia.org/wiki/WAR_(file_format) From d06af37a761fdb4f0580e176eea5758d18080844 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Wed, 29 May 2024 00:13:06 +0530 Subject: [PATCH 04/14] Test support for swift package manager Signed-off-by: Keshav Priyadarshi --- src/packagedcode/swift.py | 3 +- .../mapboxmaps_manifest/Package.swift.json | 323 +++++++++++++++++ .../mapboxmaps_manifest/src/mapbox.swift | 1 + .../Package.resolved | 32 ++ .../Package.swift.json | 323 +++++++++++++++++ .../src/mapbox.swift | 1 + .../mapboxmaps_resolved/Package.resolved | 32 ++ .../mapboxmaps_resolved/src/mapbox.swift | 1 + ...ift-maboxmaps-manifest-parse-expected.json | 75 ++++ ...ift-maboxmaps-resolved-parse-expected.json | 128 +++++++ ...anifest-and-resolved-package-expected.json | 335 ++++++++++++++++++ ...-mapboxmaps-manifest-package-expected.json | 197 ++++++++++ ...-mapboxmaps-resolved-package-expected.json | 297 ++++++++++++++++ tests/packagedcode/test_swift.py | 103 ++++++ 14 files changed, 1850 insertions(+), 1 deletion(-) create mode 100644 tests/packagedcode/data/swift/packages/mapboxmaps_manifest/Package.swift.json create mode 100644 tests/packagedcode/data/swift/packages/mapboxmaps_manifest/src/mapbox.swift create mode 100644 tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/Package.resolved create mode 100644 tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/Package.swift.json create mode 100644 tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/src/mapbox.swift create mode 100644 tests/packagedcode/data/swift/packages/mapboxmaps_resolved/Package.resolved create mode 100644 tests/packagedcode/data/swift/packages/mapboxmaps_resolved/src/mapbox.swift create mode 100644 tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json create mode 100644 tests/packagedcode/data/swift/swift-maboxmaps-resolved-parse-expected.json create mode 100644 tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json create mode 100644 tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json create mode 100644 tests/packagedcode/data/swift/swift-mapboxmaps-resolved-package-expected.json create mode 100644 tests/packagedcode/test_swift.py diff --git a/src/packagedcode/swift.py b/src/packagedcode/swift.py index 2cf04915eb5..10b2493adef 100644 --- a/src/packagedcode/swift.py +++ b/src/packagedcode/swift.py @@ -19,8 +19,9 @@ Handle the resolved file and JSON dump of the manifest for Swift packages. https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html -Run the command below before running the scan: +Run the commands below before running the scan: ``swift package dump-package > Package.swift.json`` +``swift package resolve`` """ diff --git a/tests/packagedcode/data/swift/packages/mapboxmaps_manifest/Package.swift.json b/tests/packagedcode/data/swift/packages/mapboxmaps_manifest/Package.swift.json new file mode 100644 index 00000000000..b52452c1fbf --- /dev/null +++ b/tests/packagedcode/data/swift/packages/mapboxmaps_manifest/Package.swift.json @@ -0,0 +1,323 @@ +{ + "cLanguageStandard" : null, + "cxxLanguageStandard" : null, + "dependencies" : [ + { + "sourceControl" : [ + { + "identity" : "turf-swift", + "location" : { + "remote" : [ + { + "urlString" : "https://github.com/mapbox/turf-swift.git" + } + ] + }, + "productFilter" : null, + "requirement" : { + "range" : [ + { + "lowerBound" : "2.8.0", + "upperBound" : "3.0.0" + } + ] + } + } + ] + }, + { + "sourceControl" : [ + { + "identity" : "mapbox-core-maps-ios", + "location" : { + "remote" : [ + { + "urlString" : "https://github.com/mapbox/mapbox-core-maps-ios.git" + } + ] + }, + "productFilter" : null, + "requirement" : { + "exact" : [ + "11.4.0-rc.2" + ] + } + } + ] + }, + { + "sourceControl" : [ + { + "identity" : "mapbox-common-ios", + "location" : { + "remote" : [ + { + "urlString" : "https://github.com/mapbox/mapbox-common-ios.git" + } + ] + }, + "productFilter" : null, + "requirement" : { + "exact" : [ + "24.4.0-rc.2" + ] + } + } + ] + } + ], + "name" : "MapboxMaps", + "packageKind" : { + "root" : [ + "/workspace" + ] + }, + "pkgConfig" : null, + "platforms" : [ + { + "options" : [ + + ], + "platformName" : "ios", + "version" : "12.0" + }, + { + "options" : [ + + ], + "platformName" : "macos", + "version" : "10.15" + }, + { + "options" : [ + + ], + "platformName" : "visionos", + "version" : "1.0" + } + ], + "products" : [ + { + "name" : "MapboxMaps", + "targets" : [ + "MapboxMaps" + ], + "type" : { + "library" : [ + "automatic" + ] + } + } + ], + "providers" : null, + "swiftLanguageVersions" : null, + "targets" : [ + { + "dependencies" : [ + { + "product" : [ + "MapboxCoreMaps", + "mapbox-core-maps-ios", + null, + null + ] + }, + { + "product" : [ + "MapboxCommon", + "mapbox-common-ios", + null, + null + ] + }, + { + "product" : [ + "Turf", + "turf-swift", + null, + null + ] + } + ], + "exclude" : [ + "Info.plist" + ], + "name" : "MapboxMaps", + "packageAccess" : true, + "resources" : [ + { + "path" : "MapboxMaps.json", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "PrivacyInfo.xcprivacy", + "rule" : { + "copy" : { + + } + } + } + ], + "settings" : [ + + ], + "type" : "regular" + }, + { + "dependencies" : [ + { + "byName" : [ + "MapboxMaps", + null + ] + } + ], + "exclude" : [ + + ], + "name" : "MapboxMapsTests", + "packageAccess" : true, + "resources" : [ + { + "path" : "MigrationGuide/Fixtures/polygon.geojson", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Helpers/MapboxAccessToken", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Resources/empty-style-chicago.json", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testDoesNotShowAttribution().png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testDoesNotShowLogo().png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testDoesNotShowLogoAndAttribution().png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testShowsLogoAndAttribution().png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-100.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-150.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-200.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-250.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-300.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-50.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotLogoVisibility.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotOverlay.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Resources/MapInitOptionsTests.xib", + "rule" : { + "process" : { + + } + } + } + ], + "settings" : [ + + ], + "type" : "test" + } + ], + "toolsVersion" : { + "_version" : "5.9.0" + } +} diff --git a/tests/packagedcode/data/swift/packages/mapboxmaps_manifest/src/mapbox.swift b/tests/packagedcode/data/swift/packages/mapboxmaps_manifest/src/mapbox.swift new file mode 100644 index 00000000000..9cfc54157c9 --- /dev/null +++ b/tests/packagedcode/data/swift/packages/mapboxmaps_manifest/src/mapbox.swift @@ -0,0 +1 @@ +// Test file for swift package. \ No newline at end of file diff --git a/tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/Package.resolved b/tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/Package.resolved new file mode 100644 index 00000000000..91a82660725 --- /dev/null +++ b/tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/Package.resolved @@ -0,0 +1,32 @@ +{ + "pins" : [ + { + "identity" : "mapbox-common-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mapbox/mapbox-common-ios.git", + "state" : { + "revision" : "9c04997ed32c5b2506eb704f9f7a16367b5dcc64", + "version" : "24.4.0" + } + }, + { + "identity" : "mapbox-core-maps-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mapbox/mapbox-core-maps-ios.git", + "state" : { + "revision" : "c7897628028afb2c008d50c5d5d4054768c99340", + "version" : "11.4.0" + } + }, + { + "identity" : "turf-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mapbox/turf-swift.git", + "state" : { + "revision" : "213050191cfcb3d5aa76e1fa90c6ff1e182a42ca", + "version" : "2.8.0" + } + } + ], + "version" : 2 +} diff --git a/tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/Package.swift.json b/tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/Package.swift.json new file mode 100644 index 00000000000..b52452c1fbf --- /dev/null +++ b/tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/Package.swift.json @@ -0,0 +1,323 @@ +{ + "cLanguageStandard" : null, + "cxxLanguageStandard" : null, + "dependencies" : [ + { + "sourceControl" : [ + { + "identity" : "turf-swift", + "location" : { + "remote" : [ + { + "urlString" : "https://github.com/mapbox/turf-swift.git" + } + ] + }, + "productFilter" : null, + "requirement" : { + "range" : [ + { + "lowerBound" : "2.8.0", + "upperBound" : "3.0.0" + } + ] + } + } + ] + }, + { + "sourceControl" : [ + { + "identity" : "mapbox-core-maps-ios", + "location" : { + "remote" : [ + { + "urlString" : "https://github.com/mapbox/mapbox-core-maps-ios.git" + } + ] + }, + "productFilter" : null, + "requirement" : { + "exact" : [ + "11.4.0-rc.2" + ] + } + } + ] + }, + { + "sourceControl" : [ + { + "identity" : "mapbox-common-ios", + "location" : { + "remote" : [ + { + "urlString" : "https://github.com/mapbox/mapbox-common-ios.git" + } + ] + }, + "productFilter" : null, + "requirement" : { + "exact" : [ + "24.4.0-rc.2" + ] + } + } + ] + } + ], + "name" : "MapboxMaps", + "packageKind" : { + "root" : [ + "/workspace" + ] + }, + "pkgConfig" : null, + "platforms" : [ + { + "options" : [ + + ], + "platformName" : "ios", + "version" : "12.0" + }, + { + "options" : [ + + ], + "platformName" : "macos", + "version" : "10.15" + }, + { + "options" : [ + + ], + "platformName" : "visionos", + "version" : "1.0" + } + ], + "products" : [ + { + "name" : "MapboxMaps", + "targets" : [ + "MapboxMaps" + ], + "type" : { + "library" : [ + "automatic" + ] + } + } + ], + "providers" : null, + "swiftLanguageVersions" : null, + "targets" : [ + { + "dependencies" : [ + { + "product" : [ + "MapboxCoreMaps", + "mapbox-core-maps-ios", + null, + null + ] + }, + { + "product" : [ + "MapboxCommon", + "mapbox-common-ios", + null, + null + ] + }, + { + "product" : [ + "Turf", + "turf-swift", + null, + null + ] + } + ], + "exclude" : [ + "Info.plist" + ], + "name" : "MapboxMaps", + "packageAccess" : true, + "resources" : [ + { + "path" : "MapboxMaps.json", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "PrivacyInfo.xcprivacy", + "rule" : { + "copy" : { + + } + } + } + ], + "settings" : [ + + ], + "type" : "regular" + }, + { + "dependencies" : [ + { + "byName" : [ + "MapboxMaps", + null + ] + } + ], + "exclude" : [ + + ], + "name" : "MapboxMapsTests", + "packageAccess" : true, + "resources" : [ + { + "path" : "MigrationGuide/Fixtures/polygon.geojson", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Helpers/MapboxAccessToken", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Resources/empty-style-chicago.json", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testDoesNotShowAttribution().png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testDoesNotShowLogo().png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testDoesNotShowLogoAndAttribution().png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testShowsLogoAndAttribution().png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-100.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-150.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-200.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-250.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-300.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotAttribution-50.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotLogoVisibility.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Snapshot/testSnapshotOverlay.png", + "rule" : { + "copy" : { + + } + } + }, + { + "path" : "Resources/MapInitOptionsTests.xib", + "rule" : { + "process" : { + + } + } + } + ], + "settings" : [ + + ], + "type" : "test" + } + ], + "toolsVersion" : { + "_version" : "5.9.0" + } +} diff --git a/tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/src/mapbox.swift b/tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/src/mapbox.swift new file mode 100644 index 00000000000..9cfc54157c9 --- /dev/null +++ b/tests/packagedcode/data/swift/packages/mapboxmaps_manifest_and_resolved/src/mapbox.swift @@ -0,0 +1 @@ +// Test file for swift package. \ No newline at end of file diff --git a/tests/packagedcode/data/swift/packages/mapboxmaps_resolved/Package.resolved b/tests/packagedcode/data/swift/packages/mapboxmaps_resolved/Package.resolved new file mode 100644 index 00000000000..91a82660725 --- /dev/null +++ b/tests/packagedcode/data/swift/packages/mapboxmaps_resolved/Package.resolved @@ -0,0 +1,32 @@ +{ + "pins" : [ + { + "identity" : "mapbox-common-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mapbox/mapbox-common-ios.git", + "state" : { + "revision" : "9c04997ed32c5b2506eb704f9f7a16367b5dcc64", + "version" : "24.4.0" + } + }, + { + "identity" : "mapbox-core-maps-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mapbox/mapbox-core-maps-ios.git", + "state" : { + "revision" : "c7897628028afb2c008d50c5d5d4054768c99340", + "version" : "11.4.0" + } + }, + { + "identity" : "turf-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mapbox/turf-swift.git", + "state" : { + "revision" : "213050191cfcb3d5aa76e1fa90c6ff1e182a42ca", + "version" : "2.8.0" + } + } + ], + "version" : 2 +} diff --git a/tests/packagedcode/data/swift/packages/mapboxmaps_resolved/src/mapbox.swift b/tests/packagedcode/data/swift/packages/mapboxmaps_resolved/src/mapbox.swift new file mode 100644 index 00000000000..9cfc54157c9 --- /dev/null +++ b/tests/packagedcode/data/swift/packages/mapboxmaps_resolved/src/mapbox.swift @@ -0,0 +1 @@ +// Test file for swift package. \ No newline at end of file diff --git a/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json b/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json new file mode 100644 index 00000000000..2ebf4cd1243 --- /dev/null +++ b/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json @@ -0,0 +1,75 @@ +[ + { + "type": "swift", + "namespace": null, + "name": "MapboxMaps", + "version": null, + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift", + "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0-rc.2", + "extracted_requirement": "11.4.0-rc.2", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0-rc.2", + "extracted_requirement": "24.4.0-rc.2", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_manifest_json", + "purl": "pkg:swift/MapboxMaps" + } +] \ No newline at end of file diff --git a/tests/packagedcode/data/swift/swift-maboxmaps-resolved-parse-expected.json b/tests/packagedcode/data/swift/swift-maboxmaps-resolved-parse-expected.json new file mode 100644 index 00000000000..e6837705999 --- /dev/null +++ b/tests/packagedcode/data/swift/swift-maboxmaps-resolved-parse-expected.json @@ -0,0 +1,128 @@ +[ + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fmapbox-common-ios", + "version": "24.4.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_resolved", + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0" + }, + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fmapbox-core-maps-ios", + "version": "11.4.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_resolved", + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0" + }, + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fturf-swift", + "version": "2.8.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_resolved", + "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0" + } +] \ No newline at end of file diff --git a/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json new file mode 100644 index 00000000000..3f9b5d67d33 --- /dev/null +++ b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json @@ -0,0 +1,335 @@ +{ + "packages": [ + { + "type": "swift", + "namespace": null, + "name": "MapboxMaps", + "version": null, + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "extra_data": {}, + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_paths": [ + "Package.swift.json", + "Package.resolved" + ], + "datasource_ids": [ + "swift_package_manifest_json", + "swift_package_resolved" + ], + "purl": "pkg:swift/MapboxMaps" + } + ], + "dependencies": [ + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0", + "extracted_requirement": "24.4.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "Package.swift.json", + "datasource_id": "swift_package_manifest_json" + }, + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0", + "extracted_requirement": "11.4.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "Package.swift.json", + "datasource_id": "swift_package_manifest_json" + }, + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0", + "extracted_requirement": "2.8.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "Package.swift.json", + "datasource_id": "swift_package_manifest_json" + } + ], + "files": [ + { + "path": "Package.resolved", + "type": "file", + "package_data": [ + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fmapbox-common-ios", + "version": "24.4.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_resolved", + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0" + }, + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fmapbox-core-maps-ios", + "version": "11.4.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_resolved", + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0" + }, + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fturf-swift", + "version": "2.8.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_resolved", + "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0" + } + ], + "for_packages": [ + "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758" + ], + "scan_errors": [] + }, + { + "path": "Package.swift.json", + "type": "file", + "package_data": [ + { + "type": "swift", + "namespace": null, + "name": "MapboxMaps", + "version": null, + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift", + "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0-rc.2", + "extracted_requirement": "11.4.0-rc.2", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0-rc.2", + "extracted_requirement": "24.4.0-rc.2", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_manifest_json", + "purl": "pkg:swift/MapboxMaps" + } + ], + "for_packages": [ + "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758" + ], + "scan_errors": [] + }, + { + "path": "src", + "type": "directory", + "package_data": [], + "for_packages": [ + "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758" + ], + "scan_errors": [] + }, + { + "path": "src/mapbox.swift", + "type": "file", + "package_data": [], + "for_packages": [ + "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758" + ], + "scan_errors": [] + } + ] +} \ No newline at end of file diff --git a/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json new file mode 100644 index 00000000000..a222719a3c7 --- /dev/null +++ b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json @@ -0,0 +1,197 @@ +{ + "packages": [ + { + "type": "swift", + "namespace": null, + "name": "MapboxMaps", + "version": null, + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "extra_data": {}, + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_paths": [ + "Package.swift.json" + ], + "datasource_ids": [ + "swift_package_manifest_json" + ], + "purl": "pkg:swift/MapboxMaps" + } + ], + "dependencies": [ + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift", + "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fturf-swift?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "Package.swift.json", + "datasource_id": "swift_package_manifest_json" + }, + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0-rc.2", + "extracted_requirement": "11.4.0-rc.2", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0-rc.2?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "Package.swift.json", + "datasource_id": "swift_package_manifest_json" + }, + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0-rc.2", + "extracted_requirement": "24.4.0-rc.2", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0-rc.2?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "Package.swift.json", + "datasource_id": "swift_package_manifest_json" + } + ], + "files": [ + { + "path": "Package.swift.json", + "type": "file", + "package_data": [ + { + "type": "swift", + "namespace": null, + "name": "MapboxMaps", + "version": null, + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift", + "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0-rc.2", + "extracted_requirement": "11.4.0-rc.2", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0-rc.2", + "extracted_requirement": "24.4.0-rc.2", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_manifest_json", + "purl": "pkg:swift/MapboxMaps" + } + ], + "for_packages": [ + "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758" + ], + "scan_errors": [] + }, + { + "path": "src", + "type": "directory", + "package_data": [], + "for_packages": [ + "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758" + ], + "scan_errors": [] + }, + { + "path": "src/mapbox.swift", + "type": "file", + "package_data": [], + "for_packages": [ + "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758" + ], + "scan_errors": [] + } + ] +} \ No newline at end of file diff --git a/tests/packagedcode/data/swift/swift-mapboxmaps-resolved-package-expected.json b/tests/packagedcode/data/swift/swift-mapboxmaps-resolved-package-expected.json new file mode 100644 index 00000000000..bf851a0a30d --- /dev/null +++ b/tests/packagedcode/data/swift/swift-mapboxmaps-resolved-package-expected.json @@ -0,0 +1,297 @@ +{ + "packages": [ + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fmapbox-common-ios", + "version": "24.4.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "extra_data": {}, + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "package_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_paths": [ + "Package.resolved" + ], + "datasource_ids": [ + "swift_package_resolved" + ], + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0" + }, + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fmapbox-core-maps-ios", + "version": "11.4.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "extra_data": {}, + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "package_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_paths": [ + "Package.resolved" + ], + "datasource_ids": [ + "swift_package_resolved" + ], + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0" + }, + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fturf-swift", + "version": "2.8.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "extra_data": {}, + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "package_uid": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_paths": [ + "Package.resolved" + ], + "datasource_ids": [ + "swift_package_resolved" + ], + "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0" + } + ], + "dependencies": [], + "files": [ + { + "path": "Package.resolved", + "type": "file", + "package_data": [ + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fmapbox-common-ios", + "version": "24.4.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_resolved", + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0" + }, + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fmapbox-core-maps-ios", + "version": "11.4.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_resolved", + "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0" + }, + { + "type": "swift", + "namespace": null, + "name": "github.com%2Fmapbox%2Fturf-swift", + "version": "2.8.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_resolved", + "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0" + } + ], + "for_packages": [ + "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0?uuid=fixed-uid-done-for-testing-5642512d1758" + ], + "scan_errors": [] + }, + { + "path": "src", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "src/mapbox.swift", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + } + ] +} \ No newline at end of file diff --git a/tests/packagedcode/test_swift.py b/tests/packagedcode/test_swift.py new file mode 100644 index 00000000000..9dcfef78ba8 --- /dev/null +++ b/tests/packagedcode/test_swift.py @@ -0,0 +1,103 @@ +# +# Copyright (c) nexB Inc. and others. All rights reserved. +# ScanCode is a trademark of nexB Inc. +# SPDX-License-Identifier: Apache-2.0 +# See http://www.apache.org/licenses/LICENSE-2.0 for the license text. +# See https://github.com/nexB/scancode-toolkit for support or download. +# See https://aboutcode.org for more information about nexB OSS projects. +# + +import os.path + +from packagedcode import swift +from packages_test_utils import PackageTester +from scancode.cli_test_utils import check_json_scan +from scancode.cli_test_utils import run_scan_click +from scancode_config import REGEN_TEST_FIXTURES + + +class TestSwiftHandler(PackageTester): + test_data_dir = os.path.join(os.path.dirname(__file__), "data/swift") + + def test_parse_for_mapboxmaps_manifest(self): + test_file = self.get_test_loc( + "packages/mapboxmaps_manifest_and_resolved/Package.swift.json" + ) + expected_loc = self.get_test_loc("swift-maboxmaps-manifest-parse-expected.json") + packages = swift.SwiftManifestJsonHandler.parse(test_file) + self.check_packages_data(packages, expected_loc, regen=REGEN_TEST_FIXTURES) + + def test_parse_for_mapboxmaps_resolved(self): + test_file = self.get_test_loc( + "packages/mapboxmaps_manifest_and_resolved/Package.resolved" + ) + expected_loc = self.get_test_loc("swift-maboxmaps-resolved-parse-expected.json") + packages = swift.SwiftPackageResolvedHandler.parse(test_file) + self.check_packages_data(packages, expected_loc, regen=REGEN_TEST_FIXTURES) + + +class TestSwiftEndtoEnd(PackageTester): + test_data_dir = os.path.join(os.path.dirname(__file__), "data/swift") + + def test_package_scan_swift_end_to_end_full_mapboxmaps_manifest_only(self): + test_dir = self.get_test_loc("packages/mapboxmaps_manifest") + result_file = self.get_temp_file("json") + expected_file = self.get_test_loc( + "swift-mapboxmaps-manifest-package-expected.json" + ) + run_scan_click( + [ + "--package", + "--strip-root", + "--processes", + "-1", + test_dir, + "--json", + result_file, + ] + ) + check_json_scan( + expected_file, result_file, remove_uuid=True, regen=REGEN_TEST_FIXTURES + ) + + def test_package_scan_swift_end_to_end_full_mapboxmaps_manifest_and_resolved(self): + test_dir = self.get_test_loc("packages/mapboxmaps_manifest_and_resolved") + result_file = self.get_temp_file("json") + expected_file = self.get_test_loc( + "swift-mapboxmaps-manifest-and-resolved-package-expected.json" + ) + run_scan_click( + [ + "--package", + "--strip-root", + "--processes", + "-1", + test_dir, + "--json", + result_file, + ] + ) + check_json_scan( + expected_file, result_file, remove_uuid=True, regen=REGEN_TEST_FIXTURES + ) + + def test_package_scan_swift_end_to_end_full_mapboxmaps_resolved_only(self): + test_dir = self.get_test_loc("packages/mapboxmaps_resolved") + result_file = self.get_temp_file("json") + expected_file = self.get_test_loc( + "swift-mapboxmaps-resolved-package-expected.json" + ) + run_scan_click( + [ + "--package", + "--strip-root", + "--processes", + "-1", + test_dir, + "--json", + result_file, + ] + ) + check_json_scan( + expected_file, result_file, remove_uuid=True, regen=REGEN_TEST_FIXTURES + ) From b1f17bce31f270d320644c10d7311ed3352352bf Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Wed, 29 May 2024 00:28:05 +0530 Subject: [PATCH 05/14] Update CHANGELOG Signed-off-by: Keshav Priyadarshi --- CHANGELOG.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c0da1d326ac..39fb7e8a3e5 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -34,6 +34,15 @@ v33.0.0 (next next, roadmap) of these in other summary plugins. See https://github.com/nexB/scancode-toolkit/issues/1745 +- We now support parsing the Swift manifest JSON dump and the ``Package.resolved`` file https://github.com/nexB/scancode-toolkit/issues/2657. +- Run the commands below on your local Swift project before running the scan. + - :: + + swift package dump-package > Package.swift.json + - :: + + swift package resolve + v32.1.0 (next, roadmap) ---------------------------- From 31c57aa7197e0a6cc90bc142dbaac614881100e0 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Wed, 29 May 2024 21:23:12 +0530 Subject: [PATCH 06/14] Use proper case for default_primary_language Signed-off-by: Keshav Priyadarshi Co-authored-by: Philippe Ombredanne --- src/packagedcode/swift.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packagedcode/swift.py b/src/packagedcode/swift.py index 10b2493adef..9e2fc3f0a6d 100644 --- a/src/packagedcode/swift.py +++ b/src/packagedcode/swift.py @@ -50,7 +50,7 @@ class SwiftManifestJsonHandler(models.DatafileHandler): datasource_id = "swift_package_manifest_json" path_patterns = ("*/Package.swift.json",) default_package_type = "swift" - default_primary_language = "swift" + default_primary_language = "Swift" description = "json dump of swift manifest" documentation_url = "https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html" From de88a5539ed51e62322e49a5993cc2096ff8f8a5 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Wed, 29 May 2024 21:27:49 +0530 Subject: [PATCH 07/14] Add detail to JSON dump-package command Signed-off-by: Keshav Priyadarshi Co-authored-by: Philippe Ombredanne --- src/packagedcode/swift.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/packagedcode/swift.py b/src/packagedcode/swift.py index 9e2fc3f0a6d..5c57d73eef8 100644 --- a/src/packagedcode/swift.py +++ b/src/packagedcode/swift.py @@ -20,7 +20,8 @@ https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html Run the commands below before running the scan: -``swift package dump-package > Package.swift.json`` + +- To create a parsable JSON version of the Package.swift manifest, run this: ``swift package dump-package > Package.swift.json`` ``swift package resolve`` """ From 75ea06a888d8c1585e4fe522f8b3f87f8b20e7a6 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Wed, 29 May 2024 21:29:19 +0530 Subject: [PATCH 08/14] Add detail to package resolve command Signed-off-by: Keshav Priyadarshi Co-authored-by: Philippe Ombredanne --- src/packagedcode/swift.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packagedcode/swift.py b/src/packagedcode/swift.py index 5c57d73eef8..78073025366 100644 --- a/src/packagedcode/swift.py +++ b/src/packagedcode/swift.py @@ -22,7 +22,7 @@ Run the commands below before running the scan: - To create a parsable JSON version of the Package.swift manifest, run this: ``swift package dump-package > Package.swift.json`` -``swift package resolve`` +- To create the Package.resolved lock file, run this: ``swift package resolve`` """ From 98860b3c15f1e43dc55a5c5e269834db62b49093 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Wed, 29 May 2024 21:32:04 +0530 Subject: [PATCH 09/14] Refine description for SwiftManifestJsonHandler Signed-off-by: Keshav Priyadarshi Co-authored-by: Philippe Ombredanne --- src/packagedcode/swift.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packagedcode/swift.py b/src/packagedcode/swift.py index 78073025366..814cc18c272 100644 --- a/src/packagedcode/swift.py +++ b/src/packagedcode/swift.py @@ -52,7 +52,7 @@ class SwiftManifestJsonHandler(models.DatafileHandler): path_patterns = ("*/Package.swift.json",) default_package_type = "swift" default_primary_language = "Swift" - description = "json dump of swift manifest" + description = "JSON dump of Package.swift created with ``swift package dump-package > Package.swift.json``" documentation_url = "https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html" @classmethod From 4f8753a95ef79d75c4299ade470d821c325e23a5 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Wed, 29 May 2024 21:32:50 +0530 Subject: [PATCH 10/14] Refine description for SwiftPackageResolvedHandler Signed-off-by: Keshav Priyadarshi Co-authored-by: Philippe Ombredanne --- src/packagedcode/swift.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packagedcode/swift.py b/src/packagedcode/swift.py index 814cc18c272..fb01816462f 100644 --- a/src/packagedcode/swift.py +++ b/src/packagedcode/swift.py @@ -169,7 +169,7 @@ class SwiftPackageResolvedHandler(models.DatafileHandler): path_patterns = ("*/Package.resolved",) default_package_type = "swift" default_primary_language = "swift" - description = "resolved dependency for swift package" + description = "Resolved full dependency lockfile for Package.swift created with ``swift package resolve``" documentation_url = ( "https://docs.swift.org/package-manager/PackageDescription/" "PackageDescription.html#package-dependency" From c259071f9161e3cf7b1908cb6b91cbb3ecff6227 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Wed, 29 May 2024 21:35:18 +0530 Subject: [PATCH 11/14] Use the exact name used upstream for the scope Signed-off-by: Keshav Priyadarshi Co-authored-by: Philippe Ombredanne --- src/packagedcode/swift.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packagedcode/swift.py b/src/packagedcode/swift.py index fb01816462f..c8d76a30b8e 100644 --- a/src/packagedcode/swift.py +++ b/src/packagedcode/swift.py @@ -116,7 +116,7 @@ def assemble( processed_dependencies.append( models.DependentPackage( purl=purl.to_string(), - scope="install", + scope="dependencies", is_runtime=True, is_optional=False, is_resolved=True, From a213ae8198f22f91a7cf8a047db3ef3897eecdb4 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Fri, 31 May 2024 22:30:57 +0530 Subject: [PATCH 12/14] Add namespace to swift PURLs - Use the last segment as name and the rest as namespace Signed-off-by: Keshav Priyadarshi --- src/packagedcode/swift.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/packagedcode/swift.py b/src/packagedcode/swift.py index c8d76a30b8e..07da1ac731a 100644 --- a/src/packagedcode/swift.py +++ b/src/packagedcode/swift.py @@ -188,9 +188,10 @@ def parse(cls, location, package_only=False): location = dependency.get("location") state = dependency.get("state", {}) version = None + namespace = None if location and kind == "remoteSourceControl": - name = get_canonical_name(location) + namespace, name = get_namespace_and_name(location) version = state.get("version") @@ -201,7 +202,7 @@ def parse(cls, location, package_only=False): datasource_id=cls.datasource_id, type=cls.default_package_type, primary_language=cls.default_primary_language, - namespace=None, + namespace=namespace, name=name, version=version, ) @@ -238,13 +239,14 @@ def get_dependencies(dependencies): continue source = source[0] + namespace = None name = source.get("identity") version = None is_resolved = False location = source.get("location") if remote := location.get("remote"): - name = get_canonical_name(remote[0].get("urlString")) + namespace, name = get_namespace_and_name(remote[0].get("urlString")) requirement = source.get("requirement") if exact := requirement.get("exact"): @@ -258,6 +260,7 @@ def get_dependencies(dependencies): purl = PackageURL( type="swift", + namespace=namespace, name=name, version=version if is_resolved else None, ) @@ -265,7 +268,7 @@ def get_dependencies(dependencies): dependent_packages.append( models.DependentPackage( purl=purl.to_string(), - scope="install", + scope="dependencies", is_runtime=True, is_optional=False, is_resolved=is_resolved, @@ -275,10 +278,11 @@ def get_dependencies(dependencies): return dependent_packages -def get_canonical_name(url): +def get_namespace_and_name(url): parsed_url = parse.urlparse(url) hostname = parsed_url.hostname path = parsed_url.path.removesuffix(".git") + canonical_name = hostname + path - return parse.quote(hostname + path, safe="") + return canonical_name.rsplit("/", 1) From 603d992cfba8f346730d3a298f913c9bcb28e46b Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Fri, 31 May 2024 23:32:20 +0530 Subject: [PATCH 13/14] Add support for version 1 and 2 of Package.resolved Signed-off-by: Keshav Priyadarshi --- .../reference/available_package_parsers.rst | 7 +- src/packagedcode/swift.py | 95 ++++-- tests/packagedcode/data/plugin/help.txt | 8 +- .../fastlane_resolved_v1/Package.resolved | 16 + .../src/mapbox.swift | 0 .../mapboxmaps_resolved/Package.resolved | 32 -- ...fastlane-resolved-v1-package-expected.json | 119 +++++++ ...ift-maboxmaps-manifest-parse-expected.json | 14 +- ...ift-maboxmaps-resolved-parse-expected.json | 18 +- ...anifest-and-resolved-package-expected.json | 52 +-- ...-mapboxmaps-manifest-package-expected.json | 34 +- ...-mapboxmaps-resolved-package-expected.json | 297 ------------------ tests/packagedcode/test_swift.py | 4 +- 13 files changed, 273 insertions(+), 423 deletions(-) create mode 100644 tests/packagedcode/data/swift/packages/fastlane_resolved_v1/Package.resolved rename tests/packagedcode/data/swift/packages/{mapboxmaps_resolved => fastlane_resolved_v1}/src/mapbox.swift (100%) delete mode 100644 tests/packagedcode/data/swift/packages/mapboxmaps_resolved/Package.resolved create mode 100644 tests/packagedcode/data/swift/swift-fastlane-resolved-v1-package-expected.json delete mode 100644 tests/packagedcode/data/swift/swift-mapboxmaps-resolved-package-expected.json diff --git a/docs/source/reference/available_package_parsers.rst b/docs/source/reference/available_package_parsers.rst index 833dd99462c..45a3a4c15ee 100644 --- a/docs/source/reference/available_package_parsers.rst +++ b/docs/source/reference/available_package_parsers.rst @@ -748,14 +748,15 @@ parsers in scancode-toolkit during documentation builds. - ``squashfs_disk_image`` - None - https://en.wikipedia.org/wiki/SquashFS - * - json dump of swift manifest + * - JSON dump of Package.swift created with ``swift package dump-package > Package.swift.json`` - ``*/Package.swift.json`` - ``swift`` - ``swift_package_manifest_json`` - - swift + - Swift - https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html - * - resolved dependency for swift package + * - Resolved full dependency lockfile for Package.swift created with ``swift package resolve`` - ``*/Package.resolved`` + ``*/.package.resolved`` - ``swift`` - ``swift_package_resolved`` - swift diff --git a/src/packagedcode/swift.py b/src/packagedcode/swift.py index 07da1ac731a..b7ada928fdf 100644 --- a/src/packagedcode/swift.py +++ b/src/packagedcode/swift.py @@ -166,7 +166,7 @@ def assemble( class SwiftPackageResolvedHandler(models.DatafileHandler): datasource_id = "swift_package_resolved" - path_patterns = ("*/Package.resolved",) + path_patterns = ("*/Package.resolved", "*/.package.resolved") default_package_type = "swift" default_primary_language = "swift" description = "Resolved full dependency lockfile for Package.swift created with ``swift package resolve``" @@ -179,35 +179,18 @@ class SwiftPackageResolvedHandler(models.DatafileHandler): def parse(cls, location, package_only=False): with io.open(location, encoding="utf-8") as loc: package_resolved = json.load(loc) + + resolved_doc_version = package_resolved.get("version") - pinned = package_resolved.get("pins", []) + if resolved_doc_version in [2, 3]: + yield from packages_from_resolved_v2_and_v3(package_resolved) + + if resolved_doc_version == 1: + yield from packages_from_resolved_v1(package_resolved) - for dependency in pinned: - name = dependency.get("identity") - kind = dependency.get("kind") - location = dependency.get("location") - state = dependency.get("state", {}) - version = None - namespace = None - if location and kind == "remoteSourceControl": - namespace, name = get_namespace_and_name(location) - - version = state.get("version") - - if not version: - version = state.get("revision") - - package_data = dict( - datasource_id=cls.datasource_id, - type=cls.default_package_type, - primary_language=cls.default_primary_language, - namespace=namespace, - name=name, - version=version, - ) - yield models.PackageData.from_data(package_data, package_only) + @classmethod def assemble( cls, package_data, resource, codebase, package_adder=models.add_to_package @@ -229,6 +212,66 @@ def assemble( codebase=codebase, package_adder=package_adder, ) + +def packages_from_resolved_v2_and_v3(package_resolved): + pinned = package_resolved.get("pins", []) + + for dependency in pinned: + name = dependency.get("identity") + kind = dependency.get("kind") + location = dependency.get("location") + state = dependency.get("state", {}) + version = None + namespace = None + + if location and kind == "remoteSourceControl": + namespace, name = get_namespace_and_name(location) + + version = state.get("version") + + if not version: + version = state.get("revision") + + package_data = dict( + datasource_id=SwiftPackageResolvedHandler.datasource_id, + type=SwiftPackageResolvedHandler.default_package_type, + primary_language=SwiftPackageResolvedHandler.default_primary_language, + namespace=namespace, + name=name, + version=version, + ) + yield models.PackageData.from_data(package_data, False) + +def packages_from_resolved_v1(package_resolved): + object = package_resolved.get("object", {}) + pinned = object.get("pins", []) + + for dependency in pinned: + name = dependency.get("package") + + repository_url = dependency.get("repositoryURL") + state = dependency.get("state", {}) + version = None + namespace = None + + if repository_url: + namespace, name = get_namespace_and_name(repository_url) + + version = state.get("version") + + if not version: + version = state.get("revision") + + package_data = dict( + datasource_id=SwiftPackageResolvedHandler.datasource_id, + type=SwiftPackageResolvedHandler.default_package_type, + primary_language=SwiftPackageResolvedHandler.default_primary_language, + namespace=namespace, + name=name, + version=version, + ) + yield models.PackageData.from_data(package_data, False) + def get_dependencies(dependencies): diff --git a/tests/packagedcode/data/plugin/help.txt b/tests/packagedcode/data/plugin/help.txt index ff87045349c..7fd5350bace 100755 --- a/tests/packagedcode/data/plugin/help.txt +++ b/tests/packagedcode/data/plugin/help.txt @@ -807,16 +807,16 @@ Package type: squashfs Package type: swift datasource_id: swift_package_manifest_json documentation URL: https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html - primary language: swift - description: json dump of swift manifest + primary language: Swift + description: JSON dump of Package.swift created with ``swift package dump-package > Package.swift.json`` path_patterns: '*/Package.swift.json' -------------------------------------------- Package type: swift datasource_id: swift_package_resolved documentation URL: https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html#package-dependency primary language: swift - description: resolved dependency for swift package - path_patterns: '*/Package.resolved' + description: Resolved full dependency lockfile for Package.swift created with ``swift package resolve`` + path_patterns: '*/Package.resolved', '*/.package.resolved' -------------------------------------------- Package type: war datasource_id: java_war_archive diff --git a/tests/packagedcode/data/swift/packages/fastlane_resolved_v1/Package.resolved b/tests/packagedcode/data/swift/packages/fastlane_resolved_v1/Package.resolved new file mode 100644 index 00000000000..91aa2bec40f --- /dev/null +++ b/tests/packagedcode/data/swift/packages/fastlane_resolved_v1/Package.resolved @@ -0,0 +1,16 @@ +{ + "object": { + "pins": [ + { + "package": "SwiftShell", + "repositoryURL": "https://github.com/kareman/SwiftShell", + "state": { + "branch": null, + "revision": "99680b2efc7c7dbcace1da0b3979d266f02e213c", + "version": "5.1.0" + } + } + ] + }, + "version": 1 +} \ No newline at end of file diff --git a/tests/packagedcode/data/swift/packages/mapboxmaps_resolved/src/mapbox.swift b/tests/packagedcode/data/swift/packages/fastlane_resolved_v1/src/mapbox.swift similarity index 100% rename from tests/packagedcode/data/swift/packages/mapboxmaps_resolved/src/mapbox.swift rename to tests/packagedcode/data/swift/packages/fastlane_resolved_v1/src/mapbox.swift diff --git a/tests/packagedcode/data/swift/packages/mapboxmaps_resolved/Package.resolved b/tests/packagedcode/data/swift/packages/mapboxmaps_resolved/Package.resolved deleted file mode 100644 index 91a82660725..00000000000 --- a/tests/packagedcode/data/swift/packages/mapboxmaps_resolved/Package.resolved +++ /dev/null @@ -1,32 +0,0 @@ -{ - "pins" : [ - { - "identity" : "mapbox-common-ios", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mapbox/mapbox-common-ios.git", - "state" : { - "revision" : "9c04997ed32c5b2506eb704f9f7a16367b5dcc64", - "version" : "24.4.0" - } - }, - { - "identity" : "mapbox-core-maps-ios", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mapbox/mapbox-core-maps-ios.git", - "state" : { - "revision" : "c7897628028afb2c008d50c5d5d4054768c99340", - "version" : "11.4.0" - } - }, - { - "identity" : "turf-swift", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mapbox/turf-swift.git", - "state" : { - "revision" : "213050191cfcb3d5aa76e1fa90c6ff1e182a42ca", - "version" : "2.8.0" - } - } - ], - "version" : 2 -} diff --git a/tests/packagedcode/data/swift/swift-fastlane-resolved-v1-package-expected.json b/tests/packagedcode/data/swift/swift-fastlane-resolved-v1-package-expected.json new file mode 100644 index 00000000000..dac90300299 --- /dev/null +++ b/tests/packagedcode/data/swift/swift-fastlane-resolved-v1-package-expected.json @@ -0,0 +1,119 @@ +{ + "packages": [ + { + "type": "swift", + "namespace": "github.com/kareman", + "name": "SwiftShell", + "version": "5.1.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "extra_data": {}, + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "package_uid": "pkg:swift/github.com/kareman/SwiftShell@5.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_paths": [ + "Package.resolved" + ], + "datasource_ids": [ + "swift_package_resolved" + ], + "purl": "pkg:swift/github.com/kareman/SwiftShell@5.1.0" + } + ], + "dependencies": [], + "files": [ + { + "path": "Package.resolved", + "type": "file", + "package_data": [ + { + "type": "swift", + "namespace": "github.com/kareman", + "name": "SwiftShell", + "version": "5.1.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "swift", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "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": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "swift_package_resolved", + "purl": "pkg:swift/github.com/kareman/SwiftShell@5.1.0" + } + ], + "for_packages": [ + "pkg:swift/github.com/kareman/SwiftShell@5.1.0?uuid=fixed-uid-done-for-testing-5642512d1758" + ], + "scan_errors": [] + }, + { + "path": "src", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "src/mapbox.swift", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + } + ] +} \ No newline at end of file diff --git a/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json b/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json index 2ebf4cd1243..d73cf4d918b 100644 --- a/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json +++ b/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json @@ -6,7 +6,7 @@ "version": null, "qualifiers": {}, "subpath": null, - "primary_language": "swift", + "primary_language": "Swift", "description": null, "release_date": null, "parties": [], @@ -36,9 +36,9 @@ "extra_data": {}, "dependencies": [ { - "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift", + "purl": "pkg:swift/github.com/mapbox/turf-swift", "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": false, @@ -46,9 +46,9 @@ "extra_data": {} }, { - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0-rc.2", + "purl": "pkg:swift/github.com/mapbox/mapbox-core-maps-ios@11.4.0-rc.2", "extracted_requirement": "11.4.0-rc.2", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": true, @@ -56,9 +56,9 @@ "extra_data": {} }, { - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0-rc.2", + "purl": "pkg:swift/github.com/mapbox/mapbox-common-ios@24.4.0-rc.2", "extracted_requirement": "24.4.0-rc.2", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": true, diff --git a/tests/packagedcode/data/swift/swift-maboxmaps-resolved-parse-expected.json b/tests/packagedcode/data/swift/swift-maboxmaps-resolved-parse-expected.json index e6837705999..71bf3ebc80f 100644 --- a/tests/packagedcode/data/swift/swift-maboxmaps-resolved-parse-expected.json +++ b/tests/packagedcode/data/swift/swift-maboxmaps-resolved-parse-expected.json @@ -1,8 +1,8 @@ [ { "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fmapbox-common-ios", + "namespace": "github.com/mapbox", + "name": "mapbox-common-ios", "version": "24.4.0", "qualifiers": {}, "subpath": null, @@ -39,12 +39,12 @@ "repository_download_url": null, "api_data_url": null, "datasource_id": "swift_package_resolved", - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0" + "purl": "pkg:swift/github.com/mapbox/mapbox-common-ios@24.4.0" }, { "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fmapbox-core-maps-ios", + "namespace": "github.com/mapbox", + "name": "mapbox-core-maps-ios", "version": "11.4.0", "qualifiers": {}, "subpath": null, @@ -81,12 +81,12 @@ "repository_download_url": null, "api_data_url": null, "datasource_id": "swift_package_resolved", - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0" + "purl": "pkg:swift/github.com/mapbox/mapbox-core-maps-ios@11.4.0" }, { "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fturf-swift", + "namespace": "github.com/mapbox", + "name": "turf-swift", "version": "2.8.0", "qualifiers": {}, "subpath": null, @@ -123,6 +123,6 @@ "repository_download_url": null, "api_data_url": null, "datasource_id": "swift_package_resolved", - "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0" + "purl": "pkg:swift/github.com/mapbox/turf-swift@2.8.0" } ] \ No newline at end of file diff --git a/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json index 3f9b5d67d33..5a19fbd4472 100644 --- a/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json +++ b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json @@ -7,7 +7,7 @@ "version": null, "qualifiers": {}, "subpath": null, - "primary_language": "swift", + "primary_language": "Swift", "description": null, "release_date": null, "parties": [], @@ -51,43 +51,43 @@ ], "dependencies": [ { - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0", + "purl": "pkg:swift/mapbox-common-ios@24.4.0", "extracted_requirement": "24.4.0", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": true, "resolved_package": {}, "extra_data": {}, - "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "dependency_uid": "pkg:swift/mapbox-common-ios@24.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", "datafile_path": "Package.swift.json", "datasource_id": "swift_package_manifest_json" }, { - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0", + "purl": "pkg:swift/mapbox-core-maps-ios@11.4.0", "extracted_requirement": "11.4.0", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": true, "resolved_package": {}, "extra_data": {}, - "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "dependency_uid": "pkg:swift/mapbox-core-maps-ios@11.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", "datafile_path": "Package.swift.json", "datasource_id": "swift_package_manifest_json" }, { - "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0", + "purl": "pkg:swift/turf-swift@2.8.0", "extracted_requirement": "2.8.0", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": true, "resolved_package": {}, "extra_data": {}, - "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "dependency_uid": "pkg:swift/turf-swift@2.8.0?uuid=fixed-uid-done-for-testing-5642512d1758", "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", "datafile_path": "Package.swift.json", "datasource_id": "swift_package_manifest_json" @@ -100,8 +100,8 @@ "package_data": [ { "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fmapbox-common-ios", + "namespace": "github.com/mapbox", + "name": "mapbox-common-ios", "version": "24.4.0", "qualifiers": {}, "subpath": null, @@ -138,12 +138,12 @@ "repository_download_url": null, "api_data_url": null, "datasource_id": "swift_package_resolved", - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0" + "purl": "pkg:swift/github.com/mapbox/mapbox-common-ios@24.4.0" }, { "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fmapbox-core-maps-ios", + "namespace": "github.com/mapbox", + "name": "mapbox-core-maps-ios", "version": "11.4.0", "qualifiers": {}, "subpath": null, @@ -180,12 +180,12 @@ "repository_download_url": null, "api_data_url": null, "datasource_id": "swift_package_resolved", - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0" + "purl": "pkg:swift/github.com/mapbox/mapbox-core-maps-ios@11.4.0" }, { "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fturf-swift", + "namespace": "github.com/mapbox", + "name": "turf-swift", "version": "2.8.0", "qualifiers": {}, "subpath": null, @@ -222,7 +222,7 @@ "repository_download_url": null, "api_data_url": null, "datasource_id": "swift_package_resolved", - "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0" + "purl": "pkg:swift/github.com/mapbox/turf-swift@2.8.0" } ], "for_packages": [ @@ -241,7 +241,7 @@ "version": null, "qualifiers": {}, "subpath": null, - "primary_language": "swift", + "primary_language": "Swift", "description": null, "release_date": null, "parties": [], @@ -271,9 +271,9 @@ "extra_data": {}, "dependencies": [ { - "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift", + "purl": "pkg:swift/github.com/mapbox/turf-swift", "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": false, @@ -281,9 +281,9 @@ "extra_data": {} }, { - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0-rc.2", + "purl": "pkg:swift/github.com/mapbox/mapbox-core-maps-ios@11.4.0-rc.2", "extracted_requirement": "11.4.0-rc.2", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": true, @@ -291,9 +291,9 @@ "extra_data": {} }, { - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0-rc.2", + "purl": "pkg:swift/github.com/mapbox/mapbox-common-ios@24.4.0-rc.2", "extracted_requirement": "24.4.0-rc.2", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": true, diff --git a/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json index a222719a3c7..83b16f420af 100644 --- a/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json +++ b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json @@ -7,7 +7,7 @@ "version": null, "qualifiers": {}, "subpath": null, - "primary_language": "swift", + "primary_language": "Swift", "description": null, "release_date": null, "parties": [], @@ -49,43 +49,43 @@ ], "dependencies": [ { - "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift", + "purl": "pkg:swift/github.com/mapbox/turf-swift", "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": false, "resolved_package": {}, "extra_data": {}, - "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fturf-swift?uuid=fixed-uid-done-for-testing-5642512d1758", + "dependency_uid": "pkg:swift/github.com/mapbox/turf-swift?uuid=fixed-uid-done-for-testing-5642512d1758", "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", "datafile_path": "Package.swift.json", "datasource_id": "swift_package_manifest_json" }, { - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0-rc.2", + "purl": "pkg:swift/github.com/mapbox/mapbox-core-maps-ios@11.4.0-rc.2", "extracted_requirement": "11.4.0-rc.2", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": true, "resolved_package": {}, "extra_data": {}, - "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0-rc.2?uuid=fixed-uid-done-for-testing-5642512d1758", + "dependency_uid": "pkg:swift/github.com/mapbox/mapbox-core-maps-ios@11.4.0-rc.2?uuid=fixed-uid-done-for-testing-5642512d1758", "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", "datafile_path": "Package.swift.json", "datasource_id": "swift_package_manifest_json" }, { - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0-rc.2", + "purl": "pkg:swift/github.com/mapbox/mapbox-common-ios@24.4.0-rc.2", "extracted_requirement": "24.4.0-rc.2", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": true, "resolved_package": {}, "extra_data": {}, - "dependency_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0-rc.2?uuid=fixed-uid-done-for-testing-5642512d1758", + "dependency_uid": "pkg:swift/github.com/mapbox/mapbox-common-ios@24.4.0-rc.2?uuid=fixed-uid-done-for-testing-5642512d1758", "for_package_uid": "pkg:swift/MapboxMaps?uuid=fixed-uid-done-for-testing-5642512d1758", "datafile_path": "Package.swift.json", "datasource_id": "swift_package_manifest_json" @@ -103,7 +103,7 @@ "version": null, "qualifiers": {}, "subpath": null, - "primary_language": "swift", + "primary_language": "Swift", "description": null, "release_date": null, "parties": [], @@ -133,9 +133,9 @@ "extra_data": {}, "dependencies": [ { - "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift", + "purl": "pkg:swift/github.com/mapbox/turf-swift", "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": false, @@ -143,9 +143,9 @@ "extra_data": {} }, { - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0-rc.2", + "purl": "pkg:swift/github.com/mapbox/mapbox-core-maps-ios@11.4.0-rc.2", "extracted_requirement": "11.4.0-rc.2", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": true, @@ -153,9 +153,9 @@ "extra_data": {} }, { - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0-rc.2", + "purl": "pkg:swift/github.com/mapbox/mapbox-common-ios@24.4.0-rc.2", "extracted_requirement": "24.4.0-rc.2", - "scope": "install", + "scope": "dependencies", "is_runtime": true, "is_optional": false, "is_resolved": true, diff --git a/tests/packagedcode/data/swift/swift-mapboxmaps-resolved-package-expected.json b/tests/packagedcode/data/swift/swift-mapboxmaps-resolved-package-expected.json deleted file mode 100644 index bf851a0a30d..00000000000 --- a/tests/packagedcode/data/swift/swift-mapboxmaps-resolved-package-expected.json +++ /dev/null @@ -1,297 +0,0 @@ -{ - "packages": [ - { - "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fmapbox-common-ios", - "version": "24.4.0", - "qualifiers": {}, - "subpath": null, - "primary_language": "swift", - "description": null, - "release_date": null, - "parties": [], - "keywords": [], - "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": null, - "copyright": null, - "holder": null, - "declared_license_expression": null, - "declared_license_expression_spdx": null, - "license_detections": [], - "other_license_expression": null, - "other_license_expression_spdx": null, - "other_license_detections": [], - "extracted_license_statement": null, - "notice_text": null, - "source_packages": [], - "extra_data": {}, - "repository_homepage_url": null, - "repository_download_url": null, - "api_data_url": null, - "package_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", - "datafile_paths": [ - "Package.resolved" - ], - "datasource_ids": [ - "swift_package_resolved" - ], - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0" - }, - { - "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fmapbox-core-maps-ios", - "version": "11.4.0", - "qualifiers": {}, - "subpath": null, - "primary_language": "swift", - "description": null, - "release_date": null, - "parties": [], - "keywords": [], - "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": null, - "copyright": null, - "holder": null, - "declared_license_expression": null, - "declared_license_expression_spdx": null, - "license_detections": [], - "other_license_expression": null, - "other_license_expression_spdx": null, - "other_license_detections": [], - "extracted_license_statement": null, - "notice_text": null, - "source_packages": [], - "extra_data": {}, - "repository_homepage_url": null, - "repository_download_url": null, - "api_data_url": null, - "package_uid": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", - "datafile_paths": [ - "Package.resolved" - ], - "datasource_ids": [ - "swift_package_resolved" - ], - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0" - }, - { - "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fturf-swift", - "version": "2.8.0", - "qualifiers": {}, - "subpath": null, - "primary_language": "swift", - "description": null, - "release_date": null, - "parties": [], - "keywords": [], - "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": null, - "copyright": null, - "holder": null, - "declared_license_expression": null, - "declared_license_expression_spdx": null, - "license_detections": [], - "other_license_expression": null, - "other_license_expression_spdx": null, - "other_license_detections": [], - "extracted_license_statement": null, - "notice_text": null, - "source_packages": [], - "extra_data": {}, - "repository_homepage_url": null, - "repository_download_url": null, - "api_data_url": null, - "package_uid": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0?uuid=fixed-uid-done-for-testing-5642512d1758", - "datafile_paths": [ - "Package.resolved" - ], - "datasource_ids": [ - "swift_package_resolved" - ], - "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0" - } - ], - "dependencies": [], - "files": [ - { - "path": "Package.resolved", - "type": "file", - "package_data": [ - { - "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fmapbox-common-ios", - "version": "24.4.0", - "qualifiers": {}, - "subpath": null, - "primary_language": "swift", - "description": null, - "release_date": null, - "parties": [], - "keywords": [], - "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": null, - "copyright": null, - "holder": null, - "declared_license_expression": null, - "declared_license_expression_spdx": null, - "license_detections": [], - "other_license_expression": null, - "other_license_expression_spdx": null, - "other_license_detections": [], - "extracted_license_statement": null, - "notice_text": null, - "source_packages": [], - "file_references": [], - "extra_data": {}, - "dependencies": [], - "repository_homepage_url": null, - "repository_download_url": null, - "api_data_url": null, - "datasource_id": "swift_package_resolved", - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0" - }, - { - "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fmapbox-core-maps-ios", - "version": "11.4.0", - "qualifiers": {}, - "subpath": null, - "primary_language": "swift", - "description": null, - "release_date": null, - "parties": [], - "keywords": [], - "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": null, - "copyright": null, - "holder": null, - "declared_license_expression": null, - "declared_license_expression_spdx": null, - "license_detections": [], - "other_license_expression": null, - "other_license_expression_spdx": null, - "other_license_detections": [], - "extracted_license_statement": null, - "notice_text": null, - "source_packages": [], - "file_references": [], - "extra_data": {}, - "dependencies": [], - "repository_homepage_url": null, - "repository_download_url": null, - "api_data_url": null, - "datasource_id": "swift_package_resolved", - "purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0" - }, - { - "type": "swift", - "namespace": null, - "name": "github.com%2Fmapbox%2Fturf-swift", - "version": "2.8.0", - "qualifiers": {}, - "subpath": null, - "primary_language": "swift", - "description": null, - "release_date": null, - "parties": [], - "keywords": [], - "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": null, - "copyright": null, - "holder": null, - "declared_license_expression": null, - "declared_license_expression_spdx": null, - "license_detections": [], - "other_license_expression": null, - "other_license_expression_spdx": null, - "other_license_detections": [], - "extracted_license_statement": null, - "notice_text": null, - "source_packages": [], - "file_references": [], - "extra_data": {}, - "dependencies": [], - "repository_homepage_url": null, - "repository_download_url": null, - "api_data_url": null, - "datasource_id": "swift_package_resolved", - "purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0" - } - ], - "for_packages": [ - "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", - "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0?uuid=fixed-uid-done-for-testing-5642512d1758", - "pkg:swift/github.com%252Fmapbox%252Fturf-swift@2.8.0?uuid=fixed-uid-done-for-testing-5642512d1758" - ], - "scan_errors": [] - }, - { - "path": "src", - "type": "directory", - "package_data": [], - "for_packages": [], - "scan_errors": [] - }, - { - "path": "src/mapbox.swift", - "type": "file", - "package_data": [], - "for_packages": [], - "scan_errors": [] - } - ] -} \ No newline at end of file diff --git a/tests/packagedcode/test_swift.py b/tests/packagedcode/test_swift.py index 9dcfef78ba8..0318c514489 100644 --- a/tests/packagedcode/test_swift.py +++ b/tests/packagedcode/test_swift.py @@ -82,10 +82,10 @@ def test_package_scan_swift_end_to_end_full_mapboxmaps_manifest_and_resolved(sel ) def test_package_scan_swift_end_to_end_full_mapboxmaps_resolved_only(self): - test_dir = self.get_test_loc("packages/mapboxmaps_resolved") + test_dir = self.get_test_loc("packages/fastlane_resolved_v1") result_file = self.get_temp_file("json") expected_file = self.get_test_loc( - "swift-mapboxmaps-resolved-package-expected.json" + "swift-fastlane-resolved-v1-package-expected.json" ) run_scan_click( [ From d4acaefeca2b34b627e8eb78dca0e87a44070d34 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Fri, 31 May 2024 23:43:40 +0530 Subject: [PATCH 14/14] Keep the platform details in the extra_data field Signed-off-by: Keshav Priyadarshi --- src/packagedcode/swift.py | 15 ++++--- ...ift-maboxmaps-manifest-parse-expected.json | 20 +++++++++- ...anifest-and-resolved-package-expected.json | 40 ++++++++++++++++++- ...-mapboxmaps-manifest-package-expected.json | 40 ++++++++++++++++++- 4 files changed, 102 insertions(+), 13 deletions(-) diff --git a/src/packagedcode/swift.py b/src/packagedcode/swift.py index b7ada928fdf..2dc9b5e3551 100644 --- a/src/packagedcode/swift.py +++ b/src/packagedcode/swift.py @@ -64,6 +64,7 @@ def _parse(cls, swift_manifest, package_only=False): ) dependencies = get_dependencies(swift_manifest.get("dependencies")) + platforms = swift_manifest.get("platforms", []) package_data = dict( datasource_id=cls.datasource_id, @@ -72,6 +73,7 @@ def _parse(cls, swift_manifest, package_only=False): namespace=None, name=swift_manifest.get("name"), dependencies=dependencies, + extra_data={"platforms": platforms}, ) return models.PackageData.from_data(package_data, package_only) @@ -179,18 +181,15 @@ class SwiftPackageResolvedHandler(models.DatafileHandler): def parse(cls, location, package_only=False): with io.open(location, encoding="utf-8") as loc: package_resolved = json.load(loc) - + resolved_doc_version = package_resolved.get("version") if resolved_doc_version in [2, 3]: yield from packages_from_resolved_v2_and_v3(package_resolved) - + if resolved_doc_version == 1: yield from packages_from_resolved_v1(package_resolved) - - - @classmethod def assemble( cls, package_data, resource, codebase, package_adder=models.add_to_package @@ -212,7 +211,8 @@ def assemble( codebase=codebase, package_adder=package_adder, ) - + + def packages_from_resolved_v2_and_v3(package_resolved): pinned = package_resolved.get("pins", []) @@ -242,6 +242,7 @@ def packages_from_resolved_v2_and_v3(package_resolved): ) yield models.PackageData.from_data(package_data, False) + def packages_from_resolved_v1(package_resolved): object = package_resolved.get("object", {}) pinned = object.get("pins", []) @@ -273,7 +274,6 @@ def packages_from_resolved_v1(package_resolved): yield models.PackageData.from_data(package_data, False) - def get_dependencies(dependencies): dependent_packages = [] for dependency in dependencies or []: @@ -328,4 +328,3 @@ def get_namespace_and_name(url): canonical_name = hostname + path return canonical_name.rsplit("/", 1) - diff --git a/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json b/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json index d73cf4d918b..e5abef4a602 100644 --- a/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json +++ b/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json @@ -33,7 +33,25 @@ "notice_text": null, "source_packages": [], "file_references": [], - "extra_data": {}, + "extra_data": { + "platforms": [ + { + "options": [], + "platformName": "ios", + "version": "12.0" + }, + { + "options": [], + "platformName": "macos", + "version": "10.15" + }, + { + "options": [], + "platformName": "visionos", + "version": "1.0" + } + ] + }, "dependencies": [ { "purl": "pkg:swift/github.com/mapbox/turf-swift", diff --git a/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json index 5a19fbd4472..047652da151 100644 --- a/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json +++ b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json @@ -33,7 +33,25 @@ "extracted_license_statement": null, "notice_text": null, "source_packages": [], - "extra_data": {}, + "extra_data": { + "platforms": [ + { + "options": [], + "platformName": "ios", + "version": "12.0" + }, + { + "options": [], + "platformName": "macos", + "version": "10.15" + }, + { + "options": [], + "platformName": "visionos", + "version": "1.0" + } + ] + }, "repository_homepage_url": null, "repository_download_url": null, "api_data_url": null, @@ -268,7 +286,25 @@ "notice_text": null, "source_packages": [], "file_references": [], - "extra_data": {}, + "extra_data": { + "platforms": [ + { + "options": [], + "platformName": "ios", + "version": "12.0" + }, + { + "options": [], + "platformName": "macos", + "version": "10.15" + }, + { + "options": [], + "platformName": "visionos", + "version": "1.0" + } + ] + }, "dependencies": [ { "purl": "pkg:swift/github.com/mapbox/turf-swift", diff --git a/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json index 83b16f420af..41a8e80982c 100644 --- a/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json +++ b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json @@ -33,7 +33,25 @@ "extracted_license_statement": null, "notice_text": null, "source_packages": [], - "extra_data": {}, + "extra_data": { + "platforms": [ + { + "options": [], + "platformName": "ios", + "version": "12.0" + }, + { + "options": [], + "platformName": "macos", + "version": "10.15" + }, + { + "options": [], + "platformName": "visionos", + "version": "1.0" + } + ] + }, "repository_homepage_url": null, "repository_download_url": null, "api_data_url": null, @@ -130,7 +148,25 @@ "notice_text": null, "source_packages": [], "file_references": [], - "extra_data": {}, + "extra_data": { + "platforms": [ + { + "options": [], + "platformName": "ios", + "version": "12.0" + }, + { + "options": [], + "platformName": "macos", + "version": "10.15" + }, + { + "options": [], + "platformName": "visionos", + "version": "1.0" + } + ] + }, "dependencies": [ { "purl": "pkg:swift/github.com/mapbox/turf-swift",