#!/usr/bin/env python # -*- coding: utf-8 -*- """ @todo add docstring """ # ### imports ### from __future__ import ( absolute_import, division, print_function, # , # unicode_literals ) import fnmatch import io import json import re import os # import pprint import subprocess import sys OSIS = [ "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", "AGPL-1.0-only", "AGPL-1.0-or-later", "AGPL-3.0", "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", "Artistic-1.0-cl8", "Artistic-1.0-Perl", "Artistic-2.0", "Bahyph", "Barr", "Beerware", "BitTorrent-1.0", "BitTorrent-1.1", "Borceux", "BSD-1-Clause", "BSD-2-Clause", "BSD-2-Clause-FreeBSD", "BSD-2-Clause-NetBSD", "BSD-2-Clause-Patent", "BSD-3-Clause", "BSD-3-Clause-Attribution", "BSD-3-Clause-Clear", "BSD-3-Clause-LBNL", "BSD-3-Clause-No-Nuclear-License", "BSD-3-Clause-No-Nuclear-License-2014", "BSD-3-Clause-No-Nuclear-Warranty", "BSD-4-Clause", "BSD-4-Clause-UC", "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", "CNRI-Python-GPL-Compatible", "Condor-1.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", "eCos-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", "GFDL-1.1-only", "GFDL-1.1-or-later", "GFDL-1.2", "GFDL-1.2-only", "GFDL-1.2-or-later", "GFDL-1.3", "GFDL-1.3-only", "GFDL-1.3-or-later", "Giftware", "GL2PS", "Glide", "Glulxe", "gnuplot", "GPL-1.0", "GPL-1.0+", "GPL-1.0-only", "GPL-1.0-or-later", "GPL-2.0", "GPL-2.0+", "GPL-2.0-only", "GPL-2.0-or-later", "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-only", "GPL-3.0-or-later", "GPL-3.0-with-autoconf-exception", "GPL-3.0-with-GCC-exception", "gSOAP-1.3b", "HaskellReport", "HPND", "IBM-pibs", "ICU", "IJG", "ImageMagick", "iMatix", "Imlib2", "Info-ZIP", "Intel", "Intel-ACPI", "Interbase-1.0", "IPA", "IPL-1.0", "ISC", "JasPer-2.0", "JSON", "LAL-1.2", "LAL-1.3", "Latex2e", "Leptonica", "LGPL-2.0", "LGPL-2.0+", "LGPL-2.0-only", "LGPL-2.0-or-later", "LGPL-2.1", "LGPL-2.1+", "LGPL-2.1-only", "LGPL-2.1-or-later", "LGPL-3.0", "LGPL-3.0+", "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", "MIT-0", "MIT-advertising", "MIT-CMU", "MIT-enna", "MIT-feh", "MITNFA", "Motosoto", "mpich2", "MPL-1.0", "MPL-1.1", "MPL-2.0", "MPL-2.0-no-copyleft-exception", "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", "Nunit", "OCCT-PL", "OCLC-2.0", "ODbL-1.0", "OFL-1.0", "OFL-1.1", "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", "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", "SGI-B-1.0", "SGI-B-1.1", "SGI-B-2.0", "SimPL-2.0", "SISSL", "SISSL-1.2", "Sleepycat", "SMLNJ", "SMPPL", "SNIA", "Spencer-86", "Spencer-94", "Spencer-99", "SPL-1.0", "StandardML-NJ", "SugarCRM-1.1.3", "SWL", "TCL", "TCP-wrappers", "TMate", "TORQUE-1.1", "TOSL", "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", "wxWindows", "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", "zlib-acknowledgement", "ZPL-1.1", "ZPL-2.0", "ZPL-2.1", "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", "i2p-gpl-java-exception", "Libtool-exception", "Linux-syscall-note", "LLVM-exception", "LZMA-exception", "mif-exception", "Nokia-Qt-exception-1.1", "OCCT-exception-1.0", "OpenJDK-assembly-exception-1.0", "openvpn-openssl-exception", "Qt-GPL-exception-1.0", "Qt-LGPL-exception-1.1", "Qwt-exception-1.0", "u-boot-exception-2.0", "sWxWindows-exception-3.1", ] OSImap = {} for osi in OSIS: OSImap[osi.lower()] = "https://spdx.org/licenses/%s" % osi lmap = { "commercial": "https://en.m.wikipedia.org/wiki/Software_license#Proprietary_software_licenses", "freeware": "https://en.wikipedia.org/wiki/Freeware", "proprietary": "https://en.m.wikipedia.org/wiki/Software_license#Proprietary_software_licenses", "public_domain": "https://wiki.creativecommons.org/wiki/Public_domain", "public domain": "https://wiki.creativecommons.org/wiki/Public_domain", "public-domain": "https://wiki.creativecommons.org/wiki/Public_domain", "publicdomain": "https://wiki.creativecommons.org/wiki/Public_domain", "shareware": "https://en.wikipedia.org/wiki/Shareware", } def do_license(v): """doc me""" url = v if "identifier" in v: identifier = v["identifier"] else: identifier = "" if "url" in v: url = v["url"] if re.search("^(http|ftp)", url): if not identifier: identifier = "Link" v = '[%s](%s "%s")' % (identifier, url, url) return v if not identifier: identifier = url parts = re.split(r"[,|\s]+", identifier) v = "" for part in parts: if v > "": v += "/" url = "" k = part.lower() if k in OSImap: url = OSImap[k] elif lmap.get(k): url = lmap[k] if url > "": v += '[%s](%s "%s")' % (part, url, url) else: v += part return v def get_url(js): """doc me""" if "checkver" in js: if "url" in js["checkver"]: return js["checkver"]["url"] if "homepage" in js: return js["homepage"] return "" def do_version(js): """doc me""" version = js["version"] url = get_url(js) if "checkver" not in js: version = "%s" % version if url == "": return version return '[%s](%s "%s")' % (version, url, url) # pylint: disable=R0912 # Too many branches (22/12) (too-many-branches) # pylint: disable=R0915 # Too many statements (71/50) (too-many-statements) def main(): """doc me""" markdown = "README.md" print("Reading %s" % markdown) with io.open(markdown, "r", encoding="utf-8") as f: lines = f.readlines() for i, line in enumerate(lines): lines[i] = str(line) specs = sys.argv specs.pop(0) if len(specs) == 0: specs = ["bucket/*.json"] keys = [ "checkver", "description", "homepage", "license", "version", ] rows = {} # cmdline = ["git", "ls-files"] proc = subprocess.Popen("git ls-files", stdout=subprocess.PIPE, shell=True) (out, _) = proc.communicate() files = out.splitlines() for file in files: file = file.decode("utf-8") if re.search("wip/", file): # print("skipping %s: wip" % file) continue accept = False print("file=%s" % file) for spec in specs: # print("spec=%s" % spec) if fnmatch.fnmatch(file, spec): accept = True break if not accept: # print("skipping %s: not matched" % file) continue with open(file, "r") as f: j = json.load(f) row = {} (name, _) = os.path.splitext(os.path.basename(file)) if re.search("^_", name): # print("skipping %s: starts with _" % name) continue if re.search("^schema", name): # print("skipping %s: starts with schema" % name) continue for key in keys: if key in j: val = j[key] if type(val).__name__ == "unicode": val = val.strip() if key == "license": val = do_license(val) if key == "version": val = do_version(j) row[key] = val else: row[key] = "" rows[name] = row table = [ "", "", "|Name|Version|Description|License|", "|----|-------|-----------|-------|", ] newlist = [(key, rows[key]) for key in sorted(rows.keys())] for (name, row) in newlist: table.append( '|[%s](%s "%s")|%s|%s|%s|' % (name, row["homepage"], row["homepage"], row["version"], row["description"], row["license"]) ) out = [] found = False for line in lines: line = str(line.strip()) if found: if re.match(r"^\s*", line): found = False else: continue if re.match(r"^\s*", line): found = True out.append(line) out.extend(table) continue out.append(line) print("Writing %s" % markdown) with io.open(markdown + ".tmp", "w", encoding="utf-8", newline="\n") as f: data = "\n".join(out) + "\n" f.write(data) if os.path.exists(markdown + ".bak"): os.remove(markdown + ".bak") os.rename(markdown, markdown + ".bak") os.rename(markdown + ".tmp", markdown) main() sys.exit(0)