Skip to content

Commit e2b50fc

Browse files
committed
Update package model with ignore_resource
* Package parsers can define what resources to ignore when returning package files * Resource and Codebase have been updated to support using this callable * Update tests Signed-off-by: Jono Yang <jyang@nexb.com>
1 parent d013440 commit e2b50fc

14 files changed

Lines changed: 316 additions & 67 deletions

File tree

src/packagedcode/about.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,12 @@
4949
logging.basicConfig(stream=sys.stdout)
5050
logger.setLevel(logging.DEBUG)
5151

52+
# TODO: Override get_package_resource so it returns the Resource that the ABOUT file is describing
5253

5354
@attr.s()
5455
class AboutPackage(models.Package):
5556
metafiles = ('*.ABOUT',)
5657
default_type = 'about'
57-
# This is a mapping containing path patterns that we do not want to return
58-
# as part of this Package's set of resources
59-
ignorable_path_patterns = {
60-
'node_modules': 'skip'
61-
}
6258

6359
@classmethod
6460
def recognize(cls, location):
@@ -76,13 +72,6 @@ def get_package_root(cls, manifest_resource, codebase):
7672
return child
7773
return manifest_resource
7874

79-
@classmethod
80-
def get_package_resources(cls, package_root, codebase):
81-
_ignored = partial(ignore.is_ignored, ignores=cls.ignorable_path_patterns, skip_special=False)
82-
yield package_root
83-
for resource in package_root.walk(codebase, topdown=True, ignored=_ignored):
84-
yield resource
85-
8675

