1require 'rubygems/command'
2require 'rubygems/local_remote_options'
3require 'rubygems/gemcutter_utilities'
4
5class Gem::Commands::OwnerCommand < Gem::Command
6  include Gem::LocalRemoteOptions
7  include Gem::GemcutterUtilities
8
9  def description # :nodoc:
10    'Manage gem owners on RubyGems.org.'
11  end
12
13  def arguments # :nodoc:
14    "GEM       gem to manage owners for"
15  end
16
17  def usage # :nodoc:
18    "#{program_name} GEM"
19  end
20
21  def initialize
22    super 'owner', description
23    add_proxy_option
24    add_key_option
25    defaults.merge! :add => [], :remove => []
26
27    add_option '-a', '--add EMAIL', 'Add an owner' do |value, options|
28      options[:add] << value
29    end
30
31    add_option '-r', '--remove EMAIL', 'Remove an owner' do |value, options|
32      options[:remove] << value
33    end
34  end
35
36  def execute
37    sign_in
38    name = get_one_gem_name
39
40    add_owners    name, options[:add]
41    remove_owners name, options[:remove]
42    show_owners   name
43  end
44
45  def show_owners name
46    response = rubygems_api_request :get, "api/v1/gems/#{name}/owners.yaml" do |request|
47      request.add_field "Authorization", api_key
48    end
49
50    with_response response do |resp|
51      owners = YAML.load resp.body
52
53      say "Owners for gem: #{name}"
54      owners.each do |owner|
55        say "- #{owner['email']}"
56      end
57    end
58  end
59
60  def add_owners name, owners
61    manage_owners :post, name, owners
62  end
63
64  def remove_owners name, owners
65    manage_owners :delete, name, owners
66  end
67
68  def manage_owners method, name, owners
69    owners.each do |owner|
70      begin
71        response = rubygems_api_request method, "api/v1/gems/#{name}/owners" do |request|
72          request.set_form_data 'email' => owner
73          request.add_field "Authorization", api_key
74        end
75
76        with_response response, "Removing #{owner}"
77      rescue
78        # ignore
79      end
80    end
81  end
82
83end
84
85