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.
- data/History.txt +4 -0
- data/Manifest.txt +0 -2
- data/README.txt +1 -4
- data/Rakefile +6 -0
- data/bin/rubyforge +18 -34
- data/lib/rubyforge.rb +74 -183
- data/lib/rubyforge/client.rb +13 -34
- data/test/test_rubyforge.rb +128 -199
- data/test/test_rubyforge_client.rb +2 -67
- metadata +6 -32
- data.tar.gz.sig +0 -0
- data/lib/rubyforge/cookie_manager.rb +0 -60
- data/test/test_rubyforge_cookie_manager.rb +0 -97
- metadata.gz.sig +0 -0
@@ -46,77 +46,12 @@ class TestRubyForgeClient < Test::Unit::TestCase
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def test_post_with_params
|
49
|
-
@client.post_content('http://example.com', { :f => 'adsf aoeu'})
|
49
|
+
@client.post_content('http://example.com', { :f => 'adsf aoeu'}, {}, {"username" => "tom", "password" => "secret"})
|
50
50
|
assert_equal('f=adsf+aoeu', RubyForge::FakeAgent.t_data)
|
51
51
|
|
52
|
-
@client.post_content('http://example.com', { :a => 'b', :c => 'd' })
|
52
|
+
@client.post_content('http://example.com', { :a => 'b', :c => 'd' }, {}, {"username" => "tom", "password" => "secret"})
|
53
53
|
assert_equal('a=b&c=d', RubyForge::FakeAgent.t_data)
|
54
54
|
end
|
55
55
|
|
56
|
-
def test_multipart_post_one_param
|
57
|
-
random = Array::new(8){ "%2.2d" % rand(42) }.join('__')
|
58
|
-
boundary = "multipart/form-data; boundary=___#{ random }___"
|
59
56
|
|
60
|
-
expected = <<-END
|
61
|
-
--___#{random}___\r
|
62
|
-
Content-Disposition: form-data; name="a"\r\n\r
|
63
|
-
a b c\r
|
64
|
-
--___#{random}___--\r
|
65
|
-
END
|
66
|
-
|
67
|
-
@client.post_content( 'http://example.com',
|
68
|
-
{ :a => 'a b c' },
|
69
|
-
{ 'content-type' => boundary }
|
70
|
-
)
|
71
|
-
assert_equal(expected, RubyForge::FakeAgent.t_data)
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_multipart_post_two_params
|
75
|
-
random = Array::new(8){ "%2.2d" % rand(42) }.join('__')
|
76
|
-
boundary = "multipart/form-data; boundary=___#{ random }___"
|
77
|
-
|
78
|
-
request = <<-END
|
79
|
-
--___#{random}___\r
|
80
|
-
Content-Disposition: form-data; name="a"\r\n\r
|
81
|
-
b\r
|
82
|
-
--___#{random}___\r
|
83
|
-
Content-Disposition: form-data; name="c"\r\n\r
|
84
|
-
d\r
|
85
|
-
--___#{random}___--\r
|
86
|
-
END
|
87
|
-
|
88
|
-
@client.post_content( 'http://example.com',
|
89
|
-
{ :a => 'b', :c => 'd' },
|
90
|
-
{ 'content-type' => boundary }
|
91
|
-
)
|
92
|
-
assert_equal(request, RubyForge::FakeAgent.t_data)
|
93
|
-
end
|
94
|
-
|
95
|
-
def test_multipart_io
|
96
|
-
random = Array::new(8){ "%2.2d" % rand(42) }.join('__')
|
97
|
-
boundary = "multipart/form-data; boundary=___#{ random }___"
|
98
|
-
|
99
|
-
file_contents = 'blah blah blah'
|
100
|
-
file = StringIO.new(file_contents)
|
101
|
-
class << file
|
102
|
-
def path
|
103
|
-
'/one/two/three.rb'
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
request = <<-END
|
108
|
-
--___#{random}___\r
|
109
|
-
Content-Disposition: form-data; name="userfile"; filename="three.rb"\r
|
110
|
-
Content-Transfer-Encoding: binary\r
|
111
|
-
Content-Type: text/plain\r\n\r
|
112
|
-
#{file_contents}\r
|
113
|
-
--___#{random}___--\r
|
114
|
-
END
|
115
|
-
|
116
|
-
@client.post_content( 'http://example.com',
|
117
|
-
{ :userfile => file },
|
118
|
-
{ 'content-type' => boundary }
|
119
|
-
)
|
120
|
-
assert_equal(request, RubyForge::FakeAgent.t_data)
|
121
|
-
end
|
122
57
|
end
|
metadata
CHANGED
@@ -1,38 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyforge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Davis
|
8
8
|
- Eric Hodel
|
9
9
|
- Ara T Howard
|
10
|
+
- Tom Copeland
|
10
11
|
autorequire:
|
11
12
|
bindir: bin
|
12
|
-
cert_chain:
|
13
|
-
- |
|
14
|
-
-----BEGIN CERTIFICATE-----
|
15
|
-
MIIDPjCCAiagAwIBAgIBADANBgkqhkiG9w0BAQUFADBFMRMwEQYDVQQDDApyeWFu
|
16
|
-
ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
|
17
|
-
GRYDY29tMB4XDTA5MDMwNjE4NTMxNVoXDTEwMDMwNjE4NTMxNVowRTETMBEGA1UE
|
18
|
-
AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS
|
19
|
-
JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda
|
20
|
-
b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx
|
21
|
-
taCPaLmfYIaFcHHCSY4hYDJijRQkLxPeB3xbOfzfLoBDbjvx5JxgJxUjmGa7xhcT
|
22
|
-
oOvjtt5P8+GSK9zLzxQP0gVLS/D0FmoE44XuDr3iQkVS2ujU5zZL84mMNqNB1znh
|
23
|
-
GiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt
|
24
|
-
qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV
|
25
|
-
gBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
|
26
|
-
HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBBQUAA4IB
|
27
|
-
AQAY59gYvDxqSqgC92nAP9P8dnGgfZgLxP237xS6XxFGJSghdz/nI6pusfCWKM8m
|
28
|
-
vzjjH2wUMSSf3tNudQ3rCGLf2epkcU13/rguI88wO6MrE0wi4ZqLQX+eZQFskJb/
|
29
|
-
w6x9W1ur8eR01s397LSMexySDBrJOh34cm2AlfKr/jokKCTwcM0OvVZnAutaovC0
|
30
|
-
l1SVZ0ecg88bsWHA0Yhh7NFxK1utWoIhtB6AFC/+trM0FQEB/jZkIS8SaNzn96Rl
|
31
|
-
n0sZEf77FLf5peR8TP/PtmIg7Cyqz23sLM4mCOoTGIy5OcZ8TdyiyINUHtb5ej/T
|
32
|
-
FBHgymkyj/AOSqKRIpXPhjC6
|
33
|
-
-----END CERTIFICATE-----
|
13
|
+
cert_chain: []
|
34
14
|
|
35
|
-
date: 2009-09-
|
15
|
+
date: 2009-09-21 00:00:00 -04:00
|
36
16
|
default_executable:
|
37
17
|
dependencies: []
|
38
18
|
|
@@ -45,14 +25,11 @@ description: |-
|
|
45
25
|
* edit ~/.rubyforge/user-config.yml
|
46
26
|
* rubyforge config
|
47
27
|
* For all rubyforge upgrades, run 'rubyforge config' to ensure you have latest.
|
48
|
-
* Don't forget to login! logging in will store a cookie in your
|
49
|
-
.rubyforge directory which expires after a time. always run the
|
50
|
-
login command before any operation that requires authentication,
|
51
|
-
such as uploading a package.
|
52
28
|
email:
|
53
29
|
- ryand-ruby@zenspider.com
|
54
30
|
- drbrain@segment7.net
|
55
31
|
- ara.t.howard@gmail.com
|
32
|
+
- tom@infoether.com
|
56
33
|
executables:
|
57
34
|
- rubyforge
|
58
35
|
extensions: []
|
@@ -69,10 +46,8 @@ files:
|
|
69
46
|
- bin/rubyforge
|
70
47
|
- lib/rubyforge.rb
|
71
48
|
- lib/rubyforge/client.rb
|
72
|
-
- lib/rubyforge/cookie_manager.rb
|
73
49
|
- test/test_rubyforge.rb
|
74
50
|
- test/test_rubyforge_client.rb
|
75
|
-
- test/test_rubyforge_cookie_manager.rb
|
76
51
|
has_rdoc: true
|
77
52
|
homepage: http://codeforpeople.rubyforge.org/rubyforge/
|
78
53
|
licenses: []
|
@@ -98,11 +73,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
73
|
requirements: []
|
99
74
|
|
100
75
|
rubyforge_project: codeforpeople
|
101
|
-
rubygems_version: 1.3.
|
76
|
+
rubygems_version: 1.3.4
|
102
77
|
signing_key:
|
103
78
|
specification_version: 3
|
104
79
|
summary: A script which automates a limited set of rubyforge operations
|
105
80
|
test_files:
|
106
81
|
- test/test_rubyforge.rb
|
107
82
|
- test/test_rubyforge_client.rb
|
108
|
-
- test/test_rubyforge_cookie_manager.rb
|
data.tar.gz.sig
DELETED
Binary file
|
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
|
3
|
-
class RubyForge
|
4
|
-
class CookieManager
|
5
|
-
class << self
|
6
|
-
def load(path)
|
7
|
-
cm = YAML.load_file(path) rescue CookieManager.new(path)
|
8
|
-
cm = CookieManager.new(path) unless cm.is_a?(CookieManager)
|
9
|
-
cm.clean_stale_cookies
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
attr_accessor :cookies_file
|
14
|
-
def initialize(cookies_file = nil)
|
15
|
-
@jar = Hash.new { |hash,domain_name|
|
16
|
-
hash[domain_name.downcase] = {}
|
17
|
-
}
|
18
|
-
@cookies_file = cookies_file
|
19
|
-
end
|
20
|
-
|
21
|
-
def [](uri)
|
22
|
-
# FIXME we need to do more matching on hostname.... This is not
|
23
|
-
# bulletproof
|
24
|
-
uri = (URI === uri ? uri.host : uri).downcase
|
25
|
-
@jar[uri] ||= {}
|
26
|
-
end
|
27
|
-
|
28
|
-
def clear uri
|
29
|
-
self[uri].clear
|
30
|
-
self.save!
|
31
|
-
end
|
32
|
-
|
33
|
-
def empty?
|
34
|
-
@jar.empty? || @jar.all? { |k,v| v.empty? }
|
35
|
-
end
|
36
|
-
|
37
|
-
def save!
|
38
|
-
clean_stale_cookies
|
39
|
-
File.open(@cookies_file, 'wb') { |f|
|
40
|
-
f.write(YAML.dump(self))
|
41
|
-
}
|
42
|
-
end
|
43
|
-
|
44
|
-
def add(uri, cookie)
|
45
|
-
no_dot_domain = cookie.domain.gsub(/^\./, '')
|
46
|
-
return unless uri.host =~ /#{no_dot_domain}$/i
|
47
|
-
@jar[no_dot_domain][cookie.name] = cookie
|
48
|
-
clean_stale_cookies
|
49
|
-
end
|
50
|
-
|
51
|
-
def clean_stale_cookies
|
52
|
-
@jar.each do |domain, cookies|
|
53
|
-
cookies.each do |name, cookie|
|
54
|
-
cookies.delete(name) if cookie.expires < Time.now
|
55
|
-
end
|
56
|
-
end
|
57
|
-
self
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'test/unit' unless defined? $ZENTEST and $ZENTEST
|
2
|
-
require 'rubyforge'
|
3
|
-
require 'time'
|
4
|
-
require 'yaml'
|
5
|
-
require 'tempfile'
|
6
|
-
|
7
|
-
class TestRubyForgeCookieManager < Test::Unit::TestCase
|
8
|
-
def setup
|
9
|
-
cookie = cookie_string('session_ser', 'zzzzzzzzzzzzzzzzzz')
|
10
|
-
@url = URI.parse('http://rubyforge.org/account/login.php')
|
11
|
-
@cookie = WEBrick::Cookie.parse_set_cookie(cookie)
|
12
|
-
@manager = RubyForge::CookieManager.new
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_empty?
|
16
|
-
manager = RubyForge::CookieManager.new
|
17
|
-
assert(manager.empty?)
|
18
|
-
|
19
|
-
assert_equal(0, manager[URI.parse('http://rubyforge.org/')].length)
|
20
|
-
assert(manager.empty?)
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_add
|
24
|
-
manager = RubyForge::CookieManager.new
|
25
|
-
assert(manager.empty?)
|
26
|
-
manager.add(@url, @cookie)
|
27
|
-
assert(!manager.empty?)
|
28
|
-
|
29
|
-
cookie = manager[@url][@cookie.name]
|
30
|
-
assert cookie
|
31
|
-
assert_equal(@cookie.object_id, cookie.object_id)
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_add_expired_cookie
|
35
|
-
cookie = cookie_string('session_ser', 'zzzz',
|
36
|
-
:expires => (Time.now - 10).strftime('%A, %d-%b-%Y %H:%M:%S %Z'))
|
37
|
-
cookie = WEBrick::Cookie.parse_set_cookie(cookie)
|
38
|
-
|
39
|
-
manager = RubyForge::CookieManager.new
|
40
|
-
assert(manager.empty?)
|
41
|
-
manager.add(@url, cookie)
|
42
|
-
assert(manager.empty?)
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_marshal
|
46
|
-
@manager.add(@url, @cookie)
|
47
|
-
assert(!@manager.empty?)
|
48
|
-
m = YAML.load(YAML.dump(@manager))
|
49
|
-
assert(!m.empty?)
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_save!
|
53
|
-
tmp = Tempfile.new('cookie_jar')
|
54
|
-
@manager.cookies_file = tmp.path
|
55
|
-
@manager.add(@url, @cookie)
|
56
|
-
@manager.save!
|
57
|
-
|
58
|
-
@manager = RubyForge::CookieManager.load(tmp.path)
|
59
|
-
assert(! @manager.empty?)
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_load_empty_file
|
63
|
-
tmp = Tempfile.new('cookie_jar')
|
64
|
-
manager = RubyForge::CookieManager.load(tmp.path)
|
65
|
-
assert(manager.empty?)
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_load_legacy_file
|
69
|
-
tmp = Tempfile.new('cookie_jar')
|
70
|
-
tmp.write([
|
71
|
-
'https://rubyforge.org/account/login.php',
|
72
|
-
'session_ser',
|
73
|
-
'zzzzzz',
|
74
|
-
'123456',
|
75
|
-
'.rubyforge.org',
|
76
|
-
'/',
|
77
|
-
'13'
|
78
|
-
].join("\t"))
|
79
|
-
manager = RubyForge::CookieManager.load(tmp.path)
|
80
|
-
assert(manager.empty?)
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_cookies_file=
|
84
|
-
tmp = Tempfile.new('cookie_jar')
|
85
|
-
@manager.cookies_file = tmp.path
|
86
|
-
assert(@manager.empty?)
|
87
|
-
end
|
88
|
-
|
89
|
-
def cookie_string(name, value, options = {})
|
90
|
-
options = {
|
91
|
-
:expires => (Time.now + 86400).strftime('%A, %d-%b-%Y %H:%M:%S %Z'),
|
92
|
-
:path => '/',
|
93
|
-
:domain => '.rubyforge.org',
|
94
|
-
}.merge(options)
|
95
|
-
"#{name}=#{value}; #{options.map { |o| o.join('=') }.join('; ')}"
|
96
|
-
end
|
97
|
-
end
|
metadata.gz.sig
DELETED
Binary file
|