Skip to content

Commit

Permalink
Use a class to store scoring elements #2861
Browse files Browse the repository at this point in the history
Signed-off-by: Jono Yang <jyang@nexb.com>
  • Loading branch information
JonoYang committed Feb 22, 2022
1 parent d8bb5dc commit 5145413
Show file tree
Hide file tree
Showing 2 changed files with 271 additions and 16 deletions.
53 changes: 37 additions & 16 deletions src/summarycode/score2.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,45 +80,66 @@ def compute_license_score(codebase):
the codebase level.
"""

score = 0
scoring_elements = {'score': score}
scoring_elements = ScoringElements()
declared_licenses = get_declared_license_info_from_top_level_key_files(codebase)
declared_license_expressions = get_declared_license_expressions_from_top_level_key_files(codebase)
declared_license_categories = get_license_categories(declared_licenses)
copyrights = get_copyrights_from_key_files(codebase)
other_licenses = get_other_licenses(codebase)

scoring_elements['declared_license'] = bool(declared_licenses)
scoring_elements.declared_license = bool(declared_licenses)
if declared_licenses:
scoring_elements['score'] += 40
scoring_elements.score += 40

precise_license_detection = check_declared_licenses(declared_licenses)
scoring_elements['precise_license_detection'] = precise_license_detection
scoring_elements.precise_license_detection = precise_license_detection
if precise_license_detection:
scoring_elements['score'] += 40
scoring_elements.score += 40

has_license_text = check_for_license_texts(declared_licenses)
scoring_elements['has_license_text'] = has_license_text
scoring_elements.has_license_text = has_license_text
if has_license_text:
scoring_elements['score'] += 10
scoring_elements.score += 10

scoring_elements['declared_copyrights'] = bool(copyrights)
scoring_elements.declared_copyrights = bool(copyrights)
if copyrights:
scoring_elements['score'] += 10
scoring_elements.score += 10

is_permissively_licensed = 'Copyleft' not in declared_license_categories
if is_permissively_licensed:
contains_copyleft_licenses = check_for_copyleft(other_licenses)
scoring_elements['conflicting_license_categories'] = contains_copyleft_licenses
scoring_elements.conflicting_license_categories = contains_copyleft_licenses
if contains_copyleft_licenses:
scoring_elements['score'] -= 20
scoring_elements.score -= 20

ambigous_compound_licensing = check_ambiguous_license_expression(declared_license_expressions)
scoring_elements['ambigous_compound_licensing'] = ambigous_compound_licensing
scoring_elements.ambigous_compound_licensing = ambigous_compound_licensing
if ambigous_compound_licensing:
scoring_elements['score'] -= 10

return scoring_elements
scoring_elements.score -= 10

return scoring_elements.to_dict()


@attr.s()
class ScoringElements:
score = attr.ib(default=0)
declared_license = attr.ib(default=False)
precise_license_detection = attr.ib(default=False)
has_license_text = attr.ib(default=False)
declared_copyrights = attr.ib(default=False)
conflicting_license_categories = attr.ib(default=False)
ambigous_compound_licensing = attr.ib(default=False)

def to_dict(self):
return {
'score': self.score,
'declared_license': self.declared_license,
'precise_license_detection': self.precise_license_detection,
'has_license_text': self.has_license_text,
'declared_copyrights': self.declared_copyrights,
'conflicting_license_categories': self.conflicting_license_categories,
'ambigous_compound_licensing': self.ambigous_compound_licensing
}


def check_ambiguous_license_expression(declared_license_expressions):
Expand Down
234 changes: 234 additions & 0 deletions tests/summarycode/data/score2/imprecise_license-expected.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
{
"headers": [
{
"tool_name": "scancode-toolkit",
"options": {
"input": "<path>",
"--classify": true,
"--copyright": true,
"--info": true,
"--json": "<file>",
"--license": true,
"--license-clarity-score-2": true
},
"notice": "Generated with ScanCode and provided on an \"AS IS\" BASIS, WITHOUT WARRANTIES\nOR CONDITIONS OF ANY KIND, either express or implied. No content created from\nScanCode should be considered or used as legal advice. Consult an Attorney\nfor any legal advice.\nScanCode is a free software code scanning tool from nexB Inc. and others.\nVisit https://github.com/nexB/scancode-toolkit/ for support and download.",
"output_format_version": "2.0.0",
"message": null,
"errors": [],
"extra_data": {
"spdx_license_list_version": "3.16",
"files_count": 3
}
}
],
"license_clarity_score": {
"score": 90,
"declared_license": true,
"precise_license_detection": true,
"has_license_text": false,
"declared_copyrights": true,
"conflicting_license_categories": false,
"ambigous_compound_licensing": false
},
"files": [
{
"path": "imprecise_license",
"type": "directory",
"name": "imprecise_license",
"base_name": "imprecise_license",
"extension": "",
"size": 0,
"sha1": null,
"md5": null,
"sha256": null,
"mime_type": null,
"file_type": null,
"programming_language": null,
"is_binary": false,
"is_text": false,
"is_archive": false,
"is_media": false,
"is_source": false,
"is_script": false,
"licenses": [],
"license_expressions": [],
"percentage_of_license_text": 0,
"copyrights": [],
"holders": [],
"authors": [],
"is_legal": false,
"is_manifest": false,
"is_readme": false,
"is_top_level": true,
"is_key_file": false,
"files_count": 3,
"dirs_count": 0,
"size_count": 2179,
"scan_errors": []
},
{
"path": "imprecise_license/README.md",
"type": "file",
"name": "README.md",
"base_name": "README",
"extension": ".md",
"size": 333,
"sha1": "6ad868c919fb46bb2e1dd203807915877710e305",
"md5": "3010ccc5b2e6c635308485b84d2e8d8f",
"sha256": "ed83c367801018f9b7e2d7c3d024d5f0fb3c6112fbf77ef2e6a1c05d7fd65c7a",
"mime_type": "text/plain",
"file_type": "ASCII text",
"programming_language": null,
"is_binary": false,
"is_text": true,
"is_archive": false,
"is_media": false,
"is_source": false,
"is_script": false,
"licenses": [
{
"key": "apache-2.0",
"score": 100.0,
"name": "Apache License 2.0",
"short_name": "Apache 2.0",
"category": "Permissive",
"is_exception": false,
"is_unknown": false,
"owner": "Apache Software Foundation",
"homepage_url": "http://www.apache.org/licenses/",
"text_url": "http://www.apache.org/licenses/LICENSE-2.0",
"reference_url": "https://scancode-licensedb.aboutcode.org/apache-2.0",
"scancode_text_url": "https://github.com/nexB/scancode-toolkit/tree/develop/src/licensedcode/data/licenses/apache-2.0.LICENSE",
"scancode_data_url": "https://github.com/nexB/scancode-toolkit/tree/develop/src/licensedcode/data/licenses/apache-2.0.yml",
"spdx_license_key": "Apache-2.0",
"spdx_url": "https://spdx.org/licenses/Apache-2.0",
"start_line": 19,
"end_line": 19,
"matched_rule": {
"identifier": "apache-2.0_1050.RULE",
"license_expression": "apache-2.0",
"licenses": [
"apache-2.0"
],
"referenced_filenames": [],
"is_license_text": false,
"is_license_notice": false,
"is_license_reference": true,
"is_license_tag": false,
"is_license_intro": false,
"has_unknown": false,
"matcher": "2-aho",
"rule_length": 2,
"matched_length": 2,
"match_coverage": 100.0,
"rule_relevance": 100
}
}
],
"license_expressions": [
"apache-2.0"
],
"percentage_of_license_text": 4.55,
"copyrights": [
{
"copyright": "Copyright (c) Example, Inc.",
"start_line": 18,
"end_line": 18
}
],
"holders": [
{
"holder": "Example, Inc.",
"start_line": 18,
"end_line": 18
}
],
"authors": [],
"is_legal": false,
"is_manifest": false,
"is_readme": true,
"is_top_level": true,
"is_key_file": true,
"files_count": 0,
"dirs_count": 0,
"size_count": 0,
"scan_errors": []
},
{
"path": "imprecise_license/index.js",
"type": "file",
"name": "index.js",
"base_name": "index",
"extension": ".js",
"size": 1037,
"sha1": "53771edd1e0765de7400174e42ca2e8e5840055f",
"md5": "ec9dc4294f83d24294f07e6a0676c338",
"sha256": "2b61833228890116dded1849a683d31d0273e0cf985a7bf0cc419aa7edefd839",
"mime_type": "text/plain",
"file_type": "ASCII text",
"programming_language": "JavaScript",
"is_binary": false,
"is_text": true,
"is_archive": false,
"is_media": false,
"is_source": true,
"is_script": false,
"licenses": [],
"license_expressions": [],
"percentage_of_license_text": 0,
"copyrights": [],
"holders": [],
"authors": [],
"is_legal": false,
"is_manifest": false,
"is_readme": false,
"is_top_level": true,
"is_key_file": false,
"files_count": 0,
"dirs_count": 0,
"size_count": 0,
"scan_errors": []
},
{
"path": "imprecise_license/package.json",
"type": "file",
"name": "package.json",
"base_name": "package",
"extension": ".json",
"size": 809,
"sha1": "c07fce758705b949299768f7a404a51ce31ead7a",
"md5": "6670be3f86bde3893f575303b9b33b24",
"sha256": "77891e545535e7cd9b8de9eb9633d60083e17a4120c2edb5181cef3abd906c9f",
"mime_type": "application/json",
"file_type": "JSON data",
"programming_language": null,
"is_binary": false,
"is_text": true,
"is_archive": false,
"is_media": false,
"is_source": false,
"is_script": false,
"licenses": [],
"license_expressions": [],
"percentage_of_license_text": 0,
"copyrights": [],
"holders": [],
"authors": [
{
"author": "Alexander Plavinski <alexander.plavinski@invision.de>",
"start_line": 6,
"end_line": 6
}
],
"is_legal": false,
"is_manifest": true,
"is_readme": false,
"is_top_level": true,
"is_key_file": true,
"files_count": 0,
"dirs_count": 0,
"size_count": 0,
"scan_errors": []
}
]
}

0 comments on commit 5145413

Please sign in to comment.