diff options
| author | Federico Ceratto <federico.ceratto@gmail.com> | 2015-03-07 23:55:08 +0000 |
|---|---|---|
| committer | Federico Ceratto <federico.ceratto@gmail.com> | 2015-03-07 23:55:08 +0000 |
| commit | 0a107dfd1a53fc00aa34b001fcb2e7ce21759f35 (patch) | |
| tree | 1eb855855c6689698530e1a692526ae77cd6b9c9 | |
| parent | 59cba7fadd0f70c62168b424eb69c722de146622 (diff) | |
| download | packages-0a107dfd1a53fc00aa34b001fcb2e7ce21759f35.tar.gz packages-0a107dfd1a53fc00aa34b001fcb2e7ce21759f35.zip | |
Add package scanner
| -rw-r--r-- | package_scanner.nim | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/package_scanner.nim b/package_scanner.nim new file mode 100644 index 0000000..8f9bc3f --- /dev/null +++ b/package_scanner.nim @@ -0,0 +1,101 @@ + +# A very simple Nim package scanner. +# +# Scan the package list from: +# https://github.com/nim-lang/packages/blob/master/packages.json +# +# Check the packages for: +# * Missing/unknown license +# * Missing description +# * Missing name +# * Missing/unknown method +# * Missing/unreachable repository +# +# Usage: nim c -d:ssl -r package_scanner.nim +# +# Copyright 2015 Federico Ceratto <federico.ceratto@gmail.com> +# Released under GPLv3 License, see /usr/share/common-licenses/GPL-3 + +import httpclient +import net +import json + +const + PKG_LIST_URL = "https://raw.githubusercontent.com/nim-lang/packages/master/packages.json" + + LICENSES = @[ + "Allegro 4 Giftware", + "BSD", + "BSD3", + "CC0", + "GPL", + "GPLv2", + "GPLv3", + "LGPLv2", + "LGPLv3", + "MIT", + "MS-PL", + "WTFPL", + "libpng", + "zlib" + ] + + VCS_TYPES = @["git", "hg"] + +proc check(): int = + var + name: string + url: string + + + echo "" + let + pkg_list = parseJson(getContent(PKG_LIST_URL)) + + for pdata in pkg_list: + if not pdata.hasKey("name"): + echo "E: missing package name" + result.inc() + continue + + name = pdata["name"].str + if not pdata.hasKey("method"): + echo "E: ", name, "has no method" + result.inc() + + elif not (pdata["method"].str in VCS_TYPES): + echo "E: ", name, "has an unknown method: ", pdata["method"].str + result.inc() + + if not pdata.hasKey("license"): + echo "E: ", name, "has no license" + result.inc() + elif not (pdata["license"].str in LICENSES): + echo "W: ", name, "has an unexpected license: ", pdata["license"] + + if not pdata.hasKey("description"): + echo "E: ", name, "has no description" + result.inc() + + if not pdata.hasKey("web"): + echo "E: ", name, "has no URL" + result.inc() + continue + + for pdata in pkg_list: + if pdata.hasKey("name") and pdata.hasKey("web"): + name = pdata["name"].str + url = pdata["web"].str + try: + discard getContent(url, timeout=3000) + + except HttpRequestError, TimeoutError, AssertionError: + echo "E: ", name, ": unable to fetch repository ", url, " ", getCurrentExceptionMsg() + result.inc() + + echo "Error count: ", result + return + +when isMainModule: + quit(check()) + |
