rest-more 3.0.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGES.md +16 -0
- data/README.md +31 -13
- data/example/rails3/Gemfile +1 -1
- data/example/rails3/config/rest-core.yaml +6 -0
- data/example/rails3/test/unit/rails_util_test.rb +10 -0
- data/lib/rest-core/client/dropbox.rb +1 -1
- data/lib/rest-core/client/facebook.rb +1 -1
- data/lib/rest-core/client/firebase.rb +63 -8
- data/lib/rest-core/client/twitter.rb +1 -1
- data/lib/rest-core/util/rails_util_util.rb +12 -1
- data/lib/rest-more.rb +0 -2
- data/lib/rest-more/version.rb +1 -1
- data/rest-more.gemspec +11 -13
- data/test/dropbox/{test_api.rb → test_dropbox.rb} +3 -7
- data/test/firebase/test_firebase.rb +72 -0
- data/test/instagram/{test_api.rb → test_instagram.rb} +0 -0
- data/test/twitter/{test_api.rb → test_twitter.rb} +3 -7
- metadata +10 -12
- data/lib/rest-core/util/config.rb +0 -61
- data/test/facebook/config/rest-core.yaml +0 -8
- data/test/facebook/test_load_config.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e31b7b448ea1e4dce6284fb2a7ecbacb506d759
|
4
|
+
data.tar.gz: 212fdd5674abee559e5c29e55dd4f696dc71c2f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02fb9f18f3d7a0ce0eac2d2030ceb2a21b9f45b50a13816ce35ec3227d38fae60041f12a577de54ac7035698361ea10997f362eca66cbbfbe5b26f63b10c009f
|
7
|
+
data.tar.gz: d80cb820e5c77553e2a61ea6b61a05d56c2fe0552ba7a3af81af5a828897b3f97e2b0d7f3cec60669f25144a16db052f1b3dad79f36557e40a05c751455b7290
|
data/.travis.yml
CHANGED
data/CHANGES.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# CHANGES
|
2
2
|
|
3
|
+
## rest-more 3.1.0 -- 2014-05-09
|
4
|
+
|
5
|
+
### Changes for RC::Firebase
|
6
|
+
|
7
|
+
* Now it would properly follow redirect.
|
8
|
+
* Now it would raise an error if we're not giving a secret to RC::Firebase.
|
9
|
+
* Now we have RC::Firebase::Error and its subclasses.
|
10
|
+
* Introduced RC::Firebase::EventSource which would parse the data instead of
|
11
|
+
simply giving the string for onmessage callback.
|
12
|
+
|
13
|
+
## rest-more 3.0.0 -- 2014-05-04
|
14
|
+
|
15
|
+
* Adopted latest rest-core
|
16
|
+
* Added `RC::Instagram`, thanks @khoan
|
17
|
+
* Added `RC::Firebase`
|
18
|
+
|
3
19
|
## rest-more 2.0.4 -- 2013-04-13
|
4
20
|
|
5
21
|
* [Facebook::RailsUtil] Since now that we cannot retrieve the access token
|
data/README.md
CHANGED
@@ -141,26 +141,44 @@ for a complete reference, and [RC::Firebase][] for built-in APIs.
|
|
141
141
|
``` ruby
|
142
142
|
require 'rest-more'
|
143
143
|
|
144
|
-
f = RC::Firebase.new :site => 'https://
|
144
|
+
f = RC::Firebase.new :site => 'https://SampleChat.firebaseIO-demo.com/',
|
145
145
|
:secret => 'secret',
|
146
146
|
:d => {:auth_data => 'something'},
|
147
|
-
:log_method => method(:puts)
|
147
|
+
:log_method => method(:puts),
|
148
|
+
:auth => false # Ignore auth for this example!
|
149
|
+
|
150
|
+
@reconnect = true
|
148
151
|
|
149
|
-
#
|
150
|
-
es = f.event_source('
|
151
|
-
es.onopen{ |sock| p sock }
|
152
|
-
es.onmessage{ |event| p event }
|
153
|
-
es.onerror{ |error| p error }
|
152
|
+
# Streaming over 'users/tom'
|
153
|
+
es = f.event_source('users/tom')
|
154
|
+
es.onopen { |sock| p sock } # Called when connected
|
155
|
+
es.onmessage{ |event, data, sock| p event, data } # Called for each message
|
156
|
+
es.onerror { |error, sock| p error } # Called whenever there's an error
|
157
|
+
# Extra: If we return true in onreconnect callback, it would automatically
|
158
|
+
# reconnect the node for us if disconnected.
|
159
|
+
es.onreconnect{ |error, sock| p error; @reconnect }
|
160
|
+
|
161
|
+
# Start making the request
|
154
162
|
es.start
|
155
163
|
|
156
|
-
#
|
157
|
-
|
158
|
-
p f.post('test', :some => 'other')
|
159
|
-
p f.get('test')
|
160
|
-
p f.delete('test')
|
164
|
+
# Try to close the connection and see it reconnects automatically
|
165
|
+
es.close
|
161
166
|
|
162
|
-
#
|
167
|
+
# Update users/tom.json
|
168
|
+
p f.put('users/tom', :some => 'data')
|
169
|
+
p f.post('users/tom', :some => 'other')
|
170
|
+
p f.get('users/tom')
|
171
|
+
p f.delete('users/tom')
|
172
|
+
|
173
|
+
# Need to tell onreconnect stops reconnecting, or even if we close
|
174
|
+
# the connection manually, it would still try to reconnect again.
|
175
|
+
@reconnect = false
|
176
|
+
|
177
|
+
# Close the connection to gracefully shut it down.
|
163
178
|
es.close
|
179
|
+
|
180
|
+
# Refresh the auth by resetting it
|
181
|
+
f.auth = nil
|
164
182
|
```
|
165
183
|
|
166
184
|
### Github example:
|
data/example/rails3/Gemfile
CHANGED
@@ -41,4 +41,14 @@ class RailsUtilTest < ActiveSupport::TestCase
|
|
41
41
|
assert_equal('http://test.com/',
|
42
42
|
@controller.send(:rc_facebook_normalized_request_uri))
|
43
43
|
end
|
44
|
+
|
45
|
+
def test_config
|
46
|
+
klass = RC::Builder.client
|
47
|
+
RC::RailsUtilUtil.load_config(klass, 'macebook')
|
48
|
+
|
49
|
+
assert_equal 41829 , klass.default_app_id
|
50
|
+
assert_equal 'r41829'.reverse, klass.default_secret
|
51
|
+
assert_equal false , klass.default_json_response
|
52
|
+
assert_equal 'zh-tw' , klass.default_lang
|
53
|
+
end
|
44
54
|
end
|
@@ -46,7 +46,7 @@ class RestCore::Dropbox::Error < RestCore::Error
|
|
46
46
|
|
47
47
|
def self.call env
|
48
48
|
error, code, url = env[RESPONSE_BODY], env[RESPONSE_STATUS],
|
49
|
-
|
49
|
+
env[REQUEST_URI]
|
50
50
|
return new(error, code, url) unless error.kind_of?(Hash)
|
51
51
|
case code
|
52
52
|
when 400; BadRequest
|
@@ -40,7 +40,7 @@ class RestCore::Facebook::Error < RestCore::Error
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def self.call env
|
43
|
-
error, url = env[RESPONSE_BODY],
|
43
|
+
error, url = env[RESPONSE_BODY], env[REQUEST_URI]
|
44
44
|
return new(error, url) unless error.kind_of?(Hash)
|
45
45
|
if invalid_token?(error)
|
46
46
|
InvalidAccessToken.new(error, url)
|
@@ -11,20 +11,80 @@ module RestCore
|
|
11
11
|
use DefaultHeaders, {'Accept' => 'application/json'}
|
12
12
|
use DefaultQuery , nil
|
13
13
|
|
14
|
+
use FollowRedirect, 1
|
14
15
|
use CommonLogger , nil
|
15
16
|
use Cache , nil, 600 do
|
16
|
-
use ErrorHandler, lambda{ |env|
|
17
|
-
RuntimeError.new(env[RESPONSE_BODY]['message'])}
|
17
|
+
use ErrorHandler, lambda{ |env| Firebase::Error.call(env) }
|
18
18
|
use ErrorDetectorHttp
|
19
19
|
use JsonResponse, true
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
class RestCore::Firebase::Error < RestCore::Error
|
25
|
+
include RestCore
|
26
|
+
class ServerError < Firebase::Error; end
|
27
|
+
class ClientError < RestCore::Error; end
|
28
|
+
|
29
|
+
class BadRequest < Firebase::Error; end
|
30
|
+
class Unauthorized < Firebase::Error; end
|
31
|
+
class Forbidden < Firebase::Error; end
|
32
|
+
class NotFound < Firebase::Error; end
|
33
|
+
class NotAcceptable < Firebase::Error; end
|
34
|
+
class ExpectationFailed < Firebase::Error; end
|
35
|
+
|
36
|
+
class InternalServerError < Firebase::Error::ServerError; end
|
37
|
+
class BadGateway < Firebase::Error::ServerError; end
|
38
|
+
class ServiceUnavailable < Firebase::Error::ServerError; end
|
39
|
+
|
40
|
+
attr_reader :error, :code, :url
|
41
|
+
def initialize error, code, url=''
|
42
|
+
@error, @code, @url = error, code, url
|
43
|
+
super("[#{code}] #{error.inspect} from #{url}")
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.call env
|
47
|
+
error, code, url = env[RESPONSE_BODY], env[RESPONSE_STATUS],
|
48
|
+
env[REQUEST_URI]
|
49
|
+
return new(error, code, url) unless error.kind_of?(Hash)
|
50
|
+
case code
|
51
|
+
when 400; BadRequest
|
52
|
+
when 401; Unauthorized
|
53
|
+
when 403; Forbidden
|
54
|
+
when 404; NotFound
|
55
|
+
when 406; NotAcceptable
|
56
|
+
when 417; ExpectationFailed
|
57
|
+
when 500; InternalServerError
|
58
|
+
when 502; BadGateway
|
59
|
+
when 503; ServiceUnavailable
|
60
|
+
else ; self
|
61
|
+
end.new(error, code, url)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
24
65
|
module RestCore::Firebase::Client
|
25
66
|
include RestCore
|
26
67
|
|
68
|
+
class EventSource < RestCore::EventSource
|
69
|
+
def onmessage event=nil, data=nil, sock=nil
|
70
|
+
if event
|
71
|
+
super(event, Json.decode(data), sock)
|
72
|
+
else
|
73
|
+
super
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def request env, app=app
|
79
|
+
super(env.merge(REQUEST_PATH => "#{env[REQUEST_PATH]}.json",
|
80
|
+
REQUEST_PAYLOAD => Json.encode(env[REQUEST_PAYLOAD])),
|
81
|
+
app)
|
82
|
+
end
|
83
|
+
|
27
84
|
def generate_auth opts={}
|
85
|
+
raise Firebase::Error::ClientError.new(
|
86
|
+
"Please set your secret") unless secret
|
87
|
+
|
28
88
|
header = {:typ => 'JWT', :alg => 'HS256'}
|
29
89
|
claims = {:v => 0, :iat => Time.now.to_i, :d => d}.merge(opts)
|
30
90
|
# http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-26
|
@@ -33,12 +93,6 @@ module RestCore::Firebase::Client
|
|
33
93
|
"#{input}.#{base64url(Hmac.sha256(secret, input))}"
|
34
94
|
end
|
35
95
|
|
36
|
-
def request env, key=RESPONSE_BODY, app=app
|
37
|
-
super(env.merge(REQUEST_PATH => "#{env[REQUEST_PATH]}.json",
|
38
|
-
REQUEST_PAYLOAD => Json.encode(env[REQUEST_PAYLOAD])),
|
39
|
-
key, app)
|
40
|
-
end
|
41
|
-
|
42
96
|
private
|
43
97
|
def base64url str; [str].pack('m').tr('+/', '-_'); end
|
44
98
|
def default_query; {:auth => auth}; end
|
@@ -47,4 +101,5 @@ end
|
|
47
101
|
|
48
102
|
class RestCore::Firebase
|
49
103
|
include RestCore::Firebase::Client
|
104
|
+
self.event_source_class = EventSource
|
50
105
|
end
|
@@ -45,7 +45,7 @@ class RestCore::Twitter::Error < RestCore::Error
|
|
45
45
|
|
46
46
|
def self.call env
|
47
47
|
error, code, url = env[RESPONSE_BODY], env[RESPONSE_STATUS],
|
48
|
-
|
48
|
+
env[REQUEST_URI]
|
49
49
|
return new(error, code, url) unless error.kind_of?(Hash)
|
50
50
|
case code
|
51
51
|
when 400; BadRequest
|
@@ -1,6 +1,17 @@
|
|
1
1
|
|
2
2
|
module RestCore; end
|
3
3
|
module RestCore::RailsUtilUtil
|
4
|
+
def self.load_config klass, namespace=nil, app=Rails
|
5
|
+
# make sure the default is there even if there's no config file
|
6
|
+
RestCore::Config.default_attributes_module(klass)
|
7
|
+
|
8
|
+
root = File.expand_path(app.root)
|
9
|
+
path = ["#{root}/config/rest-core.yaml", # YAML should use .yaml
|
10
|
+
"#{root}/config/rest-core.yml" ].find{|p| File.exist?(p)}
|
11
|
+
return if path.nil?
|
12
|
+
RestCore::Config.load(klass, path, app.env, namespace)
|
13
|
+
end
|
14
|
+
|
4
15
|
module Cache
|
5
16
|
def [] key ; read(key) ; end
|
6
17
|
def []= key, value; write(key, value) ; end
|
@@ -56,7 +67,7 @@ module RestCore::RailsUtilUtil
|
|
56
67
|
end
|
57
68
|
mod.module_eval(<<-RUBY, __FILE__, __LINE__)
|
58
69
|
def init app=Rails
|
59
|
-
RestCore::
|
70
|
+
RestCore::RailsUtilUtil.load_config(RestCore::#{name}, '#{meth}', app)
|
60
71
|
end
|
61
72
|
|
62
73
|
def included controller
|
data/lib/rest-more.rb
CHANGED
data/lib/rest-more/version.rb
CHANGED
data/rest-more.gemspec
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: rest-more 3.
|
2
|
+
# stub: rest-more 3.1.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "rest-more"
|
6
|
-
s.version = "3.
|
6
|
+
s.version = "3.1.0"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib"]
|
10
10
|
s.authors = ["Lin Jen-Shin (godfat)"]
|
11
|
-
s.date = "2014-05-
|
11
|
+
s.date = "2014-05-09"
|
12
12
|
s.description = "Various REST clients such as Facebook and Twitter built with [rest-core][].\n\n[rest-core]: https://github.com/godfat/rest-core"
|
13
13
|
s.email = ["godfat (XD) godfat.org"]
|
14
14
|
s.executables = ["rib-rest-core"]
|
@@ -57,7 +57,6 @@ Gem::Specification.new do |s|
|
|
57
57
|
"lib/rest-core/client/linkedin/rails_util.rb",
|
58
58
|
"lib/rest-core/client/twitter.rb",
|
59
59
|
"lib/rest-core/client/twitter/rails_util.rb",
|
60
|
-
"lib/rest-core/util/config.rb",
|
61
60
|
"lib/rest-core/util/rails_util_util.rb",
|
62
61
|
"lib/rest-more.rb",
|
63
62
|
"lib/rest-more/test.rb",
|
@@ -66,13 +65,11 @@ Gem::Specification.new do |s|
|
|
66
65
|
"rest-more.gemspec",
|
67
66
|
"task/README.md",
|
68
67
|
"task/gemgem.rb",
|
69
|
-
"test/dropbox/
|
70
|
-
"test/facebook/config/rest-core.yaml",
|
68
|
+
"test/dropbox/test_dropbox.rb",
|
71
69
|
"test/facebook/test_api.rb",
|
72
70
|
"test/facebook/test_default.rb",
|
73
71
|
"test/facebook/test_error.rb",
|
74
72
|
"test/facebook/test_handler.rb",
|
75
|
-
"test/facebook/test_load_config.rb",
|
76
73
|
"test/facebook/test_misc.rb",
|
77
74
|
"test/facebook/test_oauth.rb",
|
78
75
|
"test/facebook/test_old.rb",
|
@@ -80,19 +77,19 @@ Gem::Specification.new do |s|
|
|
80
77
|
"test/facebook/test_parse.rb",
|
81
78
|
"test/facebook/test_serialize.rb",
|
82
79
|
"test/facebook/test_timeout.rb",
|
83
|
-
"test/
|
84
|
-
"test/
|
80
|
+
"test/firebase/test_firebase.rb",
|
81
|
+
"test/instagram/test_instagram.rb",
|
82
|
+
"test/twitter/test_twitter.rb"]
|
85
83
|
s.homepage = "https://github.com/godfat/rest-more"
|
86
84
|
s.licenses = ["Apache License 2.0"]
|
87
85
|
s.rubygems_version = "2.2.2"
|
88
86
|
s.summary = "Various REST clients such as Facebook and Twitter built with [rest-core][]."
|
89
87
|
s.test_files = [
|
90
|
-
"test/dropbox/
|
88
|
+
"test/dropbox/test_dropbox.rb",
|
91
89
|
"test/facebook/test_api.rb",
|
92
90
|
"test/facebook/test_default.rb",
|
93
91
|
"test/facebook/test_error.rb",
|
94
92
|
"test/facebook/test_handler.rb",
|
95
|
-
"test/facebook/test_load_config.rb",
|
96
93
|
"test/facebook/test_misc.rb",
|
97
94
|
"test/facebook/test_oauth.rb",
|
98
95
|
"test/facebook/test_old.rb",
|
@@ -100,8 +97,9 @@ Gem::Specification.new do |s|
|
|
100
97
|
"test/facebook/test_parse.rb",
|
101
98
|
"test/facebook/test_serialize.rb",
|
102
99
|
"test/facebook/test_timeout.rb",
|
103
|
-
"test/
|
104
|
-
"test/
|
100
|
+
"test/firebase/test_firebase.rb",
|
101
|
+
"test/instagram/test_instagram.rb",
|
102
|
+
"test/twitter/test_twitter.rb"]
|
105
103
|
|
106
104
|
if s.respond_to? :specification_version then
|
107
105
|
s.specification_version = 4
|
@@ -26,12 +26,8 @@ describe RC::Dropbox do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
should 'raise exception when encountering error' do
|
29
|
-
[401, 402, 403].each{ |status|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
[500, 502, 503].each{ |status|
|
34
|
-
check(status, RC::Dropbox::Error::ServerError)
|
35
|
-
}
|
29
|
+
[401, 402, 403].each{ |status| check(status, RC::Dropbox::Error) }
|
30
|
+
[500, 502, 503].each{ |status| check(status, RC::Dropbox::Error::
|
31
|
+
ServerError) }
|
36
32
|
end
|
37
33
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
|
2
|
+
require 'rest-more/test'
|
3
|
+
|
4
|
+
describe RC::Firebase do
|
5
|
+
before do
|
6
|
+
stub(Time).now{ Time.at(0) }
|
7
|
+
end
|
8
|
+
|
9
|
+
after do
|
10
|
+
WebMock.reset!
|
11
|
+
Muack.verify
|
12
|
+
end
|
13
|
+
|
14
|
+
path = 'https://a.json?auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9%0A.eyJ2IjowLCJpYXQiOjAsImQiOm51bGx9%0A.C9JtzZhiCrsClNdAQcE7Irngr2BZJCH4x1p-IHxfrAo%3D%0A'
|
15
|
+
|
16
|
+
def firebase
|
17
|
+
RC::Firebase.new(:secret => 'nnf')
|
18
|
+
end
|
19
|
+
|
20
|
+
should 'get true' do
|
21
|
+
stub_request(:get, path).to_return(:body => 'true')
|
22
|
+
firebase.get('https://a').should.eq true
|
23
|
+
end
|
24
|
+
|
25
|
+
should 'put {"status":"ok"}' do
|
26
|
+
json = '{"status":"ok"}'
|
27
|
+
rbon = {'status' => 'ok'}
|
28
|
+
stub_request(:put, path).with(:body => json).to_return(:body => json)
|
29
|
+
firebase.put('https://a', rbon).should.eq rbon
|
30
|
+
end
|
31
|
+
|
32
|
+
should 'parse event source' do
|
33
|
+
stub_request(:get, path).to_return(:body => <<-SSE)
|
34
|
+
event: put
|
35
|
+
data: {}
|
36
|
+
|
37
|
+
event: keep-alive
|
38
|
+
data: null
|
39
|
+
|
40
|
+
event: invalid
|
41
|
+
data: invalid
|
42
|
+
SSE
|
43
|
+
m = [{'event' => 'put' , 'data' => {}},
|
44
|
+
{'event' => 'keep-alive', 'data' => nil}]
|
45
|
+
es = firebase.event_source('https://a')
|
46
|
+
es.should.kind_of RC::Firebase::Client::EventSource
|
47
|
+
es.onmessage do |event, data|
|
48
|
+
{'event' => event, 'data' => data}.should.eq m.shift
|
49
|
+
end.onerror do |error|
|
50
|
+
error.should.kind_of RC::Json::ParseError
|
51
|
+
end.start.wait
|
52
|
+
m.should.empty
|
53
|
+
end
|
54
|
+
|
55
|
+
check = lambda do |status, klass|
|
56
|
+
stub_request(:delete, path).to_return(
|
57
|
+
:body => '{}', :status => status)
|
58
|
+
|
59
|
+
lambda{ firebase.delete('https://a').tap{} }.should.raise(klass)
|
60
|
+
|
61
|
+
WebMock.reset!
|
62
|
+
end
|
63
|
+
|
64
|
+
should 'raise exception when encountering error' do
|
65
|
+
[400, 401, 402, 403, 404, 406, 417].each do |status|
|
66
|
+
check[status, RC::Firebase::Error]
|
67
|
+
end
|
68
|
+
[500, 502, 503].each do |status|
|
69
|
+
check[status, RC::Firebase::Error::ServerError]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
File without changes
|
@@ -27,12 +27,8 @@ describe RC::Twitter do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
should 'raise exception when encountering error' do
|
30
|
-
[401, 402, 403].each{ |status|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
[500, 502, 503].each{ |status|
|
35
|
-
check(status, RestCore::Twitter::Error::ServerError)
|
36
|
-
}
|
30
|
+
[401, 402, 403].each{ |status| check(status, RestCore::Twitter::Error) }
|
31
|
+
[500, 502, 503].each{ |status| check(status, RestCore::Twitter::Error::
|
32
|
+
ServerError) }
|
37
33
|
end
|
38
34
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-more
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lin Jen-Shin (godfat)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-core
|
@@ -79,7 +79,6 @@ files:
|
|
79
79
|
- lib/rest-core/client/linkedin/rails_util.rb
|
80
80
|
- lib/rest-core/client/twitter.rb
|
81
81
|
- lib/rest-core/client/twitter/rails_util.rb
|
82
|
-
- lib/rest-core/util/config.rb
|
83
82
|
- lib/rest-core/util/rails_util_util.rb
|
84
83
|
- lib/rest-more.rb
|
85
84
|
- lib/rest-more/test.rb
|
@@ -88,13 +87,11 @@ files:
|
|
88
87
|
- rest-more.gemspec
|
89
88
|
- task/README.md
|
90
89
|
- task/gemgem.rb
|
91
|
-
- test/dropbox/
|
92
|
-
- test/facebook/config/rest-core.yaml
|
90
|
+
- test/dropbox/test_dropbox.rb
|
93
91
|
- test/facebook/test_api.rb
|
94
92
|
- test/facebook/test_default.rb
|
95
93
|
- test/facebook/test_error.rb
|
96
94
|
- test/facebook/test_handler.rb
|
97
|
-
- test/facebook/test_load_config.rb
|
98
95
|
- test/facebook/test_misc.rb
|
99
96
|
- test/facebook/test_oauth.rb
|
100
97
|
- test/facebook/test_old.rb
|
@@ -102,8 +99,9 @@ files:
|
|
102
99
|
- test/facebook/test_parse.rb
|
103
100
|
- test/facebook/test_serialize.rb
|
104
101
|
- test/facebook/test_timeout.rb
|
105
|
-
- test/
|
106
|
-
- test/
|
102
|
+
- test/firebase/test_firebase.rb
|
103
|
+
- test/instagram/test_instagram.rb
|
104
|
+
- test/twitter/test_twitter.rb
|
107
105
|
homepage: https://github.com/godfat/rest-more
|
108
106
|
licenses:
|
109
107
|
- Apache License 2.0
|
@@ -129,12 +127,11 @@ signing_key:
|
|
129
127
|
specification_version: 4
|
130
128
|
summary: Various REST clients such as Facebook and Twitter built with [rest-core][].
|
131
129
|
test_files:
|
132
|
-
- test/dropbox/
|
130
|
+
- test/dropbox/test_dropbox.rb
|
133
131
|
- test/facebook/test_api.rb
|
134
132
|
- test/facebook/test_default.rb
|
135
133
|
- test/facebook/test_error.rb
|
136
134
|
- test/facebook/test_handler.rb
|
137
|
-
- test/facebook/test_load_config.rb
|
138
135
|
- test/facebook/test_misc.rb
|
139
136
|
- test/facebook/test_oauth.rb
|
140
137
|
- test/facebook/test_old.rb
|
@@ -142,5 +139,6 @@ test_files:
|
|
142
139
|
- test/facebook/test_parse.rb
|
143
140
|
- test/facebook/test_serialize.rb
|
144
141
|
- test/facebook/test_timeout.rb
|
145
|
-
- test/
|
146
|
-
- test/
|
142
|
+
- test/firebase/test_firebase.rb
|
143
|
+
- test/instagram/test_instagram.rb
|
144
|
+
- test/twitter/test_twitter.rb
|
@@ -1,61 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'erb'
|
3
|
-
require 'yaml'
|
4
|
-
|
5
|
-
module RestCore; end
|
6
|
-
module RestCore::Config
|
7
|
-
extend self
|
8
|
-
|
9
|
-
DefaultModuleName = 'DefaultAttributes'
|
10
|
-
|
11
|
-
def load_for_rails klass, namespace=nil, app=Rails
|
12
|
-
default_attributes_module(klass) # make sure the default is there
|
13
|
-
# even if there's no config file
|
14
|
-
root = File.expand_path(app.root)
|
15
|
-
path = ["#{root}/config/rest-core.yaml", # YAML should use .yaml
|
16
|
-
"#{root}/config/rest-core.yml" ].find{|p| File.exist?(p)}
|
17
|
-
return if path.nil?
|
18
|
-
RestCore::Config.load(klass, path, app.env, namespace)
|
19
|
-
end
|
20
|
-
|
21
|
-
def load klass, path, env, namespace=nil
|
22
|
-
config = YAML.load(ERB.new(File.read(path)).result(binding))
|
23
|
-
defaults = config[env]
|
24
|
-
return false unless defaults
|
25
|
-
return false unless defaults[namespace] if namespace
|
26
|
-
data = if namespace
|
27
|
-
defaults[namespace]
|
28
|
-
else
|
29
|
-
defaults
|
30
|
-
end
|
31
|
-
raise ArgumentError.new("#{data} is not a hash") unless
|
32
|
-
data.kind_of?(Hash)
|
33
|
-
|
34
|
-
default_attributes_module(klass).module_eval(
|
35
|
-
data.inject(["extend self\n"]){ |r, (k, v)|
|
36
|
-
# quote strings, leave others free (e.g. false, numbers, etc)
|
37
|
-
r << <<-RUBY
|
38
|
-
def default_#{k}
|
39
|
-
#{v.inspect}
|
40
|
-
end
|
41
|
-
RUBY
|
42
|
-
}.join, __FILE__, __LINE__)
|
43
|
-
end
|
44
|
-
|
45
|
-
def default_attributes_module klass
|
46
|
-
mod = if klass.const_defined?(DefaultModuleName)
|
47
|
-
klass.const_get(DefaultModuleName)
|
48
|
-
else
|
49
|
-
klass.send(:const_set, DefaultModuleName, Module.new)
|
50
|
-
end
|
51
|
-
|
52
|
-
singleton_class = if klass.respond_to?(:singleton_class)
|
53
|
-
klass.singleton_class
|
54
|
-
else
|
55
|
-
class << klass; self; end
|
56
|
-
end
|
57
|
-
|
58
|
-
klass.send(:extend, mod) unless singleton_class < mod
|
59
|
-
mod
|
60
|
-
end
|
61
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'rest-more/test'
|
3
|
-
|
4
|
-
require 'rest-core/util/config'
|
5
|
-
|
6
|
-
describe RC::Config do
|
7
|
-
|
8
|
-
before do
|
9
|
-
@klass = RC::Facebook.dup
|
10
|
-
end
|
11
|
-
|
12
|
-
after do
|
13
|
-
Muack.verify
|
14
|
-
end
|
15
|
-
|
16
|
-
def check
|
17
|
-
@klass.default_app_id .should.eq 41829
|
18
|
-
@klass.default_secret .should.eq 'r41829'.reverse
|
19
|
-
@klass.default_json_response.should.eq false
|
20
|
-
@klass.default_lang .should.eq 'zh-tw'
|
21
|
-
end
|
22
|
-
|
23
|
-
should 'honor rails config' do
|
24
|
-
app = Object.new
|
25
|
-
mock(app).env { 'test' }
|
26
|
-
mock(app).root{ File.dirname(__FILE__) }
|
27
|
-
RC::Config.load_for_rails(@klass, 'facebook', app)
|
28
|
-
check
|
29
|
-
end
|
30
|
-
|
31
|
-
should 'honor config' do
|
32
|
-
RC::Config.load(
|
33
|
-
@klass,
|
34
|
-
"#{File.dirname(__FILE__)}/config/rest-core.yaml",
|
35
|
-
'test',
|
36
|
-
'facebook')
|
37
|
-
check
|
38
|
-
end
|
39
|
-
end
|