rubyforge 1.0.5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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