Skip to content

Commit dc86a47

Browse files
authored
Merge pull request #3430 from nexB/fix-summary-license
Fix licenses data in summary plugin
2 parents 0d5d2fd + e367fa2 commit dc86a47

File tree

60 files changed

+656
-671
lines changed

Some content is hidden

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

60 files changed

+656
-671
lines changed

src/licensedcode/detection.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,20 @@ def get_license_detection_object(self):
810810
)
811811

812812

813+
def sort_unique_detections(license_detections):
814+
"""
815+
Return a sorted list of UniqueDetection mappings from a unsorted list of the same.
816+
These are sorted in alphabetical order of the license_expression (and same license
817+
expressions are sorted by their detection_count in descending order, and then by their
818+
UUID).
819+
"""
820+
821+
def by_expression_count(detection):
822+
return detection["license_expression"], -detection["detection_count"], detection["identifier"]
823+
824+
return sorted(license_detections, key=by_expression_count)
825+
826+
813827
def get_detections_by_id(license_detections):
814828
"""
815829
Get a dict(hashmap) where each item is: {detection.identifier: all_detections} where

src/licensedcode/plugin_license.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from licensedcode.detection import get_referenced_filenames
2828
from licensedcode.detection import DetectionCategory
2929
from licensedcode.detection import LicenseDetectionFromResult
30+
from licensedcode.detection import sort_unique_detections
3031
from licensedcode.detection import UniqueDetection
3132
from packagedcode.utils import combine_expressions
3233
from scancode.api import SCANCODE_LICENSEDB_URL
@@ -228,11 +229,13 @@ def process_codebase(self, codebase, license_diagnostics, **kwargs):
228229
f'unique_license_detections: {unique_license_detections}',
229230
)
230231

231-
codebase.attributes.license_detections.extend([
232+
unsorted_license_detections = [
232233
unique_detection.to_dict(license_diagnostics=license_diagnostics)
233234
for unique_detection in unique_license_detections
234-
])
235-
235+
]
236+
codebase.attributes.license_detections.extend(
237+
sort_unique_detections(unsorted_license_detections)
238+
)
236239

237240

238241
def add_referenced_filenames_license_matches_for_detections(resource, codebase):

src/summarycode/tallies.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,25 +159,46 @@ def license_tallies(resource, children, keep_details=False):
159159
sorted by decreasing count.
160160
"""
161161
LIC_EXP = 'detected_license_expression'
162+
LIC_DET = 'license_detections'
163+
LIC_CLUE = 'license_clues'
162164
license_expressions = []
163165

164166
# Collect current data
165-
lic_expression = getattr(resource, LIC_EXP, None)
166-
if not lic_expression and resource.is_file:
167+
detected_expressions = []
168+
for detection in getattr(resource, LIC_DET, []):
169+
detected_expressions.append(detection["license_expression"])
170+
for match in getattr(resource, LIC_CLUE, []):
171+
detected_expressions.append(match["license_expression"])
172+
173+
package_license_detections = []
174+
PACKAGE_DATA = 'package_data'
175+
package_data = getattr(resource, PACKAGE_DATA, [])
176+
if package_data:
177+
package_license_detections.extend(
178+
[
179+
detection
180+
for detection in getattr(package_data, LIC_DET, [])
181+
if detection
182+
]
183+
)
184+
185+
for detection in package_license_detections:
186+
detected_expressions.append(detection["license_expression"])
187+
188+
if not detected_expressions and resource.is_file:
167189
# also count files with no detection
168190
license_expressions.append(None)
169191
else:
170-
license_expressions.append(lic_expression)
192+
license_expressions.extend(detected_expressions)
171193

172194
# Collect direct children expression tallies
173195
for child in children:
174196
child_tallies = get_resource_tallies(child, key=LIC_EXP, as_attribute=keep_details) or []
175197
for child_tally in child_tallies:
176198
# TODO: review this: this feels rather weird
177199
child_sum_val = child_tally.get('value')
178-
if child_sum_val:
179-
values = [child_sum_val] * child_tally['count']
180-
license_expressions.extend(values)
200+
values = [child_sum_val] * child_tally['count']
201+
license_expressions.extend(values)
181202

182203
# summarize proper
183204
licenses_counter = tally_licenses(license_expressions)

tests/cluecode/data/copyrights/openoffice_org_report_builder_bin.copyright.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ copyrights:
1818
- Copyright (c) 2002 France Telecom
1919
- Copyright (c) 1990-2003 Sleepycat Software
2020
- Copyright (c) 1990, 1993, 1994, 1995 The Regents of the University of California
21-
- Copyright (c) 2003 by Bitstream, Inc. Cppyright
21+
- Copyright (c) 2003 by Bitstream, Inc.
2222
- Copyright (c) 2006 by Tavmjong Bah
2323
- Copyright (c) 2007 Red Hat, Inc
2424
- Copyright (c) 2007 Red Hat, Inc.

