Skip to content

Commit 3ffbd37

Browse files
Support SCTK v32.1
Signed-off-by: Ayan Sinha Mahapatra <ayansmahapatra@gmail.com>
1 parent 6039dd1 commit 3ffbd37

48 files changed

Lines changed: 1385 additions & 945 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

matchcode/utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
from matchcode_toolkit.fingerprinting import hexstring_to_binarray
2323

24+
from matchcode.tests import FIXTURES_REGEN
25+
2426

2527
############## TEST UTILITIES ##############
2628
"""
@@ -48,7 +50,7 @@ def get_test_loc(cls, path):
4850

4951
class CodebaseTester(object):
5052
def check_codebase(self, codebase, expected_codebase_json_loc,
51-
regen=False, remove_file_date=True):
53+
regen=FIXTURES_REGEN, remove_file_date=True):
5254
"""
5355
Check the Resources of the `codebase` Codebase objects are the same
5456
as the data in the `expected_codebase_json_loc` JSON file location,

minecode/mappers/apache.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ def get_packages(self, uri, resource_uri):
5555
package version.
5656
"""
5757
metadata = json.loads(resource_uri.data, object_pairs_hook=OrderedDict)
58-
return build_packages_from_projects(metadata)
58+
return build_packages_from_projects(metadata, uri=uri)
5959

6060

61-
def build_packages_from_projects(metadata):
61+
def build_packages_from_projects(metadata, uri=None):
6262
"""
6363
Yield Package built from Apache a `metadata` mapping
6464
which is a dictionary keyed by project name and values are project_metadata.
@@ -70,12 +70,14 @@ def build_packages_from_projects(metadata):
7070
descriptions = [d for d in (short_desc, long_desc) if d and d.strip()]
7171
description = '\n'.join(descriptions)
7272
common_data = dict(
73+
datasource_id="apache_json",
7374
type='apache',
7475
name=project_name,
7576
description=description,
7677
homepage_url=project_meta.get('homepage'),
7778
bug_tracking_url=project_meta.get('bug-database'),
7879
primary_language=project_meta.get('programming-language'),
80+
license_detections=[],
7981
)
8082

8183
# FIXME: setting the download-page as the download_url is not right
@@ -96,7 +98,7 @@ def build_packages_from_projects(metadata):
9698
parties = common_data.get('parties')
9799
if not parties:
98100
common_data['parties'] = []
99-
common_data['parties'].append(party)
101+
common_data['parties'].append(party.to_dict())
100102

101103
# license is just a URL in the json file, for example:
102104
# http://usefulinc.com/doap/licenses/asl20
@@ -127,10 +129,16 @@ def build_packages_from_projects(metadata):
127129
rdata['release_date'] = parse_date(release.get('created'))
128130
else:
129131
logger.warn('Unexpected date format for release date: {}'.format(release.get('created')))
130-
package = scan_models.Package(**rdata)
132+
package = scan_models.Package.from_package_data(
133+
package_data=rdata,
134+
datafile_path=uri,
135+
)
131136
yield package
132137
else:
133-
package = scan_models.Package(**common_data)
138+
package = scan_models.Package.from_package_data(
139+
package_data=common_data,
140+
datafile_path=uri,
141+
)
134142
yield package
135143

136144

minecode/mappers/bower.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ def build_packages_from_jsonfile(metadata, uri=None, purl=None):
5555
if devdependencies:
5656
for key, value in devdependencies.items():
5757
dev_dependencies.append(
58-
DependentPackage(purl=key, extracted_requirement=value, scope='devdependency')
58+
DependentPackage(purl=key, extracted_requirement=value, scope='devdependency').to_dict()
5959
)
6060

6161
dependencies = content.get('dependencies')
6262
dependencies_build = []
6363
if dependencies:
6464
for key, value in dependencies.items():
6565
dependencies_build.append(
66-
DependentPackage(purl=key, extracted_requirement=value, scope='runtime')
66+
DependentPackage(purl=key, extracted_requirement=value, scope='runtime').to_dict()
6767
)
6868

