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