rest-more 3.0.0 → 3.1.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.
- 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
|