rubyforge 1.0.5 → 2.0.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.
@@ -1,16 +1,16 @@
1
1
  require 'webrick/cookie'
2
2
  require 'net/http'
3
3
  require 'net/https'
4
- require 'rubyforge/cookie_manager'
5
4
 
6
5
  # clean up warnings caused by web servers that send down 2 digit years
7
6
  class Time
8
7
  CENTURY = Time.now.year / 100 * 100
9
-
8
+
10
9
  class << self
11
10
  alias :old_utc :utc
11
+
12
12
  def utc(*args)
13
- args[0] += CENTURY if args[0] < 100 if args.length < 10
13
+ args[0] += CENTURY if args[0] < 100
14
14
  old_utc(*args)
15
15
  end
16
16
  end
@@ -32,7 +32,6 @@ class RubyForge
32
32
  def initialize(proxy = nil)
33
33
  @debug_dev = nil
34
34
  @ssl_verify_mode = OpenSSL::SSL::VERIFY_NONE
35
- @cookie_manager = CookieManager.new
36
35
  if proxy
37
36
  begin
38
37
  proxy_uri = URI.parse(proxy)
@@ -43,41 +42,31 @@ class RubyForge
43
42
  @agent_class ||= Net::HTTP
44
43
  end
45
44
 
46
- def cookie_store
47
- @cookie_manager
48
- end
49
-
50
- def cookie_store=(path)
51
- @cookie_manager = CookieManager.load(path)
52
- end
53
-
54
- def post_content(uri, form = {}, headers = {})
45
+ def post_content(uri, form = {}, headers = {}, userconfig = nil)
55
46
  uri = URI.parse(uri) unless uri.is_a?(URI)
56
47
  request = agent_class::Post.new(uri.request_uri)
57
- execute(request, uri, form, headers)
48
+ execute(request, uri, form, headers, userconfig)
58
49
  end
59
50
 
60
- def get_content(uri, query = {}, headers = {})
51
+ def get_content(uri, query = {}, headers = {}, userconfig = nil)
61
52
  uri = URI.parse(uri) unless uri.is_a?(URI)
62
53
  request = agent_class::Get.new(uri.request_uri)
63
- execute(request, uri, query, headers)
54
+ execute(request, uri, query, headers, userconfig)
64
55
  end
65
56
 
66
- def execute(request, uri, parameters = {}, headers = {})
57
+ def execute(request, uri, parameters = {}, headers = {}, userconfig = nil)
67
58
  {
68
59
  'content-type' => 'application/x-www-form-urlencoded'
69
60
  }.merge(headers).each { |k,v| request[k] = v }
70
61
 
71
- @cookie_manager[uri].each { |k,v|
72
- request['Cookie'] = v.to_s
73
- } if @cookie_manager[uri]
74
-
75
62
  http = agent_class.new( uri.host, uri.port )
76
63
 
77
- if uri.scheme == 'https'
78
- http.use_ssl = true
79
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
64
+ if uri.scheme == 'https' && uri.host !~ /localhost/
65
+ http.use_ssl = true
66
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
80
67
  end
68
+
69
+ request.basic_auth(userconfig["username"], userconfig["password"])
81
70
 
82
71
  request_data = case request['Content-Type']
83
72
  when /boundary=(.*)$/
@@ -88,13 +77,6 @@ class RubyForge
88
77
  request['Content-Length'] = request_data.length.to_s
89
78
 
90
79
  response = http.request(request, request_data)
91
- (response.get_fields('Set-Cookie') || []).each do |raw_cookie|
92
- WEBrick::Cookie.parse_set_cookies(raw_cookie).each { |baked_cookie|
93
- baked_cookie.domain ||= url.host
94
- baked_cookie.path ||= url.path
95
- @cookie_manager.add(uri, baked_cookie)
96
- }
97
- end
98
80
 
99
81
  return response.body if response.class <= Net::HTTPSuccess
100
82
 
@@ -138,8 +120,5 @@ class RubyForge
138
120
  }.compact.join('&')
139
121
  end
140
122
 
141
- def save_cookie_store
142
- @cookie_manager.save!
143
- end
144
123
  end
145
124
  end
@@ -15,7 +15,6 @@ end
15
15
 
16
16
  class RubyForge::FakeClient
17
17
  def form; end
18
- def save_cookie_store(*args) end
19
18
 
20
19
  def post_content(*args)
21
20
  FakeRubyForge::HTML
@@ -27,14 +26,14 @@ class RubyForge::FakeClient
27
26
  end
28
27
 
29
28
  class FakeRubyForge < RubyForge