tests/formattedcode/data/common/manifests-expected.json

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -471,39 +471,34 @@
471471
],
472472
"license_detections": [
473473
{
474-
"identifier": "cddl_1_0-c6dbef4d-659c-289f-5ee9-1ca0278edad6",
475-
"license_expression": "cddl-1.0",
476-
"detection_count": 1
474+
"identifier": "apache_2_0-d66ab77d-a5cc-7104-e702-dc7df61fe9e8",
475+
"license_expression": "apache-2.0",
476+
"detection_count": 3
477477
},
478478
{
479-
"identifier": "cddl_1_0-9893b55c-3b2b-4ee8-a932-6c6c93a63fc5",
480-
"license_expression": "cddl-1.0",
479+
"identifier": "apache_2_0-ec759ae0-ea5a-f138-793e-388520e080c0",
480+
"license_expression": "apache-2.0",
481481
"detection_count": 1
482482
},
483483
{
484-
"identifier": "cddl_1_0-ef82fc8c-50cb-6f35-1814-d2eb0bc13e83",
484+
"identifier": "cddl_1_0-9893b55c-3b2b-4ee8-a932-6c6c93a63fc5",
485485
"license_expression": "cddl-1.0",
486486
"detection_count": 1
487487
},
488488
{
489-
"identifier": "apache_2_0-ec759ae0-ea5a-f138-793e-388520e080c0",
490-
"license_expression": "apache-2.0",
489+
"identifier": "cddl_1_0-c6dbef4d-659c-289f-5ee9-1ca0278edad6",
490+
"license_expression": "cddl-1.0",
491491
"detection_count": 1
492492
},
493493
{
494-
"identifier": "apache_2_0-d66ab77d-a5cc-7104-e702-dc7df61fe9e8",
495-
"license_expression": "apache-2.0",
496-
"detection_count": 3
497-
},
498-
{
499-
"identifier": "mit-3fce6ea2-8abd-6c6b-3ede-a37af7c6efee",
500-
"license_expression": "mit",
494+
"identifier": "cddl_1_0-ef82fc8c-50cb-6f35-1814-d2eb0bc13e83",
495+
"license_expression": "cddl-1.0",
501496
"detection_count": 1
502497
},
503498
{
504-
"identifier": "mit-a822f434-d61f-f2b1-c792-8b8cb9e7b9bf",
505-
"license_expression": "mit",
506-
"detection_count": 1
499+
"identifier": "lgpl_3_0-272571eb-5e68-95b6-ddb0-71de2d8df321",
500+
"license_expression": "lgpl-3.0",
501+
"detection_count": 2
507502
},
508503
{
509504
"identifier": "lgpl_3_0-121be3c2-9c80-df84-d3da-8f674e4125c0",
@@ -516,13 +511,18 @@
516511
"detection_count": 1
517512
},
518513
{
519-
"identifier": "lgpl_3_0-272571eb-5e68-95b6-ddb0-71de2d8df321",
514+
"identifier": "lgpl_3_0-38174920-e8ed-7bda-41ec-94df7380b7d5",
520515
"license_expression": "lgpl-3.0",
521-
"detection_count": 2
516+
"detection_count": 1
522517
},
523518
{
524-
"identifier": "lgpl_3_0-38174920-e8ed-7bda-41ec-94df7380b7d5",
525-
"license_expression": "lgpl-3.0",
519+
"identifier": "mit-3fce6ea2-8abd-6c6b-3ede-a37af7c6efee",
520+
"license_expression": "mit",
521+
"detection_count": 1
522+
},
523+
{
524+
"identifier": "mit-a822f434-d61f-f2b1-c792-8b8cb9e7b9bf",
525+
"license_expression": "mit",
526526
"detection_count": 1
527527
}
528528
],

