From bc5fb0b99f39907e95e3c6d4153bd25daf765d7a Mon Sep 17 00:00:00 2001
From: "E. Lynette Rayle" <elrayle@github.com>
Date: Mon, 13 May 2024 18:10:23 -0400
Subject: [PATCH] Move each license function dependent on SPDX licenses

* move to package spdxlicenses
* put each in their own file to make licenses easier to update
---
 Makefile                               |   78 ++
 spdxexp/license.go                     | 1054 +-----------------------
 spdxexp/spdxlicenses/get_deprecated.go |   37 +
 spdxexp/spdxlicenses/get_exceptions.go |   50 ++
 spdxexp/spdxlicenses/get_licenses.go   |  485 +++++++++++
 spdxexp/spdxlicenses/license_ranges.go |  476 +++++++++++
 6 files changed, 1132 insertions(+), 1048 deletions(-)
 create mode 100644 Makefile
 create mode 100644 spdxexp/spdxlicenses/get_deprecated.go
 create mode 100644 spdxexp/spdxlicenses/get_exceptions.go
 create mode 100644 spdxexp/spdxlicenses/get_licenses.go
 create mode 100644 spdxexp/spdxlicenses/license_ranges.go

diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..2b84d90
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,78 @@
+# Go projects should have a Makefile for commond build-related tasks.
+# See help target for a list of targets and their descriptions.
+#
+# Debug related targets are commented out until they can be tested.
+
+# setup defaults
+SHELL := $(shell which bash)
+CWD_DIR := $(shell pwd)
+GITHUB_API_URL ?= https://api.github.com
+# DLV_BIN := $(shell go env GOPATH)/bin/dlv
+LINT_FILES := ./...
+
+# provide extra information when format fails
+define goformat
+	files="$$(go fmt ./...)"; \
+	if [ -n "$${files}" ]; then \
+		echo "❌ ERROR: go files are not properly formatted:"; \
+		echo "$$files"; \
+		echo ""; \
+		echo "run the 'go fmt ./..' command or configure your editor"; \
+		exit 1; \
+	fi;
+endef
+
+# # install dlv if it is not already installed
+# define dlv
+# 	cat /proc/sys/kernel/yama/ptrace_scope | grep 0 || \
+# 		echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope; \
+# 	echo "Checking if '$(DLV_BIN)' exist"; \
+# 	test -f "$(DLV_BIN)" || \
+# 		echo "Installing dlv..." && \
+# 		go install github.com/go-delve/delve/cmd/dlv@latest && \
+# 		echo "Installed dlv";
+# endef
+
+# NOTE: Targets defined with .PHONY are not files, they execute commands.
+
+# clean up the go modules files
+.PHONY: tidy
+tidy:
+	@echo "==> starting tidy"
+	go mod tidy
+
+# go format this project
+.PHONY: format
+format: 
+	@echo "==> starting format"
+	@$(call goformat)
+
+# run some go test
+.PHONY: test
+test: 
+	@echo "==> starting test"
+	go test ./...
+
+# runs linter for all files
+.PHONY: lint-all
+lint-all:
+	@echo "==> starting lint for directory: ${LINT_FILES}"
+	golangci-lint run ${LINT_FILES}
+
+# runs linter for only files with diffs from origin/main (useful for PRs)
+.PHONY: lint
+lint:
+	@echo "==> starting lint for changed files"
+	golangci-lint run --whole-files --new-from-rev=origin/main
+
+.PHONY: help
+help:
+	@echo "Usage: make <target>"
+	@echo ""
+	@echo "Targets:"
+	@echo "  tidy       - clean up the go modules files"
+	@echo "  format     - go format this project"
+	@echo "  test       - run some go test"
+	@echo "  lint-all   - runs linter for all files (optional pass in LINT_FILES=path_to_dir_or_file_to_check)"
+	@echo "  lint       - runs linter for only files with diffs from origin/main (useful for PRs)"
+	@echo "  help       - this help message"
diff --git a/spdxexp/license.go b/spdxexp/license.go
index 1c208a6..b47ef45 100644
--- a/spdxexp/license.go
+++ b/spdxexp/license.go
@@ -2,21 +2,23 @@ package spdxexp
 
 import (
 	"strings"
+
+	"github.com/github/go-spdx/v2/spdxexp/spdxlicenses"
 )
 
 // activeLicense returns true if the id is an active license.
 func activeLicense(id string) (bool, string) {
-	return inLicenseList(getLicenses(), id)
+	return inLicenseList(spdxlicenses.GetLicenses(), id)
 }
 
 // deprecatedLicense returns true if the id is a deprecated license.
 func deprecatedLicense(id string) (bool, string) {
-	return inLicenseList(getDeprecated(), id)
+	return inLicenseList(spdxlicenses.GetDeprecated(), id)
 }
 
 // exceptionLicense returns true if the id is an exception license.
 func exceptionLicense(id string) (bool, string) {
-	return inLicenseList(getExceptions(), id)
+	return inLicenseList(spdxlicenses.GetExceptions(), id)
 }
 
 // inLicenseList looks for id in the list of licenses.  The check is case-insensitive (e.g. "mit" will match "MIT").
@@ -43,7 +45,7 @@ type licenseRange struct {
 // getLicenseRange returns a range of licenses from licenseRanges
 func getLicenseRange(id string) *licenseRange {
 	simpleID := simplifyLicense(id)
-	allRanges := licenseRanges()
+	allRanges := spdxlicenses.LicenseRanges()
 	for i, licenseGrp := range allRanges {
 		for j, versionGrp := range licenseGrp {
 			for k, license := range versionGrp {
@@ -70,1047 +72,3 @@ func simplifyLicense(id string) string {
 	}
 	return id
 }
-
-func getLicenses() []string {
-	return []string{
-		"0BSD",
-		"AAL",
-		"Abstyles",
-		"Adobe-2006",
-		"Adobe-Glyph",
-		"ADSL",
-		"AFL-1.1",
-		"AFL-1.2",
-		"AFL-2.0",
-		"AFL-2.1",
-		"AFL-3.0",
-		"Afmparse",
-		"AGPL-1.0-only",
-		"AGPL-1.0-or-later",
-		"AGPL-3.0-only",
-		"AGPL-3.0-or-later",
-		"Aladdin",
-		"AMDPLPA",
-		"AML",
-		"AMPAS",
-		"ANTLR-PD",
-		"ANTLR-PD-fallback",
-		"Apache-1.0",
-		"Apache-1.1",
-		"Apache-2.0",
-		"APAFML",
-		"APL-1.0",
-		"App-s2p",
-		"APSL-1.0",
-		"APSL-1.1",
-		"APSL-1.2",
-		"APSL-2.0",
-		"Arphic-1999",
-		"Artistic-1.0",
-		"Artistic-1.0-cl8",
-		"Artistic-1.0-Perl",
-		"Artistic-2.0",
-		"Baekmuk",
-		"Bahyph",
-		"Barr",
-		"Beerware",
-		"Bitstream-Charter",
-		"Bitstream-Vera",
-		"BitTorrent-1.0",
-		"BitTorrent-1.1",
-		"blessing",
-		"BlueOak-1.0.0",
-		"Borceux",
-		"BSD-1-Clause",
-		"BSD-2-Clause",
-		"BSD-2-Clause-Patent",
-		"BSD-2-Clause-Views",
-		"BSD-3-Clause",
-		"BSD-3-Clause-Attribution",
-		"BSD-3-Clause-Clear",
-		"BSD-3-Clause-LBNL",
-		"BSD-3-Clause-Modification",
-		"BSD-3-Clause-No-Military-License",
-		"BSD-3-Clause-No-Nuclear-License",
-		"BSD-3-Clause-No-Nuclear-License-2014",
-		"BSD-3-Clause-No-Nuclear-Warranty",
-		"BSD-3-Clause-Open-MPI",
-		"BSD-4-Clause",
-		"BSD-4-Clause-Shortened",
-		"BSD-4-Clause-UC",
-		"BSD-Protection",
-		"BSD-Source-Code",
-		"BSL-1.0",
-		"BUSL-1.1",
-		"bzip2-1.0.6",
-		"C-UDA-1.0",
-		"CAL-1.0",
-		"CAL-1.0-Combined-Work-Exception",
-		"Caldera",
-		"CATOSL-1.1",
-		"CC-BY-1.0",
-		"CC-BY-2.0",
-		"CC-BY-2.5",
-		"CC-BY-2.5-AU",
-		"CC-BY-3.0",
-		"CC-BY-3.0-AT",
-		"CC-BY-3.0-DE",
-		"CC-BY-3.0-IGO",
-		"CC-BY-3.0-NL",
-		"CC-BY-3.0-US",
-		"CC-BY-4.0",
-		"CC-BY-NC-1.0",
-		"CC-BY-NC-2.0",
-		"CC-BY-NC-2.5",
-		"CC-BY-NC-3.0",
-		"CC-BY-NC-3.0-DE",
-		"CC-BY-NC-4.0",
-		"CC-BY-NC-ND-1.0",
-		"CC-BY-NC-ND-2.0",
-		"CC-BY-NC-ND-2.5",
-		"CC-BY-NC-ND-3.0",
-		"CC-BY-NC-ND-3.0-DE",
-		"CC-BY-NC-ND-3.0-IGO",
-		"CC-BY-NC-ND-4.0",
-		"CC-BY-NC-SA-1.0",
-		"CC-BY-NC-SA-2.0",
-		"CC-BY-NC-SA-2.0-DE",
-		"CC-BY-NC-SA-2.0-FR",
-		"CC-BY-NC-SA-2.0-UK",
-		"CC-BY-NC-SA-2.5",
-		"CC-BY-NC-SA-3.0",
-		"CC-BY-NC-SA-3.0-DE",
-		"CC-BY-NC-SA-3.0-IGO",
-		"CC-BY-NC-SA-4.0",
-		"CC-BY-ND-1.0",
-		"CC-BY-ND-2.0",
-		"CC-BY-ND-2.5",
-		"CC-BY-ND-3.0",
-		"CC-BY-ND-3.0-DE",
-		"CC-BY-ND-4.0",
-		"CC-BY-SA-1.0",
-		"CC-BY-SA-2.0",
-		"CC-BY-SA-2.0-UK",
-		"CC-BY-SA-2.1-JP",
-		"CC-BY-SA-2.5",
-		"CC-BY-SA-3.0",
-		"CC-BY-SA-3.0-AT",
-		"CC-BY-SA-3.0-DE",
-		"CC-BY-SA-4.0",
-		"CC-PDDC",
-		"CC0-1.0",
-		"CDDL-1.0",
-		"CDDL-1.1",
-		"CDL-1.0",
-		"CDLA-Permissive-1.0",
-		"CDLA-Permissive-2.0",
-		"CDLA-Sharing-1.0",
-		"CECILL-1.0",
-		"CECILL-1.1",
-		"CECILL-2.0",
-		"CECILL-2.1",
-		"CECILL-B",
-		"CECILL-C",
-		"CERN-OHL-1.1",
-		"CERN-OHL-1.2",
-		"CERN-OHL-P-2.0",
-		"CERN-OHL-S-2.0",
-		"CERN-OHL-W-2.0",
-		"checkmk",
-		"ClArtistic",
-		"CNRI-Jython",
-		"CNRI-Python",
-		"CNRI-Python-GPL-Compatible",
-		"COIL-1.0",
-		"Community-Spec-1.0",
-		"Condor-1.1",
-		"copyleft-next-0.3.0",
-		"copyleft-next-0.3.1",
-		"CPAL-1.0",
-		"CPL-1.0",
-		"CPOL-1.02",
-		"Crossword",
-		"CrystalStacker",
-		"CUA-OPL-1.0",
-		"Cube",
-		"curl",
-		"D-FSL-1.0",
-		"diffmark",
-		"DL-DE-BY-2.0",
-		"DOC",
-		"Dotseqn",
-		"DRL-1.0",
-		"DSDP",
-		"dvipdfm",
-		"ECL-1.0",
-		"ECL-2.0",
-		"EFL-1.0",
-		"EFL-2.0",
-		"eGenix",
-		"Elastic-2.0",
-		"Entessa",
-		"EPICS",
-		"EPL-1.0",
-		"EPL-2.0",
-		"ErlPL-1.1",
-		"etalab-2.0",
-		"EUDatagrid",
-		"EUPL-1.0",
-		"EUPL-1.1",
-		"EUPL-1.2",
-		"Eurosym",
-		"Fair",
-		"FDK-AAC",
-		"Frameworx-1.0",
-		"FreeBSD-DOC",
-		"FreeImage",
-		"FSFAP",
-		"FSFUL",
-		"FSFULLR",
-		"FSFULLRWD",
-		"FTL",
-		"GD",
-		"GFDL-1.1-invariants-only",
-		"GFDL-1.1-invariants-or-later",
-		"GFDL-1.1-no-invariants-only",
-		"GFDL-1.1-no-invariants-or-later",
-		"GFDL-1.1-only",
-		"GFDL-1.1-or-later",
-		"GFDL-1.2-invariants-only",
-		"GFDL-1.2-invariants-or-later",
-		"GFDL-1.2-no-invariants-only",
-		"GFDL-1.2-no-invariants-or-later",
-		"GFDL-1.2-only",
-		"GFDL-1.2-or-later",
-		"GFDL-1.3-invariants-only",
-		"GFDL-1.3-invariants-or-later",
-		"GFDL-1.3-no-invariants-only",
-		"GFDL-1.3-no-invariants-or-later",
-		"GFDL-1.3-only",
-		"GFDL-1.3-or-later",
-		"Giftware",
-		"GL2PS",
-		"Glide",
-		"Glulxe",
-		"GLWTPL",
-		"gnuplot",
-		"GPL-1.0-only",
-		"GPL-1.0-or-later",
-		"GPL-2.0-only",
-		"GPL-2.0-or-later",
-		"GPL-3.0-only",
-		"GPL-3.0-or-later",
-		"Graphics-Gems",
-		"gSOAP-1.3b",
-		"HaskellReport",
-		"Hippocratic-2.1",
-		"HPND",
-		"HPND-export-US",
-		"HPND-sell-variant",
-		"HTMLTIDY",
-		"IBM-pibs",
-		"ICU",
-		"IJG",
-		"IJG-short",
-		"ImageMagick",
-		"iMatix",
-		"Imlib2",
-		"Info-ZIP",
-		"Intel",
-		"Intel-ACPI",
-		"Interbase-1.0",
-		"IPA",
-		"IPL-1.0",
-		"ISC",
-		"Jam",
-		"JasPer-2.0",
-		"JPNIC",
-		"JSON",
-		"Knuth-CTAN",
-		"LAL-1.2",
-		"LAL-1.3",
-		"Latex2e",
-		"Leptonica",
-		"LGPL-2.0-only",
-		"LGPL-2.0-or-later",
-		"LGPL-2.1-only",
-		"LGPL-2.1-or-later",
-		"LGPL-3.0-only",
-		"LGPL-3.0-or-later",
-		"LGPLLR",
-		"Libpng",
-		"libpng-2.0",
-		"libselinux-1.0",
-		"libtiff",
-		"libutil-David-Nugent",
-		"LiLiQ-P-1.1",
-		"LiLiQ-R-1.1",
-		"LiLiQ-Rplus-1.1",
-		"Linux-man-pages-copyleft",
-		"Linux-OpenIB",
-		"LOOP",
-		"LPL-1.0",
-		"LPL-1.02",
-		"LPPL-1.0",
-		"LPPL-1.1",
-		"LPPL-1.2",
-		"LPPL-1.3a",
-		"LPPL-1.3c",
-		"LZMA-SDK-9.11-to-9.20",
-		"LZMA-SDK-9.22",
-		"MakeIndex",
-		"Minpack",
-		"MirOS",
-		"MIT",
-		"MIT-0",
-		"MIT-advertising",
-		"MIT-CMU",
-		"MIT-enna",
-		"MIT-feh",
-		"MIT-Modern-Variant",
-		"MIT-open-group",
-		"MIT-Wu",
-		"MITNFA",
-		"Motosoto",
-		"mpi-permissive",
-		"mpich2",
-		"MPL-1.0",
-		"MPL-1.1",
-		"MPL-2.0",
-		"MPL-2.0-no-copyleft-exception",
-		"mplus",
-		"MS-LPL",
-		"MS-PL",
-		"MS-RL",
-		"MTLL",
-		"MulanPSL-1.0",
-		"MulanPSL-2.0",
-		"Multics",
-		"Mup",
-		"NAIST-2003",
-		"NASA-1.3",
-		"Naumen",
-		"NBPL-1.0",
-		"NCGL-UK-2.0",
-		"NCSA",
-		"Net-SNMP",
-		"NetCDF",
-		"Newsletr",
-		"NGPL",
-		"NICTA-1.0",
-		"NIST-PD",
-		"NIST-PD-fallback",
-		"NLOD-1.0",
-		"NLOD-2.0",
-		"NLPL",
-		"Nokia",
-		"NOSL",
-		"Noweb",
-		"NPL-1.0",
-		"NPL-1.1",
-		"NPOSL-3.0",
-		"NRL",
-		"NTP",
-		"NTP-0",
-		"O-UDA-1.0",
-		"OCCT-PL",
-		"OCLC-2.0",
-		"ODbL-1.0",
-		"ODC-By-1.0",
-		"OFL-1.0",
-		"OFL-1.0-no-RFN",
-		"OFL-1.0-RFN",
-		"OFL-1.1",
-		"OFL-1.1-no-RFN",
-		"OFL-1.1-RFN",
-		"OGC-1.0",
-		"OGDL-Taiwan-1.0",
-		"OGL-Canada-2.0",
-		"OGL-UK-1.0",
-		"OGL-UK-2.0",
-		"OGL-UK-3.0",
-		"OGTSL",
-		"OLDAP-1.1",
-		"OLDAP-1.2",
-		"OLDAP-1.3",
-		"OLDAP-1.4",
-		"OLDAP-2.0",
-		"OLDAP-2.0.1",
-		"OLDAP-2.1",
-		"OLDAP-2.2",
-		"OLDAP-2.2.1",
-		"OLDAP-2.2.2",
-		"OLDAP-2.3",
-		"OLDAP-2.4",
-		"OLDAP-2.5",
-		"OLDAP-2.6",
-		"OLDAP-2.7",
-		"OLDAP-2.8",
-		"OML",
-		"OpenSSL",
-		"OPL-1.0",
-		"OPUBL-1.0",
-		"OSET-PL-2.1",
-		"OSL-1.0",
-		"OSL-1.1",
-		"OSL-2.0",
-		"OSL-2.1",
-		"OSL-3.0",
-		"Parity-6.0.0",
-		"Parity-7.0.0",
-		"PDDL-1.0",
-		"PHP-3.0",
-		"PHP-3.01",
-		"Plexus",
-		"PolyForm-Noncommercial-1.0.0",
-		"PolyForm-Small-Business-1.0.0",
-		"PostgreSQL",
-		"PSF-2.0",
-		"psfrag",
-		"psutils",
-		"Python-2.0",
-		"Python-2.0.1",
-		"Qhull",
-		"QPL-1.0",
-		"Rdisc",
-		"RHeCos-1.1",
-		"RPL-1.1",
-		"RPL-1.5",
-		"RPSL-1.0",
-		"RSA-MD",
-		"RSCPL",
-		"Ruby",
-		"SAX-PD",
-		"Saxpath",
-		"SCEA",
-		"SchemeReport",
-		"Sendmail",
-		"Sendmail-8.23",
-		"SGI-B-1.0",
-		"SGI-B-1.1",
-		"SGI-B-2.0",
-		"SHL-0.5",
-		"SHL-0.51",
-		"SimPL-2.0",
-		"SISSL",
-		"SISSL-1.2",
-		"Sleepycat",
-		"SMLNJ",
-		"SMPPL",
-		"SNIA",
-		"Spencer-86",
-		"Spencer-94",
-		"Spencer-99",
-		"SPL-1.0",
-		"SSH-OpenSSH",
-		"SSH-short",
-		"SSPL-1.0",
-		"SugarCRM-1.1.3",
-		"SWL",
-		"Symlinks",
-		"TAPR-OHL-1.0",
-		"TCL",
-		"TCP-wrappers",
-		"TMate",
-		"TORQUE-1.1",
-		"TOSL",
-		"TPDL",
-		"TTWL",
-		"TU-Berlin-1.0",
-		"TU-Berlin-2.0",
-		"UCL-1.0",
-		"Unicode-DFS-2015",
-		"Unicode-DFS-2016",
-		"Unicode-TOU",
-		"Unlicense",
-		"UPL-1.0",
-		"Vim",
-		"VOSTROM",
-		"VSL-1.0",
-		"W3C",
-		"W3C-19980720",
-		"W3C-20150513",
-		"Watcom-1.0",
-		"Wsuipa",
-		"WTFPL",
-		"X11",
-		"X11-distribute-modifications-variant",
-		"Xerox",
-		"XFree86-1.1",
-		"xinetd",
-		"Xnet",
-		"xpp",
-		"XSkat",
-		"YPL-1.0",
-		"YPL-1.1",
-		"Zed",
-		"Zend-2.0",
-		"Zimbra-1.3",
-		"Zimbra-1.4",
-		"Zlib",
-		"zlib-acknowledgement",
-		"ZPL-1.1",
-		"ZPL-2.0",
-		"ZPL-2.1",
-	}
-}
-
-func getDeprecated() []string {
-	return []string{
-		"AGPL-1.0",
-		"AGPL-3.0",
-		"BSD-2-Clause-FreeBSD",
-		"BSD-2-Clause-NetBSD",
-		"bzip2-1.0.5",
-		"eCos-2.0",
-		"GFDL-1.1",
-		"GFDL-1.2",
-		"GFDL-1.3",
-		"GPL-1.0",
-		"GPL-1.0+",
-		"GPL-2.0",
-		"GPL-2.0+",
-		"GPL-2.0-with-autoconf-exception",
-		"GPL-2.0-with-bison-exception",
-		"GPL-2.0-with-classpath-exception",
-		"GPL-2.0-with-font-exception",
-		"GPL-2.0-with-GCC-exception",
-		"GPL-3.0",
-		"GPL-3.0+",
-		"GPL-3.0-with-autoconf-exception",
-		"GPL-3.0-with-GCC-exception",
-		"LGPL-2.0",
-		"LGPL-2.0+",
-		"LGPL-2.1",
-		"LGPL-2.1+",
-		"LGPL-3.0",
-		"LGPL-3.0+",
-		"Nunit",
-		"StandardML-NJ",
-		"wxWindows",
-	}
-}
-
-func getExceptions() []string {
-	return []string{
-		"389-exception",
-		"Autoconf-exception-2.0",
-		"Autoconf-exception-3.0",
-		"Bison-exception-2.2",
-		"Bootloader-exception",
-		"Classpath-exception-2.0",
-		"CLISP-exception-2.0",
-		"DigiRule-FOSS-exception",
-		"eCos-exception-2.0",
-		"Fawkes-Runtime-exception",
-		"FLTK-exception",
-		"Font-exception-2.0",
-		"freertos-exception-2.0",
-		"GCC-exception-2.0",
-		"GCC-exception-3.1",
-		"gnu-javamail-exception",
-		"GPL-3.0-linking-exception",
-		"GPL-3.0-linking-source-exception",
-		"GPL-CC-1.0",
-		"GStreamer-exception-2005",
-		"GStreamer-exception-2008",
-		"i2p-gpl-java-exception",
-		"KiCad-libraries-exception",
-		"LGPL-3.0-linking-exception",
-		"Libtool-exception",
-		"Linux-syscall-note",
-		"LLVM-exception",
-		"LZMA-exception",
-		"mif-exception",
-		"OCaml-LGPL-linking-exception",
-		"OCCT-exception-1.0",
-		"OpenJDK-assembly-exception-1.0",
-		"openvpn-openssl-exception",
-		"PS-or-PDF-font-exception-20170817",
-		"Qt-GPL-exception-1.0",
-		"Qt-LGPL-exception-1.1",
-		"Qwt-exception-1.0",
-		"SHL-2.0",
-		"SHL-2.1",
-		"Swift-exception",
-		"u-boot-exception-2.0",
-		"Universal-FOSS-exception-1.0",
-		"WxWindows-exception-3.1",
-		"x11vnc-openssl-exception",
-	}
-}
-
-// licenseRanges returns a list of license ranges.
-//
-// Ranges are organized into groups (referred to as license groups) of the same base license (e.g. GPL).
-// Groups have sub-groups of license versions (referred to as the range) where each member is considered
-// to be the same version (e.g. {GPL-2.0, GPL-2.0-only}). The sub-groups are in ascending order within
-// the license group, such that the first sub-group is considered to be less than the second sub-group,
-// and so on. (e.g. {{GPL-1.0}, {GPL-2.0, GPL-2.0-only}} implies {GPL-1.0} < {GPL-2.0, GPL-2.0-only}).
-func licenseRanges() [][][]string {
-	return [][][]string{
-		{
-			{
-				"AFL-1.1",
-			},
-			{
-				"AFL-1.2",
-			},
-			{
-				"AFL-2.0",
-			},
-			{
-				"AFL-2.1",
-			},
-			{
-				"AFL-3.0",
-			},
-		},
-		{
-			{
-				"AGPL-1.0",
-			},
-			{
-				"AGPL-3.0",
-				"AGPL-3.0-only",
-			},
-		},
-		{
-			{
-				"Apache-1.0",
-			},
-			{
-				"Apache-1.1",
-			},
-			{
-				"Apache-2.0",
-			},
-		},
-		{
-			{
-				"APSL-1.0",
-			},
-			{
-				"APSL-1.1",
-			},
-			{
-				"APSL-1.2",
-			},
-			{
-				"APSL-2.0",
-			},
-		},
-		{
-			{
-				"Artistic-1.0",
-			},
-			{
-				"Artistic-2.0",
-			},
-		},
-		{
-			{
-				"BitTorrent-1.0",
-			},
-			{
-				"BitTorrent-1.1",
-			},
-		},
-		{
-			{
-				"CC-BY-1.0",
-			},
-			{
-				"CC-BY-2.0",
-			},
-			{
-				"CC-BY-2.5",
-			},
-			{
-				"CC-BY-3.0",
-			},
-			{
-				"CC-BY-4.0",
-			},
-		},
-		{
-			{
-				"CC-BY-NC-1.0",
-			},
-			{
-				"CC-BY-NC-2.0",
-			},
-			{
-				"CC-BY-NC-2.5",
-			},
-			{
-				"CC-BY-NC-3.0",
-			},
-			{
-				"CC-BY-NC-4.0",
-			},
-		},
-		{
-			{
-				"CC-BY-NC-ND-1.0",
-			},
-			{
-				"CC-BY-NC-ND-2.0",
-			},
-			{
-				"CC-BY-NC-ND-2.5",
-			},
-			{
-				"CC-BY-NC-ND-3.0",
-			},
-			{
-				"CC-BY-NC-ND-4.0",
-			},
-		},
-		{
-			{
-				"CC-BY-NC-SA-1.0",
-			},
-			{
-				"CC-BY-NC-SA-2.0",
-			},
-			{
-				"CC-BY-NC-SA-2.5",
-			},
-			{
-				"CC-BY-NC-SA-3.0",
-			},
-			{
-				"CC-BY-NC-SA-4.0",
-			},
-		},
-		{
-			{
-				"CC-BY-ND-1.0",
-			},
-			{
-				"CC-BY-ND-2.0",
-			},
-			{
-				"CC-BY-ND-2.5",
-			},
-			{
-				"CC-BY-ND-3.0",
-			},
-			{
-				"CC-BY-ND-4.0",
-			},
-		},
-		{
-			{
-				"CC-BY-SA-1.0",
-			},
-			{
-				"CC-BY-SA-2.0",
-			},
-			{
-				"CC-BY-SA-2.5",
-			},
-			{
-				"CC-BY-SA-3.0",
-			},
-			{
-				"CC-BY-SA-4.0",
-			},
-		},
-		{
-			{
-				"CDDL-1.0",
-			},
-			{
-				"CDDL-1.1",
-			},
-		},
-		{
-			{
-				"CECILL-1.0",
-			},
-			{
-				"CECILL-1.1",
-			},
-			{
-				"CECILL-2.0",
-			},
-		},
-		{
-			{
-				"ECL-1.0",
-			},
-			{
-				"ECL-2.0",
-			},
-		},
-		{
-			{
-				"EFL-1.0",
-			},
-			{
-				"EFL-2.0",
-			},
-		},
-		{
-			{
-				"EPL-1.0",
-			},
-			{
-				"EPL-2.0",
-			},
-		},
-		{
-			{
-				"EUPL-1.0",
-			},
-			{
-				"EUPL-1.1",
-			},
-		},
-		{
-			{
-				"GFDL-1.1",
-				"GFDL-1.1-only",
-			},
-			{
-				"GFDL-1.2",
-				"GFDL-1.2-only",
-			},
-			{
-				"GFDL-1.1-or-later",
-				"GFDL-1.2-or-later",
-				"GFDL-1.3",
-				"GFDL-1.3-only",
-				"GFDL-1.3-or-later",
-			},
-		},
-		{
-			{
-				"GPL-1.0",
-				"GPL-1.0-only",
-			},
-			{
-				"GPL-2.0",
-				"GPL-2.0-only",
-			},
-			{
-				"GPL-1.0-or-later",
-				"GPL-2.0-or-later",
-				"GPL-3.0",
-				"GPL-3.0-only",
-				"GPL-3.0-or-later",
-			},
-		},
-		{
-			{
-				"LGPL-2.0",
-				"LGPL-2.0-only",
-			},
-			{
-				"LGPL-2.1",
-				"LGPL-2.1-only",
-			},
-			{
-				"LGPL-2.0-or-later",
-				"LGPL-2.1-or-later",
-				"LGPL-3.0",
-				"LGPL-3.0-only",
-				"LGPL-3.0-or-later",
-			},
-		},
-		{
-			{
-				"LPL-1.0",
-			},
-			{
-				"LPL-1.02",
-			},
-		},
-		{
-			{
-				"LPPL-1.0",
-			},
-			{
-				"LPPL-1.1",
-			},
-			{
-				"LPPL-1.2",
-			},
-			{
-				"LPPL-1.3a",
-			},
-			{
-				"LPPL-1.3c",
-			},
-		},
-		{
-			{
-				"MPL-1.0",
-			},
-			{
-				"MPL-1.1",
-			},
-			{
-				"MPL-2.0",
-			},
-		},
-		{
-			{
-				"MPL-1.0",
-			},
-			{
-				"MPL-1.1",
-			},
-			{
-				"MPL-2.0-no-copyleft-exception",
-			},
-		},
-		{
-			{
-				"NPL-1.0",
-			},
-			{
-				"NPL-1.1",
-			},
-		},
-		{
-			{
-				"OFL-1.0",
-			},
-			{
-				"OFL-1.1",
-			},
-		},
-		{
-			{
-				"OLDAP-1.1",
-			},
-			{
-				"OLDAP-1.2",
-			},
-			{
-				"OLDAP-1.3",
-			},
-			{
-				"OLDAP-1.4",
-			},
-			{
-				"OLDAP-2.0",
-			},
-			{
-				"OLDAP-2.0.1",
-			},
-			{
-				"OLDAP-2.1",
-			},
-			{
-				"OLDAP-2.2",
-			},
-			{
-				"OLDAP-2.2.1",
-			},
-			{
-				"OLDAP-2.2.2",
-			},
-			{
-				"OLDAP-2.3",
-			},
-			{
-				"OLDAP-2.4",
-			},
-			{
-				"OLDAP-2.5",
-			},
-			{
-				"OLDAP-2.6",
-			},
-			{
-				"OLDAP-2.7",
-			},
-			{
-				"OLDAP-2.8",
-			},
-		},
-		{
-			{
-				"OSL-1.0",
-			},
-			{
-				"OSL-1.1",
-			},
-			{
-				"OSL-2.0",
-			},
-			{
-				"OSL-2.1",
-			},
-			{
-				"OSL-3.0",
-			},
-		},
-		{
-			{
-				"PHP-3.0",
-			},
-			{
-				"PHP-3.01",
-			},
-		},
-		{
-			{
-				"RPL-1.1",
-			},
-			{
-				"RPL-1.5",
-			},
-		},
-		{
-			{
-				"SGI-B-1.0",
-			},
-			{
-				"SGI-B-1.1",
-			},
-			{
-				"SGI-B-2.0",
-			},
-		},
-		{
-			{
-				"YPL-1.0",
-			},
-			{
-				"YPL-1.1",
-			},
-		},
-		{
-			{
-				"ZPL-1.1",
-			},
-			{
-				"ZPL-2.0",
-			},
-			{
-				"ZPL-2.1",
-			},
-		},
-		{
-			{
-				"Zimbra-1.3",
-			},
-			{
-				"Zimbra-1.4",
-			},
-		},
-		{
-			{
-				"bzip2-1.0.5",
-			},
-			{
-				"bzip2-1.0.6",
-			},
-		},
-	}
-}
diff --git a/spdxexp/spdxlicenses/get_deprecated.go b/spdxexp/spdxlicenses/get_deprecated.go
new file mode 100644
index 0000000..d0776a5
--- /dev/null
+++ b/spdxexp/spdxlicenses/get_deprecated.go
@@ -0,0 +1,37 @@
+package spdxlicenses
+
+func GetDeprecated() []string {
+	return []string{
+		"AGPL-1.0",
+		"AGPL-3.0",
+		"BSD-2-Clause-FreeBSD",
+		"BSD-2-Clause-NetBSD",
+		"bzip2-1.0.5",
+		"eCos-2.0",
+		"GFDL-1.1",
+		"GFDL-1.2",
+		"GFDL-1.3",
+		"GPL-1.0",
+		"GPL-1.0+",
+		"GPL-2.0",
+		"GPL-2.0+",
+		"GPL-2.0-with-autoconf-exception",
+		"GPL-2.0-with-bison-exception",
+		"GPL-2.0-with-classpath-exception",
+		"GPL-2.0-with-font-exception",
+		"GPL-2.0-with-GCC-exception",
+		"GPL-3.0",
+		"GPL-3.0+",
+		"GPL-3.0-with-autoconf-exception",
+		"GPL-3.0-with-GCC-exception",
+		"LGPL-2.0",
+		"LGPL-2.0+",
+		"LGPL-2.1",
+		"LGPL-2.1+",
+		"LGPL-3.0",
+		"LGPL-3.0+",
+		"Nunit",
+		"StandardML-NJ",
+		"wxWindows",
+	}
+}
diff --git a/spdxexp/spdxlicenses/get_exceptions.go b/spdxexp/spdxlicenses/get_exceptions.go
new file mode 100644
index 0000000..23ae857
--- /dev/null
+++ b/spdxexp/spdxlicenses/get_exceptions.go
@@ -0,0 +1,50 @@
+package spdxlicenses
+
+func GetExceptions() []string {
+	return []string{
+		"389-exception",
+		"Autoconf-exception-2.0",
+		"Autoconf-exception-3.0",
+		"Bison-exception-2.2",
+		"Bootloader-exception",
+		"Classpath-exception-2.0",
+		"CLISP-exception-2.0",
+		"DigiRule-FOSS-exception",
+		"eCos-exception-2.0",
+		"Fawkes-Runtime-exception",
+		"FLTK-exception",
+		"Font-exception-2.0",
+		"freertos-exception-2.0",
+		"GCC-exception-2.0",
+		"GCC-exception-3.1",
+		"gnu-javamail-exception",
+		"GPL-3.0-linking-exception",
+		"GPL-3.0-linking-source-exception",
+		"GPL-CC-1.0",
+		"GStreamer-exception-2005",
+		"GStreamer-exception-2008",
+		"i2p-gpl-java-exception",
+		"KiCad-libraries-exception",
+		"LGPL-3.0-linking-exception",
+		"Libtool-exception",
+		"Linux-syscall-note",
+		"LLVM-exception",
+		"LZMA-exception",
+		"mif-exception",
+		"OCaml-LGPL-linking-exception",
+		"OCCT-exception-1.0",
+		"OpenJDK-assembly-exception-1.0",
+		"openvpn-openssl-exception",
+		"PS-or-PDF-font-exception-20170817",
+		"Qt-GPL-exception-1.0",
+		"Qt-LGPL-exception-1.1",
+		"Qwt-exception-1.0",
+		"SHL-2.0",
+		"SHL-2.1",
+		"Swift-exception",
+		"u-boot-exception-2.0",
+		"Universal-FOSS-exception-1.0",
+		"WxWindows-exception-3.1",
+		"x11vnc-openssl-exception",
+	}
+}
diff --git a/spdxexp/spdxlicenses/get_licenses.go b/spdxexp/spdxlicenses/get_licenses.go
new file mode 100644
index 0000000..d95af23
--- /dev/null
+++ b/spdxexp/spdxlicenses/get_licenses.go
@@ -0,0 +1,485 @@
+package spdxlicenses
+
+func GetLicenses() []string {
+	return []string{
+		"0BSD",
+		"AAL",
+		"Abstyles",
+		"Adobe-2006",
+		"Adobe-Glyph",
+		"ADSL",
+		"AFL-1.1",
+		"AFL-1.2",
+		"AFL-2.0",
+		"AFL-2.1",
+		"AFL-3.0",
+		"Afmparse",
+		"AGPL-1.0-only",
+		"AGPL-1.0-or-later",
+		"AGPL-3.0-only",
+		"AGPL-3.0-or-later",
+		"Aladdin",
+		"AMDPLPA",
+		"AML",
+		"AMPAS",
+		"ANTLR-PD",
+		"ANTLR-PD-fallback",
+		"Apache-1.0",
+		"Apache-1.1",
+		"Apache-2.0",
+		"APAFML",
+		"APL-1.0",
+		"App-s2p",
+		"APSL-1.0",
+		"APSL-1.1",
+		"APSL-1.2",
+		"APSL-2.0",
+		"Arphic-1999",
+		"Artistic-1.0",
+		"Artistic-1.0-cl8",
+		"Artistic-1.0-Perl",
+		"Artistic-2.0",
+		"Baekmuk",
+		"Bahyph",
+		"Barr",
+		"Beerware",
+		"Bitstream-Charter",
+		"Bitstream-Vera",
+		"BitTorrent-1.0",
+		"BitTorrent-1.1",
+		"blessing",
+		"BlueOak-1.0.0",
+		"Borceux",
+		"BSD-1-Clause",
+		"BSD-2-Clause",
+		"BSD-2-Clause-Patent",
+		"BSD-2-Clause-Views",
+		"BSD-3-Clause",
+		"BSD-3-Clause-Attribution",
+		"BSD-3-Clause-Clear",
+		"BSD-3-Clause-LBNL",
+		"BSD-3-Clause-Modification",
+		"BSD-3-Clause-No-Military-License",
+		"BSD-3-Clause-No-Nuclear-License",
+		"BSD-3-Clause-No-Nuclear-License-2014",
+		"BSD-3-Clause-No-Nuclear-Warranty",
+		"BSD-3-Clause-Open-MPI",
+		"BSD-4-Clause",
+		"BSD-4-Clause-Shortened",
+		"BSD-4-Clause-UC",
+		"BSD-Protection",
+		"BSD-Source-Code",
+		"BSL-1.0",
+		"BUSL-1.1",
+		"bzip2-1.0.6",
+		"C-UDA-1.0",
+		"CAL-1.0",
+		"CAL-1.0-Combined-Work-Exception",
+		"Caldera",
+		"CATOSL-1.1",
+		"CC-BY-1.0",
+		"CC-BY-2.0",
+		"CC-BY-2.5",
+		"CC-BY-2.5-AU",
+		"CC-BY-3.0",
+		"CC-BY-3.0-AT",
+		"CC-BY-3.0-DE",
+		"CC-BY-3.0-IGO",
+		"CC-BY-3.0-NL",
+		"CC-BY-3.0-US",
+		"CC-BY-4.0",
+		"CC-BY-NC-1.0",
+		"CC-BY-NC-2.0",
+		"CC-BY-NC-2.5",
+		"CC-BY-NC-3.0",
+		"CC-BY-NC-3.0-DE",
+		"CC-BY-NC-4.0",
+		"CC-BY-NC-ND-1.0",
+		"CC-BY-NC-ND-2.0",
+		"CC-BY-NC-ND-2.5",
+		"CC-BY-NC-ND-3.0",
+		"CC-BY-NC-ND-3.0-DE",
+		"CC-BY-NC-ND-3.0-IGO",
+		"CC-BY-NC-ND-4.0",
+		"CC-BY-NC-SA-1.0",
+		"CC-BY-NC-SA-2.0",
+		"CC-BY-NC-SA-2.0-DE",
+		"CC-BY-NC-SA-2.0-FR",
+		"CC-BY-NC-SA-2.0-UK",
+		"CC-BY-NC-SA-2.5",
+		"CC-BY-NC-SA-3.0",
+		"CC-BY-NC-SA-3.0-DE",
+		"CC-BY-NC-SA-3.0-IGO",
+		"CC-BY-NC-SA-4.0",
+		"CC-BY-ND-1.0",
+		"CC-BY-ND-2.0",
+		"CC-BY-ND-2.5",
+		"CC-BY-ND-3.0",
+		"CC-BY-ND-3.0-DE",
+		"CC-BY-ND-4.0",
+		"CC-BY-SA-1.0",
+		"CC-BY-SA-2.0",
+		"CC-BY-SA-2.0-UK",
+		"CC-BY-SA-2.1-JP",
+		"CC-BY-SA-2.5",
+		"CC-BY-SA-3.0",
+		"CC-BY-SA-3.0-AT",
+		"CC-BY-SA-3.0-DE",
+		"CC-BY-SA-4.0",
+		"CC-PDDC",
+		"CC0-1.0",
+		"CDDL-1.0",
+		"CDDL-1.1",
+		"CDL-1.0",
+		"CDLA-Permissive-1.0",
+		"CDLA-Permissive-2.0",
+		"CDLA-Sharing-1.0",
+		"CECILL-1.0",
+		"CECILL-1.1",
+		"CECILL-2.0",
+		"CECILL-2.1",
+		"CECILL-B",
+		"CECILL-C",
+		"CERN-OHL-1.1",
+		"CERN-OHL-1.2",
+		"CERN-OHL-P-2.0",
+		"CERN-OHL-S-2.0",
+		"CERN-OHL-W-2.0",
+		"checkmk",
+		"ClArtistic",
+		"CNRI-Jython",
+		"CNRI-Python",
+		"CNRI-Python-GPL-Compatible",
+		"COIL-1.0",
+		"Community-Spec-1.0",
+		"Condor-1.1",
+		"copyleft-next-0.3.0",
+		"copyleft-next-0.3.1",
+		"CPAL-1.0",
+		"CPL-1.0",
+		"CPOL-1.02",
+		"Crossword",
+		"CrystalStacker",
+		"CUA-OPL-1.0",
+		"Cube",
+		"curl",
+		"D-FSL-1.0",
+		"diffmark",
+		"DL-DE-BY-2.0",
+		"DOC",
+		"Dotseqn",
+		"DRL-1.0",
+		"DSDP",
+		"dvipdfm",
+		"ECL-1.0",
+		"ECL-2.0",
+		"EFL-1.0",
+		"EFL-2.0",
+		"eGenix",
+		"Elastic-2.0",
+		"Entessa",
+		"EPICS",
+		"EPL-1.0",
+		"EPL-2.0",
+		"ErlPL-1.1",
+		"etalab-2.0",
+		"EUDatagrid",
+		"EUPL-1.0",
+		"EUPL-1.1",
+		"EUPL-1.2",
+		"Eurosym",
+		"Fair",
+		"FDK-AAC",
+		"Frameworx-1.0",
+		"FreeBSD-DOC",
+		"FreeImage",
+		"FSFAP",
+		"FSFUL",
+		"FSFULLR",
+		"FSFULLRWD",
+		"FTL",
+		"GD",
+		"GFDL-1.1-invariants-only",
+		"GFDL-1.1-invariants-or-later",
+		"GFDL-1.1-no-invariants-only",
+		"GFDL-1.1-no-invariants-or-later",
+		"GFDL-1.1-only",
+		"GFDL-1.1-or-later",
+		"GFDL-1.2-invariants-only",
+		"GFDL-1.2-invariants-or-later",
+		"GFDL-1.2-no-invariants-only",
+		"GFDL-1.2-no-invariants-or-later",
+		"GFDL-1.2-only",
+		"GFDL-1.2-or-later",
+		"GFDL-1.3-invariants-only",
+		"GFDL-1.3-invariants-or-later",
+		"GFDL-1.3-no-invariants-only",
+		"GFDL-1.3-no-invariants-or-later",
+		"GFDL-1.3-only",
+		"GFDL-1.3-or-later",
+		"Giftware",
+		"GL2PS",
+		"Glide",
+		"Glulxe",
+		"GLWTPL",
+		"gnuplot",
+		"GPL-1.0-only",
+		"GPL-1.0-or-later",
+		"GPL-2.0-only",
+		"GPL-2.0-or-later",
+		"GPL-3.0-only",
+		"GPL-3.0-or-later",
+		"Graphics-Gems",
+		"gSOAP-1.3b",
+		"HaskellReport",
+		"Hippocratic-2.1",
+		"HPND",
+		"HPND-export-US",
+		"HPND-sell-variant",
+		"HTMLTIDY",
+		"IBM-pibs",
+		"ICU",
+		"IJG",
+		"IJG-short",
+		"ImageMagick",
+		"iMatix",
+		"Imlib2",
+		"Info-ZIP",
+		"Intel",
+		"Intel-ACPI",
+		"Interbase-1.0",
+		"IPA",
+		"IPL-1.0",
+		"ISC",
+		"Jam",
+		"JasPer-2.0",
+		"JPNIC",
+		"JSON",
+		"Knuth-CTAN",
+		"LAL-1.2",
+		"LAL-1.3",
+		"Latex2e",
+		"Leptonica",
+		"LGPL-2.0-only",
+		"LGPL-2.0-or-later",
+		"LGPL-2.1-only",
+		"LGPL-2.1-or-later",
+		"LGPL-3.0-only",
+		"LGPL-3.0-or-later",
+		"LGPLLR",
+		"Libpng",
+		"libpng-2.0",
+		"libselinux-1.0",
+		"libtiff",
+		"libutil-David-Nugent",
+		"LiLiQ-P-1.1",
+		"LiLiQ-R-1.1",
+		"LiLiQ-Rplus-1.1",
+		"Linux-man-pages-copyleft",
+		"Linux-OpenIB",
+		"LOOP",
+		"LPL-1.0",
+		"LPL-1.02",
+		"LPPL-1.0",
+		"LPPL-1.1",
+		"LPPL-1.2",
+		"LPPL-1.3a",
+		"LPPL-1.3c",
+		"LZMA-SDK-9.11-to-9.20",
+		"LZMA-SDK-9.22",
+		"MakeIndex",
+		"Minpack",
+		"MirOS",
+		"MIT",
+		"MIT-0",
+		"MIT-advertising",
+		"MIT-CMU",
+		"MIT-enna",
+		"MIT-feh",
+		"MIT-Modern-Variant",
+		"MIT-open-group",
+		"MIT-Wu",
+		"MITNFA",
+		"Motosoto",
+		"mpi-permissive",
+		"mpich2",
+		"MPL-1.0",
+		"MPL-1.1",
+		"MPL-2.0",
+		"MPL-2.0-no-copyleft-exception",
+		"mplus",
+		"MS-LPL",
+		"MS-PL",
+		"MS-RL",
+		"MTLL",
+		"MulanPSL-1.0",
+		"MulanPSL-2.0",
+		"Multics",
+		"Mup",
+		"NAIST-2003",
+		"NASA-1.3",
+		"Naumen",
+		"NBPL-1.0",
+		"NCGL-UK-2.0",
+		"NCSA",
+		"Net-SNMP",
+		"NetCDF",
+		"Newsletr",
+		"NGPL",
+		"NICTA-1.0",
+		"NIST-PD",
+		"NIST-PD-fallback",
+		"NLOD-1.0",
+		"NLOD-2.0",
+		"NLPL",
+		"Nokia",
+		"NOSL",
+		"Noweb",
+		"NPL-1.0",
+		"NPL-1.1",
+		"NPOSL-3.0",
+		"NRL",
+		"NTP",
+		"NTP-0",
+		"O-UDA-1.0",
+		"OCCT-PL",
+		"OCLC-2.0",
+		"ODbL-1.0",
+		"ODC-By-1.0",
+		"OFL-1.0",
+		"OFL-1.0-no-RFN",
+		"OFL-1.0-RFN",
+		"OFL-1.1",
+		"OFL-1.1-no-RFN",
+		"OFL-1.1-RFN",
+		"OGC-1.0",
+		"OGDL-Taiwan-1.0",
+		"OGL-Canada-2.0",
+		"OGL-UK-1.0",
+		"OGL-UK-2.0",
+		"OGL-UK-3.0",
+		"OGTSL",
+		"OLDAP-1.1",
+		"OLDAP-1.2",
+		"OLDAP-1.3",
+		"OLDAP-1.4",
+		"OLDAP-2.0",
+		"OLDAP-2.0.1",
+		"OLDAP-2.1",
+		"OLDAP-2.2",
+		"OLDAP-2.2.1",
+		"OLDAP-2.2.2",
+		"OLDAP-2.3",
+		"OLDAP-2.4",
+		"OLDAP-2.5",
+		"OLDAP-2.6",
+		"OLDAP-2.7",
+		"OLDAP-2.8",
+		"OML",
+		"OpenSSL",
+		"OPL-1.0",
+		"OPUBL-1.0",
+		"OSET-PL-2.1",
+		"OSL-1.0",
+		"OSL-1.1",
+		"OSL-2.0",
+		"OSL-2.1",
+		"OSL-3.0",
+		"Parity-6.0.0",
+		"Parity-7.0.0",
+		"PDDL-1.0",
+		"PHP-3.0",
+		"PHP-3.01",
+		"Plexus",
+		"PolyForm-Noncommercial-1.0.0",
+		"PolyForm-Small-Business-1.0.0",
+		"PostgreSQL",
+		"PSF-2.0",
+		"psfrag",
+		"psutils",
+		"Python-2.0",
+		"Python-2.0.1",
+		"Qhull",
+		"QPL-1.0",
+		"Rdisc",
+		"RHeCos-1.1",
+		"RPL-1.1",
+		"RPL-1.5",
+		"RPSL-1.0",
+		"RSA-MD",
+		"RSCPL",
+		"Ruby",
+		"SAX-PD",
+		"Saxpath",
+		"SCEA",
+		"SchemeReport",
+		"Sendmail",
+		"Sendmail-8.23",
+		"SGI-B-1.0",
+		"SGI-B-1.1",
+		"SGI-B-2.0",
+		"SHL-0.5",
+		"SHL-0.51",
+		"SimPL-2.0",
+		"SISSL",
+		"SISSL-1.2",
+		"Sleepycat",
+		"SMLNJ",
+		"SMPPL",
+		"SNIA",
+		"Spencer-86",
+		"Spencer-94",
+		"Spencer-99",
+		"SPL-1.0",
+		"SSH-OpenSSH",
+		"SSH-short",
+		"SSPL-1.0",
+		"SugarCRM-1.1.3",
+		"SWL",
+		"Symlinks",
+		"TAPR-OHL-1.0",
+		"TCL",
+		"TCP-wrappers",
+		"TMate",
+		"TORQUE-1.1",
+		"TOSL",
+		"TPDL",
+		"TTWL",
+		"TU-Berlin-1.0",
+		"TU-Berlin-2.0",
+		"UCL-1.0",
+		"Unicode-DFS-2015",
+		"Unicode-DFS-2016",
+		"Unicode-TOU",
+		"Unlicense",
+		"UPL-1.0",
+		"Vim",
+		"VOSTROM",
+		"VSL-1.0",
+		"W3C",
+		"W3C-19980720",
+		"W3C-20150513",
+		"Watcom-1.0",
+		"Wsuipa",
+		"WTFPL",
+		"X11",
+		"X11-distribute-modifications-variant",
+		"Xerox",
+		"XFree86-1.1",
+		"xinetd",
+		"Xnet",
+		"xpp",
+		"XSkat",
+		"YPL-1.0",
+		"YPL-1.1",
+		"Zed",
+		"Zend-2.0",
+		"Zimbra-1.3",
+		"Zimbra-1.4",
+		"Zlib",
+		"zlib-acknowledgement",
+		"ZPL-1.1",
+		"ZPL-2.0",
+		"ZPL-2.1",
+	}
+}
diff --git a/spdxexp/spdxlicenses/license_ranges.go b/spdxexp/spdxlicenses/license_ranges.go
new file mode 100644
index 0000000..9474670
--- /dev/null
+++ b/spdxexp/spdxlicenses/license_ranges.go
@@ -0,0 +1,476 @@
+package spdxlicenses
+
+// licenseRanges returns a list of license ranges.
+//
+// Ranges are organized into groups (referred to as license groups) of the same base license (e.g. GPL).
+// Groups have sub-groups of license versions (referred to as the range) where each member is considered
+// to be the same version (e.g. {GPL-2.0, GPL-2.0-only}). The sub-groups are in ascending order within
+// the license group, such that the first sub-group is considered to be less than the second sub-group,
+// and so on. (e.g. {{GPL-1.0}, {GPL-2.0, GPL-2.0-only}} implies {GPL-1.0} < {GPL-2.0, GPL-2.0-only}).
+func LicenseRanges() [][][]string {
+	return [][][]string{
+		{
+			{
+				"AFL-1.1",
+			},
+			{
+				"AFL-1.2",
+			},
+			{
+				"AFL-2.0",
+			},
+			{
+				"AFL-2.1",
+			},
+			{
+				"AFL-3.0",
+			},
+		},
+		{
+			{
+				"AGPL-1.0",
+			},
+			{
+				"AGPL-3.0",
+				"AGPL-3.0-only",
+			},
+		},
+		{
+			{
+				"Apache-1.0",
+			},
+			{
+				"Apache-1.1",
+			},
+			{
+				"Apache-2.0",
+			},
+		},
+		{
+			{
+				"APSL-1.0",
+			},
+			{
+				"APSL-1.1",
+			},
+			{
+				"APSL-1.2",
+			},
+			{
+				"APSL-2.0",
+			},
+		},
+		{
+			{
+				"Artistic-1.0",
+			},
+			{
+				"Artistic-2.0",
+			},
+		},
+		{
+			{
+				"BitTorrent-1.0",
+			},
+			{
+				"BitTorrent-1.1",
+			},
+		},
+		{
+			{
+				"CC-BY-1.0",
+			},
+			{
+				"CC-BY-2.0",
+			},
+			{
+				"CC-BY-2.5",
+			},
+			{
+				"CC-BY-3.0",
+			},
+			{
+				"CC-BY-4.0",
+			},
+		},
+		{
+			{
+				"CC-BY-NC-1.0",
+			},
+			{
+				"CC-BY-NC-2.0",
+			},
+			{
+				"CC-BY-NC-2.5",
+			},
+			{
+				"CC-BY-NC-3.0",
+			},
+			{
+				"CC-BY-NC-4.0",
+			},
+		},
+		{
+			{
+				"CC-BY-NC-ND-1.0",
+			},
+			{
+				"CC-BY-NC-ND-2.0",
+			},
+			{
+				"CC-BY-NC-ND-2.5",
+			},
+			{
+				"CC-BY-NC-ND-3.0",
+			},
+			{
+				"CC-BY-NC-ND-4.0",
+			},
+		},
+		{
+			{
+				"CC-BY-NC-SA-1.0",
+			},
+			{
+				"CC-BY-NC-SA-2.0",
+			},
+			{
+				"CC-BY-NC-SA-2.5",
+			},
+			{
+				"CC-BY-NC-SA-3.0",
+			},
+			{
+				"CC-BY-NC-SA-4.0",
+			},
+		},
+		{
+			{
+				"CC-BY-ND-1.0",
+			},
+			{
+				"CC-BY-ND-2.0",
+			},
+			{
+				"CC-BY-ND-2.5",
+			},
+			{
+				"CC-BY-ND-3.0",
+			},
+			{
+				"CC-BY-ND-4.0",
+			},
+		},
+		{
+			{
+				"CC-BY-SA-1.0",
+			},
+			{
+				"CC-BY-SA-2.0",
+			},
+			{
+				"CC-BY-SA-2.5",
+			},
+			{
+				"CC-BY-SA-3.0",
+			},
+			{
+				"CC-BY-SA-4.0",
+			},
+		},
+		{
+			{
+				"CDDL-1.0",
+			},
+			{
+				"CDDL-1.1",
+			},
+		},
+		{
+			{
+				"CECILL-1.0",
+			},
+			{
+				"CECILL-1.1",
+			},
+			{
+				"CECILL-2.0",
+			},
+		},
+		{
+			{
+				"ECL-1.0",
+			},
+			{
+				"ECL-2.0",
+			},
+		},
+		{
+			{
+				"EFL-1.0",
+			},
+			{
+				"EFL-2.0",
+			},
+		},
+		{
+			{
+				"EPL-1.0",
+			},
+			{
+				"EPL-2.0",
+			},
+		},
+		{
+			{
+				"EUPL-1.0",
+			},
+			{
+				"EUPL-1.1",
+			},
+		},
+		{
+			{
+				"GFDL-1.1",
+				"GFDL-1.1-only",
+			},
+			{
+				"GFDL-1.2",
+				"GFDL-1.2-only",
+			},
+			{
+				"GFDL-1.1-or-later",
+				"GFDL-1.2-or-later",
+				"GFDL-1.3",
+				"GFDL-1.3-only",
+				"GFDL-1.3-or-later",
+			},
+		},
+		{
+			{
+				"GPL-1.0",
+				"GPL-1.0-only",
+			},
+			{
+				"GPL-2.0",
+				"GPL-2.0-only",
+			},
+			{
+				"GPL-1.0-or-later",
+				"GPL-2.0-or-later",
+				"GPL-3.0",
+				"GPL-3.0-only",
+				"GPL-3.0-or-later",
+			},
+		},
+		{
+			{
+				"LGPL-2.0",
+				"LGPL-2.0-only",
+			},
+			{
+				"LGPL-2.1",
+				"LGPL-2.1-only",
+			},
+			{
+				"LGPL-2.0-or-later",
+				"LGPL-2.1-or-later",
+				"LGPL-3.0",
+				"LGPL-3.0-only",
+				"LGPL-3.0-or-later",
+			},
+		},
+		{
+			{
+				"LPL-1.0",
+			},
+			{
+				"LPL-1.02",
+			},
+		},
+		{
+			{
+				"LPPL-1.0",
+			},
+			{
+				"LPPL-1.1",
+			},
+			{
+				"LPPL-1.2",
+			},
+			{
+				"LPPL-1.3a",
+			},
+			{
+				"LPPL-1.3c",
+			},
+		},
+		{
+			{
+				"MPL-1.0",
+			},
+			{
+				"MPL-1.1",
+			},
+			{
+				"MPL-2.0",
+			},
+		},
+		{
+			{
+				"MPL-1.0",
+			},
+			{
+				"MPL-1.1",
+			},
+			{
+				"MPL-2.0-no-copyleft-exception",
+			},
+		},
+		{
+			{
+				"NPL-1.0",
+			},
+			{
+				"NPL-1.1",
+			},
+		},
+		{
+			{
+				"OFL-1.0",
+			},
+			{
+				"OFL-1.1",
+			},
+		},
+		{
+			{
+				"OLDAP-1.1",
+			},
+			{
+				"OLDAP-1.2",
+			},
+			{
+				"OLDAP-1.3",
+			},
+			{
+				"OLDAP-1.4",
+			},
+			{
+				"OLDAP-2.0",
+			},
+			{
+				"OLDAP-2.0.1",
+			},
+			{
+				"OLDAP-2.1",
+			},
+			{
+				"OLDAP-2.2",
+			},
+			{
+				"OLDAP-2.2.1",
+			},
+			{
+				"OLDAP-2.2.2",
+			},
+			{
+				"OLDAP-2.3",
+			},
+			{
+				"OLDAP-2.4",
+			},
+			{
+				"OLDAP-2.5",
+			},
+			{
+				"OLDAP-2.6",
+			},
+			{
+				"OLDAP-2.7",
+			},
+			{
+				"OLDAP-2.8",
+			},
+		},
+		{
+			{
+				"OSL-1.0",
+			},
+			{
+				"OSL-1.1",
+			},
+			{
+				"OSL-2.0",
+			},
+			{
+				"OSL-2.1",
+			},
+			{
+				"OSL-3.0",
+			},
+		},
+		{
+			{
+				"PHP-3.0",
+			},
+			{
+				"PHP-3.01",
+			},
+		},
+		{
+			{
+				"RPL-1.1",
+			},
+			{
+				"RPL-1.5",
+			},
+		},
+		{
+			{
+				"SGI-B-1.0",
+			},
+			{
+				"SGI-B-1.1",
+			},
+			{
+				"SGI-B-2.0",
+			},
+		},
+		{
+			{
+				"YPL-1.0",
+			},
+			{
+				"YPL-1.1",
+			},
+		},
+		{
+			{
+				"ZPL-1.1",
+			},
+			{
+				"ZPL-2.0",
+			},
+			{
+				"ZPL-2.1",
+			},
+		},
+		{
+			{
+				"Zimbra-1.3",
+			},
+			{
+				"Zimbra-1.4",
+			},
+		},
+		{
+			{
+				"bzip2-1.0.5",
+			},
+			{
+				"bzip2-1.0.6",
+			},
+		},
+	}
+}