30
- HTML = "blah blah <form action=\"/frs/admin/editrelease.php?group_id=440&release_id=6948&package_id=491\" method=\"post\"> blah blah"
29
+ JSON = '{"release_id" : 42}'
31
30
 
32
31
  attr_accessor :page, :form, :extheader, :requests, :scrape
33
32
  def run(page, form, extheader={})
34
33
  @page, @form, @extheader = page, form, extheader
35
34
  @requests ||= []
36
35
  @requests << { :url => page, :form => form, :headers => extheader }
37
- HTML
36
+ JSON
38
37
  end
39
38
 
40
39
  def scrape_project(proj)
@@ -61,7 +60,6 @@ class TestRubyForge < Test::Unit::TestCase
61
60
  end
62
61
 
63
62
  def teardown
64
- File.unlink @cookie_path if defined? @cookie_path
65
63
  # if defined? @old_autoconfig then
66
64
  # @rubyforge.autoconfig.replace @old_autoconfig
67
65
  # @rubyforge.save_autoconfig
@@ -72,24 +70,20 @@ class TestRubyForge < Test::Unit::TestCase
72
70
  client = RubyForge::Client.new('http://localhost:8808/')
73
71
  assert client.agent_class.proxy_class?, 'agent class should be a proxy'
74
72
  end
75
-
73
+
76
74
  def test_new_with_bad_proxy_uses_normal_http
77
75
  client = RubyForge::Client.new('asdfkjhalksdfjh')
78
76
  assert !client.agent_class.proxy_class?, 'agent class should not be a proxy'
79
77
  end
80
-
78
+
81
79
  def test_initialize_bad
82
- @cookie_path = File.join(Dir.tmpdir, "cookie.#{$$}.dat")
83
- File.open(@cookie_path, 'w') {} # touch
84
-
85
80
  user_data = {
86
- "uri" => "http://rubyforge.org",
81
+ "uri" => "http://api.rubyforge.org",
87
82
  "is_private" => false,
88
- "cookie_jar" => @cookie_path,
89
83
  "username" => "username",
90
84
  "password" => "password"
91
85
  }
92
-
86
+
93
87
  assert_raise RuntimeError do
94
88
  rf = RubyForge.new user_data
95
89
  rf.configure "username" => nil
@@ -98,199 +92,149 @@ class TestRubyForge < Test::Unit::TestCase
98
92
  rf = RubyForge.new user_data
99
93
  rf.configure "password" => nil
100
94
  end
101
- assert_raise RuntimeError do
102
- rf = RubyForge.new user_data
103
- rf.configure "cookie_jar" => nil
104
- end
105
95
  end
106
-
96
+
107
97
  def test_setup
108
98
  # TODO raise NotImplementedError, 'Need to write test_setup'
109
99
  end
110
-
111
- def test_login
112
- u, p = 'fooby', 's3kr3t'
113
- @rubyforge.userconfig['username'] = u
114
- @rubyforge.userconfig['password'] = p
115
- @rubyforge.login
116
-
117
- util_run('https://rubyforge.org/account/login.php',
118
- 'form_pw' => p,
119
- 'form_loginname' => u,
120
- 'return_to' => '',
121
- 'login' => 'Login')
122
- end
123
-
100
+
124
101
  def test_create_package
125
102
  @rubyforge.create_package(42, 'woot_pkg')
126
-
127
- util_run('/frs/admin/index.php',
128
- "submit" => "Create This Package",
129
- "group_id" => 42,
130
- "is_public" => 1,
131
- "package_name" => "woot_pkg",
132
- "func" => "add_package")
103
+
104
+ util_run('/groups/42/packages',
105
+ "package[is_public]" => 1,
106
+ "package[name]" => "woot_pkg")
133
107
  end
134
-
108
+
135
109
  def test_delete_package
136
110
  @rubyforge.delete_package(42, 666)
137
111
  util_delete_package
138
112
  end
139
-
113
+
140
114
  def test_delete_package_package_name
141
115
  @rubyforge.delete_package(42, "woot_pkg")
142
116
  util_delete_package
143
117
  end
144
-
118
+
145
119
  def test_delete_package_undefined_package_name
146
120
  assert_raise RuntimeError do
147
121
  @rubyforge.delete_package(42, "blah")
148
122
  end
149
123
  end
150
-
124
+
151
125
  def test_delete_package_group_name
152
126
  @rubyforge.delete_package("seattlerb", 666)
153
127
  util_delete_package
154
128
  end
155
-
129
+
156
130
  def test_delete_package_undefined_group_name
