Files
Ben Stull 222421e773 feat: per-archive license normalization
Per sub-project-2 plan Task 6 / spec §5.3. normalize_license maps CC URLs /
identifiers and public-domain markers to the LICENSES vocab, builds non-empty
attribution for cc_by/cc_by_nc, and rejects unmappable licenses at ingest.
librivox_license() helper returns public_domain.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 06:26:21 -07:00

85 lines
2.4 KiB
Python

import pytest
from hef.catalog import LICENSES
from tools.licensing import librivox_license, normalize_license
def test_cc_by_url_maps_and_requires_attribution():
lic, attr = normalize_license(
"https://creativecommons.org/licenses/by/4.0/", creator="Jane Doe"
)
assert lic == "cc_by" and "Jane Doe" in attr
def test_cc_by_identifier_maps():
lic, attr = normalize_license("CC BY 4.0", creator="Sam")
assert lic == "cc_by" and attr
def test_cc_by_nc_maps():
lic, attr = normalize_license(
"https://creativecommons.org/licenses/by-nc/4.0/", creator="Artist"
)
assert lic == "cc_by_nc" and "Artist" in attr
def test_cc_by_without_creator_still_has_nonempty_attribution():
# validate() rejects an attribution license with empty attribution, so the
# normalizer must always produce a non-empty string for cc_by/cc_by_nc.
lic, attr = normalize_license("https://creativecommons.org/licenses/by/4.0/")
assert lic == "cc_by" and attr != ""
def test_cc0_maps_with_empty_attribution():
lic, attr = normalize_license("https://creativecommons.org/publicdomain/zero/1.0/")
assert lic == "cc0" and attr == ""
def test_cc0_identifier():
lic, attr = normalize_license("CC0")
assert lic == "cc0" and attr == ""
def test_public_domain_mark():
lic, attr = normalize_license(
"https://creativecommons.org/publicdomain/mark/1.0/"
)
assert lic == "public_domain" and attr == ""
def test_no_known_copyright_is_public_domain():
lic, attr = normalize_license("No known copyright")
assert lic == "public_domain" and attr == ""
def test_public_domain_literal():
lic, attr = normalize_license("public_domain")
assert lic == "public_domain" and attr == ""
def test_unmappable_rejected():
with pytest.raises(ValueError):
normalize_license("All Rights Reserved")
def test_empty_rejected():
with pytest.raises(ValueError):
normalize_license("")
def test_librivox_license_helper():
lic, attr = librivox_license()
assert lic == "public_domain" and attr == ""
def test_all_outputs_in_vocab():
samples = [
"https://creativecommons.org/licenses/by/4.0/",
"https://creativecommons.org/licenses/by-nc/4.0/",
"CC0",
"public domain",
]
for raw in samples:
lic, _ = normalize_license(raw, creator="x")
assert lic in LICENSES