Skip to content

Commit 98fa3fd

Browse files
Merge pull request #4194 from abraemer/fix-conditions-for-bzl-package
Fix and enhance support for different bazel metadata versions
2 parents e4abe78 + 454910f commit 98fa3fd

File tree

4 files changed

+82
-48
lines changed

4 files changed

+82
-48
lines changed

AUTHORS.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ The following organizations or individuals have contributed to ScanCode:
33
- Abhigyan Kumar Singh @Abhigyankrsingh
44
- Abhishek Kumar @Abhishek-Dev09
55
- Aditya Viki @adityaviki
6+
- Adrian Braemer @abraemer
67
- Agni Bhattacharyya @PyAgni
78
- Akanksha Garg @akugarg
89
- Alex Blekhman @a-tinsmith

src/packagedcode/build.py

Lines changed: 46 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from collections import defaultdict
1414

1515
from commoncode import fileutils
16+
from packageurl import PackageURL
1617

1718
from licensedcode.cache import build_spdx_license_expression
1819
from licensedcode.cache import get_cache
@@ -374,54 +375,51 @@ def parse(cls, location, package_only=True):
374375
)
375376
)
376377

377-
if (
378-
'upstream_type'
379-
and 'name'
380-
and 'version'
381-
and 'licenses'
382-
and 'upstream_address'
383-
in metadata_fields
384-
):
385-
# TODO: Create function that determines package type from download URL,
386-
# then create a package of that package type from the metadata info
387-
package_data = dict(
388-
datasource_id=cls.datasource_id,
389-
type=metadata_fields.get('upstream_type', cls.default_package_type),
390-
name=metadata_fields.get('name'),
391-
version=metadata_fields.get('version'),
392-
extracted_license_statement=metadata_fields.get('licenses', []),
393-
parties=parties,
394-
homepage_url=metadata_fields.get('upstream_address', ''),
395-
# TODO: Store 'upstream_hash` somewhere
396-
)
397-
yield models.PackageData.from_data(package_data, package_only=True)
398-
399-
if (
400-
'package_type'
401-
and 'name'
402-
and 'version'
403-
and 'license_expression'
404-
and 'homepage_url'
405-
and 'download_url'
406-
and 'vcs_url'
407-
and 'download_archive_sha1'
408-
and 'vcs_commit_hash'
409-
in metadata_fields
410-
):
411-
package_data = dict(
412-
datasource_id=cls.datasource_id,
413-
type=metadata_fields.get('package_type', cls.default_package_type),
414-
name=metadata_fields.get('name'),
415-
version=metadata_fields.get('version'),
416-
extracted_license_statement=metadata_fields.get('license_expression', ''),
417-
parties=parties,
418-
homepage_url=metadata_fields.get('homepage_url', ''),
419-
download_url=metadata_fields.get('download_url', ''),
420-
vcs_url=metadata_fields.get('vcs_url', ''),
421-
sha1=metadata_fields.get('download_archive_sha1', ''),
422-
extra_data=dict(vcs_commit_hash=metadata_fields.get('vcs_commit_hash', ''))
423-
)
424-
yield models.PackageData.from_data(package_data, package_only=True)
378+
# TODO: Create function that determines package type from download URL,
379+
# then create a package of that package type from the metadata info
380+
381+
if 'upstream_type' in metadata_fields:
382+
package_type = metadata_fields['upstream_type']
383+
elif 'package_type' in metadata_fields:
384+
package_type = metadata_fields['package_type']
385+
else:
386+
package_type = cls.default_package_type
387+
388+
if 'licenses' in metadata_fields:
389+
extracted_license_statement = metadata_fields['licenses']
390+
else:
391+
extracted_license_statement = metadata_fields.get('license_expression')
392+
393+
if 'upstream_address' in metadata_fields:
394+
homepage_url = metadata_fields['upstream_address']
395+
else:
396+
homepage_url = metadata_fields.get('homepage_url')
397+
398+
399+
extra_data = {}
400+
if 'vcs_commit_hash' in metadata_fields:
401+
extra_data['vcs_commit_hash'] = metadata_fields['vcs_commit_hash']
402+
if 'upstream_hash' in metadata_fields:
403+
extra_data['upstream_hash'] = metadata_fields['upstream_hash']
404+
405+
package_data = dict(
406+
datasource_id=cls.datasource_id,
407+
type=package_type,
408+
name=metadata_fields.get('name'),
409+
version=metadata_fields.get('version'),
410+
extracted_license_statement=extracted_license_statement,
411+
parties=parties,
412+
homepage_url=homepage_url,
413+
download_url=metadata_fields.get('download_url'),
414+
vcs_url=metadata_fields.get('vcs_url'),
415+
sha1=metadata_fields.get('download_archive_sha1'),
416+
extra_data=extra_data
417+
)
418+
if 'package_url' in metadata_fields:
419+
package_data.update(PackageURL.from_string(metadata_fields['package_url']).to_dict())
420+
421+
yield models.PackageData.from_data(package_data, package_only=True)
422+
425423

426424
@classmethod
427425
def assign_package_to_resources(cls, package, resource, codebase, package_adder):
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
METADATA = {
2+
"licenses": [
3+
"BSD-3-Clause",
4+
],
5+
"maintainers": [
6+
"oss_foundation",
7+
],
8+
"name": "androidx.compose.animation:animation",
9+
"upstream_address": "https://developer.android.com/jetpack/androidx/releases/compose-animation#0.0.1",
10+
"version": "0.0.1",
11+
"package_url" : "pkg:maven/androidx.compose.animation/animation@0.0.1"
12+
}

tests/packagedcode/test_build.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,33 @@ def test_MetadataBzl_parse(self):
9999
role='maintainer'
100100
)
101101
],
102+
extra_data=dict(upstream_hash='deadbeef'),
102103
homepage_url='https://github.com/example/example',
103104
)
104105
expected_packages = [models.PackageData.from_data(package_data=package_data, package_only=True)]
105106
compare_package_results(expected_packages, result_packages)
107+
108+
def test_MetadataBzl_parse_with_package_url(self):
109+
test_file = self.get_test_loc('metadatabzl/with-package-url/METADATA.bzl')
110+
result_packages = build.BuckMetadataBzlHandler.parse(test_file, package_only=True)
111+
package_data = dict(
112+
datasource_id=build.BuckMetadataBzlHandler.datasource_id,
113+
name='animation',
114+
namespace='androidx.compose.animation',
115+
type='maven',
116+
version='0.0.1',
117+
extracted_license_statement=['BSD-3-Clause'],
118+
parties=[
119+
models.Party(
120+
type=models.party_org,
121+
name='oss_foundation',
122+
role='maintainer'
123+
)
124+
],
125+
homepage_url='https://developer.android.com/jetpack/androidx/releases/compose-animation#0.0.1',
126+
)
127+
expected_packages = [models.PackageData.from_data(package_data=package_data, package_only=True)]
128+
compare_package_results(expected_packages, result_packages)
106129

107130
def test_MetadataBzl_recognize_new_format(self):
108131
test_file = self.get_test_loc('metadatabzl/new-format/METADATA.bzl')

0 commit comments

Comments
 (0)