Module: Kettle::Dev::RubyGemsVersions

Defined in:
lib/kettle/dev/ruby_gems_versions.rb

Constant Summary collapse

CACHE_BUST_TTL_SECONDS =
30 * 24 * 60 * 60
VERSION_CACHE_TTL_SECONDS =
30 * 24 * 60 * 60
ENV_REFRESH =
"KETTLE_RUBYGEMS_REFRESH"
ENV_MARKER_PATH =
"KETTLE_RUBYGEMS_CACHE_BUST_PATH"
ENV_VERSION_CACHE_PATH =
"KETTLE_RUBYGEMS_VERSION_CACHE_PATH"
ENV_LEGACY_VERSION_CACHE_PATH =
"KETTLE_JEM_DEPS_FLOOR_CACHE"

Class Method Summary collapse

Class Method Details

.fetch(gem_name, version_hint: nil, refresh: false) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/kettle/dev/ruby_gems_versions.rb', line 23

def fetch(gem_name, version_hint: nil, refresh: false)
  name = gem_name.to_s
  cached = cached_versions(name)
  cache_bust = refresh || env_refresh? || fresh_release_marker?(name, version_hint)
  return cached if cached && !cache_bust

  uri = versions_uri(gem_name, cache_bust: cache_bust)
  request = Net::HTTP::Get.new(uri)
  if cache_bust
    request["Cache-Control"] = "no-cache"
    request["Pragma"] = "no-cache"
  end
  response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
    http.request(request)
  end
  return cached unless response.is_a?(Net::HTTPSuccess)

  data = JSON.parse(response.body)
  write_versions(name, data) if data.is_a?(Array)
  data
rescue => error
  return cached if cached

  raise error
end

.mark_released(gem_name, version) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/kettle/dev/ruby_gems_versions.rb', line 49

def mark_released(gem_name, version)
  return if gem_name.to_s.empty? || version.to_s.empty?

  path = marker_path
  data = read_marker(path)
  data["releases"] ||= {}
  data["releases"][gem_name.to_s] = {
    "version" => version.to_s,
    "released_at" => Time.now.utc.iso8601
  }
  FileUtils.mkdir_p(File.dirname(path))
  File.write(path, JSON.pretty_generate(data) << "\n")
rescue => error
  warn("[kettle-dev] could not update RubyGems.org cache-bust marker: #{error.class}: #{error.message}") if Kettle::Dev::DEBUGGING
end

.marker_pathObject



65
66
67
68
69
70
71
72
# File 'lib/kettle/dev/ruby_gems_versions.rb', line 65

def marker_path
  configured = ENV.fetch(ENV_MARKER_PATH, "").to_s
  return configured unless configured.empty?

  state_home = ENV["XDG_STATE_HOME"]
  state_home = File.join(Dir.home, ".local", "state") if state_home.to_s.empty?
  File.join(state_home, "kettle-dev", "rubygems-cache-bust.json")
end

.version_cache_pathObject



74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/kettle/dev/ruby_gems_versions.rb', line 74

def version_cache_path
  configured = ENV.fetch(ENV_VERSION_CACHE_PATH, "").to_s
  return "" if configured.match?(/\A(?:false|0|no|off|disabled)\z/i)
  return configured unless configured.empty?

  legacy_configured = ENV.fetch(ENV_LEGACY_VERSION_CACHE_PATH, "").to_s
  return "" if legacy_configured.match?(/\A(?:false|0|no|off|disabled)\z/i)
  return legacy_configured unless legacy_configured.empty?

  cache_home = ENV["XDG_CACHE_HOME"]
  cache_home = File.join(Dir.home, ".cache") if cache_home.to_s.empty?
  File.join(cache_home, "kettle-jem", "deps-floor-rubygems-versions.json")
end