class Gem::Commands::OwnerCommand

Public Class Methods

new() click to toggle source
Calls superclass method Gem::Command::new
# File lib/rubygems/commands/owner_command.rb, line 37
def initialize
  super "owner", "Manage gem owners of a gem on the push server"
  add_proxy_option
  add_key_option
  add_otp_option
  defaults.merge! add: [], remove: []

  add_option "-a", "--add NEW_OWNER", "Add an owner by user identifier" do |value, options|
    options[:add] << value
  end

  add_option "-r", "--remove OLD_OWNER", "Remove an owner by user identifier" do |value, options|
    options[:remove] << value
  end

  add_option "-h", "--host HOST",
             "Use another gemcutter-compatible host",
             "  (e.g. https://rubygems.org)" do |value, options|
    options[:host] = value
  end
end

Public Instance Methods

add_owners(name, owners) click to toggle source
# File lib/rubygems/commands/owner_command.rb, line 87
def add_owners(name, owners)
  manage_owners :post, name, owners
end
execute() click to toggle source
# File lib/rubygems/commands/owner_command.rb, line 59
def execute
  @host = options[:host]

  sign_in(scope: get_owner_scope)
  name = get_one_gem_name

  add_owners    name, options[:add]
  remove_owners name, options[:remove]
  show_owners   name
end
manage_owners(method, name, owners) click to toggle source
# File lib/rubygems/commands/owner_command.rb, line 95
def manage_owners(method, name, owners)
  owners.each do |owner|
    response = send_owner_request(method, name, owner)
    action = method == :delete ? "Removing" : "Adding"

    with_response response, "#{action} #{owner}"
  rescue Gem::WebauthnVerificationError => e
    raise e
  rescue StandardError
    # ignore early exits to allow for completing the iteration of all owners
  end
end
remove_owners(name, owners) click to toggle source
# File lib/rubygems/commands/owner_command.rb, line 91
def remove_owners(name, owners)
  manage_owners :delete, name, owners
end
show_owners(name) click to toggle source
# File lib/rubygems/commands/owner_command.rb, line 70
def show_owners(name)
  Gem.load_yaml

  response = rubygems_api_request :get, "api/v1/gems/#{name}/owners.yaml" do |request|
    request.add_field "Authorization", api_key
  end

  with_response response do |resp|
    owners = Gem::SafeYAML.load clean_text(resp.body)

    say "Owners for gem: #{name}"
    owners.each do |owner|
      say "- #{owner["email"] || owner["handle"] || owner["id"]}"
    end
  end
end

Private Instance Methods

get_owner_scope(method: nil) click to toggle source
# File lib/rubygems/commands/owner_command.rb, line 117
def get_owner_scope(method: nil)
  if method == :post || options.any? && options[:add].any?
    :add_owner
  elsif method == :delete || options.any? && options[:remove].any?
    :remove_owner
  end
end
send_owner_request(method, name, owner) click to toggle source
# File lib/rubygems/commands/owner_command.rb, line 110
def send_owner_request(method, name, owner)
  rubygems_api_request method, "api/v1/gems/#{name}/owners", scope: get_owner_scope(method: method) do |request|
    request.set_form_data "email" => owner
    request.add_field "Authorization", api_key
  end
end