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