summaryrefslogtreecommitdiff
path: root/lib/license/management/python/pypi.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/license/management/python/pypi.rb')
-rw-r--r--lib/license/management/python/pypi.rb44
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/license/management/python/pypi.rb b/lib/license/management/python/pypi.rb
new file mode 100644
index 0000000..0397532
--- /dev/null
+++ b/lib/license/management/python/pypi.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'net/hippie'
+
+module License
+ module Management
+ class PyPI
+ include Loggable
+
+ def initialize(http)
+ @http = http
+ end
+
+ def definition_for(name, version)
+ uri = "https://pypi.org/pypi/#{name}/#{version}/json"
+ process(@http.with_retry { |client| client.get(uri) }).tap do |definition|
+ log_info([name, version, definition["license"]].inspect)
+ end
+ rescue *Net::Hippie::CONNECTION_ERRORS
+ {}
+ end
+
+ class << self
+ def definition(name, version)
+ @pypi ||= new(License::Management.http)
+ @pypi.definition_for(name, version)
+ end
+ end
+
+ private
+
+ def process(response)
+ return JSON.parse(response.body).fetch('info', {}) if ok?(response)
+
+ log_error([response.class, response.code, response.body].inspect)
+ {}
+ end
+
+ def ok?(response)
+ response.is_a?(Net::HTTPSuccess)
+ end
+ end
+ end
+end