gemcutter 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -13,14 +13,13 @@ begin
13
13
  require 'jeweler'
14
14
  Jeweler::Tasks.new do |gem|
15
15
  gem.name = "gemcutter"
16
- gem.version = "0.4.1"
16
+ gem.version = "0.6.0"
17
17
  gem.summary = "Commands to interact with RubyGems.org"
18
18
  gem.description = "Adds several commands to RubyGems for managing gems and more on RubyGems.org."
19
19
  gem.email = "nick@quaran.to"
20
20
  gem.homepage = "http://rubygems.org"
21
21
  gem.authors = ["Nick Quaranto"]
22
22
  gem.files = FileList["lib/rubygems_plugin.rb",
23
- "lib/gemcutter.rb",
24
23
  "lib/rubygems/commands/*",
25
24
  "test/*_helper.rb",
26
25
  "test/*_test.rb",
@@ -28,7 +27,6 @@ begin
28
27
  "Rakefile"]
29
28
  gem.test_files = []
30
29
  gem.executables = []
31
- gem.add_runtime_dependency('json_pure')
32
30
  %w[rake shoulda activesupport webmock rr].each do |dep|
33
31
  gem.add_development_dependency(dep)
34
32
  end
@@ -38,9 +36,10 @@ begin
38
36
 
39
37
  Thanks for installing Gemcutter! You can now run:
40
38
 
41
- gem push merged into RubyGems 1.3.6
42
- gem owner merged into RubyGems 1.3.6
43
- gem webhook register urls to be pinged when gems are pushed
39
+ gem push merged into RubyGems 1.3.6
40
+ gem owner merged into RubyGems 1.3.6
41
+ gem webhook register urls to be pinged when gems are pushed
42
+ gem yank remove a specific version of a gem from RubyGems.org
44
43
 
45
44
  ========================================================================
46
45
 
@@ -74,15 +74,13 @@ EOF
74
74
  end
75
75
 
76
76
  def list_webhooks
77
- require 'json/pure' unless defined?(JSON::JSON_LOADED)
78
-
79
- resp = rubygems_api_request(:get, "api/v1/web_hooks") do |request|
77
+ resp = rubygems_api_request(:get, "api/v1/web_hooks.yaml") do |request|
80
78
  request.add_field("Authorization", Gem.configuration.rubygems_api_key)
81
79
  end
82
80
 
83
81
  with_response(resp) do |response|
84
82
  begin
85
- groups = JSON.parse(response.body)
83
+ groups = YAML.load(response.body)
86
84
 
87
85
  if groups.size.zero?
88
86
  say "You haven't added any webhooks yet."
@@ -100,9 +98,9 @@ EOF
100
98
  end
101
99
  end
102
100
  end
103
- rescue JSON::ParserError => json_error
101
+ rescue Exception => error
104
102
  say "There was a problem parsing the data:"
105
- say json_error.to_s
103
+ say error.to_s
106
104
  terminate_interaction
107
105
  end
108
106
  end
