api_resource 0.2.11 → 0.3.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/Gemfile +8 -2
- data/Gemfile.lock +85 -61
- data/VERSION +1 -1
- data/api_resource.gemspec +19 -9
- data/lib/api_resource.rb +46 -24
- data/lib/api_resource/associations.rb +15 -16
- data/lib/api_resource/associations/scope.rb +2 -1
- data/lib/api_resource/attributes.rb +72 -76
- data/lib/api_resource/base.rb +69 -53
- data/lib/api_resource/callbacks.rb +18 -22
- data/lib/api_resource/connection.rb +24 -1
- data/lib/api_resource/custom_methods.rb +23 -25
- data/lib/api_resource/formats.rb +9 -1
- data/lib/api_resource/model_errors.rb +36 -40
- data/lib/api_resource/observing.rb +9 -11
- data/lib/api_resource/scopes.rb +12 -12
- data/spec/lib/api_resource_spec.rb +43 -0
- data/spec/lib/associations_spec.rb +4 -3
- data/spec/lib/base_spec.rb +28 -0
- data/spec/spec_helper.rb +0 -1
- metadata +84 -50
@@ -51,7 +51,13 @@ module ApiResource
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def get(path, headers = {})
|
54
|
-
|
54
|
+
# our site and headers for this request
|
55
|
+
site = self.site.merge(path)
|
56
|
+
headers = build_request_headers(headers, :get, site)
|
57
|
+
|
58
|
+
self.with_caching(path, headers) do
|
59
|
+
format.decode(request(:get, path, headers))
|
60
|
+
end
|
55
61
|
end
|
56
62
|
|
57
63
|
def delete(path, headers = {})
|
@@ -81,6 +87,23 @@ module ApiResource
|
|
81
87
|
end
|
82
88
|
end
|
83
89
|
|
90
|
+
protected
|
91
|
+
|
92
|
+
def cache_key(path, headers)
|
93
|
+
key = Digest::MD5.hexdigest([path, headers].to_s)
|
94
|
+
return "a-#{key}-#{ApiResource::Base.ttl}"
|
95
|
+
end
|
96
|
+
|
97
|
+
def with_caching(path, data = {}, &block)
|
98
|
+
if ApiResource::Base.ttl.to_f > 0.0
|
99
|
+
key = self.cache_key(path, data)
|
100
|
+
ApiResource.cache.fetch(key, :expires_in => ApiResource::Base.ttl) do
|
101
|
+
yield
|
102
|
+
end
|
103
|
+
else
|
104
|
+
yield
|
105
|
+
end
|
106
|
+
end
|
84
107
|
|
85
108
|
private
|
86
109
|
# Makes a request to the remote service.
|
@@ -83,37 +83,35 @@ module ApiResource
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
end
|
86
|
+
def get(method_name, options = {})
|
87
|
+
connection.get(custom_method_element_url(method_name, options), self.class.headers)
|
88
|
+
end
|
90
89
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
end
|
90
|
+
def post(method_name, options = {}, body = nil)
|
91
|
+
request_body = body.blank? ? encode : body
|
92
|
+
if new?
|
93
|
+
connection.post(custom_method_new_element_url(method_name, options), request_body, self.class.headers)
|
94
|
+
else
|
95
|
+
connection.post(custom_method_element_url(method_name, options), request_body, self.class.headers)
|
98
96
|
end
|
97
|
+
end
|
99
98
|
|
100
|
-
|
101
|
-
|
102
|
-
|
99
|
+
def put(method_name, options = {}, body = '')
|
100
|
+
connection.put(custom_method_element_url(method_name, options), body, self.class.headers)
|
101
|
+
end
|
103
102
|
|
104
|
-
|
105
|
-
|
106
|
-
|
103
|
+
def delete(method_name, options = {})
|
104
|
+
connection.delete(custom_method_element_url(method_name, options), self.class.headers)
|
105
|
+
end
|
107
106
|
|
108
107
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
108
|
+
private
|
109
|
+
def custom_method_element_url(method_name, options = {})
|
110
|
+
"#{self.class.prefix(prefix_options)}#{self.class.collection_name}/#{id}/#{method_name}.#{self.class.format.extension}#{self.class.__send__(:query_string, options)}"
|
111
|
+
end
|
113
112
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
end
|
113
|
+
def custom_method_new_element_url(method_name, options = {})
|
114
|
+
"#{self.class.prefix(prefix_options)}#{self.class.collection_name}/new/#{method_name}.#{self.class.format.extension}#{self.class.__send__(:query_string, options)}"
|
115
|
+
end
|
118
116
|
end
|
119
117
|
end
|
data/lib/api_resource/formats.rb
CHANGED
@@ -8,7 +8,15 @@ module ApiResource
|
|
8
8
|
# ActiveResource::Formats[:xml] # => ActiveResource::Formats::XmlFormat
|
9
9
|
# ActiveResource::Formats[:json] # => ActiveResource::Formats::JsonFormat
|
10
10
|
def self.[](mime_type_reference)
|
11
|
-
|
11
|
+
format_name = ActiveSupport::Inflector.camelize(mime_type_reference.to_s) + "Format"
|
12
|
+
begin
|
13
|
+
ApiResource::Formats.const_get(format_name)
|
14
|
+
rescue NameError => e
|
15
|
+
raise BadFormat.new("#{mime_type_reference} is not a valid format")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class BadFormat < StandardError
|
12
20
|
end
|
13
21
|
end
|
14
22
|
end
|
@@ -35,50 +35,46 @@ module ApiResource
|
|
35
35
|
alias_method_chain :save, :validations
|
36
36
|
end
|
37
37
|
|
38
|
-
|
38
|
+
def save_with_validations(*args)
|
39
|
+
# we want to leave the original intact
|
40
|
+
options = args.clone.extract_options!
|
39
41
|
|
40
|
-
|
41
|
-
# we want to leave the original intact
|
42
|
-
options = args.clone.extract_options!
|
43
|
-
|
44
|
-
perform_validation = options.blank? ? true : options[:validate]
|
45
|
-
|
46
|
-
@remote_errors = nil
|
47
|
-
if perform_validation && valid? || !perform_validation
|
48
|
-
save_without_validations(*args)
|
49
|
-
true
|
50
|
-
else
|
51
|
-
false
|
52
|
-
end
|
53
|
-
rescue ApiResource::UnprocessableEntity => error
|
54
|
-
@remote_errors = error
|
55
|
-
load_remote_errors(@remote_errors, true)
|
56
|
-
false
|
57
|
-
end
|
58
|
-
|
59
|
-
def load_remote_errors(remote_errors, save_cache = false)
|
60
|
-
error_data = self.class.format.decode(remote_errors.response.body)['errors'] || {}
|
61
|
-
if error_data.is_a?(Hash)
|
62
|
-
self.errors.from_hash(error_data)
|
63
|
-
elsif error_data.is_a?(Array)
|
64
|
-
self.errors.from_array(error_data)
|
65
|
-
else
|
66
|
-
raise Exception.new
|
67
|
-
end
|
68
|
-
rescue Exception
|
69
|
-
raise "Invalid response for invalid object: expected an array or hash got #{remote_errors}"
|
70
|
-
end
|
42
|
+
perform_validation = options.blank? ? true : options[:validate]
|
71
43
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
44
|
+
@remote_errors = nil
|
45
|
+
if perform_validation && valid? || !perform_validation
|
46
|
+
save_without_validations(*args)
|
47
|
+
true
|
48
|
+
else
|
49
|
+
false
|
76
50
|
end
|
77
|
-
|
78
|
-
|
79
|
-
|
51
|
+
rescue ApiResource::UnprocessableEntity => error
|
52
|
+
@remote_errors = error
|
53
|
+
load_remote_errors(@remote_errors, true)
|
54
|
+
false
|
55
|
+
end
|
56
|
+
|
57
|
+
def load_remote_errors(remote_errors, save_cache = false)
|
58
|
+
error_data = self.class.format.decode(remote_errors.response.body)['errors'] || {}
|
59
|
+
if error_data.is_a?(Hash)
|
60
|
+
self.errors.from_hash(error_data)
|
61
|
+
elsif error_data.is_a?(Array)
|
62
|
+
self.errors.from_array(error_data)
|
63
|
+
else
|
64
|
+
raise Exception.new
|
80
65
|
end
|
81
|
-
|
66
|
+
rescue Exception
|
67
|
+
raise "Invalid response for invalid object: expected an array or hash got #{remote_errors}"
|
68
|
+
end
|
69
|
+
|
70
|
+
# This method runs any local validations but not remote ones
|
71
|
+
def valid?
|
72
|
+
super
|
73
|
+
errors.empty?
|
74
|
+
end
|
75
|
+
|
76
|
+
def errors
|
77
|
+
@errors ||= ApiResource::Errors.new(self)
|
82
78
|
end
|
83
79
|
|
84
80
|
end
|
@@ -11,18 +11,16 @@ module ApiResource
|
|
11
11
|
alias_method_chain method, :observers
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
notify_observers(:after_#{method})
|
21
|
-
end
|
22
|
-
return result
|
14
|
+
%w( create save update destroy ).each do |method|
|
15
|
+
module_eval <<-EOE, __FILE__, __LINE__ + 1
|
16
|
+
def #{method}_with_observers(*args)
|
17
|
+
notify_observers(:before_#method)
|
18
|
+
if result = #{method}_without_observers(*args)
|
19
|
+
notify_observers(:after_#{method})
|
23
20
|
end
|
24
|
-
|
25
|
-
|
21
|
+
return result
|
22
|
+
end
|
23
|
+
EOE
|
26
24
|
end
|
27
25
|
|
28
26
|
end
|
data/lib/api_resource/scopes.rb
CHANGED
@@ -28,18 +28,18 @@ module ApiResource
|
|
28
28
|
self.related_objects[:scope][name.to_sym]
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
def scope_attributes(name)
|
41
|
-
return self.class.scope_attributes(name)
|
42
|
-
end
|
31
|
+
|
32
|
+
def scopes
|
33
|
+
return self.class.scopes
|
34
|
+
end
|
35
|
+
|
36
|
+
def scope?(name)
|
37
|
+
return self.class.scope?(name)
|
43
38
|
end
|
39
|
+
|
40
|
+
def scope_attributes(name)
|
41
|
+
return self.class.scope_attributes(name)
|
42
|
+
end
|
43
|
+
|
44
44
|
end
|
45
45
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ApiResource do
|
4
|
+
|
5
|
+
context ".cache" do
|
6
|
+
|
7
|
+
around(:each) do |example|
|
8
|
+
begin
|
9
|
+
old_rails = Object.send(:remove_const, :Rails)
|
10
|
+
example.run
|
11
|
+
ensure
|
12
|
+
Rails = old_rails
|
13
|
+
ApiResource
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be a Rails cache if it's initialized" do
|
18
|
+
cache_stub = stub()
|
19
|
+
Rails = mock(:cache => cache_stub)
|
20
|
+
ApiResource.cache(true).should be cache_stub
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should default to an instance of memory cache" do
|
24
|
+
defined?(Rails).should be_blank
|
25
|
+
ApiResource.cache(true).should be_a(
|
26
|
+
ActiveSupport::Cache::MemoryStore
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context ".with_ttl" do
|
32
|
+
|
33
|
+
it "should temporarily set ttl for a block" do
|
34
|
+
old_ttl = ApiResource.ttl
|
35
|
+
ApiResource.with_ttl(10) do
|
36
|
+
ApiResource.ttl.should eql(10)
|
37
|
+
end
|
38
|
+
ApiResource.ttl.should eql(old_ttl)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -52,7 +52,7 @@ describe "Associations" do
|
|
52
52
|
|
53
53
|
it "should only define relationships for the given class - they should not cascade" do
|
54
54
|
TestResource.belongs_to :belongs_to_object
|
55
|
-
AnotherTestResource.association?(:belongs_to_object).should_not
|
55
|
+
AnotherTestResource.association?(:belongs_to_object).should_not be_true
|
56
56
|
end
|
57
57
|
|
58
58
|
it "should have its relationship cascade when sub-classed" do
|
@@ -295,7 +295,6 @@ describe "Associations" do
|
|
295
295
|
|
296
296
|
|
297
297
|
it "should be able to query scopes on the current model" do
|
298
|
-
|
299
298
|
ScopeResource.one.to_query.should eql "one=true"
|
300
299
|
ScopeResource.two("test").to_query.should eql "two=test"
|
301
300
|
ScopeResource.three(1,2,3).to_query.should eql "three[]=1&three[]=2&three[]=3"
|
@@ -518,6 +517,7 @@ describe "Associations" do
|
|
518
517
|
end
|
519
518
|
|
520
519
|
it "should assign associations to the correct type on initialization" do
|
520
|
+
#binding.pry
|
521
521
|
tr = TestResource.new(:has_one_object => {:name => "Dan"}, :belongs_to_object => {:name => "Dan"})
|
522
522
|
|
523
523
|
tr.has_one_object.internal_object.should be_instance_of HasOneObject
|
@@ -563,7 +563,8 @@ describe "Associations" do
|
|
563
563
|
context "ActiveModel" do
|
564
564
|
before(:all) do
|
565
565
|
require 'active_record'
|
566
|
-
|
566
|
+
db_path = File.expand_path(File.dirname(__FILE__) + "/../tmp/api_resource_test_db.sqlite")
|
567
|
+
ActiveRecord::Base.establish_connection({"adapter" => "sqlite3", "database" => db_path})
|
567
568
|
ActiveRecord::Base.connection.create_table(:test_ars, :force => true) do |t|
|
568
569
|
t.integer(:test_resource_id)
|
569
570
|
end
|
data/spec/lib/base_spec.rb
CHANGED
@@ -162,6 +162,10 @@ describe "Base" do
|
|
162
162
|
TestResource.format.extension.to_sym.should eql(:xml)
|
163
163
|
TestResource.format = :json
|
164
164
|
end
|
165
|
+
|
166
|
+
it "should only allow proper formats to be set" do
|
167
|
+
expect {TestResource.format = :blah}.should raise_error(::ApiResource::Formats::BadFormat)
|
168
|
+
end
|
165
169
|
|
166
170
|
it "should be able to set an http timeout" do
|
167
171
|
TestResource.timeout = 5
|
@@ -579,5 +583,29 @@ describe "Base" do
|
|
579
583
|
end
|
580
584
|
|
581
585
|
end
|
586
|
+
|
587
|
+
context ".get" do
|
588
|
+
|
589
|
+
context "with ttl" do
|
590
|
+
around(:each) do |example|
|
591
|
+
|
592
|
+
begin
|
593
|
+
initial = ApiResource::Base.ttl
|
594
|
+
ApiResource::Base.ttl = 1
|
595
|
+
example.run
|
596
|
+
ensure
|
597
|
+
ApiResource::Base.ttl = initial
|
598
|
+
end
|
599
|
+
|
600
|
+
end
|
601
|
+
|
602
|
+
it "should implement caching using the ttl setting" do
|
603
|
+
cache = mock(:fetch => {:id => 123, :name => "Dan"})
|
604
|
+
ApiResource.stubs(:cache => cache)
|
605
|
+
TestResource.find(123)
|
606
|
+
end
|
607
|
+
end
|
608
|
+
|
609
|
+
end
|
582
610
|
|
583
611
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api_resource
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &2157448720 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 3
|
21
|
+
version: '3'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2157448720
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: hash_dealer
|
27
|
-
requirement: &
|
27
|
+
requirement: &2157445640 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2157445640
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rest-client
|
38
|
-
requirement: &
|
38
|
+
requirement: &2157443060 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2157443060
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: log4r
|
49
|
-
requirement: &
|
49
|
+
requirement: &2157441760 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2157441760
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: differ
|
60
|
-
requirement: &
|
60
|
+
requirement: &2157438700 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2157438700
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: colorize
|
71
|
-
requirement: &
|
71
|
+
requirement: &2157427000 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *2157427000
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: json
|
82
|
-
requirement: &
|
82
|
+
requirement: &2157425020 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,43 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *2157425020
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: pry
|
93
|
+
requirement: &2157421560 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *2157421560
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: pry-doc
|
104
|
+
requirement: &2157417420 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: *2157417420
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: pry-nav
|
115
|
+
requirement: &2157416240 !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ! '>='
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
type: :development
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: *2157416240
|
91
124
|
- !ruby/object:Gem::Dependency
|
92
125
|
name: rspec
|
93
|
-
requirement: &
|
126
|
+
requirement: &2157415120 !ruby/object:Gem::Requirement
|
94
127
|
none: false
|
95
128
|
requirements:
|
96
129
|
- - ! '>='
|
@@ -98,10 +131,10 @@ dependencies:
|
|
98
131
|
version: '0'
|
99
132
|
type: :development
|
100
133
|
prerelease: false
|
101
|
-
version_requirements: *
|
134
|
+
version_requirements: *2157415120
|
102
135
|
- !ruby/object:Gem::Dependency
|
103
136
|
name: ruby-debug19
|
104
|
-
requirement: &
|
137
|
+
requirement: &2157408240 !ruby/object:Gem::Requirement
|
105
138
|
none: false
|
106
139
|
requirements:
|
107
140
|
- - ! '>='
|
@@ -109,10 +142,10 @@ dependencies:
|
|
109
142
|
version: '0'
|
110
143
|
type: :development
|
111
144
|
prerelease: false
|
112
|
-
version_requirements: *
|
145
|
+
version_requirements: *2157408240
|
113
146
|
- !ruby/object:Gem::Dependency
|
114
147
|
name: growl
|
115
|
-
requirement: &
|
148
|
+
requirement: &2157406740 !ruby/object:Gem::Requirement
|
116
149
|
none: false
|
117
150
|
requirements:
|
118
151
|
- - ! '>='
|
@@ -120,10 +153,10 @@ dependencies:
|
|
120
153
|
version: '0'
|
121
154
|
type: :development
|
122
155
|
prerelease: false
|
123
|
-
version_requirements: *
|
156
|
+
version_requirements: *2157406740
|
124
157
|
- !ruby/object:Gem::Dependency
|
125
158
|
name: rspec-rails
|
126
|
-
requirement: &
|
159
|
+
requirement: &2157405020 !ruby/object:Gem::Requirement
|
127
160
|
none: false
|
128
161
|
requirements:
|
129
162
|
- - ! '>='
|
@@ -131,10 +164,10 @@ dependencies:
|
|
131
164
|
version: '0'
|
132
165
|
type: :development
|
133
166
|
prerelease: false
|
134
|
-
version_requirements: *
|
167
|
+
version_requirements: *2157405020
|
135
168
|
- !ruby/object:Gem::Dependency
|
136
169
|
name: factory_girl
|
137
|
-
requirement: &
|
170
|
+
requirement: &2157402240 !ruby/object:Gem::Requirement
|
138
171
|
none: false
|
139
172
|
requirements:
|
140
173
|
- - ! '>='
|
@@ -142,10 +175,10 @@ dependencies:
|
|
142
175
|
version: '0'
|
143
176
|
type: :development
|
144
177
|
prerelease: false
|
145
|
-
version_requirements: *
|
178
|
+
version_requirements: *2157402240
|
146
179
|
- !ruby/object:Gem::Dependency
|
147
180
|
name: simplecov
|
148
|
-
requirement: &
|
181
|
+
requirement: &2157394860 !ruby/object:Gem::Requirement
|
149
182
|
none: false
|
150
183
|
requirements:
|
151
184
|
- - ! '>='
|
@@ -153,10 +186,10 @@ dependencies:
|
|
153
186
|
version: '0'
|
154
187
|
type: :development
|
155
188
|
prerelease: false
|
156
|
-
version_requirements: *
|
189
|
+
version_requirements: *2157394860
|
157
190
|
- !ruby/object:Gem::Dependency
|
158
191
|
name: faker
|
159
|
-
requirement: &
|
192
|
+
requirement: &2157392560 !ruby/object:Gem::Requirement
|
160
193
|
none: false
|
161
194
|
requirements:
|
162
195
|
- - ! '>='
|
@@ -164,10 +197,10 @@ dependencies:
|
|
164
197
|
version: '0'
|
165
198
|
type: :development
|
166
199
|
prerelease: false
|
167
|
-
version_requirements: *
|
200
|
+
version_requirements: *2157392560
|
168
201
|
- !ruby/object:Gem::Dependency
|
169
202
|
name: guard
|
170
|
-
requirement: &
|
203
|
+
requirement: &2157391740 !ruby/object:Gem::Requirement
|
171
204
|
none: false
|
172
205
|
requirements:
|
173
206
|
- - ! '>='
|
@@ -175,10 +208,10 @@ dependencies:
|
|
175
208
|
version: '0'
|
176
209
|
type: :development
|
177
210
|
prerelease: false
|
178
|
-
version_requirements: *
|
211
|
+
version_requirements: *2157391740
|
179
212
|
- !ruby/object:Gem::Dependency
|
180
213
|
name: guard-rspec
|
181
|
-
requirement: &
|
214
|
+
requirement: &2157390760 !ruby/object:Gem::Requirement
|
182
215
|
none: false
|
183
216
|
requirements:
|
184
217
|
- - ! '>='
|
@@ -186,10 +219,10 @@ dependencies:
|
|
186
219
|
version: '0'
|
187
220
|
type: :development
|
188
221
|
prerelease: false
|
189
|
-
version_requirements: *
|
222
|
+
version_requirements: *2157390760
|
190
223
|
- !ruby/object:Gem::Dependency
|
191
224
|
name: mocha
|
192
|
-
requirement: &
|
225
|
+
requirement: &2157389540 !ruby/object:Gem::Requirement
|
193
226
|
none: false
|
194
227
|
requirements:
|
195
228
|
- - ! '>='
|
@@ -197,10 +230,10 @@ dependencies:
|
|
197
230
|
version: '0'
|
198
231
|
type: :development
|
199
232
|
prerelease: false
|
200
|
-
version_requirements: *
|
233
|
+
version_requirements: *2157389540
|
201
234
|
- !ruby/object:Gem::Dependency
|
202
235
|
name: bundler
|
203
|
-
requirement: &
|
236
|
+
requirement: &2157384400 !ruby/object:Gem::Requirement
|
204
237
|
none: false
|
205
238
|
requirements:
|
206
239
|
- - ! '>='
|
@@ -208,10 +241,10 @@ dependencies:
|
|
208
241
|
version: '0'
|
209
242
|
type: :development
|
210
243
|
prerelease: false
|
211
|
-
version_requirements: *
|
244
|
+
version_requirements: *2157384400
|
212
245
|
- !ruby/object:Gem::Dependency
|
213
246
|
name: jeweler
|
214
|
-
requirement: &
|
247
|
+
requirement: &2157381720 !ruby/object:Gem::Requirement
|
215
248
|
none: false
|
216
249
|
requirements:
|
217
250
|
- - ~>
|
@@ -219,21 +252,21 @@ dependencies:
|
|
219
252
|
version: 1.6.4
|
220
253
|
type: :development
|
221
254
|
prerelease: false
|
222
|
-
version_requirements: *
|
255
|
+
version_requirements: *2157381720
|
223
256
|
- !ruby/object:Gem::Dependency
|
224
257
|
name: activerecord
|
225
|
-
requirement: &
|
258
|
+
requirement: &2157379880 !ruby/object:Gem::Requirement
|
226
259
|
none: false
|
227
260
|
requirements:
|
228
|
-
- -
|
261
|
+
- - ~>
|
229
262
|
- !ruby/object:Gem::Version
|
230
|
-
version: 3
|
263
|
+
version: '3'
|
231
264
|
type: :development
|
232
265
|
prerelease: false
|
233
|
-
version_requirements: *
|
266
|
+
version_requirements: *2157379880
|
234
267
|
- !ruby/object:Gem::Dependency
|
235
268
|
name: sqlite3
|
236
|
-
requirement: &
|
269
|
+
requirement: &2157378660 !ruby/object:Gem::Requirement
|
237
270
|
none: false
|
238
271
|
requirements:
|
239
272
|
- - ! '>='
|
@@ -241,7 +274,7 @@ dependencies:
|
|
241
274
|
version: '0'
|
242
275
|
type: :development
|
243
276
|
prerelease: false
|
244
|
-
version_requirements: *
|
277
|
+
version_requirements: *2157378660
|
245
278
|
description: A replacement for ActiveResource for RESTful APIs that handles associated
|
246
279
|
object and multiple data sources
|
247
280
|
email: ejl6266@gmail.com
|
@@ -294,6 +327,7 @@ files:
|
|
294
327
|
- lib/api_resource/railtie.rb
|
295
328
|
- lib/api_resource/scopes.rb
|
296
329
|
- nohup.out
|
330
|
+
- spec/lib/api_resource_spec.rb
|
297
331
|
- spec/lib/associations_spec.rb
|
298
332
|
- spec/lib/attributes_spec.rb
|
299
333
|
- spec/lib/base_spec.rb
|
@@ -325,7 +359,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
325
359
|
version: '0'
|
326
360
|
segments:
|
327
361
|
- 0
|
328
|
-
hash:
|
362
|
+
hash: 391851535398052430
|
329
363
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
330
364
|
none: false
|
331
365
|
requirements:
|
@@ -334,7 +368,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
334
368
|
version: '0'
|
335
369
|
requirements: []
|
336
370
|
rubyforge_project:
|
337
|
-
rubygems_version: 1.8.
|
371
|
+
rubygems_version: 1.8.11
|
338
372
|
signing_key:
|
339
373
|
specification_version: 3
|
340
374
|
summary: A replacement for ActiveResource for RESTful APIs that handles associated
|