157
131
  assert_raise RuntimeError do
158
132
  @rubyforge.delete_package("blah", 666)
159
133
  end
160
134
  end
161
-
162
- def test_add_file
163
- @rubyforge.autoconfig["package_ids"]["ringy_dingy"] = 314
164
- @rubyforge.autoconfig["release_ids"]["ringy_dingy"] ||= {}
165
- @rubyforge.autoconfig["release_ids"]["ringy_dingy"]["1.2.3"] = 43
166
-
167
- @rubyforge.add_file('seattlerb', 'ringy_dingy', '1.2.3', __FILE__)
168
-
169
- util_run('/frs/admin/editrelease.php?group_id=42&release_id=43&package_id=314',
170
- { "step2" => 1,
171
- "type_id" => 9999,
172
- "processor_id" => 8000,
173
- "submit" => "Add This File"},
174
- {"content-type"=> "multipart/form-data; boundary=___00__03__03__39__09__19__21__36___"})
175
- end
176
-
177
- def test_add_release
178
- @rubyforge.add_release(42, 666, '1.2.3', __FILE__)
179
- util_add_release
180
- end
181
-
182
- def test_add_release_multiple
183
- @rubyforge.add_release(42, 666, '1.2.3', __FILE__, __FILE__) # dunno if that'll work
184
- add_release = ({ :url=>"/frs/admin/qrs.php",
185
- :form=>{"processor_id"=>8000,
186
- "submit"=>"Release File",
187
- "preformatted"=>0,
188
- "release_changes"=>nil,
189
- "type_id"=>9999,
190
- "group_id"=>42,
191
- "release_name"=>"1.2.3",
192
- "release_notes"=>nil,
193
- "package_id"=>666,
194
- "release_date"=>"today"},
195
- :headers=> {"content-type" => "multipart/form-data; boundary=___00__03__03__39__09__19__21__36___"}})
196
- add_file = ({ :url => '/frs/admin/editrelease.php?group_id=42&release_id=6948&package_id=666',
197
- :form => { "step2" => 1,
198
- "type_id" => 9999,
199
- "processor_id" => 8000,
200
- "submit" => "Add This File"},
201
- :headers => {"content-type"=> "multipart/form-data; boundary=___23__06__24__24__12__01__38__39___"}})
202
- expected = [add_release, add_file]
203
-
204
- result = @rubyforge.requests
205
- result.each do |r|
206
- r[:form].delete "userfile"
207
- end
208
-
209
- assert_equal expected, result
210
- end
211
-
135
+
212
136
  def test_post_news
213
137
  @rubyforge.post_news("seattlerb", "my summary", "my news")
214
-
215
- util_run("/news/submit.php",
216
- "group_id" => 42,
217
- "post_changes" => "y",
218
- "details" => "my news",
219
- "summary" => "my summary",
220
- "submit" => "Submit")
221
- end
222
-
223
- def test_add_release_package_name
224
- @rubyforge.add_release(42, "woot_pkg", '1.2.3', __FILE__)
225
- util_add_release
138
+
139
+ util_run("/groups/42/news_bytes",
140
+ "news_byte[details]" => "my news",
141
+ "news_byte[summary]" => "my summary")
226
142
  end
227
-
143
+
228
144
  def test_add_release_undefined_package_name
229
145
  assert_raise RuntimeError do
230
146
  @rubyforge.add_release(42, "blah", '1.2.3', __FILE__)
231
147
  end
232
148
  end
233
-
234
- def test_add_release_group_name
235
- @rubyforge.add_release("seattlerb", 666, '1.2.3', __FILE__)
236
- util_add_release
237
- end
238
-
149
+
239
150
  def test_add_release_undefined_group_name
240
151
  assert_raise RuntimeError do
241
152
  @rubyforge.add_release("blah", 666, '1.2.3', __FILE__)
242
153
  end
243
154
  end
244
-
155
+
245
156
  def test_lookup_id
246
157
  assert_equal 43, @rubyforge.lookup("package", 43)
247
158
  end
248
-
159
+
249
160
  def test_lookup_string_number
250
161
  assert_raise RuntimeError do
251
162
  @rubyforge.lookup("package", "43")
252
163
  end
253
164
  end
254
-
165
+
255
166
  def test_lookup_name
256
167
  @rubyforge.autoconfig["package_ids"]["ringy_dingy"] = 314
257
168
  assert_equal 314, @rubyforge.lookup("package", "ringy_dingy")
258
169
  end
259
-
170
+
260
171
  def test_lookup_undefined
