rubyforge 0.4.5 → 1.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.
- 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
|
|