Class: BundleSafeUpdate::RubygemsApi

Inherits:
Object
  • Object
show all
Defined in:
lib/bundle_safe_update/rubygems_api.rb

Defined Under Namespace

Classes: ApiError, GemInfo

Constant Summary collapse

VERSIONS_API_BASE =
'https://rubygems.org/api/v1/versions'
OWNERS_API_BASE =
'https://rubygems.org/api/v1/gems'
GEM_API_BASE =
'https://rubygems.org/api/v1/gems'
SECONDS_PER_DAY =
86_400
HTTP_OPEN_TIMEOUT =
10
HTTP_READ_TIMEOUT =
30

Instance Method Summary collapse

Constructor Details

#initialize(http_client: nil) ⇒ RubygemsApi

Returns a new instance of RubygemsApi.



20
21
22
# File 'lib/bundle_safe_update/rubygems_api.rb', line 20

def initialize(http_client: nil)
  @http_client = http_client
end

Instance Method Details

#fetch_gem_info(gem_name) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/bundle_safe_update/rubygems_api.rb', line 63

def fetch_gem_info(gem_name)
  uri = URI("#{GEM_API_BASE}/#{gem_name}.json")
  response = perform_request(uri)

  return nil unless response.is_a?(Net::HTTPSuccess)

  data = JSON.parse(response.body)
  GemInfo.new(
    downloads: data['downloads'],
    version_created_at: parse_time(data['version_created_at'])
  )
rescue JSON::ParserError
  nil
end

#fetch_owners(gem_name) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/bundle_safe_update/rubygems_api.rb', line 50

def fetch_owners(gem_name)
  uri = URI("#{OWNERS_API_BASE}/#{gem_name}/owners.json")
  response = perform_request(uri)

  return [] unless response.is_a?(Net::HTTPSuccess)

  JSON
    .parse(response.body)
    .filter_map { |owner| owner['handle'] }
rescue JSON::ParserError
  []
end

#fetch_version_info(gem_name, version) ⇒ Object



24
25
26
27
# File 'lib/bundle_safe_update/rubygems_api.rb', line 24

def fetch_version_info(gem_name, version)
  versions = fetch_versions(gem_name)
  versions.find { |v| v['number'] == version }
end

#fetch_versions(gem_name) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/bundle_safe_update/rubygems_api.rb', line 29

def fetch_versions(gem_name)
  uri = URI("#{VERSIONS_API_BASE}/#{gem_name}.json")
  response = perform_request(uri)

  unless response.is_a?(Net::HTTPSuccess)
    raise ApiError, "Failed to fetch versions for #{gem_name}: #{response.code}"
  end

  JSON.parse(response.body)
rescue JSON::ParserError => e
  raise ApiError, "Invalid JSON response for #{gem_name}: #{e.message}"
end

#version_age_days(gem_name, version) ⇒ Object



42
43
44
45
46
47
48
# File 'lib/bundle_safe_update/rubygems_api.rb', line 42

def version_age_days(gem_name, version)
  info = fetch_version_info(gem_name, version)
  return nil unless info

  created_at = Time.parse(info['created_at'])
  ((Time.now - created_at) / SECONDS_PER_DAY).to_i
end