Skip to content

Commit 2bc5f20

Browse files
committed
feat: Analyze licenses or-ed together separately
Multi-licensed packages may specify their allowed licenses using an `or` designation. This commit adds support for parsing out those `or`-ed licenses as if they had been listed separately.
1 parent 691c3eb commit 2bc5f20

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

liccheck/command_line.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,16 +223,16 @@ def check_one(license_str, license_rule="AUTHORIZED", as_regex=False):
223223

224224
at_least_one_unauthorized = False
225225
count_authorized = 0
226-
for license in pkg["licenses"]:
227-
lower = license.lower()
226+
licenses = get_license_names(pkg["licenses"])
227+
for license in licenses:
228228
if check_one(
229-
lower,
229+
license,
230230
license_rule="UNAUTHORIZED",
231231
as_regex=as_regex,
232232
):
233233
at_least_one_unauthorized = True
234234
if check_one(
235-
lower,
235+
license,
236236
license_rule="AUTHORIZED",
237237
as_regex=as_regex,
238238
):
@@ -247,7 +247,7 @@ def check_one(license_str, license_rule="AUTHORIZED", as_regex=False):
247247
)
248248
or (
249249
count_authorized
250-
and count_authorized == len(pkg["licenses"])
250+
and count_authorized == len(licenses)
251251
and level is Level.PARANOID
252252
)
253253
):
@@ -259,6 +259,14 @@ def check_one(license_str, license_rule="AUTHORIZED", as_regex=False):
259259

260260
return Reason.UNKNOWN
261261

262+
def get_license_names(licenses):
263+
names = []
264+
for license in licenses:
265+
license = license.lower()
266+
options = license.split(" or ")
267+
for option in options:
268+
names.append(option)
269+
return names
262270

263271
def find_parents(package, all, seen):
264272
if package in seen:

tests/test_check_package.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ def packages():
2525
"version": "1",
2626
"licenses": ["authorized 1", "unauthorized 1"],
2727
},
28+
{
29+
"name": "auth_one_or_unauth_one",
30+
"version": "2",
31+
"licenses": ["authorized 1 or unauthorized 1"],
32+
},
2833
{
2934
"name": "unauth_one",
3035
"version": "2",
@@ -77,9 +82,9 @@ def packages():
7782
@pytest.mark.parametrize(
7883
("level", "reasons"),
7984
[
80-
(Level.STANDARD, [OK, OK, OK, UNAUTH, OK, UNAUTH, OK, UNKNOWN]),
81-
(Level.CAUTIOUS, [OK, OK, UNAUTH, UNAUTH, OK, UNAUTH, OK, UNKNOWN]),
82-
(Level.PARANOID, [OK, OK, UNAUTH, UNAUTH, OK, UNAUTH, UNKNOWN, UNKNOWN]),
85+
(Level.STANDARD, [OK, OK, OK, OK, UNAUTH, OK, UNAUTH, OK, UNKNOWN]),
86+
(Level.CAUTIOUS, [OK, OK, UNAUTH, UNAUTH, UNAUTH, OK, UNAUTH, OK, UNKNOWN]),
87+
(Level.PARANOID, [OK, OK, UNAUTH, UNAUTH, UNAUTH, OK, UNAUTH, UNKNOWN, UNKNOWN]),
8388
],
8489
ids=[level.name for level in Level],
8590
)

0 commit comments

Comments
 (0)