diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b5ba1c27078..e11ca9714bd 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -43,6 +43,14 @@ v33.0.0 (next next, roadmap) - Better handle workspace data thorugh extra_data attribute See https://github.com/nexB/scancode-toolkit/pull/3783 +- 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) ---------------------------- diff --git a/docs/source/reference/available_package_parsers.rst b/docs/source/reference/available_package_parsers.rst index 5b435abaa1f..45a3a4c15ee 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,19 @@ parsers in scancode-toolkit during documentation builds. - ``squashfs_disk_image`` - None - https://en.wikipedia.org/wiki/SquashFS + * - JSON dump of Package.swift created with ``swift package dump-package > Package.swift.json`` + - ``*/Package.swift.json`` + - ``swift`` + - ``swift_package_manifest_json`` + - Swift + - https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html + * - Resolved full dependency lockfile for Package.swift created with ``swift package resolve`` + - ``*/Package.resolved`` + ``*/.package.resolved`` + - ``swift`` + - ``swift_package_resolved`` + - swift + - https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html#package-dependency * - Java Web Application Archive - ``*.war`` - ``war`` 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..2dc9b5e3551 --- /dev/null +++ b/src/packagedcode/swift.py @@ -0,0 +1,330 @@ +# 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 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`` +- To create the Package.resolved lock file, run this: ``swift package resolve`` +""" + + +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 Package.swift created with ``swift package dump-package > Package.swift.json``" + 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")) + platforms = swift_manifest.get("platforms", []) + + 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, + extra_data={"platforms": platforms}, + ) + + 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="dependencies", + 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", "*/.package.resolved") + default_package_type = "swift" + default_primary_language = "swift" + 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" + ) + + @classmethod + 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 + ): + 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 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): + dependent_packages = [] + for dependency in dependencies or []: + source = dependency.get("sourceControl") + if not source: + continue + + source = source[0] + namespace = None + name = source.get("identity") + version = None + is_resolved = False + + location = source.get("location") + if remote := location.get("remote"): + namespace, name = get_namespace_and_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", + namespace=namespace, + name=name, + version=version if is_resolved else None, + ) + + dependent_packages.append( + models.DependentPackage( + purl=purl.to_string(), + scope="dependencies", + is_runtime=True, + is_optional=False, + is_resolved=is_resolved, + extracted_requirement=version, + ) + ) + return dependent_packages + + +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 canonical_name.rsplit("/", 1) diff --git a/tests/packagedcode/data/plugin/help.txt b/tests/packagedcode/data/plugin/help.txt index 8fb8389b38f..7fd5350bace 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 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 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 documentation URL: https://en.wikipedia.org/wiki/WAR_(file_format) 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/fastlane_resolved_v1/src/mapbox.swift b/tests/packagedcode/data/swift/packages/fastlane_resolved_v1/src/mapbox.swift new file mode 100644 index 00000000000..9cfc54157c9 --- /dev/null +++ b/tests/packagedcode/data/swift/packages/fastlane_resolved_v1/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/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/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 new file mode 100644 index 00000000000..e5abef4a602 --- /dev/null +++ b/tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json @@ -0,0 +1,93 @@ +[ + { + "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": { + "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", + "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com/mapbox/mapbox-core-maps-ios@11.4.0-rc.2", + "extracted_requirement": "11.4.0-rc.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com/mapbox/mapbox-common-ios@24.4.0-rc.2", + "extracted_requirement": "24.4.0-rc.2", + "scope": "dependencies", + "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..71bf3ebc80f --- /dev/null +++ b/tests/packagedcode/data/swift/swift-maboxmaps-resolved-parse-expected.json @@ -0,0 +1,128 @@ +[ + { + "type": "swift", + "namespace": "github.com/mapbox", + "name": "mapbox-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/mapbox/mapbox-common-ios@24.4.0" + }, + { + "type": "swift", + "namespace": "github.com/mapbox", + "name": "mapbox-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/mapbox/mapbox-core-maps-ios@11.4.0" + }, + { + "type": "swift", + "namespace": "github.com/mapbox", + "name": "turf-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/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 new file mode 100644 index 00000000000..047652da151 --- /dev/null +++ b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-and-resolved-package-expected.json @@ -0,0 +1,371 @@ +{ + "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": { + "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, + "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/mapbox-common-ios@24.4.0", + "extracted_requirement": "24.4.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {}, + "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/mapbox-core-maps-ios@11.4.0", + "extracted_requirement": "11.4.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {}, + "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/turf-swift@2.8.0", + "extracted_requirement": "2.8.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {}, + "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" + } + ], + "files": [ + { + "path": "Package.resolved", + "type": "file", + "package_data": [ + { + "type": "swift", + "namespace": "github.com/mapbox", + "name": "mapbox-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/mapbox/mapbox-common-ios@24.4.0" + }, + { + "type": "swift", + "namespace": "github.com/mapbox", + "name": "mapbox-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/mapbox/mapbox-core-maps-ios@11.4.0" + }, + { + "type": "swift", + "namespace": "github.com/mapbox", + "name": "turf-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/mapbox/turf-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": { + "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", + "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com/mapbox/mapbox-core-maps-ios@11.4.0-rc.2", + "extracted_requirement": "11.4.0-rc.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com/mapbox/mapbox-common-ios@24.4.0-rc.2", + "extracted_requirement": "24.4.0-rc.2", + "scope": "dependencies", + "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..41a8e80982c --- /dev/null +++ b/tests/packagedcode/data/swift/swift-mapboxmaps-manifest-package-expected.json @@ -0,0 +1,233 @@ +{ + "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": { + "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, + "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/mapbox/turf-swift", + "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {}, + "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/mapbox/mapbox-core-maps-ios@11.4.0-rc.2", + "extracted_requirement": "11.4.0-rc.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {}, + "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/mapbox/mapbox-common-ios@24.4.0-rc.2", + "extracted_requirement": "24.4.0-rc.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {}, + "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" + } + ], + "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": { + "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", + "extracted_requirement": "vers:swift/>=2.8.0|<3.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com/mapbox/mapbox-core-maps-ios@11.4.0-rc.2", + "extracted_requirement": "11.4.0-rc.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:swift/github.com/mapbox/mapbox-common-ios@24.4.0-rc.2", + "extracted_requirement": "24.4.0-rc.2", + "scope": "dependencies", + "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/test_swift.py b/tests/packagedcode/test_swift.py new file mode 100644 index 00000000000..0318c514489 --- /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/fastlane_resolved_v1") + result_file = self.get_temp_file("json") + expected_file = self.get_test_loc( + "swift-fastlane-resolved-v1-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 + )