6969
if name:
@@ -80,6 +80,8 @@ def build_packages_from_jsonfile(metadata, uri=None, purl=None):
8080
vcs_url=vcs_repo,
8181
keywords=keywords_content,
8282
homepage_url=content.get('homepage'),
83+
datasource_id='bower_json',
84+
license_detections=[],
8385
)
8486

8587
if extracted_license_statement:
@@ -90,7 +92,7 @@ def build_packages_from_jsonfile(metadata, uri=None, purl=None):
9092
parties = common_data.get('parties')
9193
if not parties:
9294
common_data['parties'] = []
93-
common_data['parties'].append(scan_models.Party(name=author_content, role='author',))
95+
common_data['parties'].append(scan_models.Party(name=author_content, role='author',).to_dict())
9496
else:
9597
parties = common_data.get('parties')
9698
if not parties:
@@ -99,7 +101,7 @@ def build_packages_from_jsonfile(metadata, uri=None, purl=None):
99101
for author in author_content:
100102
author_split = author.split(':')
101103
if len(author_split) > 1:
102-
common_data['parties'].append(scan_models.Party(name=author_split[1].strip(), role='author',))
104+
common_data['parties'].append(scan_models.Party(name=author_split[1].strip(), role='author',).to_dict())
103105

104106
dependencies = []
105107
if dependencies_build:
@@ -108,7 +110,10 @@ def build_packages_from_jsonfile(metadata, uri=None, purl=None):
108110
dependencies.extend(dev_dependencies)
109111
if len(dependencies) > 0:
110112
common_data['dependencies'] = dependencies
111-
package = scan_models.Package(**common_data)
113+
package = scan_models.Package.from_package_data(
114+
package_data=common_data,
115+
datafile_path=uri,
116+
)
112117
package.set_purl(purl)
113118
yield package
114119

minecode/mappers/cpan.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def build_packages_from_release_json(metadata, uri=None):
5050
extracted_license_statement = [l for l in release.get('license', []) if l and l.strip()]
5151

5252
common_data = dict(
53+
datasource_id="cpan_release_json",
5354
type='cpan',
5455
name=name,
5556
description=release.get('abstract'),
@@ -58,7 +59,8 @@ def build_packages_from_release_json(metadata, uri=None):
5859
extracted_license_statement=extracted_license_statement,
5960
# the date format passing is like:
6061
# "2014-04-20T21:30:13"
61-
release_date=parse_date(release.get('date'))
62+
release_date=parse_date(release.get('date')),
63+
license_detections=[],
6264
)
6365

6466
# Get the homepage_url, declared_license and vcs_repository/vcs_tool under resources section.
@@ -101,9 +103,12 @@ def build_packages_from_release_json(metadata, uri=None):
101103
type=scan_models.party_person,
102104
name=release.get('author'), role='author')
103105
common_data['parties'] = common_data.get('parties', [])
104-
common_data['parties'].append(party)
106+
common_data['parties'].append(party.to_dict())
105107

106-
package = scan_models.Package(**common_data)
108+
package = scan_models.Package.from_package_data(
109+
package_data=common_data,
110+
datafile_path=uri,
111+
)
107112
package_url = PackageURL(type='cpan', name=release.get('name'), version=release.get('version'))
108113
package.set_purl(package_url.to_string())
109114
yield package
@@ -173,6 +178,7 @@ def build_packages_from_metafile(metadata, uri=None, purl=None):
173178
# https://spdx.org/spdx-specification-21-web-version#h.49x2ik5
174179
vcs_repo = vcs_tool + '+' + vcs_repo
175180
common_data = dict(
181+
datasource_id="cpan_metadata_json",
176182
type='cpan',
177183
name=name,
178184
description=content.get('abstract', name),
@@ -181,6 +187,7 @@ def build_packages_from_metafile(metadata, uri=None, purl=None):
181187
extracted_license_statement=extracted_license_statement,
182188
vcs_url=vcs_repo,
183189
keywords=keywords_content,
190+
license_detections=[],
184191
)
185192

186193
parties = common_data['parties'] = []
@@ -201,9 +208,9 @@ def build_packages_from_metafile(metadata, uri=None, purl=None):
201208
email=author_email
202209
)
203210

204-
parties.append(party)
211+
parties.append(party.to_dict())
205212

