Class: Rake::Gem::Maintenance::CredentialStore

Inherits:
Object
  • Object
show all
Defined in:
lib/rake/gem/maintenance/credential_store.rb

Overview

Persists rubygems.org credentials (username, API key, OTP seed) to a local config file.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path: self.class.default_path) ⇒ CredentialStore

Returns a new instance of CredentialStore.



21
22
23
# File 'lib/rake/gem/maintenance/credential_store.rb', line 21

def initialize(path: self.class.default_path)
  @path = path
end

Instance Attribute Details

#pathObject (readonly)

Returns the value of attribute path.



25
26
27
# File 'lib/rake/gem/maintenance/credential_store.rb', line 25

def path
  @path
end

Class Method Details

.default_pathObject



12
13
14
15
16
17
18
19
# File 'lib/rake/gem/maintenance/credential_store.rb', line 12

def self.default_path
  base = if ::Gem.win_platform?
           ENV.fetch("APPDATA", File.expand_path("~"))
         else
           ENV.fetch("XDG_CONFIG_HOME", File.join(Dir.home, ".config"))
         end
  File.join(base, "rake-gem-maintenance", "credentials.yml")
end

Instance Method Details

#apply_to_env(username_env_var:, api_key_env_var:) ⇒ Object



41
42
43
44
45
46
# File 'lib/rake/gem/maintenance/credential_store.rb', line 41

def apply_to_env(username_env_var:, api_key_env_var:)
  creds = read
  set_env_if_absent(username_env_var, creds[:username])
  set_env_if_absent("RUBYGEMS_OTP_SEED", creds[:rubygems_otp_seed])
  set_env_if_absent(api_key_env_var, creds[:gem_host_api_key])
end

#readObject



27
28
29
30
31
32
33
# File 'lib/rake/gem/maintenance/credential_store.rb', line 27

def read
  return {} unless File.exist?(@path)

  YAML.safe_load_file(@path, symbolize_names: true) || {}
rescue StandardError
  {}
end

#update(username:, api_key:, api_key_env_var:) ⇒ Object



48
49
50
51
52
53
54
# File 'lib/rake/gem/maintenance/credential_store.rb', line 48

def update(username:, api_key:, api_key_env_var:)
  otp_seed = ENV.fetch("RUBYGEMS_OTP_SEED", nil)
  updated = read.merge(username: username, gem_host_api_key: api_key)
  updated[:rubygems_otp_seed] = otp_seed if otp_seed && !otp_seed.empty?
  write(updated)
  ENV[api_key_env_var] = api_key
end

#write(credentials) ⇒ Object



35
36
37
38
39
# File 'lib/rake/gem/maintenance/credential_store.rb', line 35

def write(credentials)
  FileUtils.mkdir_p(File.dirname(@path))
  File.write(@path, credentials.transform_keys(&:to_s).to_yaml)
  File.chmod(0o600, @path) unless ::Gem.win_platform?
end