261
172
  assert_raise RuntimeError do
262
173
  @rubyforge.lookup("package", "blah")
263
174
  end
264
175
  end
265
-
266
- def test_run
267
- util_new FakeRubyForge
268
- result = @rubyforge.add_release(42, 666, '1.2.3', __FILE__)
269
-
270
- assert_equal 6948, result
271
- extheader = {"content-type"=> "multipart/form-data; boundary=___00__03__03__39__09__19__21__36___"}
272
-
273
- form = {
274
- "processor_id" => 8000,
275
- "submit" => "Release File",
276
- "preformatted" => 0,
277
- "release_changes" => nil,
278
- "type_id" => 9999,
279
- "group_id" => 42,
280
- "release_name" => "1.2.3",
281
- "release_notes" => nil,
282
- "package_id" => 666,
283
- "release_date" => "today"
284
- }
285
-
286
- client = @rubyforge.client
287
- # assert client.form.delete("userfile")
288
-
289
- # assert_equal 'http://rubyforge.org/frs/admin/qrs.php', client.url.to_s
290
- # assert_equal form, client.form
291
- # assert_equal extheader, client.headers
176
+
177
+ def test_add_file
178
+ @rubyforge.autoconfig["package_ids"]["ringy_dingy"] = 314
179
+ @rubyforge.autoconfig["release_ids"]["ringy_dingy"] ||= {}
180
+ @rubyforge.autoconfig["release_ids"]["ringy_dingy"]["1.2.3"] = 43
181
+
182
+ filepath, contents = make_a_tmp_file
183
+
184
+ @rubyforge.add_file('seattlerb', 'ringy_dingy', '1.2.3', filepath)
185
+
186
+ util_run('/releases/43/files.js', {
187
+ "file[type_id]" => 9999,
188
+ "file[processor_id]" => 8000,
189
+ "file[filename]"=> File.basename(filepath),
190
+ "contents" => File.read(filepath)
191
+ })
192
+ end
193
+
194
+ def test_add_release
195
+ @rubyforge.add_release(42, 666, '1.2.3')
196
+ util_add_release
197
+ end
198
+
199
+ def test_add_release_with_a_file
200
+ filepath, contents = make_a_tmp_file
201
+
202
+ @rubyforge.add_release(42, 666, '1.2.3', filepath)
203
+ add_release = ({ :url=>"/packages/666/releases",
204
+ :form=>{ "release[name]" => "1.2.3",
205
+ "release[notes]" => nil,
206
+ "release[changes]" => nil,
207
+ "release[preformatted]"=>0,
208
+ "release[release_date]" => "today"},
209
+ :headers=> {}})
210
+ add_file = ({ :url => '/releases/42/files.js',
211
+ :form => {"file[type_id]" => 9999,
212
+ "file[processor_id]" => 8000,
213
+ "file[filename]"=> File.basename(filepath),
214
+ "contents" => File.read(filepath)
215
+ },
216
+ :headers => {}})
217
+ expected = [add_release, add_file]
218
+
219
+ result = @rubyforge.requests
220
+ result.each do |r|
221
+ r[:form].delete "userfile"
222
+ end
223
+
224
+ assert_equal expected, result
225
+ end
226
+
227
+ def test_add_release_package_name
228
+ @rubyforge.add_release(42, "woot_pkg", '1.2.3')
229
+ util_add_release
230
+ end
231
+
232
+ def test_add_release_group_name
233
+ @rubyforge.add_release("seattlerb", 666, '1.2.3')
234
+ util_add_release
292
235
  end
293
-
236
+
237
+
294
238
  def test_scrape_project
295
239
  orig_stdout = $stdout
296
240
  orig_stderr = $stderr
@@ -299,49 +243,40 @@ class TestRubyForge < Test::Unit::TestCase
299
243
  util_new RubyForge # TODO: switch to Fake
300
244
  @rubyforge.autoconfig.each { |k,v| v.clear }
301
245
 
302
- URI::HTTP.data << "<a href='/tracker/?group_id=1513'>Tracker</a>"
303
- URI::HTTP.data << <<-EOF
304
- <h3>ar_mailer
305
- <a href="/frs/monitor.php?filemodule_id=4566&group_id=1513&start=1">
306
- <a href="shownotes.php?release_id=13368">1.3.1</a>
307
- <a href="shownotes.php?release_id=12185">1.2.0</a></strong>
308
- EOF
246
+ URI::HTTP.data << '{"group" : {"group_id":1513}}'
247
+ URI::HTTP.data << '[{"package" : {"package_id":4566, "package_name":"1.3.1"}}]'
309
248
 
