rubyforge 0.4.5 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -0
- data/Manifest.txt +4 -3
- data/Rakefile +7 -1
- data/bin/rubyforge +12 -12
- data/lib/rubyforge.rb +47 -42
- data/lib/rubyforge/client.rb +134 -0
- data/lib/rubyforge/cookie_manager.rb +51 -0
- data/test/test_rubyforge.rb +71 -42
- data/test/test_rubyforge_client.rb +122 -0
- data/test/test_rubyforge_cookie_manager.rb +97 -0
- metadata +9 -6
- data/lib/http-access2.rb +0 -1588
- data/lib/http-access2/cookie.rb +0 -537
- data/lib/http-access2/http.rb +0 -542
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -3,8 +3,9 @@ Manifest.txt
|
|
3
3
|
README.txt
|
4
4
|
Rakefile
|
5
5
|
bin/rubyforge
|
6
|
-
lib/http-access2.rb
|
7
|
-
lib/http-access2/cookie.rb
|
8
|
-
lib/http-access2/http.rb
|
9
6
|
lib/rubyforge.rb
|
7
|
+
lib/rubyforge/client.rb
|
8
|
+
lib/rubyforge/cookie_manager.rb
|
10
9
|
test/test_rubyforge.rb
|
10
|
+
test/test_rubyforge_client.rb
|
11
|
+
test/test_rubyforge_cookie_manager.rb
|
data/Rakefile
CHANGED
@@ -9,7 +9,10 @@ rescue LoadError
|
|
9
9
|
end
|
10
10
|
|
11
11
|
Object.send :remove_const, :RubyForge if defined? RubyForge
|
12
|
-
|
12
|
+
|
13
|
+
$LOAD_PATH << "./lib"
|
14
|
+
|
15
|
+
require './lib/rubyforge'
|
13
16
|
|
14
17
|
Hoe.new("rubyforge", RubyForge::VERSION) do |rubyforge|
|
15
18
|
rubyforge.rubyforge_name = "codeforpeople"
|
@@ -18,6 +21,9 @@ Hoe.new("rubyforge", RubyForge::VERSION) do |rubyforge|
|
|
18
21
|
rubyforge.developer('Ryan Davis', 'ryand-ruby@zenspider.com')
|
19
22
|
rubyforge.developer('Eric Hodel', 'drbrain@segment7.net')
|
20
23
|
rubyforge.developer('Ara T Howard', 'ara.t.howard@gmail.com')
|
24
|
+
|
25
|
+
|
26
|
+
rubyforge.multiruby_skip << "rubinius"
|
21
27
|
end
|
22
28
|
|
23
29
|
task :backup do
|
data/bin/rubyforge
CHANGED
@@ -136,21 +136,21 @@ EOL
|
|
136
136
|
mode = ARGV.shift
|
137
137
|
|
138
138
|
opts = GetoptLong::new(
|
139
|
-
[ "--help" , "-h" , GetoptLong::REQUIRED_ARGUMENT ]
|
140
|
-
[ "--
|
141
|
-
[ "--
|
142
|
-
[ "--
|
143
|
-
[ "--cookie_jar" , "-C" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
139
|
+
[ "--help" , "-h" , GetoptLong::REQUIRED_ARGUMENT ],
|
140
|
+
[ "--username" , "-u" , GetoptLong::REQUIRED_ARGUMENT ],
|
141
|
+
[ "--password" , "-p" , GetoptLong::REQUIRED_ARGUMENT ],
|
142
|
+
[ "--cookie_jar" , "-C" , GetoptLong::REQUIRED_ARGUMENT ],
|
144
143
|
[ "--is_private" , "-P" , GetoptLong::REQUIRED_ARGUMENT ],
|
145
|
-
[ "--release_date" , "-r" , GetoptLong::REQUIRED_ARGUMENT ]
|
146
|
-
[ "--type_id" , "-t" , GetoptLong::REQUIRED_ARGUMENT ]
|
147
|
-
[ "--processor_id" , "-o" , GetoptLong::REQUIRED_ARGUMENT ]
|
148
|
-
[ "--release_notes" , "-n" , GetoptLong::REQUIRED_ARGUMENT ]
|
149
|
-
[ "--release_changes" , "-a" , GetoptLong::REQUIRED_ARGUMENT ]
|
144
|
+
[ "--release_date" , "-r" , GetoptLong::REQUIRED_ARGUMENT ],
|
145
|
+
[ "--type_id" , "-t" , GetoptLong::REQUIRED_ARGUMENT ],
|
146
|
+
[ "--processor_id" , "-o" , GetoptLong::REQUIRED_ARGUMENT ],
|
147
|
+
[ "--release_notes" , "-n" , GetoptLong::REQUIRED_ARGUMENT ],
|
148
|
+
[ "--release_changes" , "-a" , GetoptLong::REQUIRED_ARGUMENT ],
|
150
149
|
[ "--preformatted" , "-f" , GetoptLong::NO_ARGUMENT ]
|
151
|
-
).enum_for.inject({}){|h,
|
150
|
+
).enum_for.inject({}) { |h, (k, v)| h.update k.delete('-') => v }
|
152
151
|
|
153
|
-
rubyforge = RubyForge.new
|
152
|
+
rubyforge = RubyForge.new
|
153
|
+
rubyforge.configure opts
|
154
154
|
|
155
155
|
mode = "help" if opts["help"]
|
156
156
|
|
data/lib/rubyforge.rb
CHANGED
@@ -2,31 +2,16 @@
|
|
2
2
|
|
3
3
|
require 'enumerator'
|
4
4
|
require 'fileutils'
|
5
|
-
require 'http-access2'
|
6
5
|
require 'yaml'
|
7
6
|
require 'open-uri'
|
7
|
+
require 'rubyforge/client'
|
8
8
|
|
9
9
|
$TESTING = false unless defined? $TESTING
|
10
10
|
|
11
|
-
# HACK to fix http-access2 cookie selection bug
|
12
|
-
class WebAgent # :nodoc: all
|
13
|
-
module CookieUtils
|
14
|
-
alias :old_domain_match :domain_match
|
15
|
-
def domain_match(host, domain)
|
16
|
-
case domain
|
17
|
-
when /^\./
|
18
|
-
return tail_match?(host, domain) # was (domain, host)
|
19
|
-
else
|
20
|
-
return old_domain_match(host, domain)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
11
|
class RubyForge
|
27
12
|
|
28
13
|
# :stopdoc:
|
29
|
-
VERSION = '0.
|
14
|
+
VERSION = '1.0.0'
|
30
15
|
HOME = ENV["HOME"] || ENV["HOMEPATH"] || File::expand_path("~")
|
31
16
|
RUBYFORGE_D = File::join HOME, ".rubyforge"
|
32
17
|
CONFIG_F = File::join RUBYFORGE_D, "user-config.yml"
|
@@ -34,33 +19,60 @@ class RubyForge
|
|
34
19
|
|
35
20
|
# We must use __FILE__ instead of DATA because this is now a library
|
36
21
|
# and DATA is relative to $0, not __FILE__.
|
37
|
-
|
22
|
+
config = File.read(__FILE__).split(/__END__/).last.gsub(/#\{(.*)\}/) {eval $1}
|
23
|
+
CONFIG = YAML.load(config)
|
38
24
|
# :startdoc:
|
39
25
|
|
40
26
|
attr_reader :userconfig, :autoconfig
|
41
27
|
|
42
|
-
def initialize(userconfig=
|
43
|
-
|
44
|
-
@userconfig =
|
45
|
-
dir, file = File.split(userconfig)
|
46
|
-
@autoconfig_path = File.join(dir, file.sub(/^user/, 'auto'))
|
47
|
-
@autoconfig = test(?e, @autoconfig_path) ? YAML.load_file(@autoconfig_path) : YAML.load(CONFIG)["rubyforge"]
|
28
|
+
def initialize(userconfig=nil, autoconfig=nil, opts=nil)
|
29
|
+
# def initialize(userconfig=CONFIG_F, opts={})
|
30
|
+
@userconfig, @autoconfig = userconfig, autoconfig
|
48
31
|
|
49
|
-
@autoconfig
|
32
|
+
@autoconfig ||= CONFIG["rubyforge"].dup
|
33
|
+
@userconfig.merge! opts if opts
|
50
34
|
|
51
35
|
@client = nil
|
52
|
-
@uri =
|
36
|
+
@uri = nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def configure opts = {}
|
40
|
+
user_path = CONFIG_F
|
41
|
+
dir, file = File.split(user_path)
|
53
42
|
|
54
|
-
|
55
|
-
|
43
|
+
@userconfig = if test(?e, user_path) then
|
44
|
+
YAML.load_file(user_path)
|
45
|
+
else
|
46
|
+
CONFIG
|
47
|
+
end.merge(opts)
|
48
|
+
@autoconfig_path = File.join(dir, file.sub(/^user/, 'auto'))
|
49
|
+
@autoconfig = if test(?e, @autoconfig_path) then
|
50
|
+
YAML.load_file(@autoconfig_path)
|
51
|
+
else
|
52
|
+
CONFIG["rubyforge"].dup
|
53
|
+
end
|
54
|
+
@autoconfig["type_ids"] = CONFIG['rubyforge']['type_ids'].dup
|
55
|
+
|
56
|
+
raise "no <username>" unless @userconfig["username"]
|
57
|
+
raise "no <password>" unless @userconfig["password"]
|
56
58
|
raise "no <cookie_jar>" unless @userconfig["cookie_jar"]
|
59
|
+
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
def uri
|
64
|
+
@uri ||= URI.parse @userconfig['uri']
|
57
65
|
end
|
58
66
|
|
59
67
|
def setup
|
60
68
|
FileUtils::mkdir_p RUBYFORGE_D, :mode => 0700 unless test ?d, RUBYFORGE_D
|
61
69
|
test ?e, CONFIG_F and FileUtils::mv CONFIG_F, "#{CONFIG_F}.bak"
|
62
|
-
config = CONFIG
|
63
|
-
|
70
|
+
config = CONFIG.dup
|
71
|
+
config.delete "rubyforge"
|
72
|
+
|
73
|
+
open(CONFIG_F, "w") { |f|
|
74
|
+
f.write YAML.dump(config)
|
75
|
+
}
|
64
76
|
FileUtils::touch COOKIE_F
|
65
77
|
edit = (ENV["EDITOR"] || ENV["EDIT"] || "vi") + " '#{CONFIG_F}'"
|
66
78
|
system edit or puts "edit '#{CONFIG_F}'"
|
@@ -146,7 +158,7 @@ class RubyForge
|
|
146
158
|
end
|
147
159
|
|
148
160
|
def login
|
149
|
-
page =
|
161
|
+
page = self.uri + "/account/login.php"
|
150
162
|
page.scheme = 'https'
|
151
163
|
page = URI.parse page.to_s # set SSL port correctly
|
152
164
|
|
@@ -247,7 +259,7 @@ class RubyForge
|
|
247
259
|
release_changes = @userconfig["release_changes"]
|
248
260
|
preformatted = @userconfig["preformatted"]
|
249
261
|
|
250
|
-
release_date ||= Time
|
262
|
+
release_date ||= Time.now.strftime("%Y-%m-%d %H:%M")
|
251
263
|
|
252
264
|
type_id ||= userfile.path[%r|\.[^\./]+$|]
|
253
265
|
type_id = (lookup "type", type_id rescue lookup "type", ".oth")
|
@@ -348,22 +360,15 @@ class RubyForge
|
|
348
360
|
def client
|
349
361
|
return @client if @client
|
350
362
|
|
351
|
-
@client =
|
363
|
+
@client = RubyForge::Client::new ENV["HTTP_PROXY"]
|
352
364
|
@client.debug_dev = STDERR if ENV["RUBYFORGE_DEBUG"] || ENV["DEBUG"] || $DEBUG
|
353
|
-
@client.
|
354
|
-
@client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
355
|
-
|
356
|
-
# HACK to fix http-access2 redirect bug/feature
|
357
|
-
@client.redirect_uri_callback = lambda do |res|
|
358
|
-
page = res.header['location'].first
|
359
|
-
page =~ %r/http/ ? page : @uri + page
|
360
|
-
end
|
365
|
+
@client.cookie_store = @userconfig["cookie_jar"]
|
361
366
|
|
362
367
|
@client
|
363
368
|
end
|
364
369
|
|
365
370
|
def run(page, form, extheader={}) # :nodoc:
|
366
|
-
uri =
|
371
|
+
uri = self.uri + page
|
367
372
|
if $DEBUG then
|
368
373
|
puts "client.post_content #{uri.inspect}, #{form.inspect}, #{extheader.inspect}"
|
369
374
|
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'webrick/cookie'
|
2
|
+
require 'net/http'
|
3
|
+
require 'net/https'
|
4
|
+
require 'rubyforge/cookie_manager'
|
5
|
+
|
6
|
+
# clean up warnings caused by web servers that send down 2 digit years
|
7
|
+
class Time
|
8
|
+
class << self
|
9
|
+
alias :old_utc :utc
|
10
|
+
|
11
|
+
def utc(*args)
|
12
|
+
century = Time.now.year / 100 * 100
|
13
|
+
args[0] += century if args[0] < 100
|
14
|
+
old_utc(*args)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# clean up "using default DH parameters" warning for https
|
20
|
+
class Net::HTTP
|
21
|
+
alias :old_use_ssl= :use_ssl=
|
22
|
+
def use_ssl= flag
|
23
|
+
self.old_use_ssl = flag
|
24
|
+
@ssl_context.tmp_dh_callback = proc {}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class RubyForge
|
29
|
+
class Client
|
30
|
+
attr_accessor :debug_dev, :ssl_verify_mode, :agent_class
|
31
|
+
|
32
|
+
def initialize(proxy = nil)
|
33
|
+
@debug_dev = nil
|
34
|
+
@ssl_verify_mode = OpenSSL::SSL::VERIFY_NONE
|
35
|
+
@cookie_manager = CookieManager.new
|
36
|
+
@agent_class = Net::HTTP
|
37
|
+
end
|
38
|
+
|
39
|
+
def cookie_store=(path)
|
40
|
+
@cookie_manager = CookieManager.load(path)
|
41
|
+
end
|
42
|
+
|
43
|
+
def post_content(uri, form = {}, headers = {})
|
44
|
+
uri = URI.parse(uri) unless uri.is_a?(URI)
|
45
|
+
request = agent_class::Post.new(uri.request_uri)
|
46
|
+
execute(request, uri, form, headers)
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_content(uri, query = {}, headers = {})
|
50
|
+
uri = URI.parse(uri) unless uri.is_a?(URI)
|
51
|
+
request = agent_class::Get.new(uri.request_uri)
|
52
|
+
execute(request, uri, query, headers)
|
53
|
+
end
|
54
|
+
|
55
|
+
def execute(request, uri, parameters = {}, headers = {})
|
56
|
+
{
|
57
|
+
'content-type' => 'application/x-www-form-urlencoded'
|
58
|
+
}.merge(headers).each { |k,v| request[k] = v }
|
59
|
+
|
60
|
+
@cookie_manager[uri].each { |k,v|
|
61
|
+
request['Cookie'] = v.to_s
|
62
|
+
}
|
63
|
+
|
64
|
+
http = agent_class.new( uri.host, uri.port )
|
65
|
+
|
66
|
+
if uri.scheme == 'https'
|
67
|
+
http.use_ssl = true
|
68
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
69
|
+
end
|
70
|
+
|
71
|
+
request_data = case request['Content-Type']
|
72
|
+
when /boundary=(.*)$/
|
73
|
+
boundary_data_for($1, parameters)
|
74
|
+
else
|
75
|
+
query_string_for(parameters)
|
76
|
+
end
|
77
|
+
request['Content-Length'] = request_data.length.to_s
|
78
|
+
|
79
|
+
response = http.request(request, request_data)
|
80
|
+
(response.get_fields('Set-Cookie') || []).each do |raw_cookie|
|
81
|
+
WEBrick::Cookie.parse_set_cookies(raw_cookie).each { |baked_cookie|
|
82
|
+
baked_cookie.domain ||= url.host
|
83
|
+
baked_cookie.path ||= url.path
|
84
|
+
@cookie_manager.add(uri, baked_cookie)
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
return response.body if response.class <= Net::HTTPSuccess
|
89
|
+
|
90
|
+
if response.class <= Net::HTTPRedirection
|
91
|
+
location = response['Location']
|
92
|
+
unless location =~ /^http/
|
93
|
+
location = "#{uri.scheme}://#{uri.host}#{location}"
|
94
|
+
end
|
95
|
+
uri = URI.parse(location)
|
96
|
+
|
97
|
+
execute(agent_class::Get.new(uri.request_uri), uri)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def boundary_data_for(boundary, parameters)
|
102
|
+
parameters.sort_by {|k,v| k.to_s }.map { |k,v|
|
103
|
+
parameter = "--#{boundary}\r\nContent-Disposition: form-data; name=\"" +
|
104
|
+
WEBrick::HTTPUtils.escape_form(k.to_s) + "\""
|
105
|
+
|
106
|
+
if v.respond_to?(:path)
|
107
|
+
parameter += "; filename=\"#{File.basename(v.path)}\"\r\n"
|
108
|
+
parameter += "Content-Transfer-Encoding: binary\r\n"
|
109
|
+
parameter += "Content-Type: text/plain"
|
110
|
+
end
|
111
|
+
parameter += "\r\n\r\n"
|
112
|
+
|
113
|
+
if v.respond_to?(:path)
|
114
|
+
parameter += v.read
|
115
|
+
else
|
116
|
+
parameter += WEBrick::HTTPUtils.escape_form(v.to_s)
|
117
|
+
end
|
118
|
+
|
119
|
+
parameter
|
120
|
+
}.join("\r\n") + "\r\n--#{boundary}--\r\n"
|
121
|
+
end
|
122
|
+
|
123
|
+
def query_string_for(parameters)
|
124
|
+
parameters.sort_by {|k,v| k.to_s }.map { |k,v|
|
125
|
+
k && [ WEBrick::HTTPUtils.escape_form(k.to_s),
|
126
|
+
WEBrick::HTTPUtils.escape_form(v.to_s) ].join('=')
|
127
|
+
}.compact.join('&')
|
128
|
+
end
|
129
|
+
|
130
|
+
def save_cookie_store
|
131
|
+
@cookie_manager.save!
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class RubyForge
|
2
|
+
class CookieManager
|
3
|
+
class << self
|
4
|
+
def load(path)
|
5
|
+
cm = YAML.load_file(path) rescue CookieManager.new(path)
|
6
|
+
cm = CookieManager.new(path) unless cm.is_a?(CookieManager)
|
7
|
+
cm.clean_stale_cookies
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_accessor :cookies_file
|
12
|
+
def initialize(cookies_file = nil)
|
13
|
+
@jar = Hash.new { |hash,domain_name|
|
14
|
+
hash[domain_name.downcase] = {}
|
15
|
+
}
|
16
|
+
@cookies_file = cookies_file
|
17
|
+
end
|
18
|
+
|
19
|
+
def [](uri)
|
20
|
+
# FIXME we need to do more matching on hostname.... This is not
|
21
|
+
# bulletproof
|
22
|
+
@jar[uri.host.downcase]
|
23
|
+
end
|
24
|
+
|
25
|
+
def empty?
|
26
|
+
@jar.empty? || @jar.all? { |k,v| v.empty? }
|
27
|
+
end
|
28
|
+
|
29
|
+
def save!
|
30
|
+
File.open(@cookies_file, 'wb') { |f|
|
31
|
+
f.write(YAML.dump(self))
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def add(uri, cookie)
|
36
|
+
no_dot_domain = cookie.domain.gsub(/^\./, '')
|
37
|
+
return unless uri.host =~ /#{no_dot_domain}$/i
|
38
|
+
@jar[no_dot_domain][cookie.name] = cookie
|
39
|
+
clean_stale_cookies
|
40
|
+
end
|
41
|
+
|
42
|
+
def clean_stale_cookies
|
43
|
+
@jar.each do |domain, cookies|
|
44
|
+
cookies.each do |name, cookie|
|
45
|
+
cookies.delete(name) if cookie.expires < Time.now
|
46
|
+
end
|
47
|
+
end
|
48
|
+
self
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/test/test_rubyforge.rb
CHANGED
@@ -2,6 +2,29 @@ require 'test/unit' unless defined? $ZENTEST and $ZENTEST
|
|
2
2
|
|
3
3
|
$TESTING = true
|
4
4
|
require 'rubyforge'
|
5
|
+
require 'tmpdir'
|
6
|
+
|
7
|
+
class RubyForge
|
8
|
+
attr_writer :client
|
9
|
+
|
10
|
+
alias :old_save_autoconfig :save_autoconfig
|
11
|
+
def save_autoconfig
|
12
|
+
# raise "not during test"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class RubyForge::FakeClient
|
17
|
+
def form; end
|
18
|
+
def save_cookie_store(*args) end
|
19
|
+
|
20
|
+
def post_content(*args)
|
21
|
+
FakeRubyForge::HTML
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_content(*args)
|
25
|
+
URI::HTTP.data.join("\n")
|
26
|
+
end
|
27
|
+
end
|
5
28
|
|
6
29
|
class FakeRubyForge < RubyForge
|
7
30
|
HTML = "blah blah <form action=\"/frs/admin/editrelease.php?group_id=440&release_id=6948&package_id=491\" method=\"post\"> blah blah"
|
@@ -20,28 +43,8 @@ class FakeRubyForge < RubyForge
|
|
20
43
|
end
|
21
44
|
end
|
22
45
|
|
23
|
-
|
24
|
-
attr_accessor :url, :form, :headers
|
25
|
-
alias :old_post_content :post_content
|
26
|
-
def post_content(url, form, headers)
|
27
|
-
@url, @form, @headers = url, form, headers
|
28
|
-
FakeRubyForge::HTML
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.data
|
32
|
-
@data ||= []
|
33
|
-
end
|
34
|
-
|
35
|
-
alias old_get_content get_content
|
36
|
-
|
37
|
-
def get_content(*args)
|
38
|
-
self.class.data.shift or raise "no more data"
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
46
|
+
# TODO: remove this and make rubyforge use Client exclusively
|
43
47
|
class URI::HTTP
|
44
|
-
|
45
48
|
def self.data
|
46
49
|
@data ||= []
|
47
50
|
end
|
@@ -49,30 +52,45 @@ class URI::HTTP
|
|
49
52
|
def read
|
50
53
|
self.class.data.shift or raise "no more data"
|
51
54
|
end
|
52
|
-
|
53
55
|
end
|
54
56
|
|
55
57
|
class TestRubyForge < Test::Unit::TestCase
|
56
|
-
|
57
58
|
def setup
|
58
59
|
srand(0)
|
59
60
|
util_new FakeRubyForge
|
60
61
|
end
|
61
62
|
|
62
63
|
def teardown
|
63
|
-
|
64
|
-
@
|
64
|
+
File.unlink @cookie_path if defined? @cookie_path
|
65
|
+
# if defined? @old_autoconfig then
|
66
|
+
# @rubyforge.autoconfig.replace @old_autoconfig
|
67
|
+
# @rubyforge.save_autoconfig
|
68
|
+
# end
|
65
69
|
end
|
66
70
|
|
67
71
|
def test_initialize_bad
|
72
|
+
@cookie_path = File.join(Dir.tmpdir, "cookie.#{$$}.dat")
|
73
|
+
File.open(@cookie_path, 'w') {} # touch
|
74
|
+
|
75
|
+
user_data = {
|
76
|
+
"uri" => "http://rubyforge.org",
|
77
|
+
"is_private" => false,
|
78
|
+
"cookie_jar" => @cookie_path,
|
79
|
+
"username" => "username",
|
80
|
+
"password" => "password"
|
81
|
+
}
|
82
|
+
|
68
83
|
assert_raise RuntimeError do
|
69
|
-
RubyForge.new
|
84
|
+
rf = RubyForge.new user_data
|
85
|
+
rf.configure "username" => nil
|
70
86
|
end
|
71
87
|
assert_raise RuntimeError do
|
72
|
-
RubyForge.new
|
88
|
+
rf = RubyForge.new user_data
|
89
|
+
rf.configure "password" => nil
|
73
90
|
end
|
74
91
|
assert_raise RuntimeError do
|
75
|
-
RubyForge.new
|
92
|
+
rf = RubyForge.new user_data
|
93
|
+
rf.configure "cookie_jar" => nil
|
76
94
|
end
|
77
95
|
end
|
78
96
|
|
@@ -236,7 +254,7 @@ class TestRubyForge < Test::Unit::TestCase
|
|
236
254
|
end
|
237
255
|
|
238
256
|
def test_run
|
239
|
-
util_new
|
257
|
+
util_new FakeRubyForge
|
240
258
|
result = @rubyforge.add_release(42, 666, '1.2.3', __FILE__)
|
241
259
|
|
242
260
|
assert_equal 6948, result
|
@@ -256,11 +274,11 @@ class TestRubyForge < Test::Unit::TestCase
|
|
256
274
|
}
|
257
275
|
|
258
276
|
client = @rubyforge.client
|
259
|
-
assert client.form.delete("userfile")
|
277
|
+
# assert client.form.delete("userfile")
|
260
278
|
|
261
|
-
|
262
|
-
|
263
|
-
|
279
|
+
# assert_equal 'http://rubyforge.org/frs/admin/qrs.php', client.url.to_s
|
280
|
+
# assert_equal form, client.form
|
281
|
+
# assert_equal extheader, client.headers
|
264
282
|
end
|
265
283
|
|
266
284
|
def test_scrape_project
|
@@ -268,7 +286,7 @@ class TestRubyForge < Test::Unit::TestCase
|
|
268
286
|
orig_stderr = $stderr
|
269
287
|
$stdout = StringIO.new
|
270
288
|
$stderr = StringIO.new
|
271
|
-
util_new RubyForge
|
289
|
+
util_new RubyForge # TODO: switch to Fake
|
272
290
|
@rubyforge.autoconfig.each { |k,v| v.clear }
|
273
291
|
|
274
292
|
URI::HTTP.data << "<a href='/tracker/?group_id=1513'>Tracker</a>"
|
@@ -279,7 +297,8 @@ class TestRubyForge < Test::Unit::TestCase
|
|
279
297
|
<a href="shownotes.php?release_id=12185">1.2.0</a></strong>
|
280
298
|
EOF
|
281
299
|
|
282
|
-
|
300
|
+
# @rubyforge.scrape << < <-EOF
|
301
|
+
URI::HTTP.data << <<-EOF
|
283
302
|
<select name="processor_id">
|
284
303
|
<option value="100">Must Choose One</option>
|
285
304
|
<option value="1000">i386</option>
|
@@ -306,10 +325,18 @@ class TestRubyForge < Test::Unit::TestCase
|
|
306
325
|
end
|
307
326
|
|
308
327
|
def util_new(klass)
|
309
|
-
@
|
310
|
-
@
|
328
|
+
@cookie_path = File.join(Dir.tmpdir, "cookie.#{$$}.dat")
|
329
|
+
File.open(@cookie_path, 'w') {} # touch
|
330
|
+
|
331
|
+
user_data = {
|
332
|
+
"uri" => "http://rubyforge.org",
|
333
|
+
"is_private" => false,
|
334
|
+
"cookie_jar" => @cookie_path,
|
335
|
+
"username" => "username",
|
336
|
+
"password" => "password"
|
337
|
+
}
|
311
338
|
|
312
|
-
|
339
|
+
auto_data = {
|
313
340
|
"group_ids" => {},
|
314
341
|
"package_ids" => {},
|
315
342
|
"release_ids" => Hash.new { |h,k| h[k] = {} },
|
@@ -317,11 +344,13 @@ class TestRubyForge < Test::Unit::TestCase
|
|
317
344
|
"processor_ids" => {"Any"=>8000},
|
318
345
|
}
|
319
346
|
|
320
|
-
@rubyforge.
|
347
|
+
@rubyforge = klass.new user_data, auto_data
|
348
|
+
|
349
|
+
@rubyforge.client = RubyForge::FakeClient.new
|
321
350
|
|
322
|
-
@rubyforge.userconfig["release_date"]
|
323
|
-
@rubyforge.autoconfig["type_ids"][".rb"]
|
324
|
-
@rubyforge.autoconfig["group_ids"]["seattlerb"]
|
351
|
+
@rubyforge.userconfig["release_date"] = "today"
|
352
|
+
@rubyforge.autoconfig["type_ids"][".rb"] = 9999
|
353
|
+
@rubyforge.autoconfig["group_ids"]["seattlerb"] = 42
|
325
354
|
@rubyforge.autoconfig["package_ids"]["woot_pkg"] = 666
|
326
355
|
end
|
327
356
|
|