From 375fb4f14f2fd0b1cb90f377d4a9bfcd7345c8e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=9D=E4=BA=91?= Date: Fri, 22 Jul 2016 14:24:07 +0800 Subject: [PATCH] add support for crates.io --- nvchecker/get_version.py | 2 +- nvchecker/source/cratesio.py | 22 ++++++++++++++++++++++ tests/test_cratesio.py | 8 ++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 nvchecker/source/cratesio.py create mode 100644 tests/test_cratesio.py diff --git a/nvchecker/get_version.py b/nvchecker/get_version.py index ef7a859..95568db 100644 --- a/nvchecker/get_version.py +++ b/nvchecker/get_version.py @@ -5,7 +5,7 @@ logger = logging.getLogger(__name__) handler_precedence = ( 'github', 'gitcafe', 'aur', 'pypi', 'archpkg', 'gems', 'pacman', 'cmd', 'bitbucket', 'gcode_hg', 'gcode_svn', 'regex', 'manual', 'vcs', - 'npm', 'hackage', 'cpan', 'gitlab', 'packagist' + 'cratesio', 'npm', 'hackage', 'cpan', 'gitlab', 'packagist' ) def get_version(name, conf, callback): diff --git a/nvchecker/source/cratesio.py b/nvchecker/source/cratesio.py new file mode 100644 index 0000000..e3926a6 --- /dev/null +++ b/nvchecker/source/cratesio.py @@ -0,0 +1,22 @@ +import os +import json +from functools import partial + +from tornado.httpclient import AsyncHTTPClient, HTTPRequest + +from ..sortversion import sort_version_keys + +API_URL = 'https://crates.io/api/v1/crates/%s' + +def get_version(name, conf, callback): + name = conf.get('cratesio') or name + request = HTTPRequest(API_URL % name, user_agent='lilydjwg/nvchecker') + AsyncHTTPClient().fetch( + request, + callback = partial(_cratesio_done, name, callback), + ) + +def _cratesio_done(name, callback, res): + data = json.loads(res.body.decode('utf-8')) + version = [v['num'] for v in data['versions'] if not v['yanked']][0] + callback(name, version) diff --git a/tests/test_cratesio.py b/tests/test_cratesio.py new file mode 100644 index 0000000..c829d7e --- /dev/null +++ b/tests/test_cratesio.py @@ -0,0 +1,8 @@ +from tests.helper import ExternalVersionTestCase + + +class CratesIOTest(ExternalVersionTestCase): + def test_npm(self): + self.assertEqual( + self.sync_get_version("example", {"cratesio": None}), + "0.1.0")