diff --git a/maubot/cli/cliq/validators.py b/maubot/cli/cliq/validators.py
index d267658..99618b9 100644
--- a/maubot/cli/cliq/validators.py
+++ b/maubot/cli/cliq/validators.py
@@ -14,8 +14,6 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
from typing import Callable
-import pkg_resources
-import json
import os
from packaging.version import Version, InvalidVersion
@@ -23,6 +21,8 @@ from prompt_toolkit.validation import Validator, ValidationError
from prompt_toolkit.document import Document
import click
+from ..util import spdx as spdxlib
+
class Required(Validator):
proxy: Validator
@@ -75,19 +75,8 @@ class VersionValidator(ClickValidator):
click_type = version
-spdx_list = None
-
-
-def load_spdx():
- global spdx_list
- spdx_data = pkg_resources.resource_stream("maubot.cli", "res/spdx-simple.json")
- spdx_list = json.load(spdx_data)
-
-
def spdx(val: str) -> str:
- if not spdx_list:
- load_spdx()
- if val not in spdx_list:
+ if spdxlib.valid(val):
raise click.BadParameter(f"{val} is not a valid SPDX license identifier")
return val
diff --git a/maubot/cli/commands/init.py b/maubot/cli/commands/init.py
index a3fb278..63bf3c2 100644
--- a/maubot/cli/commands/init.py
+++ b/maubot/cli/commands/init.py
@@ -21,6 +21,7 @@ from jinja2 import Template
from .. import cliq
from ..cliq import SPDXValidator, VersionValidator
+from ..util import spdx
loaded: bool = False
meta_template: Template
@@ -56,6 +57,8 @@ def init(name: str, id: str, version: Version, license: str, config: bool) -> No
main_class=main_class)
with open("maubot.yaml", "w") as file:
file.write(meta)
+ with open("LICENSE", "w") as file:
+ file.write(spdx.get(license)["text"])
if not os.path.isdir(name):
os.mkdir(name)
mod = mod_template.render(config=config, name=main_class)
diff --git a/maubot/cli/res/spdx-simple.json b/maubot/cli/res/spdx-simple.json
deleted file mode 100644
index 39f8a95..0000000
--- a/maubot/cli/res/spdx-simple.json
+++ /dev/null
@@ -1,383 +0,0 @@
-[
- "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",
- "Apache-1.0",
- "Apache-1.1",
- "Apache-2.0",
- "APAFML",
- "APL-1.0",
- "APSL-1.0",
- "APSL-1.1",
- "APSL-1.2",
- "APSL-2.0",
- "Artistic-1.0-cl8",
- "Artistic-1.0-Perl",
- "Artistic-1.0",
- "Artistic-2.0",
- "Bahyph",
- "Barr",
- "Beerware",
- "BitTorrent-1.0",
- "BitTorrent-1.1",
- "Borceux",
- "BSD-1-Clause",
- "BSD-2-Clause-FreeBSD",
- "BSD-2-Clause-NetBSD",
- "BSD-2-Clause-Patent",
- "BSD-2-Clause",
- "BSD-3-Clause-Attribution",
- "BSD-3-Clause-Clear",
- "BSD-3-Clause-LBNL",
- "BSD-3-Clause-No-Nuclear-License-2014",
- "BSD-3-Clause-No-Nuclear-License",
- "BSD-3-Clause-No-Nuclear-Warranty",
- "BSD-3-Clause",
- "BSD-4-Clause-UC",
- "BSD-4-Clause",
- "BSD-Protection",
- "BSD-Source-Code",
- "BSL-1.0",
- "bzip2-1.0.5",
- "bzip2-1.0.6",
- "Caldera",
- "CATOSL-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",
- "CC0-1.0",
- "CDDL-1.0",
- "CDDL-1.1",
- "CDLA-Permissive-1.0",
- "CDLA-Sharing-1.0",
- "CECILL-1.0",
- "CECILL-1.1",
- "CECILL-2.0",
- "CECILL-2.1",
- "CECILL-B",
- "CECILL-C",
- "ClArtistic",
- "CNRI-Jython",
- "CNRI-Python-GPL-Compatible",
- "CNRI-Python",
- "Condor-1.1",
- "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",
- "DOC",
- "Dotseqn",
- "DSDP",
- "dvipdfm",
- "ECL-1.0",
- "ECL-2.0",
- "EFL-1.0",
- "EFL-2.0",
- "eGenix",
- "Entessa",
- "EPL-1.0",
- "EPL-2.0",
- "ErlPL-1.1",
- "EUDatagrid",
- "EUPL-1.0",
- "EUPL-1.1",
- "EUPL-1.2",
- "Eurosym",
- "Fair",
- "Frameworx-1.0",
- "FreeImage",
- "FSFAP",
- "FSFUL",
- "FSFULLR",
- "FTL",
- "GFDL-1.1-only",
- "GFDL-1.1-or-later",
- "GFDL-1.2-only",
- "GFDL-1.2-or-later",
- "GFDL-1.3-only",
- "GFDL-1.3-or-later",
- "Giftware",
- "GL2PS",
- "Glide",
- "Glulxe",
- "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",
- "gSOAP-1.3b",
- "HaskellReport",
- "HPND",
- "IBM-pibs",
- "ICU",
- "IJG",
- "ImageMagick",
- "iMatix",
- "Imlib2",
- "Info-ZIP",
- "Intel-ACPI",
- "Intel",
- "Interbase-1.0",
- "IPA",
- "IPL-1.0",
- "ISC",
- "JasPer-2.0",
- "JSON",
- "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",
- "libtiff",
- "LiLiQ-P-1.1",
- "LiLiQ-R-1.1",
- "LiLiQ-Rplus-1.1",
- "Linux-OpenIB",
- "LPL-1.0",
- "LPL-1.02",
- "LPPL-1.0",
- "LPPL-1.1",
- "LPPL-1.2",
- "LPPL-1.3a",
- "LPPL-1.3c",
- "MakeIndex",
- "MirOS",
- "MIT-0",
- "MIT-advertising",
- "MIT-CMU",
- "MIT-enna",
- "MIT-feh",
- "MIT",
- "MITNFA",
- "Motosoto",
- "mpich2",
- "MPL-1.0",
- "MPL-1.1",
- "MPL-2.0-no-copyleft-exception",
- "MPL-2.0",
- "MS-PL",
- "MS-RL",
- "MTLL",
- "Multics",
- "Mup",
- "NASA-1.3",
- "Naumen",
- "NBPL-1.0",
- "NCSA",
- "Net-SNMP",
- "NetCDF",
- "Newsletr",
- "NGPL",
- "NLOD-1.0",
- "NLPL",
- "Nokia",
- "NOSL",
- "Noweb",
- "NPL-1.0",
- "NPL-1.1",
- "NPOSL-3.0",
- "NRL",
- "NTP",
- "OCCT-PL",
- "OCLC-2.0",
- "ODbL-1.0",
- "ODC-By-1.0",
- "OFL-1.0",
- "OFL-1.1",
- "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.1",
- "OLDAP-2.0",
- "OLDAP-2.1",
- "OLDAP-2.2.1",
- "OLDAP-2.2.2",
- "OLDAP-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",
- "OSET-PL-2.1",
- "OSL-1.0",
- "OSL-1.1",
- "OSL-2.0",
- "OSL-2.1",
- "OSL-3.0",
- "PDDL-1.0",
- "PHP-3.0",
- "PHP-3.01",
- "Plexus",
- "PostgreSQL",
- "psfrag",
- "psutils",
- "Python-2.0",
- "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",
- "Sendmail-8.23",
- "Sendmail",
- "SGI-B-1.0",
- "SGI-B-1.1",
- "SGI-B-2.0",
- "SimPL-2.0",
- "SISSL-1.2",
- "SISSL",
- "Sleepycat",
- "SMLNJ",
- "SMPPL",
- "SNIA",
- "Spencer-86",
- "Spencer-94",
- "Spencer-99",
- "SPL-1.0",
- "SugarCRM-1.1.3",
- "SWL",
- "TCL",
- "TCP-wrappers",
- "TMate",
- "TORQUE-1.1",
- "TOSL",
- "TU-Berlin-1.0",
- "TU-Berlin-2.0",
- "Unicode-DFS-2015",
- "Unicode-DFS-2016",
- "Unicode-TOU",
- "Unlicense",
- "UPL-1.0",
- "Vim",
- "VOSTROM",
- "VSL-1.0",
- "W3C-19980720",
- "W3C-20150513",
- "W3C",
- "Watcom-1.0",
- "Wsuipa",
- "WTFPL",
- "X11",
- "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-acknowledgement",
- "Zlib",
- "ZPL-1.1",
- "ZPL-2.0",
- "ZPL-2.1",
- "AGPL-1.0",
- "AGPL-3.0",
- "eCos-2.0",
- "GFDL-1.1",
- "GFDL-1.2",
- "GFDL-1.3",
- "GPL-1.0+",
- "GPL-1.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-2.0",
- "GPL-3.0+",
- "GPL-3.0-with-autoconf-exception",
- "GPL-3.0-with-GCC-exception",
- "GPL-3.0",
- "LGPL-2.0+",
- "LGPL-2.0",
- "LGPL-2.1+",
- "LGPL-2.1",
- "LGPL-3.0+",
- "LGPL-3.0",
- "Nunit",
- "StandardML-NJ",
- "wxWindows"
-]
\ No newline at end of file
diff --git a/maubot/cli/res/spdx.json.zip b/maubot/cli/res/spdx.json.zip
new file mode 100644
index 0000000..4cd4701
Binary files /dev/null and b/maubot/cli/res/spdx.json.zip differ
diff --git a/maubot/cli/util/__init__.py b/maubot/cli/util/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/maubot/cli/util/spdx.py b/maubot/cli/util/spdx.py
new file mode 100644
index 0000000..2655356
--- /dev/null
+++ b/maubot/cli/util/spdx.py
@@ -0,0 +1,43 @@
+# maubot - A plugin-based Matrix bot system.
+# Copyright (C) 2018 Tulir Asokan
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+from typing import Dict
+import zipfile
+import pkg_resources
+import json
+
+spdx_list = None
+
+
+def load() -> None:
+ global spdx_list
+ if spdx_list is not None:
+ return
+ with pkg_resources.resource_stream("maubot.cli", "res/spdx.json.zip") as disk_file:
+ with zipfile.ZipFile(disk_file) as zip_file:
+ with zip_file.open("spdx.json") as file:
+ spdx_list = json.load(file)
+
+
+def get(id: str) -> Dict[str, str]:
+ if not spdx_list:
+ load()
+ return spdx_list[id.lower()]
+
+
+def valid(id: str) -> bool:
+ if not spdx_list:
+ load()
+ return id.lower() in spdx_list