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