Skip to content

Commit

Permalink
gem yank --undo for the gem
Browse files Browse the repository at this point in the history
  • Loading branch information
jtrupiano committed Mar 2, 2010
1 parent c8c6621 commit 7b76ffc
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 15 deletions.
38 changes: 25 additions & 13 deletions lib/rubygems/commands/yank.rb
Expand Up @@ -16,19 +16,26 @@ def arguments
end

def usage
"#{program_name} GEM -v VERSION"
"#{program_name} GEM -v VERSION [--undo]"
end

def initialize
super 'yank', description
add_version_option("remove")
add_option('--undo') do |value, options|
options[:undo] = true
end
end

def execute
sign_in
version = get_version_from_requirements(options[:version])
if !version.nil?
yank_gem(version)
if options[:undo]
unyank_gem(version)
else
yank_gem(version)
end
else
say "A version argument is required: #{usage}"
terminate_interaction
Expand All @@ -37,19 +44,24 @@ def execute

def yank_gem(version)
say "Yanking gem from RubyGems.org..."

name = get_one_gem_name
url = "api/v1/gems/yank"

response = rubygems_api_request(:delete, url) do |request|
request.add_field("Authorization", Gem.configuration.rubygems_api_key)
request.set_form_data({'gem_name' => name, 'version' => version})
end

say response.body
yank_api_request(:delete, version, "api/v1/gems/yank")
end

def unyank_gem(version)
say "Unyanking gem from RubyGems.org..."
yank_api_request(:put, version, "api/v1/gems/unyank")
end

private
def yank_api_request(method, version, api)
name = get_one_gem_name
response = rubygems_api_request(method, api) do |request|
request.add_field("Authorization", Gem.configuration.rubygems_api_key)
request.set_form_data({'gem_name' => name, 'version' => version})
end
say response.body
end

def get_version_from_requirements(requirements)
begin
requirements.requirements.first[1].version
Expand Down
42 changes: 40 additions & 2 deletions test/yank_command_test.rb
Expand Up @@ -22,24 +22,62 @@ class YankCommandTest < CommandTest
setup do
stub_api_key("key")
stub_request(:delete, @api).to_return(:body => "Successfully yanked")

@command.handle_options([@gem, "-v", @version])
@command.execute
end

should 'say gem was yanked' do
@command.execute
assert_received(@command) do |command|
command.say("Yanking gem from Gemcutter...")
command.say("Successfully yanked")
end
end

should 'invoke yank_gem' do
stub(@command).yank_gem(@version)
@command.execute
assert_received(@command) do |command|
command.yank_gem(@version)
end
end

should 'delete to api' do
@command.execute
assert_requested(:delete, @api,
:times => 1)
assert_requested(:delete, @api,
:headers => { 'Authorization' => 'key' })
end
end

context 'unyanking a gem' do
setup do
stub_api_key("key")
stub_request(:put, @api).to_return(:body => "Successfully unyanked")
@command.handle_options([@gem, "-v", @version, "--undo"])
end

should 'say gem was unyanked' do
@command.execute
assert_received(@command) do |command|
command.say("Re-indexing gem")
command.say("Successfully unyanked")
end
end

should 'invoke unyank_gem' do
stub(@command).unyank_gem(@version)
@command.execute
assert_received(@command) do |command|
command.unyank_gem(@version)
end
end

should 'put to api' do
@command.execute
assert_requested(:put, @api, :times => 1)
assert_requested(:put, @api, :headers => { 'Authorization' => 'key' })
end
end
end
end

0 comments on commit 7b76ffc

Please sign in to comment.