1require 'rubygems/command' 2require 'rubygems/local_remote_options' 3require 'rubygems/version_option' 4require 'rubygems/gemcutter_utilities' 5 6class Gem::Commands::YankCommand < Gem::Command 7 include Gem::LocalRemoteOptions 8 include Gem::VersionOption 9 include Gem::GemcutterUtilities 10 11 def description # :nodoc: 12 'Remove a specific gem version release from RubyGems.org' 13 end 14 15 def arguments # :nodoc: 16 "GEM name of gem" 17 end 18 19 def usage # :nodoc: 20 "#{program_name} GEM -v VERSION [-p PLATFORM] [--undo] [--key KEY_NAME]" 21 end 22 23 def initialize 24 super 'yank', description 25 26 add_version_option("remove") 27 add_platform_option("remove") 28 29 add_option('--undo') do |value, options| 30 options[:undo] = true 31 end 32 33 add_option('-k', '--key KEY_NAME', 34 'Use API key from your gem credentials file') do |value, options| 35 options[:key] = value 36 end 37 end 38 39 def execute 40 sign_in 41 42 version = get_version_from_requirements(options[:version]) 43 platform = get_platform_from_requirements(options) 44 api_key = Gem.configuration.rubygems_api_key 45 api_key = Gem.configuration.api_keys[options[:key].to_sym] if options[:key] 46 47 if version then 48 if options[:undo] then 49 unyank_gem(version, platform, api_key) 50 else 51 yank_gem(version, platform, api_key) 52 end 53 else 54 say "A version argument is required: #{usage}" 55 terminate_interaction 56 end 57 end 58 59 def yank_gem(version, platform, api_key) 60 say "Yanking gem from #{self.host}..." 61 yank_api_request(:delete, version, platform, "api/v1/gems/yank", api_key) 62 end 63 64 def unyank_gem(version, platform, api_key) 65 say "Unyanking gem from #{host}..." 66 yank_api_request(:put, version, platform, "api/v1/gems/unyank", api_key) 67 end 68 69 private 70 71 def yank_api_request(method, version, platform, api, api_key) 72 name = get_one_gem_name 73 response = rubygems_api_request(method, api) do |request| 74 request.add_field("Authorization", api_key) 75 76 data = { 77 'gem_name' => name, 78 'version' => version, 79 } 80 data['platform'] = platform if platform 81 82 request.set_form_data data 83 end 84 say response.body 85 end 86 87 def get_version_from_requirements(requirements) 88 requirements.requirements.first[1].version 89 rescue 90 nil 91 end 92 93 def get_platform_from_requirements(requirements) 94 Gem.platforms[1].to_s if requirements.key? :added_platform 95 end 96 97end 98 99