206-
package = scan_models.PackageData(**common_data)
213+
package = scan_models.PackageData.from_data(package_data=common_data)
207214
package.set_purl(purl)
208215
yield package
209216

@@ -260,6 +267,7 @@ def build_packages_from_readmefile(metadata, uri=None, purl=None):
260267
vcs_repo = vcs_tool + '+' + vcs_repo
261268
copyr = content.get('COPYRIGHT and LICENSE')
262269
common_data = dict(
270+
datasource_id="cpan_readme",
263271
type='cpan',
264272
name=name,
265273
description=content.get('ABSTRACT', name),
@@ -284,7 +292,7 @@ def build_packages_from_readmefile(metadata, uri=None, purl=None):
284292
keywords_content = [content.get('KEYWORDS')]
285293
common_data['keywords'] = keywords_content
286294

287-
package = scan_models.PackageData(**common_data)
295+
package = scan_models.PackageData.from_data(package_data=common_data)
288296
package.set_purl(purl)
289297
yield package
290298

minecode/mappers/cran.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def get_dependencies(depends):
4747
if not dependencies:
4848
return dep_pkgs
4949
for name in dependencies:
50-
dep_pkgs.append(scan_models.DependentPackage(purl=name))
50+
dep_pkgs.append(scan_models.DependentPackage(purl=name).to_dict())
5151
return dep_pkgs
5252

5353

@@ -60,7 +60,7 @@ def comma_separated(text):
6060
return [t.strip() for t in text.split(',') if t and t.strip()]
6161

6262

63-
def build_packages_from_html(metadata, uri, purl=None):
63+
def build_packages_from_html(metadata, uri=None, purl=None):
6464
"""
6565
Yield Package built from Cpan a `metadata` content
6666
metadata: json metadata content
@@ -69,6 +69,7 @@ def build_packages_from_html(metadata, uri, purl=None):
6969
"""
7070
# Parse the name from the url, for example: https://cloud.r-project.org/web/packages/ANN2/index.html
7171
common_data = dict(
72+
datasource_id="cran_metadata",
7273
type='cran',
7374
name=uri.rpartition('/')[0].rpartition('/')[-1]
7475
)
@@ -115,15 +116,15 @@ def build_packages_from_html(metadata, uri, purl=None):
115116
if not parties:
116117
common_data['parties'] = []
117118
party = scan_models.Party(type=scan_models.party_person, name=value, role='author')
118-
common_data['parties'].append(party)
119+
common_data['parties'].append(party.to_dict())
119120
elif key == 'Maintainer:':
120121
maintainer_split = value.split('<')
121122
if len(maintainer_split) > 1:
122123
parties = common_data.get('parties')
123124
if not parties:
124125
common_data['parties'] = []
125126
party = scan_models.Party(type=scan_models.party_person, name=maintainer_split[0].rstrip(), role='maintainer', email=maintainer_split[1].replace('>', '').replace(' at ', '@'))
126-
common_data['parties'].append(party)
127+
common_data['parties'].append(party.to_dict())
127128
elif 'source' in key or 'binaries' in key:
128129
if type(value) == list:
129130
for url in value:
@@ -140,12 +141,18 @@ def build_packages_from_html(metadata, uri, purl=None):
140141

141142
if download_urls: # for else statement will have else running always if there is no break statement
142143
for download_url in download_urls:
143-
package = scan_models.Package(**common_data)
144+
package = scan_models.Package.from_package_data(
145+
package_data=common_data,
146+
datafile_path=uri,
147+
)
144148
package.download_url = download_url
145149
package.set_purl(purl)
146150
yield package
147151
else:
148152
# Yield a package without download_url
149-
package = scan_models.Package(**common_data)
153+
package = scan_models.Package.from_package_data(
154+
package_data=common_data,
155+
datafile_path=uri,
156+
)
150157
package.set_purl(purl)
151158
yield package

minecode/mappers/debian.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ def build_packages_from_dist_archive(metadata, uri):
377377
# version by analysing the uri
378378
version = uri[folder_length:uri.index('/', folder_length)]
379379
common_data = dict(
380+
datasource_id="debian_archive_file",
380381
name=name,
381382
version=version,
382383
)
@@ -415,12 +416,18 @@ def get_resourceuri_by_uri(uri):
415416

416417
if download_urls:
417418
for download_url in download_urls:
418-
package = scan_models.Package(**common_data)
419+
package = scan_models.Package.from_package_data(
420+
package_data=common_data,
421+
datafile_path=uri,
422+
)
419423
package['download_url'] = download_url
420424
yield package
421425
else:
422426
# yield package without a download_url value
423-
package = scan_models.DebianPackage(**common_data)
427+
package = scan_models.Package.from_package_data(
428+
package_data=common_data,
429+
datafile_path=uri,
430+
)
424431
# FIXME: this is NOT RIGHT: purl is not defined
425-
package.set_purl(purl)
432+
package.set_purl(package.purl)
426433
yield package

minecode/mappers/eclipse.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ def get_packages(self, uri, resource_uri):
2929
"""
3030
# FIXME: JSON deserialization should be handled eventually by the framework
3131
metadata = json.loads(resource_uri.data)
32-
return build_packages_with_json(metadata, resource_uri.package_url)
32+
return build_packages_with_json(metadata, resource_uri.package_url, uri)
3333

3434

35-
def build_packages_with_json(metadata, purl=None):
35+
def build_packages_with_json(metadata, purl=None, uri=None):
3636
"""
3737
Yield Package built from Eclipse a `metadata` mapping
3838
The package can contain multiple projects, and each project can contain
@@ -44,6 +44,7 @@ def build_packages_with_json(metadata, purl=None):
4444
projects = metadata['projects']
4545
for project, project_metadata in projects.items():
4646
common_data = dict(
47+
datasource_id="eclipse_metadata",
4748
type='eclipse',
4849
name=project,
4950
)
@@ -70,7 +71,10 @@ def build_packages_with_json(metadata, purl=None):
7071
durl = download_url.get('url')
7172
if durl:
7273
common_data['download_url'] = durl
73-
package = scan_models.Package(**common_data)
74+
package = scan_models.Package.from_package_data(
75+
package_data=common_data,
76+
datafile_path=uri,
77+
)
7478
package.set_purl(purl)
7579
yield package
7680

@@ -84,16 +88,19 @@ def get_packages(self, uri, resource_uri):
8488
Yield as many Package as there are download URLs.
8589
"""
8690
# FIXME: JSON deserialization should be handled eventually by the framework
87-
return build_packages(resource_uri.data, resource_uri.package_url)
91+
return build_packages(resource_uri.data, resource_uri.package_url, uri)
8892

8993

90-
def build_packages(html_text, purl=None):
94+
def build_packages(html_text, purl=None, uri=None):
9195
"""
9296
Yield Package objects built from `html_text`and the `purl` package URL
9397
string.
9498
"""
9599
page = BeautifulSoup(html_text, 'lxml')
96-
common_data = dict(type='eclipse')
100+
common_data = dict(
101+
datasource_id="eclipse_html",
102+
type='eclipse',
103+
)
97104

98105
extracted_license_statement = []
99106
for meta in page.find_all(name='meta'):
@@ -126,7 +133,10 @@ def build_packages(html_text, purl=None):
126133
if str(a.contents[0]).strip() == 'Downloads':
127134
download_data = dict(download_url=a['href'],)
128135
download_data.update(common_data)
129-
package = scan_models.Package(**download_data)
136+
package = scan_models.Package.from_package_data(
137+
package_data=download_data,
138+
datafile_path=uri,
139+
)
130140
package.set_purl(purl)
131141
yield package
132142

@@ -151,8 +161,14 @@ def build_packages(html_text, purl=None):
151161

152162
version = a.contents[0]
153163
href = a['href']
154-
download_data = dict(version=version, download_url=href)
164+
download_data = dict(
165+
version=version,
166+
download_url=href,
167+
)
155168
download_data.update(common_data)
156-
package = scan_models.Package(**download_data)
169+
package = scan_models.Package.from_package_data(
170+
package_data=download_data,
171+
datafile_path=uri,
172+
)
157173
package.set_purl(purl)
158174
yield package

0 commit comments

Comments
 (0)