From 1d3abf73b2febf934a56fa828afb44bed79d638a Mon Sep 17 00:00:00 2001 From: lilydjwg Date: Wed, 4 Nov 2015 22:42:32 +0800 Subject: [PATCH] use a common module for sources with simple JSON API closes #19 --- nvchecker/source/cpan.py | 21 ++++++++------------- nvchecker/source/gems.py | 21 ++++++++------------- nvchecker/source/hackage.py | 21 ++++++++------------- nvchecker/source/npm.py | 21 ++++++++------------- nvchecker/source/pypi.py | 21 ++++++++------------- nvchecker/source/simple_json.py | 19 +++++++++++++++++++ 6 files changed, 59 insertions(+), 65 deletions(-) create mode 100644 nvchecker/source/simple_json.py diff --git a/nvchecker/source/cpan.py b/nvchecker/source/cpan.py index dd83df8..549aeb4 100644 --- a/nvchecker/source/cpan.py +++ b/nvchecker/source/cpan.py @@ -1,18 +1,13 @@ -import json -from functools import partial - -from tornado.httpclient import AsyncHTTPClient +from .simple_json import simple_json # Using metacpan CPAN_URL = 'https://api.metacpan.org/release/%s' -def get_version(name, conf, callback): - repo = conf.get('cpan') or name - url = CPAN_URL % repo - AsyncHTTPClient().fetch(url, user_agent='lilydjwg/nvchecker', - callback=partial(_cpan_done, name, callback)) +def _version_from_json(data): + return str(data['version']) -def _cpan_done(name, callback, res): - data = json.loads(res.body.decode('utf-8')) - version = str(data['version']) - callback(name, version) +get_version = simple_json( + CPAN_URL, + 'cpan', + _version_from_json, +) diff --git a/nvchecker/source/gems.py b/nvchecker/source/gems.py index a0320a6..5251d9e 100644 --- a/nvchecker/source/gems.py +++ b/nvchecker/source/gems.py @@ -1,17 +1,12 @@ -import json -from functools import partial - -from tornado.httpclient import AsyncHTTPClient +from .simple_json import simple_json GEMS_URL = 'https://rubygems.org/api/v1/versions/%s.json' -def get_version(name, conf, callback): - repo = conf.get('gems') or name - url = GEMS_URL % repo - AsyncHTTPClient().fetch(url, user_agent='lilydjwg/nvchecker', - callback=partial(_gems_done, name, callback)) +def _version_from_json(data): + return data[0]['number'] -def _gems_done(name, callback, res): - data = json.loads(res.body.decode('utf-8')) - version = data[0]['number'] - callback(name, version) +get_version = simple_json( + GEMS_URL, + 'gems', + _version_from_json, +) diff --git a/nvchecker/source/hackage.py b/nvchecker/source/hackage.py index edfe7f8..307373b 100644 --- a/nvchecker/source/hackage.py +++ b/nvchecker/source/hackage.py @@ -1,17 +1,12 @@ -import json -from functools import partial - -from tornado.httpclient import AsyncHTTPClient +from .simple_json import simple_json HACKAGE_URL = 'https://hackage.haskell.org/package/%s/preferred.json' -def get_version(name, conf, callback): - repo = conf.get('hackage') or name - url = HACKAGE_URL % repo - AsyncHTTPClient().fetch(url, user_agent='lilydjwg/nvchecker', - callback=partial(_hackage_done, name, callback)) +def _version_from_json(data): + return data['normal-version'][0] -def _hackage_done(name, callback, res): - data = json.loads(res.body.decode('utf-8')) - version = data['normal-version'][0] - callback(name, version) +get_version = simple_json( + HACKAGE_URL, + 'hackage', + _version_from_json, +) diff --git a/nvchecker/source/npm.py b/nvchecker/source/npm.py index 4c5280f..acc2e4d 100644 --- a/nvchecker/source/npm.py +++ b/nvchecker/source/npm.py @@ -1,17 +1,12 @@ -import json -from functools import partial - -from tornado.httpclient import AsyncHTTPClient +from .simple_json import simple_json NPM_URL = 'https://registry.npmjs.org/%s' -def get_version(name, conf, callback): - repo = conf.get('npm') or name - url = NPM_URL % repo - AsyncHTTPClient().fetch(url, user_agent='lilydjwg/nvchecker', - callback=partial(_npm_done, name, callback)) +def _version_from_json(data): + return data['dist-tags']['latest'] -def _npm_done(name, callback, res): - data = json.loads(res.body.decode('utf-8')) - version = data['dist-tags']['latest'] - callback(name, version) +get_version = simple_json( + NPM_URL, + 'npm', + _version_from_json, +) diff --git a/nvchecker/source/pypi.py b/nvchecker/source/pypi.py index 51f47e9..fd7f517 100644 --- a/nvchecker/source/pypi.py +++ b/nvchecker/source/pypi.py @@ -1,17 +1,12 @@ -import json -from functools import partial - -from tornado.httpclient import AsyncHTTPClient +from .simple_json import simple_json PYPI_URL = 'https://pypi.python.org/pypi/%s/json' -def get_version(name, conf, callback): - repo = conf.get('pypi') or name - url = PYPI_URL % repo - AsyncHTTPClient().fetch(url, user_agent='lilydjwg/nvchecker', - callback=partial(_pypi_done, name, callback)) +def _version_from_json(data): + return data['info']['version'] -def _pypi_done(name, callback, res): - data = json.loads(res.body.decode('utf-8')) - version = data['info']['version'] - callback(name, version) +get_version = simple_json( + PYPI_URL, + 'pypi', + _version_from_json, +) diff --git a/nvchecker/source/simple_json.py b/nvchecker/source/simple_json.py new file mode 100644 index 0000000..211dff5 --- /dev/null +++ b/nvchecker/source/simple_json.py @@ -0,0 +1,19 @@ +import json +from functools import partial + +from tornado.httpclient import AsyncHTTPClient + +def simple_json(urlpat, confkey, version_from_json): + + def get_version(name, conf, callback): + repo = conf.get(confkey) or name + url = urlpat % repo + AsyncHTTPClient().fetch(url, user_agent='lilydjwg/nvchecker', + callback=partial(_json_done, name, callback)) + + def _json_done(name, callback, res): + data = json.loads(res.body.decode('utf-8')) + version = version_from_json(data) + callback(name, version) + + return get_version