diff options
Diffstat (limited to 'baserockimport/exts/rubygems.to_lorry')
-rwxr-xr-x | baserockimport/exts/rubygems.to_lorry | 59 |
1 files changed, 25 insertions, 34 deletions
diff --git a/baserockimport/exts/rubygems.to_lorry b/baserockimport/exts/rubygems.to_lorry index 0413204..340e889 100755 --- a/baserockimport/exts/rubygems.to_lorry +++ b/baserockimport/exts/rubygems.to_lorry @@ -18,53 +18,26 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -import requests -import requests_cache import yaml - import logging import json import os import sys import urlparse -from importer_base import ImportException, ImportExtension +from importer_base import ImportException, ImportExtension, WebServiceClient + +RUBYGEMS_API_URL = 'http://rubygems.org/api/v1' class GenerateLorryException(ImportException): pass -class RubyGemsWebServiceClient(object): - def __init__(self): - # Save hammering the rubygems.org API: 'requests' API calls are - # transparently cached in an SQLite database, instead. - requests_cache.install_cache('rubygems_api_cache') - - def _request(self, url): - r = requests.get(url) - if r.ok: - return json.loads(r.text) - else: - raise GenerateLorryException( - 'Request to %s failed: %s' % (r.url, r.reason)) - - def get_gem_info(self, gem_name): - info = self._request( - 'http://rubygems.org/api/v1/gems/%s.json' % gem_name) - - if info['name'] != gem_name: - # Sanity check - raise GenerateLorryException( - 'Received info for Gem "%s", requested "%s"' % info['name'], - gem_name) - - return info - - class RubyGemLorryGenerator(ImportExtension): def __init__(self): super(RubyGemLorryGenerator, self).__init__() + self.apiclient = WebServiceClient('rubygems_api_cache') with open(self.local_data_path('rubygems.yaml'), 'r') as f: local_data = yaml.load(f.read()) @@ -163,10 +136,28 @@ class RubyGemLorryGenerator(ImportExtension): repo_url = repo_url[:-len('.git')] return os.path.basename(repo_url) - def generate_lorry_for_gem(self, gem_name): - rubygems_client = RubyGemsWebServiceClient() + def get_gem_info(self, gem_name): - gem_info = rubygems_client.get_gem_info(gem_name) + try: + r = self.apiclient.request(RUBYGEMS_API_URL + '/gems/%s.json' + % gem_name) + + r.raise_for_status() + info = r.json() + except Exception as e: + raise GenerateLorryException('Request to %s failed: %s' + % (r.url, e)) + + if info['name'] != gem_name: + # Sanity check + raise GenerateLorryException( + 'Received info for Gem "%s", requested "%s"' % info['name'], + gem_name) + + return info + + def generate_lorry_for_gem(self, gem_name): + gem_info = self.get_gem_info(gem_name) gem_source_url = self.find_upstream_repo_for_gem(gem_name, gem_info) logging.info('Got URL <%s> for %s', gem_source_url, gem_name) |