Compare commits
No commits in common. "master" and "fowlmouth-patch-1" have entirely different histories.
master
...
fowlmouth-
7 changed files with 485 additions and 18592 deletions
1
.gitattributes
vendored
1
.gitattributes
vendored
|
|
@ -1 +0,0 @@
|
||||||
/packages.json merge=union
|
|
||||||
26
.travis.yml
26
.travis.yml
|
|
@ -1,26 +0,0 @@
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
dist: trusty
|
|
||||||
|
|
||||||
language: c
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- "$HOME/.choosenim"
|
|
||||||
|
|
||||||
install:
|
|
||||||
- export CHOOSENIM_CHOOSE_VERSION="0.18.0"
|
|
||||||
- |
|
|
||||||
curl https://nim-lang.org/choosenim/init.sh -sSf > init.sh
|
|
||||||
sh init.sh -y
|
|
||||||
- export PATH=$HOME/.nimble/bin:$PATH
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- set -e
|
|
||||||
- set -x
|
|
||||||
|
|
||||||
script:
|
|
||||||
- nim c -d:ssl -r package_scanner.nim && node ./validate_json.js
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email: false # noisy
|
|
||||||
63
README.md
63
README.md
|
|
@ -1,13 +1,11 @@
|
||||||
# Nim packages [](https://travis-ci.org/nim-lang/packages)
|
***Due to a mistake on my part (@flaviut), your branches may be out of date. Simply rebase on top of this repo to fix that. Sorry for any inconvenience.***
|
||||||
|
|
||||||
|
# Nim packages
|
||||||
|
|
||||||
This is a central listing of all packages for
|
This is a central listing of all packages for
|
||||||
[Nimble](https://github.com/nim-lang/nimble), a package manager for the
|
[Nimble](https://github.com/nim-lang/nimble), a package manager for the
|
||||||
[Nim programming language](http://nim-lang.org).
|
[Nim programming language](http://nim-lang.org).
|
||||||
|
|
||||||
An overview of all packages is available at https://nimble.directory.
|
|
||||||
|
|
||||||
NOTE: The packages listed here are not peer-reviewed or otherwise screened. We try to keep the list up-to-date but we cannot guarantee quality or maturity of the packages.
|
|
||||||
|
|
||||||
## Adding your own package
|
## Adding your own package
|
||||||
To add your own package, fork this repository, edit
|
To add your own package, fork this repository, edit
|
||||||
[packages.json](packages.json) and make a pull request.
|
[packages.json](packages.json) and make a pull request.
|
||||||
|
|
@ -15,68 +13,19 @@ To add your own package, fork this repository, edit
|
||||||
[Packages.json](packages.json) is a simple array of objects. Each package
|
[Packages.json](packages.json) is a simple array of objects. Each package
|
||||||
object should have the following fields (unless the field is marked as
|
object should have the following fields (unless the field is marked as
|
||||||
optional):
|
optional):
|
||||||
|
|
||||||
* name - The name of the package, this should match the name in the package's
|
* name - The name of the package, this should match the name in the package's
|
||||||
nimble file.
|
babel file.
|
||||||
* url - The url from which to retrieve the package.
|
* url - The url from which to retrieve the package.
|
||||||
* method - The method that should be used to retrieve this package. Currently
|
* method - The method that should be used to retrieve this package. Currently
|
||||||
"git" and "hg" is supported.
|
"git" and "hg" is supported.
|
||||||
* tags - A list of tags describing this package.
|
* tags - A list of tags describing this package.
|
||||||
* description - A description of this package.
|
* description - A description of this package.
|
||||||
* license - The license of the source code in the package.
|
* license - The license of the source code in the package.
|
||||||
* web - An optional URL for humans to read additional information about
|
* web - An optional url for humans to read additional information about
|
||||||
the package.
|
the package.
|
||||||
* doc - An optional URL for humans to read the package HTML documentation
|
|
||||||
|
|
||||||
### Requirements
|
|
||||||
|
|
||||||
While we really appreciate your contribution, please follow the requirements: other developers will rely on your package. Non-compliant packages might be removed with no warning.
|
|
||||||
|
|
||||||
* The URL should work, a .nimble file should be present and the package should be installable
|
|
||||||
* The package should build correctly with the latest Nim release
|
|
||||||
* The package should not contain files without a license or in breach of 3rd parties licensing
|
|
||||||
* Non-mature packages should be flagged as such, especially if they perform security-critical tasks (e.g. encryption)
|
|
||||||
* If a vulnerability is found, make a patch release against the latest stable release (or more) that fixes the issue without introducing any other change.
|
|
||||||
* Tiny libraries should be avoided where possible
|
|
||||||
* Avoid having many dependencies. Use "when defined(...)" to enable optional features.
|
|
||||||
* If abandoning a package, please tag it as "abandoned"
|
|
||||||
* The package name should be unique and specific. Avoid overly generic names e.g. "math", "http"
|
|
||||||
* Provide a contact email address.
|
|
||||||
* Optionally try to support older Nim releases (6 months to 1 year)
|
|
||||||
* Optionally GPG-sign your releases
|
|
||||||
* Optionally follow [SemVer 2](http://semver.org)
|
|
||||||
|
|
||||||
Your packages may be removed if the url stops working. It goes without saying
|
Your packages may be removed if the url stops working. It goes without saying
|
||||||
that your pull request will not be accepted unless you fill out all of the
|
that your pull request will not be accepted unless you fill out all of the
|
||||||
above required fields correctly, the package that ``url`` points to must also
|
above required fields correctly, the package that ``url`` points to must also
|
||||||
contain a .nimble file, or else it will be rejected.
|
contain a .nimble file, or else it will be rejected.
|
||||||
|
|
||||||
The requirements might change in future.
|
|
||||||
|
|
||||||
## Renaming packages
|
|
||||||
|
|
||||||
To rename a package you will need to add a new entry for your package. Simply
|
|
||||||
perform the following steps:
|
|
||||||
|
|
||||||
* Duplicate your package's current entry.
|
|
||||||
* Remove every field in one of the entries apart from the `name` field.
|
|
||||||
* Add an `alias` field to that entry.
|
|
||||||
* Change the name in the other package entry.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
```
|
|
||||||
...
|
|
||||||
{
|
|
||||||
"name": "myoldname",
|
|
||||||
"alias": "mynewname"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "mynewname",
|
|
||||||
"url": "...",
|
|
||||||
"method": "git",
|
|
||||||
...
|
|
||||||
},
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,135 +0,0 @@
|
||||||
|
|
||||||
# A very simple Nim package scanner.
|
|
||||||
#
|
|
||||||
# Scans the package list from this repository.
|
|
||||||
#
|
|
||||||
# Check the packages for:
|
|
||||||
# * Missing name
|
|
||||||
# * Missing/unknown method
|
|
||||||
# * Missing/unreachable repository
|
|
||||||
# * Missing tags
|
|
||||||
# * Missing description
|
|
||||||
# * Missing/unknown license
|
|
||||||
# * Insecure git:// url on GitHub
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
import os
|
|
||||||
import sets
|
|
||||||
import strutils
|
|
||||||
|
|
||||||
const
|
|
||||||
LICENSES = @[
|
|
||||||
"Allegro 4 Giftware",
|
|
||||||
"Apache License 2.0",
|
|
||||||
"BSD",
|
|
||||||
"BSD2",
|
|
||||||
"BSD3",
|
|
||||||
"CC0",
|
|
||||||
"GPL",
|
|
||||||
"GPLv2",
|
|
||||||
"GPLv3",
|
|
||||||
"LGPLv2",
|
|
||||||
"LGPLv3",
|
|
||||||
"MIT",
|
|
||||||
"MS-PL",
|
|
||||||
"MPL",
|
|
||||||
"WTFPL",
|
|
||||||
"libpng",
|
|
||||||
"zlib",
|
|
||||||
"ISC",
|
|
||||||
"Unlicense"
|
|
||||||
]
|
|
||||||
VCS_TYPES = @["git", "hg"]
|
|
||||||
|
|
||||||
proc canFetchNimbleRepository(name: string, urlJson: JsonNode): bool =
|
|
||||||
# The fetch is a lie!
|
|
||||||
# TODO: Make this check the actual repo url and check if there is a
|
|
||||||
# nimble file in it
|
|
||||||
result = true
|
|
||||||
var url: string
|
|
||||||
|
|
||||||
if not urlJson.isNil:
|
|
||||||
url = urlJson.str
|
|
||||||
|
|
||||||
try:
|
|
||||||
discard getContent(url, timeout=10000)
|
|
||||||
except HttpRequestError, TimeoutError:
|
|
||||||
echo "W: ", name, ": unable to fetch repo ", url, " ",
|
|
||||||
getCurrentExceptionMsg()
|
|
||||||
except AssertionError:
|
|
||||||
echo "W: ", name, ": httpclient failed ", url, " ",
|
|
||||||
getCurrentExceptionMsg()
|
|
||||||
except:
|
|
||||||
echo "W: Another error attempting to request: ", url
|
|
||||||
echo " Error was: ", getCurrentExceptionMsg()
|
|
||||||
|
|
||||||
proc verifyAlias(pdata: JsonNode, result: var int) =
|
|
||||||
if not pdata.hasKey("name"):
|
|
||||||
echo "E: missing alias' package name"
|
|
||||||
result.inc()
|
|
||||||
|
|
||||||
# TODO: Verify that 'alias' points to a known package.
|
|
||||||
|
|
||||||
proc check(): int =
|
|
||||||
var name: string
|
|
||||||
echo ""
|
|
||||||
let pkg_list = parseJson(readFile(getCurrentDir() / "packages.json"))
|
|
||||||
var names = initSet[string]()
|
|
||||||
|
|
||||||
for pdata in pkg_list:
|
|
||||||
name = if pdata.hasKey("name"): pdata["name"].str else: ""
|
|
||||||
|
|
||||||
if pdata.hasKey("alias"):
|
|
||||||
verifyAlias(pdata, result)
|
|
||||||
else:
|
|
||||||
if name == "":
|
|
||||||
echo "E: missing package name"
|
|
||||||
result.inc()
|
|
||||||
elif 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()
|
|
||||||
elif not pdata.hasKey("url"):
|
|
||||||
echo "E: ", name, " has no URL"
|
|
||||||
result.inc()
|
|
||||||
elif pdata.hasKey("web") and not canFetchNimbleRepository(name, pdata["web"]):
|
|
||||||
result.inc()
|
|
||||||
elif not pdata.hasKey("tags"):
|
|
||||||
echo "E: ", name, " has no tags"
|
|
||||||
result.inc()
|
|
||||||
elif not pdata.hasKey("description"):
|
|
||||||
echo "E: ", name, " has no description"
|
|
||||||
result.inc()
|
|
||||||
elif not pdata.hasKey("license"):
|
|
||||||
echo "E: ", name, " has no license"
|
|
||||||
result.inc()
|
|
||||||
elif pdata["url"].str.normalize.startsWith("git://github.com/"):
|
|
||||||
echo "E: ", name, " has an insecure git:// URL instead of https://"
|
|
||||||
result.inc()
|
|
||||||
else:
|
|
||||||
# Other warnings should go here
|
|
||||||
if not (pdata["license"].str in LICENSES):
|
|
||||||
echo "W: ", name, " has an unexpected license: ", pdata["license"]
|
|
||||||
|
|
||||||
if name.normalize notin names:
|
|
||||||
names.incl(name.normalize)
|
|
||||||
else:
|
|
||||||
echo("E: ", name, ": a package by that name already exists.")
|
|
||||||
result.inc()
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "Problematic packages count: ", result
|
|
||||||
|
|
||||||
|
|
||||||
when isMainModule:
|
|
||||||
quit(check())
|
|
||||||
|
|
||||||
18809
packages.json
18809
packages.json
File diff suppressed because it is too large
Load diff
|
|
@ -1,41 +0,0 @@
|
||||||
|
|
||||||
import strutils, json, os
|
|
||||||
|
|
||||||
proc cleanupWhitespace(s: string): string =
|
|
||||||
## Removes trailing whitespace and normalizes line endings to LF.
|
|
||||||
result = newStringOfCap(s.len)
|
|
||||||
var i = 0
|
|
||||||
while i < s.len:
|
|
||||||
if s[i] == ' ':
|
|
||||||
var j = i+1
|
|
||||||
while s[j] == ' ': inc j
|
|
||||||
if s[j] == '\c':
|
|
||||||
inc j
|
|
||||||
if s[j] == '\L': inc j
|
|
||||||
result.add '\L'
|
|
||||||
i = j
|
|
||||||
elif s[j] == '\L':
|
|
||||||
result.add '\L'
|
|
||||||
i = j+1
|
|
||||||
else:
|
|
||||||
result.add ' '
|
|
||||||
inc i
|
|
||||||
elif s[i] == '\c':
|
|
||||||
inc i
|
|
||||||
if s[i] == '\L': inc i
|
|
||||||
result.add '\L'
|
|
||||||
elif s[i] == '\L':
|
|
||||||
result.add '\L'
|
|
||||||
inc i
|
|
||||||
else:
|
|
||||||
result.add s[i]
|
|
||||||
inc i
|
|
||||||
if result[^1] != '\L':
|
|
||||||
result.add '\L'
|
|
||||||
|
|
||||||
proc editJson() =
|
|
||||||
var contents = parseFile("packages.json")
|
|
||||||
doAssert contents.kind == JArray
|
|
||||||
writeFile("packages.json", contents.pretty.cleanupWhitespace)
|
|
||||||
|
|
||||||
editJson()
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
var fs = require('fs');
|
|
||||||
JSON.parse(fs.readFileSync('packages.json', 'utf8'));
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue