gems 0.1.0 → 0.2.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/.gitignore CHANGED
@@ -1,4 +1,3 @@
1
- *.gem
2
1
  *.rbc
3
2
  .DS_Store
4
3
  .bundle
data/README.md CHANGED
@@ -76,6 +76,9 @@ Usage Examples
76
76
  # Test fire a webhook.
77
77
  Gems.fire_web_hook 'rails', 'http://example.com'
78
78
 
79
+ # Submit a gem to RubyGems.org.
80
+ Gems.push File.new 'gemcutter-0.2.1.gem'
81
+
79
82
  # Remove a gem from RubyGems.org's index.
80
83
  # Defaults to the latest version if no version is specified.
81
84
  Gems.yank 'bills', '0.0.1'
data/gems.gemspec CHANGED
@@ -11,7 +11,6 @@ Gem::Specification.new do |gem|
11
11
  gem.add_development_dependency 'yard', '~> 0.7'
12
12
  gem.add_runtime_dependency 'faraday', '~> 0.6.1'
13
13
  gem.add_runtime_dependency 'faraday_middleware', '~> 0.6.5'
14
- gem.add_runtime_dependency 'hashie', '~> 1.0.0'
15
14
  gem.add_runtime_dependency 'multi_json', '~> 1.0.3'
16
15
  gem.add_runtime_dependency 'multi_xml', '~> 0.2.2'
17
16
 
data/lib/gems/client.rb CHANGED
@@ -58,7 +58,7 @@ module Gems
58
58
  # @example
59
59
  # Gems.downloads 'coulda', '0.6.3', Date.today - 30, Date.today
60
60
  def downloads(gem_name, gem_version=nil, from=nil, to=Date.today)
61
- gem_version ||= info(gem_name).version
61
+ gem_version ||= info(gem_name)['version']
62
62
  if from
63
63
  get("/api/v1/versions/#{gem_name}-#{gem_version}/downloads/search", {:from => from.to_s, :to => to.to_s}, :json)
64
64
  else
@@ -173,6 +173,16 @@ module Gems
173
173
  post("/api/v1/web_hooks/fire", {:gem_name => gem_name, :url => url}, :raw)
174
174
  end
175
175
 
176
+ # Submit a gem to RubyGems.org
177
+ #
178
+ # @param gem [File] A built gem.
179
+ # @return [String]
180
+ # @example
181
+ # Gems.push(File.new("pkg/gemcutter-0.2.1.gem"))
182
+ def push(gem)
183
+ post("/api/v1/gems", gem.read, :raw, 'application/octet-stream')
184
+ end
185
+
176
186
  # Remove a gem from RubyGems.org's index
177
187
  #
178
188
  # @param gem_name [String] The name of a gem.
@@ -183,7 +193,7 @@ module Gems
183
193
  # @example
184
194
  # Gems.yank("gemcutter", "0.2.1", {:platform => "x86-darwin-10"})
185
195
  def yank(gem_name, gem_version=nil, options={})
186
- gem_version ||= info(gem_name).version
196
+ gem_version ||= info(gem_name)['version']
187
197
  delete("/api/v1/gems/yank", options.merge(:gem_name => gem_name, :version => gem_version), :raw)
188
198
  end
189
199
 
@@ -197,7 +207,7 @@ module Gems
197
207
  # @example
198
208
  # Gems.unyank("gemcutter", "0.2.1", {:platform => "x86-darwin-10"})
199
209
  def unyank(gem_name, gem_version=nil, options={})
200
- gem_version ||= info(gem_name).version
210
+ gem_version ||= info(gem_name)['version']
201
211
  put("/api/v1/gems/unyank", options.merge(:gem_name => gem_name, :version => gem_version), :raw)
202
212
  end
203
213
  end
@@ -7,6 +7,7 @@ module Gems
7
7
  # An array of valid keys in the options hash when configuring a {Gems::Client}
8
8
  VALID_OPTIONS_KEYS = [
9
9
  :format,
10
+ :host,
10
11
  :key,
11
12
  :password,
12
13
  :user_agent,
@@ -16,12 +17,15 @@ module Gems
16
17
  # Set the default response format appended to the path
17
18
  #
18
19
  # @note JSON is preferred over XML because it is more concise and faster to parse.
19
- DEFAULT_FORMAT = :json
20
+ DEFAULT_FORMAT = :json.freeze
21
+
22
+ # Set the default API endpoint
23
+ DEFAULT_HOST = ENV['RUBYGEMS_HOST'] ? ENV['RUBYGEMS_HOST'].freeze : 'https://rubygems.org'.freeze
20
24
 
21
25
  # Set the default credentials
22
- DEFAULT_KEY = Gem.configuration.rubygems_api_key
26
+ DEFAULT_KEY = Gem.configuration.rubygems_api_key.freeze
23
27
 
24
- # Set the default value sent in the 'User-Agent' header
28
+ # Set the default 'User-Agent' HTTP header
25
29
  DEFAULT_USER_AGENT = "Gems #{Gems::VERSION}".freeze
26
30
 
27
31
  attr_accessor *VALID_OPTIONS_KEYS
@@ -46,6 +50,7 @@ module Gems
46
50
  # Reset all configuration options to defaults
47
51
  def reset
48
52
  self.format = DEFAULT_FORMAT
53
+ self.host = DEFAULT_HOST
49
54
  self.key = DEFAULT_KEY
50
55
  self.password = nil
51
56
  self.user_agent = DEFAULT_USER_AGENT
@@ -2,20 +2,21 @@ require 'faraday_middleware'
2
2
 
3
3
  module Gems
4
4
  module Connection
5
- def connection(format=format)
5
+ def connection(content_length=nil, content_type=nil, format=foramt)
6
6
  options = {
7
7
  :headers => {
8
8
  :user_agent => user_agent,
9
9
  },
10
10
  :ssl => {:verify => false},
11
- :url => 'https://rubygems.org',
11
+ :url => host,
12
12
  }
13
13
 
14
+ options[:headers].merge!({:content_length => content_length}) if content_length
15
+ options[:headers].merge!({:content_type => content_type}) if content_type
14
16
  options[:headers].merge!({:authorization => key}) if key
15
17
 
16
18
  connection = Faraday.new(options) do |connection|
17
- connection.use Faraday::Request::UrlEncoded
18
- connection.use Faraday::Response::Mashify
19
+ connection.use Faraday::Request::UrlEncoded unless content_type
19
20
  case format.to_s.downcase
20
21
  when 'json'
21
22
  connection.use Faraday::Response::ParseJson
data/lib/gems/request.rb CHANGED
@@ -1,31 +1,37 @@
1
+ require 'rubygems'
2
+
1
3
  module Gems
2
4
  module Request
3
- def delete(path, options={}, format=format)
4
- request(:delete, path, options, format)
5
+ def delete(path, options={}, format=format, content_type=nil)
6
+ request(:delete, path, options, format, content_type)
5
7
  end
6
8
 
7
- def get(path, options={}, format=format)
8
- request(:get, path, options, format)
9
+ def get(path, options={}, format=format, content_type=nil)
10
+ request(:get, path, options, format, content_type)
9
11
  end
10
12
 
11
- def post(path, options={}, format=format)
12
- request(:post, path, options, format)
13
+ def post(path, options={}, format=format, content_type=nil)
14
+ request(:post, path, options, format, content_type)
13
15
  end
14
16
 
15
- def put(path, options={}, format=format)
16
- request(:put, path, options, format)
17
+ def put(path, options={}, format=format, content_type=nil)
18
+ request(:put, path, options, format, content_type)
17
19
  end
18
20
 
19
21
  private
20
22
 
21
- def request(method, path, options, format)
22
- response = connection(format).send(method) do |request|
23
+ def request(method, path, options, format, content_type)
24
+ content_length = case content_type
25
+ when 'application/octet-stream'
26
+ options.size
27
+ end
28
+ response = connection(content_length, content_type, format).send(method) do |request|
23
29
  case method
24
30
  when :delete, :get
25
31
  request.url(formatted_path(path, format), options)
26
32
  when :post, :put
27
33
  request.path = formatted_path(path, format)
28
- request.body = options unless options.empty?
34
+ request.body = options unless options == {}
29
35
  end
30
36
  end
31
37
  response.body
data/lib/gems/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Gems
2
- VERSION = "0.1.0" unless defined? ::Gems::VERSION
2
+ VERSION = "0.2.0" unless defined? ::Gems::VERSION
3
3
  end
Binary file
@@ -0,0 +1 @@
1
+ Successfully registered gem: gems (0.0.8)
@@ -2,14 +2,6 @@ require 'helper'
2
2
 
3
3
  describe Gems::Client do
4
4
  before do
5
- Gems.configure do |config|
6
- config.key = '701243f217cdf23b1370c7b66b65ca97'
7
- config.username = 'nick@gemcutter.org'
8
- config.password = 'schwwwwing'
9
- end
10
- end
11
-
12
- after do
13
5
  Gems.reset
14
6
  end
15
7
 
@@ -26,7 +18,7 @@ describe Gems::Client do
26
18
  info = Gems.info 'rails'
27
19
  a_get("/api/v1/gems/rails.#{format}").
28
20
  should have_been_made
29
- info.name.should == 'rails'
21
+ info['name'].should == 'rails'
30
22
  end
31
23
  end
32
24
  end
@@ -47,7 +39,7 @@ describe Gems::Client do
47
39
  a_get("/api/v1/search.#{format}").
48
40
  with(:query => {"query" => "cucumber"}).
49
41
  should have_been_made
50
- search.first.name.should == 'cucumber'
42
+ search.first['name'].should == 'cucumber'
51
43
  end
52
44
  end
53
45
  end
@@ -63,7 +55,7 @@ describe Gems::Client do
63
55
  versions = Gems.versions 'coulda'
64
56
  a_get("/api/v1/versions/coulda.json").
65
57
  should have_been_made
66
- versions.first.number.should == '0.6.3'
58
+ versions.first['number'].should == '0.6.3'
67
59
  end
68
60
  end
69
61
 
@@ -80,7 +72,7 @@ describe Gems::Client do
80
72
  downloads = Gems.downloads 'coulda'
81
73
  a_get("/api/v1/versions/coulda-3.0.9/downloads.json").
82
74
  should have_been_made
83
- downloads["2011-06-22"].should == 8
75
+ downloads['2011-06-22'].should == 8
84
76
  end
85
77
  end
86
78
 
@@ -94,7 +86,7 @@ describe Gems::Client do
94
86
  downloads = Gems.downloads 'coulda', '0.6.3'
95
87
  a_get("/api/v1/versions/coulda-0.6.3/downloads.json").
96
88
  should have_been_made
97
- downloads["2011-06-22"].should == 8
89
+ downloads['2011-06-22'].should == 8
98
90
  end
99
91
  end
100
92
 
@@ -110,7 +102,7 @@ describe Gems::Client do
110
102
  a_get("/api/v1/versions/coulda-0.6.3/downloads/search.json").
111
103
  with(:query => {"from" => "2011-01-01", "to" => Date.today.to_s}).
112
104
  should have_been_made
113
- downloads["2011-06-22"].should == 8
105
+ downloads['2011-06-22'].should == 8
114
106
  end
115
107
  end
116
108
 
@@ -126,7 +118,7 @@ describe Gems::Client do
126
118
  a_get("/api/v1/versions/coulda-0.6.3/downloads/search.json").
127
119
  with(:query => {"from" => "2011-01-01", "to" => "2011-06-28"}).
128
120
  should have_been_made
129
- downloads["2011-06-22"].should == 8
121
+ downloads['2011-06-22'].should == 8
130
122
  end
131
123
  end
132
124
  end
@@ -143,19 +135,23 @@ describe Gems::Client do
143
135
  a_get("/api/v1/dependencies").
144
136
  with(:query => {"gems" => "rails,thor"}).
145
137
  should have_been_made
146
- dependencies.first.number.should == "3.0.9"
138
+ dependencies.first[:number].should == "3.0.9"
147
139
  end
148
140
  end
149
141
 
150
142
  describe ".api_key" do
151
143
  before do
152
- stub_get("/api/v1/api_key").
144
+ Gems.configure do |config|
145
+ config.username = 'nick@gemcutter.org'
146
+ config.password = 'schwwwwing'
147
+ end
148
+ stub_get("https://nick%40gemcutter.org:schwwwwing@rubygems.org/api/v1/api_key").
153
149
  to_return(:body => fixture("api_key"))
154
150
  end
155
151
 
156
152
  it "should retrieve an API key" do
157
153
  api_key = Gems.api_key
158
- a_get("/api/v1/api_key").
154
+ a_get("https://nick%40gemcutter.org:schwwwwing@rubygems.org/api/v1/api_key").
159
155
  should have_been_made
160
156
  api_key.should == "701243f217cdf23b1370c7b66b65ca97"
161
157
  end
@@ -174,7 +170,7 @@ describe Gems::Client do
174
170
  gems = Gems.gems
175
171
  a_get("/api/v1/gems.#{format}").
176
172
  should have_been_made
177
- gems.first.name.should == "congress"
173
+ gems.first['name'].should == "congress"
178
174
  end
179
175
  end
180
176
  end
@@ -193,7 +189,7 @@ describe Gems::Client do
193
189
  owners = Gems.owners("gems")
194
190
  a_get("/api/v1/gems/gems/owners.#{format}").
195
191
  should have_been_made
196
- owners.first.email.should == "sferik@gmail.com"
192
+ owners.first['email'].should == "sferik@gmail.com"
197
193
  end
198
194
  end
199
195
  end
@@ -241,7 +237,7 @@ describe Gems::Client do
241
237
  web_hooks = Gems.web_hooks
242
238
  a_get("/api/v1/web_hooks.json").
243
239
  should have_been_made
244
- web_hooks.rails.first.url.should == "http://example.com"
240
+ web_hooks['rails'].first['url'].should == "http://example.com"
245
241
  end
246
242
  end
247
243
 
@@ -293,6 +289,20 @@ describe Gems::Client do
293
289
  end
294
290
  end
295
291
 
292
+ describe ".push" do
293
+ before do
294
+ stub_post("/api/v1/gems").
295
+ to_return(:body => fixture("push"))
296
+ end
297
+
298
+ it "should submit a gem to RubyGems.org" do
299
+ push = Gems.push(File.new(File.expand_path("../../fixtures/gems-0.0.8.gem", __FILE__), "rb"))
300
+ a_post("/api/v1/gems").
301
+ should have_been_made
302
+ push.should == "Successfully registered gem: gems (0.0.8)"
303
+ end
304
+ end
305
+
296
306
  describe ".yank" do
297
307
  context "with no version specified" do
298
308
  before do
data/spec/gems_spec.rb CHANGED
@@ -3,14 +3,8 @@ require 'helper'
3
3
  describe Gems do
4
4
  context "when delegating to a client" do
5
5
  before do
6
- Gems.configure do |config|
7
- config.username = 'nick@gemcutter.org'
8
- config.password = 'schwwwwing'
9
- end
10
- stub_get("/api/v1/gems/rails.json").to_return(:body => fixture("rails.json"))
11
- end
12
-
13
- after do
6
+ stub_get("/api/v1/gems/rails.json").
7
+ to_return(:body => fixture("rails.json"))
14
8
  Gems.reset
15
9
  end
16
10
 
data/spec/helper.rb CHANGED
@@ -6,36 +6,40 @@ require 'gems'
6
6
  require 'rspec'
7
7
  require 'webmock/rspec'
8
8
 
9
- def a_delete(path)
10
- a_request(:delete, 'https://nick%40gemcutter.org:schwwwwing@rubygems.org' + path)
9
+ def rubygems_url(url)
10
+ url =~ /^http/ ? url : 'https://rubygems.org' + url
11
11
  end
12
12
 
13
- def a_get(path)
14
- a_request(:get, 'https://nick%40gemcutter.org:schwwwwing@rubygems.org' + path)
13
+ def a_delete(url)
14
+ a_request(:delete, rubygems_url(url))
15
15
  end
16
16
 
17
- def a_post(path)
18
- a_request(:post, 'https://nick%40gemcutter.org:schwwwwing@rubygems.org' + path)
17
+ def a_get(url)
18
+ a_request(:get, rubygems_url(url))
19
19
  end
20
20
 
21
- def a_put(path)
22
- a_request(:put, 'https://nick%40gemcutter.org:schwwwwing@rubygems.org' + path)
21
+ def a_post(url)
22
+ a_request(:post, rubygems_url(url))
23
23
  end
24
24
 
25
- def stub_delete(path)
26
- stub_request(:delete, 'https://nick%40gemcutter.org:schwwwwing@rubygems.org' + path)
25
+ def a_put(url)
26
+ a_request(:put, rubygems_url(url))
27
27
  end
28
28
 
29
- def stub_get(path)
30
- stub_request(:get, 'https://nick%40gemcutter.org:schwwwwing@rubygems.org' + path)
29
+ def stub_delete(url)
30
+ stub_request(:delete, rubygems_url(url))
31
31
  end
32
32
 
33
- def stub_post(path)
34
- stub_request(:post, 'https://nick%40gemcutter.org:schwwwwing@rubygems.org' + path)
33
+ def stub_get(url)
34
+ stub_request(:get, rubygems_url(url))
35
35
  end
36
36
 
37
- def stub_put(path)
38
- stub_request(:put, 'https://nick%40gemcutter.org:schwwwwing@rubygems.org' + path)
37
+ def stub_post(url)
38
+ stub_request(:post, rubygems_url(url))
39
+ end
40
+
41
+ def stub_put(url)
42
+ stub_request(:put, rubygems_url(url))
39
43
  end
40
44
 
41
45
  def fixture_path
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: gems
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.0
5
+ version: 0.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Erik Michaels-Ober
@@ -112,39 +112,28 @@ dependencies:
112
112
  version: 0.6.5
113
113
  type: :runtime
114
114
  version_requirements: *id009
115
- - !ruby/object:Gem::Dependency
116
- name: hashie
117
- prerelease: false
118
- requirement: &id010 !ruby/object:Gem::Requirement
119
- none: false
120
- requirements:
121
- - - ~>
122
- - !ruby/object:Gem::Version
123
- version: 1.0.0
124
- type: :runtime
125
- version_requirements: *id010
126
115
  - !ruby/object:Gem::Dependency
127
116
  name: multi_json
128
117
  prerelease: false
129
- requirement: &id011 !ruby/object:Gem::Requirement
118
+ requirement: &id010 !ruby/object:Gem::Requirement
130
119
  none: false
131
120
  requirements:
132
121
  - - ~>
133
122
  - !ruby/object:Gem::Version
134
123
  version: 1.0.3
135
124
  type: :runtime
136
- version_requirements: *id011
125
+ version_requirements: *id010
137
126
  - !ruby/object:Gem::Dependency
138
127
  name: multi_xml
139
128
  prerelease: false
140
- requirement: &id012 !ruby/object:Gem::Requirement
129
+ requirement: &id011 !ruby/object:Gem::Requirement
141
130
  none: false
142
131
  requirements:
143
132
  - - ~>
144
133
  - !ruby/object:Gem::Version
145
134
  version: 0.2.2
146
135
  type: :runtime
147
- version_requirements: *id012
136
+ version_requirements: *id011
148
137
  description: Ruby wrapper for the RubyGems.org API
149
138
  email:
150
139
  - sferik@gmail.com
@@ -178,10 +167,12 @@ files:
178
167
  - spec/fixtures/dependencies
179
168
  - spec/fixtures/downloads.json
180
169
  - spec/fixtures/fire_web_hook
170
+ - spec/fixtures/gems-0.0.8.gem
181
171
  - spec/fixtures/gems.json
182
172
  - spec/fixtures/gems.xml
183
173
  - spec/fixtures/owners.json
184
174
  - spec/fixtures/owners.yaml
175
+ - spec/fixtures/push
185
176
  - spec/fixtures/rails.json
186
177
  - spec/fixtures/rails.xml
187
178
  - spec/fixtures/remove_owner.json
@@ -230,10 +221,12 @@ test_files:
230
221
  - spec/fixtures/dependencies
231
222
  - spec/fixtures/downloads.json
232
223
  - spec/fixtures/fire_web_hook
224
+ - spec/fixtures/gems-0.0.8.gem
233
225
  - spec/fixtures/gems.json
234
226
  - spec/fixtures/gems.xml
235
227
  - spec/fixtures/owners.json
236
228
  - spec/fixtures/owners.yaml
229
+ - spec/fixtures/push
237
230
  - spec/fixtures/rails.json
238
231
  - spec/fixtures/rails.xml
239
232
  - spec/fixtures/remove_owner.json