rest-core 0.0.1

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.
Files changed (65) hide show
  1. data/.gitignore +6 -0
  2. data/.gitmodules +3 -0
  3. data/.travis.yml +9 -0
  4. data/CONTRIBUTORS +11 -0
  5. data/Gemfile +8 -0
  6. data/LICENSE +201 -0
  7. data/NOTE.md +48 -0
  8. data/README +83 -0
  9. data/README.md +83 -0
  10. data/Rakefile +26 -0
  11. data/TODO.md +17 -0
  12. data/example/facebook.rb +145 -0
  13. data/example/github.rb +21 -0
  14. data/lib/rest-core.rb +48 -0
  15. data/lib/rest-core/app/ask.rb +11 -0
  16. data/lib/rest-core/app/rest-client.rb +24 -0
  17. data/lib/rest-core/builder.rb +24 -0
  18. data/lib/rest-core/client.rb +278 -0
  19. data/lib/rest-core/client/github.rb +19 -0
  20. data/lib/rest-core/client/linkedin.rb +57 -0
  21. data/lib/rest-core/client/rest-graph.rb +262 -0
  22. data/lib/rest-core/client/twitter.rb +59 -0
  23. data/lib/rest-core/client_oauth1.rb +25 -0
  24. data/lib/rest-core/event.rb +17 -0
  25. data/lib/rest-core/middleware.rb +53 -0
  26. data/lib/rest-core/middleware/cache.rb +80 -0
  27. data/lib/rest-core/middleware/common_logger.rb +27 -0
  28. data/lib/rest-core/middleware/default_headers.rb +11 -0
  29. data/lib/rest-core/middleware/default_query.rb +11 -0
  30. data/lib/rest-core/middleware/default_site.rb +15 -0
  31. data/lib/rest-core/middleware/defaults.rb +44 -0
  32. data/lib/rest-core/middleware/error_detector.rb +16 -0
  33. data/lib/rest-core/middleware/error_detector_http.rb +11 -0
  34. data/lib/rest-core/middleware/error_handler.rb +19 -0
  35. data/lib/rest-core/middleware/json_decode.rb +83 -0
  36. data/lib/rest-core/middleware/oauth1_header.rb +81 -0
  37. data/lib/rest-core/middleware/oauth2_query.rb +19 -0
  38. data/lib/rest-core/middleware/timeout.rb +13 -0
  39. data/lib/rest-core/util/hmac.rb +22 -0
  40. data/lib/rest-core/version.rb +4 -0
  41. data/lib/rest-core/wrapper.rb +55 -0
  42. data/lib/rest-graph/config_util.rb +43 -0
  43. data/rest-core.gemspec +162 -0
  44. data/task/.gitignore +1 -0
  45. data/task/gemgem.rb +184 -0
  46. data/test/common.rb +29 -0
  47. data/test/config/rest-graph.yaml +7 -0
  48. data/test/pending/test_load_config.rb +42 -0
  49. data/test/pending/test_multi.rb +123 -0
  50. data/test/pending/test_test_util.rb +86 -0
  51. data/test/test_api.rb +98 -0
  52. data/test/test_cache.rb +62 -0
  53. data/test/test_default.rb +27 -0
  54. data/test/test_error.rb +66 -0
  55. data/test/test_handler.rb +87 -0
  56. data/test/test_misc.rb +75 -0
  57. data/test/test_oauth.rb +42 -0
  58. data/test/test_oauth1_header.rb +46 -0
  59. data/test/test_old.rb +116 -0
  60. data/test/test_page.rb +110 -0
  61. data/test/test_parse.rb +131 -0
  62. data/test/test_rest-graph.rb +10 -0
  63. data/test/test_serialize.rb +44 -0
  64. data/test/test_timeout.rb +25 -0
  65. metadata +267 -0