@@ -0,0 +1,72 @@
1
+ require 'rubygems/local_remote_options'
2
+ require 'rubygems/version_option'
3
+ require 'rubygems/gemcutter_utilities'
4
+
5
+ class Gem::Commands::YankCommand < Gem::Command
6
+ include Gem::LocalRemoteOptions
7
+ include Gem::VersionOption
8
+ include Gem::GemcutterUtilities
9
+
10
+ def description
11
+ 'Remove a specific gem version release from RubyGems.org'
12
+ end
13
+
14
+ def arguments
15
+ "GEM name of gem"
16
+ end
17
+
18
+ def usage
19
+ "#{program_name} GEM -v VERSION [--undo]"
20
+ end
21
+
22
+ def initialize
23
+ super 'yank', description
24
+ add_version_option("remove")
25
+ add_option('--undo') do |value, options|
26
+ options[:undo] = true
27
+ end
28
+ end
29
+
30
+ def execute
31
+ sign_in
32
+ version = get_version_from_requirements(options[:version])
33
+ if !version.nil?
34
+ if options[:undo]
35
+ unyank_gem(version)
36
+ else
37
+ yank_gem(version)
38
+ end
39
+ else
40
+ say "A version argument is required: #{usage}"
41
+ terminate_interaction
42
+ end
43
+ end
44
+
45
+ def yank_gem(version)
46
+ say "Yanking gem from RubyGems.org..."
47
+ yank_api_request(:delete, version, "api/v1/gems/yank")
48
+ end
49
+
50
+ def unyank_gem(version)
51
+ say "Unyanking gem from RubyGems.org..."
52
+ yank_api_request(:put, version, "api/v1/gems/unyank")
53
+ end
54
+
55
+ private
56
+ def yank_api_request(method, version, api)
57
+ name = get_one_gem_name
58
+ response = rubygems_api_request(method, api) do |request|
59
+ request.add_field("Authorization", Gem.configuration.rubygems_api_key)
60
+ request.set_form_data({'gem_name' => name, 'version' => version})
61
+ end
62
+ say response.body
63
+ end
64
+
65
+ def get_version_from_requirements(requirements)
66
+ begin
67
+ requirements.requirements.first[1].version
68
+ rescue
69
+ nil
70
+ end
71
+ end
72
+ end
@@ -1 +1,7 @@
1
- require File.join(File.dirname(__FILE__), 'gemcutter') if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.3.6')
1
+ require 'rubygems/command_manager'
2
+
3
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.3.6')
4
+ %w[migrate tumble webhook yank].each do |command|
5
+ Gem::CommandManager.instance.register_command command.to_sym
6
+ end
7
+ end
@@ -1,4 +1,5 @@
1
1
  require 'helper'
2
+ require 'lib/rubygems/commands/webhook_command'
2
3
 
3
4
  class WebhookCommandTest < CommandTest
4
5
  context "webhooking" do
@@ -71,11 +72,15 @@ class WebhookCommandTest < CommandTest
71
72
  context "listing hooks with some available" do
72
73
  setup do
73
74
  stub_api_key("key")
74
- stub_request(:get, @api).to_return :body => <<EOF
75
- {
76
- "foo": [{"url":"http://foogemhook.com","failure_count":0}],
77
- "all gems":[{"url":"http://allgemshook.com","failure_count":0}]
78
- }
75
+ stub_request(:get, "#{@api}.yaml").to_return :body => <<EOF
76
+ ---
77
+ foo:
78
+ - url: http://foogemhook.com
79
+ failure_count: 0
80
+ all gems:
81
+ - url: http://allgemshook.com
82
+ failure_count: 0
83
+
79
84
  EOF
80
85
  end
81
86
 
@@ -114,9 +119,9 @@ EOF
114
119
  @command.execute
115
120
 
116
121
  # webmock doesn't pass body params on correctly :[
