Release history and notes

Sequence based identifiers are used for versioning (schema follows below):

major.minor[.revision]
  • It is always safe to upgrade within the same minor version (for example, from 0.3 to 0.3.4).

  • Minor version changes might be backwards incompatible. Read the release notes carefully before upgrading (for example, when upgrading from 0.3.4 to 0.4).

  • All backwards incompatible changes are mentioned in this document.

0.3.2

2026-03-25

  • Introduce sub-aliases in aliases.json.

  • Introduce handy scripts for finding, automatic filling and merging the duplicates.

0.3.1

2026-03-24

  • Minor fixes.

0.3

2026-03-23

  • Plugin-based architectureLicenseNormaliser class accepts plugin CLASSES (not instances) with lazy loading; replaces old module-level globals.

  • 6 plugin interfacesBasePlugin, RegistryPlugin, URLPlugin, AliasPlugin, FamilyPlugin, NamePlugin, ProsePlugin.

  • New `BasePlugin.refresh()` — classmethod to fetch/refresh data from upstream URLs; CLI uses parser IDs (spdx, opendefinition, etc.) instead of class names.

  • Thread-safe singleton_DefaultNormaliser class with double-checked locking protects the shared LicenseNormaliser instance.

  • Public `registry_keys()`LicenseNormaliser.registry_keys() exposes known keys; get_registry_keys() in _cache.py uses it.

  • URL population fix — inverted URL map (version_key → cleaned_url) ensures LicenseVersion.url is populated for resolved licenses.

  • Removed dead code — deleted _registry.py, parsers/base.py, parsers/__init__.py, and empty DEFAULT_* module globals.

  • Docs updated — ARCHITECTURE.rst, AGENTS.md, README.rst rewritten to reflect new plugin architecture.

0.2

2026-03-21

  • Architecture rewrite — parser-based pluggable system with 8 parsers loading from JSON data files.

  • 3-level hierarchyLicenseFamily → LicenseName → LicenseVersion with 11 families including publisher OA/TDM.

  • New data files — 170+ aliases, 41 prose patterns, 50+ publisher URLs (Elsevier, Wiley, Springer, ACS, etc.).

  • Strict modestrict=True raises LicenseNotFoundError on unknown licenses.

  • Bug fixescc-pdm/cc0 family inference, gpl-3.0+ +-suffix stripping, false-positive prose pattern removed, ALIASES-before-REGISTRY lookup order.

  • Tests — 386 tests (up from ~80), including 165-case integration matrix.

  • DocsAGENTS.md, ARCHITECTURE.rst, CONTRIBUTING.rst rewritten; stale literalinclude targets fixed.

0.1.1

2026-03-17

  • Remove Pydantic as dependency.

0.1

2026-03-17

  • Initial beta release.