tests/formattedcode/data/common/manifests-expected.jsonlines

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -507,39 +507,34 @@
507507
{
508508
"license_detections": [
509509
{
510-
"identifier": "cddl_1_0-c6dbef4d-659c-289f-5ee9-1ca0278edad6",
511-
"license_expression": "cddl-1.0",
512-
"detection_count": 1
510+
"identifier": "apache_2_0-d66ab77d-a5cc-7104-e702-dc7df61fe9e8",
511+
"license_expression": "apache-2.0",
512+
"detection_count": 3
513513
},
514514
{
515-
"identifier": "cddl_1_0-9893b55c-3b2b-4ee8-a932-6c6c93a63fc5",
516-
"license_expression": "cddl-1.0",
515+
"identifier": "apache_2_0-ec759ae0-ea5a-f138-793e-388520e080c0",
516+
"license_expression": "apache-2.0",
517517
"detection_count": 1
518518
},
519519
{
520-
"identifier": "cddl_1_0-ef82fc8c-50cb-6f35-1814-d2eb0bc13e83",
520+
"identifier": "cddl_1_0-9893b55c-3b2b-4ee8-a932-6c6c93a63fc5",
521521
"license_expression": "cddl-1.0",
522522
"detection_count": 1
523523
},
524524
{
525-
"identifier": "apache_2_0-ec759ae0-ea5a-f138-793e-388520e080c0",
526-
"license_expression": "apache-2.0",
525+
"identifier": "cddl_1_0-c6dbef4d-659c-289f-5ee9-1ca0278edad6",
526+
"license_expression": "cddl-1.0",
527527
"detection_count": 1
528528
},
529529
{
530-
"identifier": "apache_2_0-d66ab77d-a5cc-7104-e702-dc7df61fe9e8",
531-
"license_expression": "apache-2.0",
532-
"detection_count": 3
533-
},
534-
{
535-
"identifier": "mit-3fce6ea2-8abd-6c6b-3ede-a37af7c6efee",
536-
"license_expression": "mit",
530+
"identifier": "cddl_1_0-ef82fc8c-50cb-6f35-1814-d2eb0bc13e83",
531+
"license_expression": "cddl-1.0",
537532
"detection_count": 1
538533
},
539534
{
540-
"identifier": "mit-a822f434-d61f-f2b1-c792-8b8cb9e7b9bf",
541-
"license_expression": "mit",
542-
"detection_count": 1
535+
"identifier": "lgpl_3_0-272571eb-5e68-95b6-ddb0-71de2d8df321",
536+
"license_expression": "lgpl-3.0",
537+
"detection_count": 2
543538
},
544539
{
545540
"identifier": "lgpl_3_0-121be3c2-9c80-df84-d3da-8f674e4125c0",
@@ -552,13 +547,18 @@
552547
"detection_count": 1
553548
},
554549
{
555-
"identifier": "lgpl_3_0-272571eb-5e68-95b6-ddb0-71de2d8df321",
550+
"identifier": "lgpl_3_0-38174920-e8ed-7bda-41ec-94df7380b7d5",
556551
"license_expression": "lgpl-3.0",
557-
"detection_count": 2
552+
"detection_count": 1
558553
},
559554
{
560-
"identifier": "lgpl_3_0-38174920-e8ed-7bda-41ec-94df7380b7d5",
561-
"license_expression": "lgpl-3.0",
555+
"identifier": "mit-3fce6ea2-8abd-6c6b-3ede-a37af7c6efee",
556+
"license_expression": "mit",
557+
"detection_count": 1
558+
},
559+
{
560+
"identifier": "mit-a822f434-d61f-f2b1-c792-8b8cb9e7b9bf",
561+
"license_expression": "mit",
562562
"detection_count": 1
563563
}
564564
]

tests/formattedcode/data/common/manifests-expected.yaml

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,12 @@ summary:
4747
declared_holder:
4848
primary_language: Python
4949
other_license_expressions:
50-
- value:
51-
count: 1
50+
- value: lgpl-3.0
51+
count: 3
5252
- value: apache-2.0
53-
count: 1
53+
count: 2
5454
- value: cddl-1.0
5555
count: 1
56-
- value: lgpl-3.0
57-
count: 1
5856
- value: mit
5957
count: 1
6058
other_holders:
@@ -465,39 +463,39 @@ dependencies:
465463
datafile_path: manifests/npm-license-string/package.json
466464
datasource_id: npm_package_json
467465
license_detections:
468-
- identifier: cddl_1_0-c6dbef4d-659c-289f-5ee9-1ca0278edad6
469-
license_expression: cddl-1.0
466+
- identifier: apache_2_0-d66ab77d-a5cc-7104-e702-dc7df61fe9e8
467+
license_expression: apache-2.0
468+
detection_count: 3
469+
- identifier: apache_2_0-ec759ae0-ea5a-f138-793e-388520e080c0
470+
license_expression: apache-2.0
470471
detection_count: 1
471472
- identifier: cddl_1_0-9893b55c-3b2b-4ee8-a932-6c6c93a63fc5
472473
license_expression: cddl-1.0
473474
detection_count: 1
474-
- identifier: cddl_1_0-ef82fc8c-50cb-6f35-1814-d2eb0bc13e83
475+
- identifier: cddl_1_0-c6dbef4d-659c-289f-5ee9-1ca0278edad6
475476
license_expression: cddl-1.0
476477
detection_count: 1
477-
- identifier: apache_2_0-ec759ae0-ea5a-f138-793e-388520e080c0
478-
license_expression: apache-2.0
479-
detection_count: 1
480-
- identifier: apache_2_0-d66ab77d-a5cc-7104-e702-dc7df61fe9e8
481-
license_expression: apache-2.0
482-
detection_count: 3
483-
- identifier: mit-3fce6ea2-8abd-6c6b-3ede-a37af7c6efee
484-
license_expression: mit
485-
detection_count: 1
486-
- identifier: mit-a822f434-d61f-f2b1-c792-8b8cb9e7b9bf
487-
license_expression: mit
478+
- identifier: cddl_1_0-ef82fc8c-50cb-6f35-1814-d2eb0bc13e83
479+
license_expression: cddl-1.0
488480
detection_count: 1
481+
- identifier: lgpl_3_0-272571eb-5e68-95b6-ddb0-71de2d8df321
482+
license_expression: lgpl-3.0
483+
detection_count: 2
489484
- identifier: lgpl_3_0-121be3c2-9c80-df84-d3da-8f674e4125c0
490485
license_expression: lgpl-3.0
491486
detection_count: 1
492487
- identifier: lgpl_3_0-2db87bcf-56b4-9d7d-7075-2effae31c631
493488
license_expression: lgpl-3.0
494489
detection_count: 1
495-
- identifier: lgpl_3_0-272571eb-5e68-95b6-ddb0-71de2d8df321
496-
license_expression: lgpl-3.0
497-
detection_count: 2
498490
- identifier: lgpl_3_0-38174920-e8ed-7bda-41ec-94df7380b7d5
499491
license_expression: lgpl-3.0
500492
detection_count: 1
493+
- identifier: mit-3fce6ea2-8abd-6c6b-3ede-a37af7c6efee
494+
license_expression: mit
495+
detection_count: 1
496+
- identifier: mit-a822f434-d61f-f2b1-c792-8b8cb9e7b9bf
497+
license_expression: mit
498+
detection_count: 1
501499
license_references:
502500
- key: apache-2.0
503501
language: en

tests/formattedcode/data/yaml/package-and-licenses-expected.yaml

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ headers:
2929
system_environment:
3030
operating_system: linux
3131
cpu_architecture: 64
32-
platform: Linux-5.14.0-1059-oem-x86_64-with-glibc2.29
33-
platform_version: '#67-Ubuntu SMP Mon Mar 13 14:22:10 UTC 2023'
34-
python_version: "3.8.10 (default, Mar 13 2023, 10:26:41) \n[GCC 9.4.0]"
32+
platform: Linux-5.15.0-73-generic-x86_64-with-glibc2.29
33+
platform_version: '#80~20.04.1-Ubuntu SMP Wed May 17 14:58:14 UTC 2023'
34+
python_version: "3.8.10 (default, May 26 2023, 14:05:08) \n[GCC 9.4.0]"
3535
spdx_license_list_version: '3.20'
3636
files_count: 4
3737
summary:
@@ -47,8 +47,6 @@ summary:
4747
declared_holder: Example Corp.
4848
primary_language: Python
4949
other_license_expressions:
50-
- value:
51-
count: 1
5250
- value: apache-2.0 AND (apache-2.0 OR mit)
5351
count: 1
5452
- value: mit
@@ -121,18 +119,18 @@ packages:
121119
purl: pkg:pypi/codebase
122120
dependencies: []
123121
license_detections:
122+
- identifier: apache_2_0-ec759ae0-ea5a-f138-793e-388520e080c0
123+
license_expression: apache-2.0
124+
detection_count: 2
124125
- identifier: apache_2_0-ab23f79b-ec38-9a8a-9b23-85059407f34d
125126
license_expression: apache-2.0
126127
detection_count: 1
127-
- identifier: mit-cacd5c0c-204a-85c2-affc-e4c125b2492a
128-
license_expression: mit
129-
detection_count: 1
130128
- identifier: apache_2_0_and__apache_2_0_or_mit-9b638e72-e872-a67f-3447-eec297ef7b39
131129
license_expression: apache-2.0 AND (apache-2.0 OR mit)
132130
detection_count: 1
133-
- identifier: apache_2_0-ec759ae0-ea5a-f138-793e-388520e080c0
134-
license_expression: apache-2.0
135-
detection_count: 2
131+
- identifier: mit-cacd5c0c-204a-85c2-affc-e4c125b2492a
132+
license_expression: mit
133+
detection_count: 1
136134
license_references:
137135
- key: apache-2.0
138136
language: en

0 commit comments

Comments
 (0)