8776
def is_about_file(location):
8877
return (filetype.is_file(location)

src/packagedcode/bower.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,6 @@
5656
class BowerPackage(models.Package):
5757
metafiles = ('bower.json', '.bower.json')
5858
default_type = 'bower'
59-
# This is a mapping containing path patterns that we do not want to return
60-
# as part of this Package's set of resources
61-
ignorable_path_patterns = {
62-
'node_modules': 'skip'
63-
}
6459

6560
@classmethod
6661
def recognize(cls, location):
@@ -70,13 +65,6 @@ def recognize(cls, location):
7065
def get_package_root(cls, manifest_resource, codebase):
7166
return manifest_resource.parent(codebase)
7267

73-
@classmethod
74-
def get_package_resources(cls, package_root, codebase):
75-
_ignored = partial(ignore.is_ignored, ignores=cls.ignorable_path_patterns, skip_special=False)
76-
yield package_root
77-
for resource in package_root.walk(codebase, topdown=True, ignored=_ignored):
78-
yield resource
79-
8068
def compute_normalized_license(self):
8169
return compute_normalized_license(self.declared_license)
8270

src/packagedcode/chef.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,6 @@ class ChefPackage(models.Package):
6969
default_web_baseurl = 'https://supermarket.chef.io/cookbooks'
7070
default_download_baseurl = 'https://supermarket.chef.io/cookbooks'
7171
default_api_baseurl = 'https://supermarket.chef.io/api/v1'
72-
# This is a mapping containing path patterns that we do not want to return
73-
# as part of this Package's set of resources
74-
ignorable_path_patterns = {
75-
'node_modules': 'skip'
76-
}
7772

7873
@classmethod
7974
def recognize(cls, location):
@@ -83,13 +78,6 @@ def recognize(cls, location):
8378
def get_package_root(cls, manifest_resource, codebase):
8479
return manifest_resource.parent(codebase)
8580

86-
@classmethod
87-
def get_package_resources(cls, package_root, codebase):
88-
_ignored = partial(ignore.is_ignored, ignores=cls.ignorable_path_patterns, skip_special=False)
89-
yield package_root
90-
for resource in package_root.walk(codebase, topdown=True, ignored=_ignored):
91-
yield resource
92-
9381
def repository_download_url(self, baseurl=default_download_baseurl):
9482
return chef_download_url(self.name, self.version, registry=baseurl)
9583

src/packagedcode/models.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -511,10 +511,23 @@ def get_package_resources(cls, package_root, codebase):
511511
"""
512512
Yield the Resources of a Package starting from `package_root`
513513
"""
514-
yield package_root
515-
for resource in package_root.walk(codebase, topdown=True):
514+
if not Package.is_ignored_package_resource(package_root, codebase):
515+
yield package_root
516+
for resource in package_root.walk(codebase, topdown=True, ignored=Package.is_ignored_package_resource):
516517
yield resource
517518

519+
@classmethod
520+
def ignore_resource(cls, resource, codebase):
521+
"""
522+
Return True if `resource` should be ignored.
523+
"""
524+
return False
525+
526+
@staticmethod
527+
def is_ignored_package_resource(resource, codebase):
528+
from packagedcode import PACKAGE_TYPES
529+
return any(pt.ignore_resource(resource, codebase) for pt in PACKAGE_TYPES)
530+
518531
def compute_normalized_license(self):
519532
"""
520533
Return a normalized license_expression string using the declared_license

src/packagedcode/npm.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,6 @@ class NpmPackage(models.Package):
7878
default_web_baseurl = 'https://www.npmjs.com/package'
7979
default_download_baseurl = 'https://registry.npmjs.org'
8080
default_api_baseurl = 'https://registry.npmjs.org'
81-
# This is a mapping containing path patterns that we do not want to return
82-
# as part of this Package's set of resources
83-
ignorable_path_patterns = {
84-
'node_modules': 'skip'
85-
}
8681

8782
@classmethod
8883
def recognize(cls, location):
@@ -93,11 +88,8 @@ def get_package_root(cls, manifest_resource, codebase):
9388
return manifest_resource.parent(codebase)
9489

9590
@classmethod
96-
def get_package_resources(cls, package_root, codebase):
97-
_ignored = partial(ignore.is_ignored, ignores=cls.ignorable_path_patterns, skip_special=False)
98-
yield package_root
99-
for resource in package_root.walk(codebase, topdown=True, ignored=_ignored):
100-
yield resource
91+
def ignore_resource(cls, resource, codebase):
92+
return resource.is_dir and resource.name == 'node_modules'
10193

10294
def repository_homepage_url(self, baseurl=default_web_baseurl):
10395
return npm_homepage_url(self.namespace, self.name, registry=baseurl)

src/scancode/cli_test_utils.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ def remove_windows_extra_timeout(scancode_options, timeout=WINDOWS_CI_TIMEOUT):
133133
del scancode_options['--timeout']
134134

135135

136-
def check_json_scan(expected_file, result_file, regen=False, remove_file_date=False):
136+
def check_json_scan(expected_file, result_file, regen=False, remove_file_date=False, ignore_headers=False):
137137
"""
138138
Check the scan `result_file` JSON results against the `expected_file`
139139
expected JSON results.
@@ -151,6 +151,10 @@ def check_json_scan(expected_file, result_file, regen=False, remove_file_date=Fa
151151

152152
expected = load_json_result(expected_file, remove_file_date)
153153

154+
if ignore_headers:
155+
results.pop('headers', None)
156+
expected.pop('headers', None)
157+
154158
# NOTE we redump the JSON as a string for a more efficient display of the
155159
# failures comparison/diff
156160
# TODO: remove sort, this should no longer be needed

src/scancode/resource.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,13 @@ def from_dict(cls, **kwargs):
164164
return cls(**kwargs)
165165

166166

167-
def ignore_nothing(_):
167+
def ignore_nothing(resource, codebase):
168+
"""
169+
Return True if `resource` should be ignored.
170+
171+
This function is used as a callable for `ignored` argument in Codebase and
172+
Resource walk.
173+
"""
168174
return False
169175

170176

@@ -775,10 +781,13 @@ def walk(self, topdown=True, skip_root=False, ignored=ignore_nothing):
775781
776782
If `skip_root` is True, the root resource is not returned unless this is
777783
a codebase with a single resource.
784+
785+
`ignored` is a callable that accepts two arguments, `resource` and `codebase`,
786+
and returns True if `resource` should be ignored.
778787
"""
779788
root = self.root
780789

781-
if ignored(root.path):
790+
if ignored(root, self):
782791
return
783792

784793
root = attr.evolve(root)
@@ -1116,17 +1125,21 @@ def walk(self, codebase, topdown=True, ignored=ignore_nothing):
11161125
11171126
Each level is sorted by children sort order (e.g. without-children, then
11181127
with-children and each group by case-insensitive name)
1128+
1129+
`ignored` is a callable that accepts two arguments, `resource` and `codebase`,
1130+
and returns True if `resource` should be ignored.
11191131
"""
11201132

11211133
for child in self.children(codebase):
1122-
child = attr.evolve(child)
1123-
if topdown and not ignored(child.path):
1124-
yield child
1125-
for subchild in child.walk(codebase, topdown=topdown, ignored=ignored):
1126-
if not ignored(subchild.path):
1127-
yield subchild
1128-
if not topdown and not ignored(child.path):
1129-
yield child
1134+
if not ignored(child, codebase):
1135+
child = attr.evolve(child)
1136+
if topdown:
1137+
yield child
1138+
for subchild in child.walk(codebase, topdown=topdown, ignored=ignored):
1139+
if not ignored(subchild, codebase):
1140+
yield subchild
1141+
if not topdown:
1142+
yield child
11301143

11311144
def has_children(self):
11321145
"""

0 commit comments

Comments
 (0)