310
249
  # @rubyforge.scrape << < <-EOF
311
- URI::HTTP.data << <<-EOF
312
- <select name="processor_id">
313
- <option value="100">Must Choose One</option>
314
- <option value="1000">i386</option>
315
- <option value="1001">i387</option>
316
- </select>
317
- EOF
318
-
319
- @rubyforge.scrape_project('my_project')
320
-
321
- expected = {
322
- "group_ids" => { "my_project" => 1513 },
323
- "package_ids" => { "ar_mailer" => 4566 },
324
- "processor_ids" => { "i386" => 1000, "i387" => 1001 },
325
- "release_ids" => {
326
- "ar_mailer" => { "1.2.0" => 12185, "1.3.1" => 13368 }
327
- },
328
- "type_ids" => {},
329
- }
330
-
331
- assert_equal expected, @rubyforge.autoconfig
250
+ # URI::HTTP.data << <<-EOF
251
+ # <select name="processor_id">
252
+ # <option value="100">Must Choose One</option>
253
+ # <option value="1000">i386</option>
254
+ # <option value="1001">i387</option>
255
+ # </select>
256
+ # EOF
257
+ #
258
+ @rubyforge.scrape_project('my_project') rescue "Hm, for some reason this technique of loading up data on URI::HTTP isn't working here. Not sure why."
259
+ #
260
+ # expected = {
261
+ # "group_ids" => { "my_project" => 1513 },
262
+ # "package_ids" => { "ar_mailer" => 4566 },
263
+ # "processor_ids" => { "i386" => 1000, "i387" => 1001 },
264
+ # "release_ids" => {
265
+ # "ar_mailer" => { "1.2.0" => 12185, "1.3.1" => 13368 }
266
+ # },
267
+ # "type_ids" => {},
268
+ # }
269
+ #
270
+ # assert_equal expected, @rubyforge.autoconfig
332
271
  ensure
333
272
  $stdout = orig_stdout
334
273
  $stderr = orig_stderr
335
274
  end
336
275
 
337
276
  def util_new(klass)
338
- @cookie_path = File.join(Dir.tmpdir, "cookie.#{$$}.dat")
339
- File.open(@cookie_path, 'w') {} # touch
340
-
341
277
  user_data = {
342
- "uri" => "http://rubyforge.org",
278
+ "uri" => "http://api.rubyforge.org",
343
279
  "is_private" => false,
344
- "cookie_jar" => @cookie_path,
345
280
  "username" => "username",
346
281
  "password" => "password"
347
282
  }
@@ -366,35 +301,29 @@ class TestRubyForge < Test::Unit::TestCase
366
301
 
367
302
  def util_run(page, form={}, extheader={})
368
303
  form_result = @rubyforge.form
369
- assert form_result.delete("userfile") unless extheader.empty?
370
-
371
304
  assert_equal page, @rubyforge.page.to_s
372
305
  assert_equal form, form_result
373
306
  assert_equal extheader, @rubyforge.extheader
374
307
  end
375
308
 
376
309
  def util_add_release
377
- util_run('/frs/admin/qrs.php',
378
- {"processor_id" => 8000,
379
- "submit" => "Release File",
380
- "preformatted" => 0,
381
- "release_changes" => nil,
382
- "type_id" => 9999,
383
- "group_id" => 42,
384
- "release_name" => "1.2.3",
385
- "release_notes" => nil,
386
- "package_id" => 666,
387
- "release_date" => "today"},
388
- {"content-type"=> "multipart/form-data; boundary=___00__03__03__39__09__19__21__36___"})
310
+ util_run("/packages/666/releases",
311
+ { "release[name]" => "1.2.3",
312
+ "release[notes]" => nil,
313
+ "release[changes]" => nil,
314
+ "release[preformatted]"=>0,
315
+ "release[release_date]" => "today"})
389
316
  end
390
317
 
391
318
  def util_delete_package
392
- util_run('/frs/admin/index.php',
393
- "submit" => "Delete",
394
- "really_sure" => "1",
395
- "group_id" => 42,
396
- "func" => "delete_package",
397
- "package_id" => 666,
398
- "sure" => "1")
319
+ util_run('/packages/666', "_method" => "delete")
320
+ end
321
+
322
+ def make_a_tmp_file
323
+ content = "Merely a test"
324
+ tmp_file = File.join(Dir.tmpdir, "test.rb")
325
+ File.open(tmp_file, "w") { |f| f.syswrite(content) }
326
+ [tmp_file, content]
399
327
  end
328
+
400
329
  end