@@ -0,0 +1,110 @@
1
+
2
+ if respond_to?(:require_relative, true)
3
+ require_relative 'common'
4
+ else
5
+ require File.dirname(__FILE__) + '/common'
6
+ end
7
+
8
+ describe RestGraph do
9
+ after do
10
+ WebMock.reset!
11
+ RR.verify
12
+ end
13
+
14
+ should 'get the next/prev page' do
15
+ rg = RestGraph.new(:site => '', :cache => false)
16
+ %w[next previous].each{ |type|
17
+ kind = "#{type}_page"
18
+ rg.send(kind, {}) .should == nil
19
+ rg.send(kind, {'paging' => []}).should == nil
20
+ rg.send(kind, {'paging' => {}}).should == nil
21
+
22
+ stub_request(:get, 'zzz').to_return(:body => '["ok"]')
23
+ rg.send(kind, {'paging' => {type => 'zzz'}}).should == ['ok']
24
+ }
25
+ end
26
+
27
+ should 'merge all pages into one' do
28
+ rg = RestGraph.new(:site => '', :cache => false)
29
+ %w[next previous].each{ |type|
30
+ kind = "#{type}_page"
31
+ data = {'paging' => {type => 'zzz'}, 'data' => ['z']}
32
+
33
+ # invalid pages or just the page itself
34
+ (-1..1).each{ |page|
35
+ rg.for_pages(data, page, {}, kind).should == data
36
+ }
37
+
38
+ (2..4).each{ |pages|
39
+ # merge data
40
+ stub_request(:get, 'zzz').to_return(:body => '{"data":["y"]}')
41
+ rg.for_pages(data, pages, {}, kind).should == {'data' => %w[z y]}
42
+
43
+ # this data cannot be merged
44
+ stub_request(:get, 'zzz').to_return(:body => '{"data":"y"}')
45
+ rg.for_pages(data, pages, {}, kind).should == {'data' => %w[z]}
46
+ }
47
+
48
+ stub_request(:get, 'zzz').to_return(:body =>
49
+ '{"paging":{"'+type+'":"yyy"},"data":["y"]}')
50
+ stub_request(:get, 'yyy').to_return(:body => '{"data":["x"]}')
51
+
52
+ rg.for_pages(data, 3, {}, kind).should == {'data' => %w[z y x]}
53
+ }
54
+ end
55
+
56
+ should 'for_pages with callback' do
57
+ rg = RestGraph.new(:site => '', :cache => false)
58
+ %w[next previous].each{ |type|
59
+ kind = "#{type}_page"
60
+ data = {'paging' => {type => 'zzz'}, 'data' => ['z']}
61
+
62
+ # invalid pages or just the page itself
63
+ nils = 0
64
+ ranges = -1..1
65
+ ranges.each{ |page|
66
+ rg.for_pages(data, page, {}, kind){ |r|
67
+ if r
68
+ r.should == data
69
+ else
70
+ nils += 1
71
+ end
72
+ }.should == data
73
+ }
74
+ nils.should == ranges.to_a.size
75
+
76
+ (2..4).each{ |pages|
77
+ # merge data
78
+ stub_request(:get, 'zzz').to_return(:body => '{"data":["y"]}')
79
+ expects = [{'data' => %w[y]}, nil]
80
+ rg.for_pages(data, pages, {}, kind){ |r|
81
+ r.should == expects.shift
82
+ }.should == {'data' => %w[z y]}
83
+ expects.empty?.should == true
84
+
85
+ # this data cannot be merged
86
+ stub_request(:get, 'zzz').to_return(:body => '{"data":"y"}')
87
+ expects = [{'data' => 'y'}, nil]
88
+ rg.for_pages(data, pages, {}, kind){ |r|
89
+ r.should == expects.shift
90
+ }.should == {'data' => %w[z]}
91
+ expects.empty?.should == true
92
+ }
93
+
94
+ stub_request(:get, 'zzz').to_return(:body =>
95
+ '{"paging":{"'+type+'":"yyy"},"data":["y"]}')
96
+ stub_request(:get, 'yyy').to_return(:body => '{"data":["x"]}')
97
+
98
+ expects = [{'data' => %w[y]}, {'data' => %w[x]}, nil]
99
+ rg.for_pages(data, 3, {}, kind){ |rr|
100
+ if rr
101
+ r = rr.dup
102
+ r.delete('paging')
103
+ else
104
+ r = rr
105
+ end
106
+ r.should == expects.shift
107
+ }.should == {'data' => %w[z y x]}
108
+ }
109
+ end
110
+ end
@@ -0,0 +1,131 @@
1
+
2
+ if respond_to?(:require_relative, true)
3
+ require_relative 'common'
4
+ else
5
+ require File.dirname(__FILE__) + '/common'
6
+ end
7
+
8
+ describe RestGraph do
9
+
10
+ should 'return nil if parse error, but not when call data directly' do
11
+ rg = RestGraph.new
12
+ rg.parse_cookies!({}).should == nil
13
+ rg.data .should == {}
14
+ end
15
+
16
+ should 'parse if fbs contains json as well' do
17
+ algorithm = 'HMAC-SHA256'
18
+ user = '{"country"=>"us", "age"=>{"min"=>21}}'
19
+ data = {'algorithm' => algorithm, 'user' => user}
20
+ rg = RestGraph.new(:data => data, :secret => 'secret')
21
+ sig = rg.send(:calculate_sig, data)
22
+ rg.parse_fbs!("\"#{rg.fbs}\"").should == data.merge('sig' => sig)
23
+ end
24
+
25
+ should 'extract correct access_token or fail checking sig' do
26
+ access_token = '1|2-5|f.'
27
+ app_id = '1829'
28
+ secret = app_id.reverse
29
+ sig = '398262caea8442bd8801e8fba7c55c8a'
30
+ fbs = "access_token=#{CGI.escape(access_token)}&expires=0&" \
31
+ "secret=abc&session_key=def-456&sig=#{sig}&uid=3"
32
+
33
+ check = lambda{ |token, fbs|
34
+ http_cookie =
35
+ "__utma=123; __utmz=456.utmcsr=(d)|utmccn=(d)|utmcmd=(n); " \
36
+ "fbs_#{app_id}=#{fbs}"
37
+
38
+ rg = RestGraph.new(:app_id => app_id, :secret => secret)
39
+ rg.parse_rack_env!('HTTP_COOKIE' => http_cookie).
40
+ should.kind_of?(token ? Hash : NilClass)
41
+ rg.access_token.should == token
42
+
43
+ rg.parse_rack_env!('HTTP_COOKIE' => nil).should == nil
44
+ rg.data.should == {}
45
+
46
+ rg.parse_cookies!({"fbs_#{app_id}" => fbs}).
47
+ should.kind_of?(token ? Hash : NilClass)
48
+ rg.access_token.should == token
49
+
50
+ rg.parse_fbs!(fbs).
51
+ should.kind_of?(token ? Hash : NilClass)
52
+ rg.access_token.should == token
53
+ }
54
+ check.call(access_token, fbs)
55
+ check.call(access_token, "\"#{fbs}\"")
56
+ fbs << '&inject=evil"'
57
+ check.call(nil, fbs)
58
+ check.call(nil, "\"#{fbs}\"")
59
+ end
60
+
61
+ should 'not pass if there is no secret, prevent from forgery' do
62
+ rg = RestGraph.new
63
+ rg.parse_fbs!('"feed=me&sig=bddd192cf27f22c05f61c8bea24fa4b7"').
64
+ should == nil
65
+ end
66
+
67
+ should 'parse json correctly' do
68
+ rg = RestGraph.new
69
+
70
+ rg.parse_json!('bad json') .should == nil
71
+ rg.parse_json!('{"no":"sig"}').should == nil
72
+ rg.parse_json!('{"feed":"me","sig":"bddd192cf27f22c05f61c8bea24fa4b7"}').
73
+ should == nil
74
+
75
+ rg = RestGraph.new(:secret => 'bread')
76
+ rg.parse_json!('{"feed":"me","sig":"20393e7823730308938a86ecf1c88b14"}').
77
+ should == {'feed' => 'me', 'sig' => "20393e7823730308938a86ecf1c88b14"}
78
+ rg.data.empty?.should == false
79
+ rg.parse_json!('bad json')
80
+ rg.data.empty?.should == true
81
+ end
82
+
83
+ should 'parse signed_request' do
84
+ secret = 'aloha'
85
+ json = RestCore::JsonDecode.json_encode('ooh' => 'dir', 'moo' => 'bar')
86
+ encode = lambda{ |str|
87
+ [str].pack('m').tr("\n=", '').tr('+/', '-_')
88
+ }
89
+ json_encoded = encode[json]
90
+ sig = OpenSSL::HMAC.digest('sha256', secret, json_encoded)
91
+ signed_request = "#{encode[sig]}.#{json_encoded}"
92
+
93
+ rg = RestGraph.new(:secret => secret)
94
+ rg.parse_signed_request!(signed_request)
95
+ rg.data['ooh'].should == 'dir'
96
+ rg.data['moo'].should == 'bar'
97
+
98
+ signed_request = "#{encode[sig[0..-4]+'bad']}.#{json_encoded}"
99
+ rg.parse_signed_request!(signed_request).should == nil
100
+ rg.data .should == {}
101
+ end
102
+
103
+ should 'fallback to ruby-hmac if Digest.new raise an runtime error' do
104
+ key, data = 'top', 'secret'
105
+ digest = OpenSSL::HMAC.digest('sha256', key, data)
106
+ mock(OpenSSL::HMAC).digest('sha256', key, data){ raise 'boom' }
107
+ RestCore::Hmac.sha256(key, data).should == digest
108
+ end
109
+
110
+ should 'generate correct fbs with correct sig' do
111
+ RestGraph.new(:access_token => 'fake', :secret => 's').fbs.should ==
112
+ "access_token=fake&sig=#{Digest::MD5.hexdigest('access_token=fakes')}"
113
+ end
114
+
115
+ should 'parse fbs from facebook response which lacks sig...' do
116
+ rg = RestGraph.new(:access_token => 'a', :secret => 'z')
117
+ rg.parse_fbs!(rg.fbs) .should.kind_of?(Hash)
118
+ rg.data.empty?.should == false
119
+ rg.parse_fbs!(rg.fbs.sub(/sig\=\w+/, 'sig=abc')).should == nil
120
+ rg.data.empty?.should == true
121
+ end
122
+
123
+ should 'generate correct fbs with additional parameters' do
124
+ rg = RestGraph.new(:access_token => 'a', :secret => 'z')
125
+ rg.data['expires'] = '1234'
126
+ rg.parse_fbs!(rg.fbs).should.kind_of?(Hash)
127
+ rg.access_token .should == 'a'
128
+ rg.data['expires'] .should == '1234'
129
+ end
130
+
131
+ end
@@ -0,0 +1,10 @@
1
+
2
+ $LOAD_PATH << File.dirname(__FILE__)
3
+ $LOAD_PATH.uniq!
4
+
5
+ Dir["#{File.dirname(__FILE__)}/*.rb"].each{ |file|
6
+ next if file == __FILE__
7
+ next if ARGV.map{ |path| File.expand_path(path)
8
+ }.include?(File.expand_path(file))
9
+ require File.basename(file).sub(/\..+$/, '')
10
+ }
@@ -0,0 +1,44 @@
1
+
2
+ if respond_to?(:require_relative, true)
3
+ require_relative 'common'
4
+ else
5
+ require File.dirname(__FILE__) + '/common'
6
+ end
7
+
8
+ describe RestGraph do
9
+ after do
10
+ WebMock.reset!
11
+ RR.verify
12
+ end
13
+
14
+ should 'be serialized with lighten' do
15
+ engines = if RUBY_VERSION >= '1.9.2'
16
+ begin
17
+ require 'psych'
18
+ YAML::ENGINE.yamler = 'psych' # TODO: probably a bug?
19
+ [Marshal, YAML, Psych]
20
+ rescue LoadError
21
+ [Marshal, YAML]
22
+ end
23
+ elsif defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
24
+ [Marshal]
25
+ else
26
+ [YAML]
27
+ end
28
+
29
+ engines.each{ |engine|
30
+ test = lambda{ |obj| engine.load(engine.dump(obj)) }
31
+ rg = RestGraph.new(:log_handler => lambda{})
32
+ lambda{ test[rg] }.should.raise(TypeError)
33
+ test[rg.lighten].should == rg.lighten
34
+ lambda{ test[rg] }.should.raise(TypeError)
35
+ rg.lighten!
36
+ test[rg.lighten].should == rg
37
+ }
38
+ end
39
+
40
+ should 'lighten takes options to change attributes' do
41
+ RestGraph.new.lighten(:timeout => 100 ).timeout.should == 100
42
+ RestGraph.new.lighten(:lang => 'zh-TW').lang .should == 'zh-TW'
43
+ end
44
+ end
@@ -0,0 +1,25 @@
1
+
2
+ if respond_to?(:require_relative, true)
3
+ require_relative 'common'
4
+ else
5
+ require File.dirname(__FILE__) + '/common'
6
+ end
7
+
8
+ describe RestGraph do
9
+ after do
10
+ WebMock.reset!
11
+ RR.verify
12
+ end
13
+
14
+ should 'respect timeout' do
15
+ stub_request(:get, 'https://graph.facebook.com/me').
16
+ to_return(:body => '{}')
17
+ mock.proxy(Timeout).timeout(numeric)
18
+ RestGraph.new.get('me').should == {}
19
+ end
20
+
21
+ should 'override timeout' do
22
+ mock(Timeout).timeout(99){ {RestCore::RESPONSE_BODY => true} }
23
+ RestGraph.new(:timeout => 1).get('me', {}, :timeout => 99).should == true
24
+ end
25
+ end
metadata ADDED
@@ -0,0 +1,267 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rest-core
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Cardinal Blue
9
+ - Lin Jen-Shin (godfat)
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2011-08-16 00:00:00.000000000Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rest-client
17
+ requirement: &2153518960 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: *2153518960
26
+ - !ruby/object:Gem::Dependency
27
+ name: rack
28
+ requirement: &2153518480 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *2153518480
37
+ - !ruby/object:Gem::Dependency
38
+ name: yajl-ruby
39
+ requirement: &2153518000 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *2153518000
48
+ - !ruby/object:Gem::Dependency
49
+ name: json
50
+ requirement: &2153517520 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *2153517520
59
+ - !ruby/object:Gem::Dependency
60
+ name: json_pure
61
+ requirement: &2153517040 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *2153517040
70
+ - !ruby/object:Gem::Dependency
71
+ name: ruby-hmac
72
+ requirement: &2153516560 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *2153516560
81
+ - !ruby/object:Gem::Dependency
82
+ name: webmock
83
+ requirement: &2153516080 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *2153516080
92
+ - !ruby/object:Gem::Dependency
93
+ name: bacon
94
+ requirement: &2153515600 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: *2153515600
103
+ - !ruby/object:Gem::Dependency
104
+ name: rr
105
+ requirement: &2153515120 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *2153515120
114
+ - !ruby/object:Gem::Dependency
115
+ name: rake
116
+ requirement: &2153514640 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *2153514640
125
+ description: ! 'A modular Ruby REST client collection/infrastructure.
126
+
127
+
128
+ In this era of web services and mashups, we have seen a blooming of REST
129
+
130
+ APIs. One might wonder, how do we use these APIs easily and elegantly?
131
+
132
+ Since REST is very simple compared to SOAP, it is not hard to build a
133
+
134
+ dedicated client ourselves.
135
+
136
+
137
+ We have developed [rest-core][] with composable middlewares to build a
138
+
139
+ REST client, based on the effort from [rest-graph][]. In the cases of
140
+
141
+ common APIs such as Facebook, Github, and Twitter, developers can simply
142
+
143
+ use the built-in dedicated clients provided by rest-core, or do it yourself
144
+
145
+ for any other REST APIs.
146
+
147
+
148
+ [rest-core]: http://github.com/cardinalblue/rest-core
149
+
150
+ [rest-graph]: http://github.com/cardinalblue/rest-graph'
151
+ email:
152
+ - dev (XD) cardinalblue.com
153
+ executables: []
154
+ extensions: []
155
+ extra_rdoc_files:
156
+ - CONTRIBUTORS
157
+ - LICENSE
158
+ - TODO.md
159
+ files:
160
+ - .gitignore
161
+ - .gitmodules
162
+ - .travis.yml
163
+ - CONTRIBUTORS
164
+ - Gemfile
165
+ - LICENSE
166
+ - NOTE.md
167
+ - README
168
+ - README.md
169
+ - Rakefile
170
+ - TODO.md
171
+ - example/facebook.rb
172
+ - example/github.rb
173
+ - lib/rest-core.rb
174
+ - lib/rest-core/app/ask.rb
175
+ - lib/rest-core/app/rest-client.rb
176
+ - lib/rest-core/builder.rb
177
+ - lib/rest-core/client.rb
178
+ - lib/rest-core/client/github.rb
179
+ - lib/rest-core/client/linkedin.rb
180
+ - lib/rest-core/client/rest-graph.rb
181
+ - lib/rest-core/client/twitter.rb
182
+ - lib/rest-core/client_oauth1.rb
183
+ - lib/rest-core/event.rb
184
+ - lib/rest-core/middleware.rb
185
+ - lib/rest-core/middleware/cache.rb
186
+ - lib/rest-core/middleware/common_logger.rb
187
+ - lib/rest-core/middleware/default_headers.rb
188
+ - lib/rest-core/middleware/default_query.rb
189
+ - lib/rest-core/middleware/default_site.rb
190
+ - lib/rest-core/middleware/defaults.rb
191
+ - lib/rest-core/middleware/error_detector.rb
192
+ - lib/rest-core/middleware/error_detector_http.rb
193
+ - lib/rest-core/middleware/error_handler.rb
194
+ - lib/rest-core/middleware/json_decode.rb
195
+ - lib/rest-core/middleware/oauth1_header.rb
196
+ - lib/rest-core/middleware/oauth2_query.rb
197
+ - lib/rest-core/middleware/timeout.rb
198
+ - lib/rest-core/util/hmac.rb
199
+ - lib/rest-core/version.rb
200
+ - lib/rest-core/wrapper.rb
201
+ - lib/rest-graph/config_util.rb
202
+ - rest-core.gemspec
203
+ - task/.gitignore
204
+ - task/gemgem.rb
205
+ - test/common.rb
206
+ - test/config/rest-graph.yaml
207
+ - test/pending/test_load_config.rb
208
+ - test/pending/test_multi.rb
209
+ - test/pending/test_test_util.rb
210
+ - test/test_api.rb
211
+ - test/test_cache.rb
212
+ - test/test_default.rb
213
+ - test/test_error.rb
214
+ - test/test_handler.rb
215
+ - test/test_misc.rb
216
+ - test/test_oauth.rb
217
+ - test/test_oauth1_header.rb
218
+ - test/test_old.rb
219
+ - test/test_page.rb
220
+ - test/test_parse.rb
221
+ - test/test_rest-graph.rb
222
+ - test/test_serialize.rb
223
+ - test/test_timeout.rb
224
+ homepage: https://github.com/cardinalblue/rest-core
225
+ licenses: []
226
+ post_install_message:
227
+ rdoc_options:
228
+ - --main
229
+ - README
230
+ require_paths:
231
+ - lib
232
+ required_ruby_version: !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - ! '>='
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ required_rubygems_version: !ruby/object:Gem::Requirement
239
+ none: false
240
+ requirements:
241
+ - - ! '>='
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ requirements: []
245
+ rubyforge_project:
246
+ rubygems_version: 1.8.7
247
+ signing_key:
248
+ specification_version: 3
249
+ summary: A modular Ruby REST client collection/infrastructure.
250
+ test_files:
251
+ - test/pending/test_load_config.rb
252
+ - test/pending/test_multi.rb
253
+ - test/pending/test_test_util.rb
254
+ - test/test_api.rb
255
+ - test/test_cache.rb
256
+ - test/test_default.rb
257
+ - test/test_error.rb
258
+ - test/test_handler.rb
259
+ - test/test_misc.rb
260
+ - test/test_oauth.rb
261
+ - test/test_oauth1_header.rb
262
+ - test/test_old.rb
263
+ - test/test_page.rb
264
+ - test/test_parse.rb
265
+ - test/test_rest-graph.rb
266
+ - test/test_serialize.rb
267
+ - test/test_timeout.rb