Skip to content

Commit 58f3696

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

48 files changed

Lines changed: 1381 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: 12 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,6 +70,7 @@ 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,
@@ -96,7 +97,7 @@ def build_packages_from_projects(metadata):
9697
parties = common_data.get('parties')
9798
if not parties:
9899
common_data['parties'] = []
99-
common_data['parties'].append(party)
100+
common_data['parties'].append(party.to_dict())
100101

101102
# license is just a URL in the json file, for example:
102103
# http://usefulinc.com/doap/licenses/asl20
@@ -127,10 +128,16 @@ def build_packages_from_projects(metadata):
127128
rdata['release_date'] = parse_date(release.get('created'))
128129
else:
129130
logger.warn('Unexpected date format for release date: {}'.format(release.get('created')))
130-
package = scan_models.Package(**rdata)
131+
package = scan_models.Package.from_package_data(
132+
package_data=rdata,
133+
datafile_path=uri,
134+
)
131135
yield package
132136
else:
133-
package = scan_models.Package(**common_data)
137+
package = scan_models.Package.from_package_data(
138+
package_data=common_data,
139+
datafile_path=uri,
140+
)
134141
yield package
135142

136143

minecode/mappers/bower.py

Lines changed: 9 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,7 @@ 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',
8384
)
8485

8586
if extracted_license_statement:
@@ -90,7 +91,7 @@ def build_packages_from_jsonfile(metadata, uri=None, purl=None):
9091
parties = common_data.get('parties')
9192
if not parties:
9293
common_data['parties'] = []
93-
common_data['parties'].append(scan_models.Party(name=author_content, role='author',))
94+
common_data['parties'].append(scan_models.Party(name=author_content, role='author',).to_dict())
9495
else:
9596
parties = common_data.get('parties')
9697
if not parties:
@@ -99,7 +100,7 @@ def build_packages_from_jsonfile(metadata, uri=None, purl=None):
99100
for author in author_content:
100101
author_split = author.split(':')
101102
if len(author_split) > 1:
102-
common_data['parties'].append(scan_models.Party(name=author_split[1].strip(), role='author',))
103+
common_data['parties'].append(scan_models.Party(name=author_split[1].strip(), role='author',).to_dict())
103104

104105
dependencies = []
105106
if dependencies_build:
@@ -108,7 +109,10 @@ def build_packages_from_jsonfile(metadata, uri=None, purl=None):
108109
dependencies.extend(dev_dependencies)
109110
if len(dependencies) > 0:
110111
common_data['dependencies'] = dependencies
111-
package = scan_models.Package(**common_data)
112+
package = scan_models.Package.from_package_data(
113+
package_data=common_data,
114+
datafile_path=uri,
115+
)
112116
package.set_purl(purl)
113117
yield package
114118

minecode/mappers/cpan.py

Lines changed: 12 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,7 @@ 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')),
6263
)
6364

6465
# Get the homepage_url, declared_license and vcs_repository/vcs_tool under resources section.
@@ -101,9 +102,12 @@ def build_packages_from_release_json(metadata, uri=None):
101102
type=scan_models.party_person,
102103
name=release.get('author'), role='author')
103104
common_data['parties'] = common_data.get('parties', [])
104-
common_data['parties'].append(party)
105+
common_data['parties'].append(party.to_dict())
105106

106-
package = scan_models.Package(**common_data)
107+
package = scan_models.Package.from_package_data(
108+
package_data=common_data,
109+
datafile_path=uri,
110+
)
107111
package_url = PackageURL(type='cpan', name=release.get('name'), version=release.get('version'))
108112
package.set_purl(package_url.to_string())
109113
yield package
@@ -173,6 +177,7 @@ def build_packages_from_metafile(metadata, uri=None, purl=None):
173177
# https://spdx.org/spdx-specification-21-web-version#h.49x2ik5
174178
vcs_repo = vcs_tool + '+' + vcs_repo
175179
common_data = dict(
180+
datasource_id="cpan_metadata_json",
176181
type='cpan',
177182
name=name,
178183
description=content.get('abstract', name),
@@ -201,9 +206,9 @@ def build_packages_from_metafile(metadata, uri=None, purl=None):
201206
email=author_email
202207
)
203208

204-
parties.append(party)
209+
parties.append(party.to_dict())
205210

206-
package = scan_models.PackageData(**common_data)
211+
package = scan_models.PackageData.from_data(package_data=common_data)
207212
package.set_purl(purl)
208213
yield package
209214

@@ -260,6 +265,7 @@ def build_packages_from_readmefile(metadata, uri=None, purl=None):
260265
vcs_repo = vcs_tool + '+' + vcs_repo
261266
copyr = content.get('COPYRIGHT and LICENSE')
262267
common_data = dict(
268+
datasource_id="cpan_readme",
263269
type='cpan',
264270
name=name,
265271
description=content.get('ABSTRACT', name),
@@ -284,7 +290,7 @@ def build_packages_from_readmefile(metadata, uri=None, purl=None):
284290
keywords_content = [content.get('KEYWORDS')]
285291
common_data['keywords'] = keywords_content
286292

287-
package = scan_models.PackageData(**common_data)
293+
package = scan_models.PackageData.from_data(package_data=common_data)
288294
package.set_purl(purl)
289295
yield package
290296

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)