117
- assert_requested(:get, @api,
122
+ assert_requested(:get, "#{@api}.yaml",
118
123
  :times => 1)
119
- assert_requested(:get, @api,
124
+ assert_requested(:get, "#{@api}.yaml",
120
125
  :headers => { 'Authorization' => 'key' })
121
126
  end
122
127
  end
@@ -124,7 +129,7 @@ EOF
124
129
  context "listing hooks with none available" do
125
130
  setup do
126
131
  stub_api_key("key")
127
- stub_request(:get, @api).to_return(:body => "{}")
132
+ stub_request(:get, "#{@api}.yaml").to_return(:body => "{}")
128
133
  @command.handle_options([])
129
134
  @command.execute
130
135
  end
@@ -140,7 +145,7 @@ EOF
140
145
  setup do
141
146
  stub(@command).terminate_interaction
142
147
  stub_api_key("key")
143
- stub_request(:get, @api).to_return(:body => "fubar")
148
+ stub_request(:get, "#{@api}.yaml").to_return(:body => "fubar")
144
149
  @command.handle_options([])
145
150
  @command.execute
146
151
  end
@@ -0,0 +1,85 @@
1
+ require 'helper'
2
+ require 'lib/rubygems/commands/yank_command'
3
+
4
+ class YankCommandTest < CommandTest
5
+ context "yanking" do
6
+ setup do
7
+ @gem = "MyGem"
8
+ @version = '0.1.0'
9
+ @command = Gem::Commands::YankCommand.new
10
+ stub(@command).say
11
+ end
12
+
13
+ %w[-v --version].each do |option|
14
+ should "raise an error with no version with #{option}" do
15
+ assert_raise OptionParser::MissingArgument do
16
+ @command.handle_options([@gem, option])
17
+ end
18
+ end
19
+ end
20
+
21
+ context 'yanking a gem' do
22
+ setup do
23
+ stub_api_key("key")
24
+ @api = "https://rubygems.org/api/v1/gems/yank"
25
+ stub_request(:delete, @api).to_return(:body => "Successfully yanked")
26
+ @command.handle_options([@gem, "-v", @version])
27
+ end
28
+
29
+ should 'say gem was yanked' do
30
+ @command.execute
31
+ assert_received(@command) do |command|
32
+ command.say("Yanking gem from Gemcutter...")
33
+ command.say("Successfully yanked")
34
+ end
35
+ end
36
+
37
+ should 'invoke yank_gem' do
38
+ stub(@command).yank_gem(@version)
39
+ @command.execute
40
+ assert_received(@command) do |command|
41
+ command.yank_gem(@version)
42
+ end
43
+ end
44
+
45
+ should 'delete to api' do
46
+ @command.execute
47
+ assert_requested(:delete, @api,
48
+ :times => 1)
49
+ assert_requested(:delete, @api,
50
+ :headers => { 'Authorization' => 'key' })
51
+ end
52
+ end
53
+
54
+ context 'unyanking a gem' do
55
+ setup do
56
+ stub_api_key("key")
57
+ @api = "https://rubygems.org/api/v1/gems/unyank"
58
+ stub_request(:put, @api).to_return(:body => "Successfully unyanked")
59
+ @command.handle_options([@gem, "-v", @version, "--undo"])
60
+ end
61
+
62
+ should 'say gem was unyanked' do
63
+ @command.execute
64
+ assert_received(@command) do |command|
65
+ command.say("Re-indexing gem")
66
+ command.say("Successfully unyanked")
67
+ end
68
+ end
69
+
70
+ should 'invoke unyank_gem' do
71
+ stub(@command).unyank_gem(@version)
72
+ @command.execute
73
+ assert_received(@command) do |command|
74
+ command.unyank_gem(@version)
75
+ end
76
+ end
77
+
78
+ should 'put to api' do
79
+ @command.execute
80
+ assert_requested(:put, @api, :times => 1)
81
+ assert_requested(:put, @api, :headers => { 'Authorization' => 'key' })
82
+ end
83
+ end
84
+ end
85
+ end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gemcutter
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 7
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 4
8
- - 1
9
- version: 0.4.1
8
+ - 6
9
+ - 0
10
+ version: 0.6.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Nick Quaranto
@@ -14,81 +15,79 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-02-22 00:00:00 -05:00
18
+ date: 2010-07-17 00:00:00 -05:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
- name: json_pure
22
+ name: rake
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 3
27
30
  segments:
28
31
  - 0
29
32
  version: "0"
30
- type: :runtime
33
+ type: :development
31
34
  version_requirements: *id001
32
35
  - !ruby/object:Gem::Dependency
33
- name: rake
36
+ name: shoulda
34
37
  prerelease: false
35
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
36
40
  requirements:
37
41
  - - ">="
38
42
  - !ruby/object:Gem::Version
43
+ hash: 3
39
44
  segments:
40
45
  - 0
41
46
  version: "0"
42
47
  type: :development
43
48
  version_requirements: *id002
44
49
  - !ruby/object:Gem::Dependency
45
- name: shoulda
50
+ name: activesupport
46
51
  prerelease: false
47
52
  requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
48
54
  requirements:
49
55
  - - ">="
50
56
  - !ruby/object:Gem::Version
57
+ hash: 3
51
58
  segments:
52
59
  - 0
53
60
  version: "0"
54
61
  type: :development
55
62
  version_requirements: *id003
56
63
  - !ruby/object:Gem::Dependency
57
- name: activesupport
64
+ name: webmock
58
65
  prerelease: false
59
66
  requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
60
68
  requirements:
61
69
  - - ">="
62
70
  - !ruby/object:Gem::Version
71
+ hash: 3
63
72
  segments:
64
73
  - 0
65
74
  version: "0"
66
75
  type: :development
67
76
  version_requirements: *id004
68
77
  - !ruby/object:Gem::Dependency
69
- name: webmock
78
+ name: rr
70
79
  prerelease: false
71
80
  requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
83
  - - ">="
74
84
  - !ruby/object:Gem::Version
85
+ hash: 3
75
86
  segments:
76
87
  - 0
77
88
  version: "0"
78
89
  type: :development
79
90
  version_requirements: *id005
80
- - !ruby/object:Gem::Dependency
81
- name: rr
82
- prerelease: false
83
- requirement: &id006 !ruby/object:Gem::Requirement
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- segments:
88
- - 0
89
- version: "0"
90
- type: :development
91
- version_requirements: *id006
92
91
  description: Adds several commands to RubyGems for managing gems and more on RubyGems.org.
93
92
  email: nick@quaran.to
94
93
  executables: []
@@ -100,12 +99,13 @@ extra_rdoc_files: []
100
99
  files:
101
100
  - MIT-LICENSE
102
101
  - Rakefile
103
- - lib/gemcutter.rb
104
- - lib/rubygems/commands/migrate.rb
105
- - lib/rubygems/commands/tumble.rb
106
- - lib/rubygems/commands/webhook.rb
102
+ - lib/rubygems/commands/migrate_command.rb
103
+ - lib/rubygems/commands/tumble_command.rb
104
+ - lib/rubygems/commands/webhook_command.rb
105
+ - lib/rubygems/commands/yank_command.rb
107
106
  - lib/rubygems_plugin.rb
108
107
  - test/webhook_command_test.rb
108
+ - test/yank_command_test.rb
109
109
  has_rdoc: true
110
110
  homepage: http://rubygems.org
111
111
  licenses: []
@@ -116,9 +116,10 @@ post_install_message: |+
116
116
 
117
117
  Thanks for installing Gemcutter! You can now run:
118
118
 
119
- gem push merged into RubyGems 1.3.6
120
- gem owner merged into RubyGems 1.3.6
121
- gem webhook register urls to be pinged when gems are pushed
119
+ gem push merged into RubyGems 1.3.6
120
+ gem owner merged into RubyGems 1.3.6
121
+ gem webhook register urls to be pinged when gems are pushed
122
+ gem yank remove a specific version of a gem from RubyGems.org
122
123
 
123
124
  ========================================================================
124
125
 
@@ -127,23 +128,27 @@ rdoc_options:
127
128
  require_paths:
128
129
  - lib
129
130
  required_ruby_version: !ruby/object:Gem::Requirement
131
+ none: false
130
132
  requirements:
131
133
  - - ">="
132
134
  - !ruby/object:Gem::Version
135
+ hash: 3
133
136
  segments:
134
137
  - 0
135
138
  version: "0"
136
139
  required_rubygems_version: !ruby/object:Gem::Requirement
140
+ none: false
137
141
  requirements:
138
142
  - - ">="
139
143
  - !ruby/object:Gem::Version
144
+ hash: 3
140
145
  segments:
141
146
  - 0
142
147
  version: "0"
143
148
  requirements: []
144
149
 
145
150
  rubyforge_project:
146
- rubygems_version: 1.3.6
151
+ rubygems_version: 1.3.7
147
152
  signing_key:
148
153
  specification_version: 3
149
154
  summary: Commands to interact with RubyGems.org
@@ -1,6 +0,0 @@
1
- require 'rubygems/command_manager'
2
-
3
- %w[migrate tumble webhook].each do |command|
4
- require "rubygems/commands/#{command}"
5
- Gem::CommandManager.instance.register_command command.to_sym
6
- end