rest-more 2.0.4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -6
- data/.gitignore +1 -2
- data/.gitmodules +1 -1
- data/.travis.yml +5 -4
- data/CHANGES.md +1 -1
- data/Gemfile +16 -10
- data/README.md +209 -44
- data/Rakefile +11 -22
- data/doc/{tutorial/facebook.md → facebook.md} +1 -1
- data/example/multi.rb +3 -3
- data/example/rails3/Gemfile +18 -8
- data/example/rails3/app/controllers/application_controller.rb +2 -5
- data/example/rails3/config/application.rb +1 -1
- data/example/rails3/test/functional/application_controller_test.rb +0 -12
- data/example/rails3/test/test_helper.rb +12 -5
- data/example/rails3/test/unit/rails_util_test.rb +1 -6
- data/example/simple.rb +2 -2
- data/lib/rest-core/client/firebase.rb +50 -0
- data/lib/rest-core/client/instagram.rb +59 -0
- data/lib/rest-core/client/linkedin.rb +0 -4
- data/lib/rest-more.rb +8 -6
- data/lib/rest-more/test.rb +0 -11
- data/lib/rest-more/version.rb +1 -1
- data/rest-more.gemspec +20 -17
- data/task/README.md +54 -0
- data/task/gemgem.rb +151 -156
- data/test/dropbox/test_api.rb +1 -1
- data/test/facebook/test_api.rb +6 -7
- data/test/facebook/test_error.rb +1 -1
- data/test/facebook/test_handler.rb +2 -2
- data/test/facebook/test_load_config.rb +1 -1
- data/test/facebook/test_misc.rb +4 -14
- data/test/facebook/test_oauth.rb +1 -1
- data/test/facebook/test_old.rb +1 -1
- data/test/facebook/test_page.rb +4 -5
- data/test/facebook/test_parse.rb +0 -7
- data/test/facebook/test_serialize.rb +1 -1
- data/test/facebook/test_timeout.rb +4 -4
- data/test/instagram/test_api.rb +54 -0
- data/test/twitter/test_api.rb +1 -1
- metadata +26 -23
- data/example/rainbows.rb +0 -67
- data/task/.gitignore +0 -1
data/Rakefile
CHANGED
@@ -1,34 +1,23 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
|
3
2
|
begin
|
4
3
|
require "#{dir = File.dirname(__FILE__)}/task/gemgem"
|
5
4
|
rescue LoadError
|
6
|
-
sh
|
7
|
-
exec Gem.ruby,
|
5
|
+
sh 'git submodule update --init'
|
6
|
+
exec Gem.ruby, '-S', $PROGRAM_NAME, *ARGV
|
8
7
|
end
|
9
8
|
|
10
|
-
|
11
|
-
($LOAD_PATH << File.expand_path("#{Gemgem.dir}/lib" ) <<
|
12
|
-
File.expand_path("#{Gemgem.dir}/rest-core/lib")).uniq!
|
9
|
+
$LOAD_PATH.unshift(File.expand_path("#{dir}/rest-core/lib"))
|
13
10
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
s.version = RestMore::VERSION
|
20
|
-
s.homepage = 'https://github.com/cardinalblue/rest-more'
|
11
|
+
Gemgem.init(dir) do |s|
|
12
|
+
require 'rest-more/version'
|
13
|
+
s.name = 'rest-more'
|
14
|
+
s.version = RestMore::VERSION
|
15
|
+
s.homepage = 'https://github.com/godfat/rest-more'
|
21
16
|
|
22
|
-
|
17
|
+
%w[rest-core].each{ |g| s.add_runtime_dependency(g, '>=3.0.0') }
|
23
18
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
# exclude rest-core
|
28
|
-
s.files.reject!{ |f| f.start_with?('rest-core/') }
|
29
|
-
end
|
30
|
-
|
31
|
-
Gemgem.write
|
19
|
+
# exclude rest-core
|
20
|
+
s.files.reject!{ |f| f.start_with?('rest-core/') }
|
32
21
|
end
|
33
22
|
|
34
23
|
module Gemgem
|
@@ -170,4 +170,4 @@
|
|
170
170
|
|
171
171
|
That's it!
|
172
172
|
|
173
|
-
15. More information on customizing rest-more and its functions are to be found here: <https://github.com/
|
173
|
+
15. More information on customizing rest-more and its functions are to be found here: <https://github.com/godfat/rest-more>
|
data/example/multi.rb
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
require 'rest-more'
|
3
3
|
|
4
4
|
facebook = RC::Facebook.new(:log_method => method(:puts))
|
5
|
-
puts "
|
5
|
+
puts "httpclient with threads doing concurrent requests"
|
6
6
|
a = [facebook.get('4'), facebook.get('5')]
|
7
7
|
puts "It's not blocking... but doing concurrent requests underneath"
|
8
8
|
p a.map{ |r| r['name'] } # here we want the values, so it blocks here
|
9
9
|
puts "DONE"
|
10
10
|
|
11
11
|
puts "callback also works"
|
12
|
-
facebook.get('6')
|
12
|
+
facebook.get('6') do |r|
|
13
13
|
p r['name']
|
14
|
-
|
14
|
+
end
|
15
15
|
puts "It's not blocking... but doing concurrent requests underneath"
|
16
16
|
facebook.wait # we block here to wait for the request done
|
17
17
|
puts "DONE"
|
data/example/rails3/Gemfile
CHANGED
@@ -1,22 +1,32 @@
|
|
1
1
|
|
2
|
-
source '
|
2
|
+
source 'https://rubygems.org/'
|
3
3
|
|
4
|
-
gem 'rails', '3.2.
|
4
|
+
gem 'rails', '3.2.16'
|
5
5
|
|
6
|
-
gem 'rest-client' # for rest-core
|
7
6
|
gem 'rest-core', :path => '../../rest-core'
|
8
7
|
gem 'rest-more', :path => '../../'
|
9
8
|
|
10
|
-
group
|
11
|
-
gem '
|
9
|
+
group :test do
|
10
|
+
gem 'muack'
|
12
11
|
gem 'webmock'
|
13
12
|
end
|
14
13
|
|
15
|
-
platforms
|
14
|
+
platforms :ruby do
|
16
15
|
gem 'yajl-ruby'
|
17
|
-
gem 'psych' # why?
|
18
16
|
end
|
19
17
|
|
20
|
-
platforms
|
18
|
+
platforms :jruby do
|
21
19
|
gem 'jruby-openssl'
|
22
20
|
end
|
21
|
+
|
22
|
+
platforms :rbx do
|
23
|
+
gem 'rubysl-fiber' # used in rest-core
|
24
|
+
gem 'rubysl-weakref' # used in rest-core
|
25
|
+
gem 'rubysl-singleton' # used in rake
|
26
|
+
gem 'rubysl-rexml' # used in crack used in webmock
|
27
|
+
gem 'rubysl-bigdecimal' # used in crack used in webmock
|
28
|
+
gem 'rubysl-test-unit' # used in activesupport
|
29
|
+
gem 'rubysl-enumerator' # used in activesupport
|
30
|
+
gem 'rubysl-benchmark' # used in activesupport
|
31
|
+
gem 'racc' # used in journey used in actionpack
|
32
|
+
end
|
@@ -41,11 +41,8 @@ class ApplicationController < ActionController::Base
|
|
41
41
|
url = rc_facebook.url('cache')
|
42
42
|
rc_facebook.get('cache').tap{}
|
43
43
|
rc_facebook.get('cache').tap{}
|
44
|
-
|
45
|
-
|
46
|
-
RC::REQUEST_METHOD => :get,
|
47
|
-
RC::REQUEST_PATH => rc_facebook.url('cache'),
|
48
|
-
&RC::Middleware.id))
|
44
|
+
res = rc_facebook.request_full(RC::REQUEST_PATH => url)
|
45
|
+
key = RC::Cache.new(nil, nil, nil).cache_key(res)
|
49
46
|
render :text => Rails.cache.read(key)
|
50
47
|
end
|
51
48
|
|
@@ -15,7 +15,7 @@ module Rails3
|
|
15
15
|
|
16
16
|
logger = Logger.new($stdout)
|
17
17
|
logger.level = Logger::INFO
|
18
|
-
config.logger = logger
|
18
|
+
config.logger = logger if $DEBUG
|
19
19
|
|
20
20
|
# Configure sensitive parameters which will be filtered from the log file.
|
21
21
|
config.filter_parameters += [:password]
|
@@ -1,14 +1,7 @@
|
|
1
1
|
|
2
2
|
require 'test_helper'
|
3
|
-
require 'webmock'
|
4
|
-
require 'rr'
|
5
|
-
|
6
|
-
WebMock.disable_net_connect!
|
7
3
|
|
8
4
|
class ApplicationControllerTest < ActionController::TestCase
|
9
|
-
include WebMock::API
|
10
|
-
include RR::Adapters::TestUnit
|
11
|
-
|
12
5
|
def setup
|
13
6
|
body = rand(2) == 0 ? '{"error":{"type":"OAuthException"}}' :
|
14
7
|
'{"error_code":104}'
|
@@ -17,11 +10,6 @@ class ApplicationControllerTest < ActionController::TestCase
|
|
17
10
|
to_return(:body => body)
|
18
11
|
end
|
19
12
|
|
20
|
-
def teardown
|
21
|
-
RR.verify
|
22
|
-
WebMock.reset!
|
23
|
-
end
|
24
|
-
|
25
13
|
def assert_url expected
|
26
14
|
assert_equal(expected, normalize_url(assigns(:rc_facebook_authorize_url)))
|
27
15
|
if @response.status == 200 # js redirect
|
@@ -1,13 +1,20 @@
|
|
1
1
|
|
2
2
|
ENV["RAILS_ENV"] = "test"
|
3
3
|
require File.expand_path('../../config/environment', __FILE__)
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
end
|
4
|
+
require 'rails/test_help'
|
5
|
+
require 'webmock'
|
6
|
+
WebMock.disable_net_connect!
|
7
|
+
require 'muack'
|
9
8
|
|
10
9
|
class ActiveSupport::TestCase
|
10
|
+
include WebMock::API
|
11
|
+
include Muack::API
|
12
|
+
|
13
|
+
teardown do
|
14
|
+
WebMock.reset!
|
15
|
+
Muack.verify
|
16
|
+
end
|
17
|
+
|
11
18
|
def normalize_query query, amp='&'
|
12
19
|
'?' + query[1..-1].split(amp).sort.join(amp)
|
13
20
|
end
|
@@ -1,10 +1,7 @@
|
|
1
1
|
|
2
2
|
require 'test_helper'
|
3
|
-
require 'rr'
|
4
3
|
|
5
4
|
class RailsUtilTest < ActiveSupport::TestCase
|
6
|
-
include RR::Adapters::TestUnit
|
7
|
-
|
8
5
|
def setup_mock url
|
9
6
|
@controller = Class.new do
|
10
7
|
def self.helper dummy ; end
|
@@ -12,9 +9,7 @@ class RailsUtilTest < ActiveSupport::TestCase
|
|
12
9
|
include RestCore::Facebook::RailsUtil
|
13
10
|
end.new
|
14
11
|
mock(@controller).rc_facebook_in_canvas?{ false }
|
15
|
-
mock(@controller).request{
|
16
|
-
mock(Object.new).url{ url }
|
17
|
-
}
|
12
|
+
mock(@controller).request{ mock.url{ url }.object }
|
18
13
|
end
|
19
14
|
|
20
15
|
def test_rest_graph_normalized_request_uri_0
|
data/example/simple.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
2
|
require 'rest-more'
|
3
3
|
|
4
|
-
p RC::Twitter.new.statuses('
|
4
|
+
p RC::Twitter.new.statuses('godfat').first # get user tweets
|
5
5
|
puts
|
6
|
-
p RC::Github.new.get('users/
|
6
|
+
p RC::Github.new.get('users/godfat') # get user info
|
7
7
|
puts
|
8
8
|
p RC::Facebook.new.get('4') # get user info
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
require 'rest-core'
|
3
|
+
|
4
|
+
# https://www.firebase.com/docs/security/custom-login.html
|
5
|
+
# https://www.firebase.com/docs/rest-api.html
|
6
|
+
module RestCore
|
7
|
+
Firebase = Builder.client(:d, :secret, :auth) do
|
8
|
+
use Timeout , 10
|
9
|
+
|
10
|
+
use DefaultSite , 'https://SampleChat.firebaseIO-demo.com/'
|
11
|
+
use DefaultHeaders, {'Accept' => 'application/json'}
|
12
|
+
use DefaultQuery , nil
|
13
|
+
|
14
|
+
use CommonLogger , nil
|
15
|
+
use Cache , nil, 600 do
|
16
|
+
use ErrorHandler, lambda{ |env|
|
17
|
+
RuntimeError.new(env[RESPONSE_BODY]['message'])}
|
18
|
+
use ErrorDetectorHttp
|
19
|
+
use JsonResponse, true
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module RestCore::Firebase::Client
|
25
|
+
include RestCore
|
26
|
+
|
27
|
+
def generate_auth opts={}
|
28
|
+
header = {:typ => 'JWT', :alg => 'HS256'}
|
29
|
+
claims = {:v => 0, :iat => Time.now.to_i, :d => d}.merge(opts)
|
30
|
+
# http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-26
|
31
|
+
input = [header, claims].map{ |d| base64url(Json.encode(d)) }.join('.')
|
32
|
+
# http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-20
|
33
|
+
"#{input}.#{base64url(Hmac.sha256(secret, input))}"
|
34
|
+
end
|
35
|
+
|
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
|
+
private
|
43
|
+
def base64url str; [str].pack('m').tr('+/', '-_'); end
|
44
|
+
def default_query; {:auth => auth}; end
|
45
|
+
def default_auth ; generate_auth ; end
|
46
|
+
end
|
47
|
+
|
48
|
+
class RestCore::Firebase
|
49
|
+
include RestCore::Firebase::Client
|
50
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
require 'rest-core'
|
3
|
+
|
4
|
+
# http://instagram.com/developer/
|
5
|
+
module RestCore
|
6
|
+
Instagram = Builder.client(:client_id, :client_secret, :data) do
|
7
|
+
use Timeout , 10
|
8
|
+
|
9
|
+
use DefaultSite , 'https://api.instagram.com/'
|
10
|
+
use DefaultHeaders, {'Accept' => 'application/json'}
|
11
|
+
use DefaultQuery , nil
|
12
|
+
use Oauth2Query , nil
|
13
|
+
|
14
|
+
use CommonLogger , nil
|
15
|
+
use Cache , nil, 600 do
|
16
|
+
use ErrorHandler, lambda{ |env| RuntimeError.new(env[RESPONSE_BODY])}
|
17
|
+
use ErrorDetectorHttp
|
18
|
+
use JsonResponse, true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module RestCore::Instagram::Client
|
24
|
+
include RestCore
|
25
|
+
|
26
|
+
def me query={}, opts={}
|
27
|
+
get('v1/users/self', query, opts)
|
28
|
+
end
|
29
|
+
|
30
|
+
def access_token
|
31
|
+
data['access_token']
|
32
|
+
end
|
33
|
+
|
34
|
+
def access_token= token
|
35
|
+
data['access_token'] = token
|
36
|
+
end
|
37
|
+
|
38
|
+
def authorize_url query={}, opts={}
|
39
|
+
url('oauth/authorize', {:access_token => false,
|
40
|
+
:response_type => 'code'}.merge(query), opts)
|
41
|
+
end
|
42
|
+
|
43
|
+
def authorize! payload={}, opts={}
|
44
|
+
p = {:client_id => client_id, :client_secret => client_secret,
|
45
|
+
:grant_type => 'authorization_code' }.
|
46
|
+
merge(payload)
|
47
|
+
|
48
|
+
self.data = post('oauth/access_token', p, {:access_token => false,
|
49
|
+
:client_id => false}, opts)
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def default_data ; {}; end
|
54
|
+
def default_query; {:client_id => client_id}; end
|
55
|
+
end
|
56
|
+
|
57
|
+
class RestCore::Instagram
|
58
|
+
include RestCore::Instagram::Client
|
59
|
+
end
|
data/lib/rest-more.rb
CHANGED
@@ -2,11 +2,13 @@
|
|
2
2
|
require 'rest-core'
|
3
3
|
|
4
4
|
module RestCore
|
5
|
-
autoload :Config
|
5
|
+
autoload :Config , 'rest-core/util/config'
|
6
6
|
|
7
|
-
autoload :Dropbox
|
8
|
-
autoload :Facebook, 'rest-core/client/facebook'
|
9
|
-
autoload :
|
10
|
-
autoload :
|
11
|
-
autoload :
|
7
|
+
autoload :Dropbox , 'rest-core/client/dropbox'
|
8
|
+
autoload :Facebook , 'rest-core/client/facebook'
|
9
|
+
autoload :Firebase , 'rest-core/client/firebase'
|
10
|
+
autoload :Github , 'rest-core/client/github'
|
11
|
+
autoload :Instagram, 'rest-core/client/instagram'
|
12
|
+
autoload :Linkedin , 'rest-core/client/linkedin'
|
13
|
+
autoload :Twitter , 'rest-core/client/twitter'
|
12
14
|
end
|
data/lib/rest-more/test.rb
CHANGED
@@ -1,14 +1,3 @@
|
|
1
1
|
|
2
2
|
require 'rest-core/test'
|
3
3
|
require 'rest-more'
|
4
|
-
|
5
|
-
module TestHelper
|
6
|
-
module_function
|
7
|
-
def normalize_query query
|
8
|
-
'?' + query[1..-1].split('&').sort.join('&')
|
9
|
-
end
|
10
|
-
|
11
|
-
def normalize_url url
|
12
|
-
url.sub(/\?.+/){ |query| TestHelper.normalize_query(query) }
|
13
|
-
end
|
14
|
-
end
|
data/lib/rest-more/version.rb
CHANGED
data/rest-more.gemspec
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# stub: rest-more 3.0.0 ruby lib
|
2
3
|
|
3
4
|
Gem::Specification.new do |s|
|
4
5
|
s.name = "rest-more"
|
5
|
-
s.version = "
|
6
|
+
s.version = "3.0.0"
|
6
7
|
|
7
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.
|
9
|
-
"
|
10
|
-
|
11
|
-
s.
|
12
|
-
s.
|
13
|
-
s.email = ["dev (XD) cardinalblue.com"]
|
9
|
+
s.require_paths = ["lib"]
|
10
|
+
s.authors = ["Lin Jen-Shin (godfat)"]
|
11
|
+
s.date = "2014-05-04"
|
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
|
+
s.email = ["godfat (XD) godfat.org"]
|
14
14
|
s.executables = ["rib-rest-core"]
|
15
15
|
s.files = [
|
16
16
|
".gitignore",
|
@@ -23,7 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
"Rakefile",
|
24
24
|
"TODO.md",
|
25
25
|
"bin/rib-rest-core",
|
26
|
-
"doc/
|
26
|
+
"doc/facebook.md",
|
27
27
|
"example/multi.rb",
|
28
28
|
"example/rails3/Gemfile",
|
29
29
|
"example/rails3/README",
|
@@ -44,14 +44,15 @@ Gem::Specification.new do |s|
|
|
44
44
|
"example/rails3/test/functional/application_controller_test.rb",
|
45
45
|
"example/rails3/test/test_helper.rb",
|
46
46
|
"example/rails3/test/unit/rails_util_test.rb",
|
47
|
-
"example/rainbows.rb",
|
48
47
|
"example/simple.rb",
|
49
48
|
"example/sinatra/config.ru",
|
50
49
|
"lib/rest-core/client/dropbox.rb",
|
51
50
|
"lib/rest-core/client/facebook.rb",
|
52
51
|
"lib/rest-core/client/facebook/rails_util.rb",
|
52
|
+
"lib/rest-core/client/firebase.rb",
|
53
53
|
"lib/rest-core/client/github.rb",
|
54
54
|
"lib/rest-core/client/github/rails_util.rb",
|
55
|
+
"lib/rest-core/client/instagram.rb",
|
55
56
|
"lib/rest-core/client/linkedin.rb",
|
56
57
|
"lib/rest-core/client/linkedin/rails_util.rb",
|
57
58
|
"lib/rest-core/client/twitter.rb",
|
@@ -63,7 +64,7 @@ Gem::Specification.new do |s|
|
|
63
64
|
"lib/rest-more/version.rb",
|
64
65
|
"lib/rib/app/rest-core.rb",
|
65
66
|
"rest-more.gemspec",
|
66
|
-
"task
|
67
|
+
"task/README.md",
|
67
68
|
"task/gemgem.rb",
|
68
69
|
"test/dropbox/test_api.rb",
|
69
70
|
"test/facebook/config/rest-core.yaml",
|
@@ -79,11 +80,12 @@ Gem::Specification.new do |s|
|
|
79
80
|
"test/facebook/test_parse.rb",
|
80
81
|
"test/facebook/test_serialize.rb",
|
81
82
|
"test/facebook/test_timeout.rb",
|
83
|
+
"test/instagram/test_api.rb",
|
82
84
|
"test/twitter/test_api.rb"]
|
83
|
-
s.homepage = "https://github.com/
|
84
|
-
s.
|
85
|
-
s.rubygems_version = "2.
|
86
|
-
s.summary = "Various REST clients such as Facebook and Twitter built with [rest-core][]"
|
85
|
+
s.homepage = "https://github.com/godfat/rest-more"
|
86
|
+
s.licenses = ["Apache License 2.0"]
|
87
|
+
s.rubygems_version = "2.2.2"
|
88
|
+
s.summary = "Various REST clients such as Facebook and Twitter built with [rest-core][]."
|
87
89
|
s.test_files = [
|
88
90
|
"test/dropbox/test_api.rb",
|
89
91
|
"test/facebook/test_api.rb",
|
@@ -98,17 +100,18 @@ Gem::Specification.new do |s|
|
|
98
100
|
"test/facebook/test_parse.rb",
|
99
101
|
"test/facebook/test_serialize.rb",
|
100
102
|
"test/facebook/test_timeout.rb",
|
103
|
+
"test/instagram/test_api.rb",
|
101
104
|
"test/twitter/test_api.rb"]
|
102
105
|
|
103
106
|
if s.respond_to? :specification_version then
|
104
107
|
s.specification_version = 4
|
105
108
|
|
106
109
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
107
|
-
s.add_runtime_dependency(%q<rest-core>, [">=
|
110
|
+
s.add_runtime_dependency(%q<rest-core>, [">= 3.0.0"])
|
108
111
|
else
|
109
|
-
s.add_dependency(%q<rest-core>, [">=
|
112
|
+
s.add_dependency(%q<rest-core>, [">= 3.0.0"])
|
110
113
|
end
|
111
114
|
else
|
112
|
-
s.add_dependency(%q<rest-core>, [">=
|
115
|
+
s.add_dependency(%q<rest-core>, [">= 3.0.0"])
|
113
116
|
end
|
114
117
|
end
|