placid 0.0.6 → 0.0.7
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/.gitignore +2 -0
- data/Gemfile +1 -1
- data/History.md +8 -0
- data/Rakefile +7 -4
- data/lib/placid/exceptions.rb +10 -2
- data/lib/placid/helper.rb +9 -3
- data/lib/placid/model.rb +1 -1
- data/placid.gemspec +8 -3
- data/spec/{placid_config_spec.rb → placid/config_spec.rb} +0 -0
- data/spec/{placid_helper_spec.rb → placid/helper_spec.rb} +30 -9
- data/spec/{placid_model_spec.rb → placid/model_spec.rb} +114 -76
- metadata +12 -10
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
gemspec
|
data/History.md
CHANGED
data/Rakefile
CHANGED
@@ -4,9 +4,12 @@ require 'rspec/core/rake_task'
|
|
4
4
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
5
5
|
t.pattern = 'spec/**/*.rb'
|
6
6
|
t.rspec_opts = ['--color', '--format doc']
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
if RUBY_VERSION < "1.9"
|
8
|
+
t.rcov = true
|
9
|
+
t.rcov_opts = [
|
10
|
+
'--exclude /.gem/,/gems/,spec',
|
11
|
+
]
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
15
|
+
task :default => :spec
|
data/lib/placid/exceptions.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
module Placid
|
2
|
+
# Generic Placid exception
|
3
|
+
class PlacidError < RuntimeError
|
4
|
+
end
|
5
|
+
|
2
6
|
# Error parsing a JSON response
|
3
|
-
class JSONParseError <
|
7
|
+
class JSONParseError < PlacidError
|
4
8
|
def initialize(message, data='')
|
5
9
|
super(message)
|
6
10
|
@data = data
|
@@ -9,6 +13,10 @@ module Placid
|
|
9
13
|
end
|
10
14
|
|
11
15
|
# Error connecting to the REST API
|
12
|
-
class RestConnectionError <
|
16
|
+
class RestConnectionError < PlacidError
|
17
|
+
end
|
18
|
+
|
19
|
+
# Error with request path
|
20
|
+
class PathError < PlacidError
|
13
21
|
end
|
14
22
|
end
|
data/lib/placid/helper.rb
CHANGED
@@ -7,13 +7,14 @@ require 'placid/exceptions'
|
|
7
7
|
|
8
8
|
module Placid
|
9
9
|
module Helper
|
10
|
-
# Escape any special URI characters in `text`
|
11
|
-
# `nil` is treated as an empty string.
|
10
|
+
# Escape any special URI characters in `text` (except for '/') and return
|
11
|
+
# the escaped string. `nil` is treated as an empty string.
|
12
12
|
#
|
13
13
|
# @return [String]
|
14
14
|
#
|
15
15
|
def escape(text)
|
16
|
-
|
16
|
+
# Treat '/' as unreserved
|
17
|
+
URI.escape(text.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}/]"))
|
17
18
|
end
|
18
19
|
|
19
20
|
# Return a full URL for a REST API request to the given path, relative to
|
@@ -57,8 +58,13 @@ module Placid
|
|
57
58
|
# If there is a problem connecting to the REST API
|
58
59
|
# @raise [JSONParseError]
|
59
60
|
# If the response from the REST API cannot be parsed as JSON
|
61
|
+
# @raise [PathError]
|
62
|
+
# If any part of the path is nil
|
60
63
|
#
|
61
64
|
def request(method, *path)
|
65
|
+
if path.any? {|p| p.nil?}
|
66
|
+
raise PathError, "Cannot use nil as a path component"
|
67
|
+
end
|
62
68
|
method = method.to_sym
|
63
69
|
params = path.extract_options!
|
64
70
|
params = {:params => params} if method == :get
|
data/lib/placid/model.rb
CHANGED
data/placid.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "placid"
|
3
|
-
s.version = "0.0.
|
3
|
+
s.version = "0.0.7"
|
4
4
|
s.summary = "Models from REST"
|
5
5
|
s.description = <<-EOS
|
6
6
|
Placid is an ActiveRecord-ish model using a REST API for storage. The REST API
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.homepage = "http://github.com/a-e/placid"
|
13
13
|
s.platform = Gem::Platform::RUBY
|
14
14
|
|
15
|
-
s.add_dependency 'hashie'
|
15
|
+
s.add_dependency 'hashie', '>= 2.0.4'
|
16
16
|
s.add_dependency 'json'
|
17
17
|
s.add_dependency 'rest-client'
|
18
18
|
s.add_dependency 'activesupport'
|
@@ -20,7 +20,12 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.add_development_dependency 'rspec'
|
21
21
|
s.add_development_dependency 'yard' # For documentation
|
22
22
|
s.add_development_dependency 'redcarpet' # For YARD / Markdown
|
23
|
-
|
23
|
+
|
24
|
+
if RUBY_VERSION < "1.9"
|
25
|
+
s.add_development_dependency 'rcov'
|
26
|
+
else
|
27
|
+
s.add_development_dependency 'simplecov'
|
28
|
+
end
|
24
29
|
|
25
30
|
s.files = `git ls-files`.split("\n")
|
26
31
|
|
File without changes
|
@@ -3,7 +3,11 @@ require 'spec_helper'
|
|
3
3
|
describe Placid::Helper do
|
4
4
|
describe "#escape" do
|
5
5
|
it "escapes all URI reserved characters" do
|
6
|
-
escape("
|
6
|
+
escape(";?:@&=+$,[]").should == "%3B%3F%3A%40%26%3D%2B%24%2C%5B%5D"
|
7
|
+
end
|
8
|
+
|
9
|
+
it "does not escape '/'" do
|
10
|
+
escape("foo/bar/baz").should == "foo/bar/baz"
|
7
11
|
end
|
8
12
|
end
|
9
13
|
|
@@ -13,7 +17,11 @@ describe Placid::Helper do
|
|
13
17
|
end
|
14
18
|
|
15
19
|
it "escapes path components to make them URI-safe" do
|
16
|
-
get_url('a b', 'c:d'
|
20
|
+
get_url('a b', 'c:d').should == 'http://localhost/a%20b/c%3Ad'
|
21
|
+
end
|
22
|
+
|
23
|
+
it "does not escape '/'" do
|
24
|
+
get_url('a/b', 'c/d').should == 'http://localhost/a/b/c/d'
|
17
25
|
end
|
18
26
|
end
|
19
27
|
|
@@ -45,18 +53,24 @@ describe Placid::Helper do
|
|
45
53
|
json.should == ["fail"]
|
46
54
|
end
|
47
55
|
|
48
|
-
it "
|
49
|
-
RestClient.
|
56
|
+
it "preserves '/' in path components" do
|
57
|
+
RestClient.should_receive(:post).
|
58
|
+
with('http://localhost/foo/bar/baz', {:x => '5'}).
|
59
|
+
and_return('{}')
|
60
|
+
request('post', 'foo/bar', 'baz', :x => '5')
|
61
|
+
end
|
62
|
+
|
63
|
+
it "raises a PathError if there's a nil in the path array" do
|
50
64
|
lambda do
|
51
|
-
|
52
|
-
end.should raise_error(Placid::
|
65
|
+
request('get', 'foo', nil, 'bar')
|
66
|
+
end.should raise_error(Placid::PathError, /Cannot use nil as a path component/)
|
53
67
|
end
|
54
68
|
|
55
|
-
it "
|
56
|
-
RestClient.stub(:get).and_raise(
|
69
|
+
it "raises a RestConnectionError when connection is refused" do
|
70
|
+
RestClient.stub(:get).and_raise(Errno::ECONNREFUSED)
|
57
71
|
lambda do
|
58
72
|
json = request('get')
|
59
|
-
end.should raise_error(
|
73
|
+
end.should raise_error(Placid::RestConnectionError, /Could not connect/)
|
60
74
|
end
|
61
75
|
|
62
76
|
it "raises a JSONParseError if there is no response" do
|
@@ -66,6 +80,13 @@ describe Placid::Helper do
|
|
66
80
|
end.should raise_error(Placid::JSONParseError, /Cannot parse/)
|
67
81
|
end
|
68
82
|
|
83
|
+
it "passes other exceptions through" do
|
84
|
+
RestClient.stub(:get).and_raise(URI::InvalidURIError)
|
85
|
+
lambda do
|
86
|
+
json = request('get')
|
87
|
+
end.should raise_error(URI::InvalidURIError)
|
88
|
+
end
|
89
|
+
|
69
90
|
it "accepts a params hash as the last argument" do
|
70
91
|
RestClient.should_receive(:post).
|
71
92
|
with('http://localhost/foo', {:bar => 'hi'}).
|
@@ -4,6 +4,8 @@ describe Placid::Model do
|
|
4
4
|
class Thing < Placid::Model
|
5
5
|
end
|
6
6
|
|
7
|
+
subject { Thing }
|
8
|
+
|
7
9
|
context "Instance methods" do
|
8
10
|
describe "#id" do
|
9
11
|
it "returns the value in the custom unique ID field" do
|
@@ -17,8 +19,8 @@ describe Placid::Model do
|
|
17
19
|
end
|
18
20
|
|
19
21
|
it "returns the value in the :id field if no custom field was set" do
|
20
|
-
thing_1 =
|
21
|
-
thing_2 =
|
22
|
+
thing_1 = subject.new(:id => '111')
|
23
|
+
thing_2 = subject.new(:id => '222')
|
22
24
|
thing_1.id.should == '111'
|
23
25
|
thing_2.id.should == '222'
|
24
26
|
end
|
@@ -26,90 +28,90 @@ describe Placid::Model do
|
|
26
28
|
|
27
29
|
describe "#save" do
|
28
30
|
it "creates a new instance if one doesn't exist" do
|
29
|
-
thing =
|
30
|
-
|
31
|
-
|
31
|
+
thing = subject.new(:id => '123')
|
32
|
+
subject.stub(:find => nil)
|
33
|
+
subject.should_receive(:create).
|
32
34
|
with({'id' => '123'}).
|
33
|
-
and_return(
|
35
|
+
and_return(subject.new)
|
34
36
|
thing.save
|
35
37
|
end
|
36
38
|
|
37
39
|
it "updates an existing instance" do
|
38
|
-
thing =
|
39
|
-
|
40
|
-
|
40
|
+
thing = subject.new(:id => '123')
|
41
|
+
subject.stub(:find => {:id => '123'})
|
42
|
+
subject.should_receive(:update).
|
41
43
|
with('123', {'id' => '123'}).
|
42
|
-
and_return(
|
44
|
+
and_return(subject.new)
|
43
45
|
thing.save
|
44
46
|
end
|
45
47
|
|
46
48
|
it "merges saved attributes on create" do
|
47
|
-
thing =
|
49
|
+
thing = subject.new(:id => '123')
|
48
50
|
saved_attribs = {'id' => '123', 'name' => 'foo'}
|
49
|
-
|
50
|
-
|
51
|
+
subject.stub(:find => nil)
|
52
|
+
subject.should_receive(:create).
|
51
53
|
with({'id' => '123'}).
|
52
|
-
and_return(
|
54
|
+
and_return(subject.new(saved_attribs))
|
53
55
|
thing.save
|
54
56
|
thing.should == saved_attribs
|
55
57
|
end
|
56
58
|
|
57
59
|
it "merges saved attributes on update" do
|
58
|
-
thing =
|
60
|
+
thing = subject.new(:id => '123')
|
59
61
|
saved_attribs = {'id' => '123', 'name' => 'foo'}
|
60
|
-
|
61
|
-
|
62
|
+
subject.stub(:find => {:id => '123'})
|
63
|
+
subject.should_receive(:update).
|
62
64
|
with('123', {'id' => '123'}).
|
63
|
-
and_return(
|
65
|
+
and_return(subject.new(saved_attribs))
|
64
66
|
thing.save
|
65
67
|
thing.should == saved_attribs
|
66
68
|
end
|
67
69
|
|
68
70
|
it "returns false if errors were reported" do
|
69
|
-
thing =
|
70
|
-
|
71
|
-
|
71
|
+
thing = subject.new
|
72
|
+
subject.stub(:find => nil)
|
73
|
+
subject.stub(:request).with(:post, 'thing', {}) { {'errors' => 'Missing id'} }
|
72
74
|
thing.save.should be_false
|
73
75
|
end
|
74
76
|
|
75
77
|
it "returns true if errors is an empty list" do
|
76
|
-
thing =
|
77
|
-
|
78
|
-
|
78
|
+
thing = subject.new(:id => '123')
|
79
|
+
subject.stub(:find => nil)
|
80
|
+
subject.stub(:request).with(:post, 'thing', {'id' => '123'}) { {'errors' => []} }
|
79
81
|
thing.save.should be_true
|
80
82
|
end
|
81
83
|
|
82
84
|
it "returns true if no errors were reported" do
|
83
|
-
thing =
|
84
|
-
|
85
|
-
|
85
|
+
thing = subject.new(:id => '123')
|
86
|
+
subject.stub(:find => nil)
|
87
|
+
subject.stub(:request).with(:post, 'thing', {'id' => '123'}) { {} }
|
86
88
|
thing.save.should be_true
|
87
89
|
end
|
88
90
|
end
|
89
91
|
|
90
92
|
describe "#required?" do
|
91
93
|
it "true if the given field is implicitly required" do
|
92
|
-
|
93
|
-
thing =
|
94
|
+
subject.stub(:meta => {:id => {:required => true}})
|
95
|
+
thing = subject.new
|
94
96
|
thing.required?(:id).should == true
|
95
97
|
end
|
96
98
|
|
97
99
|
it "false if the given field is explicitly optional" do
|
98
|
-
|
99
|
-
thing =
|
100
|
+
subject.stub(:meta => {:id => {:required => false}})
|
101
|
+
thing = subject.new
|
100
102
|
thing.required?(:id).should == false
|
101
103
|
end
|
102
104
|
|
103
105
|
it "false if the given field is implicitly optional" do
|
104
|
-
|
105
|
-
thing =
|
106
|
+
subject.stub(:meta => {:id => {}})
|
107
|
+
thing = subject.new
|
106
108
|
thing.required?(:id).should == false
|
107
109
|
end
|
108
110
|
end
|
109
111
|
|
110
112
|
describe "#errors=" do
|
111
113
|
it "sets the list of errors on the instance" do
|
112
|
-
thing =
|
114
|
+
thing = subject.new
|
113
115
|
thing.errors = ['missing id']
|
114
116
|
thing['errors'].should == ['missing id']
|
115
117
|
end
|
@@ -117,24 +119,24 @@ describe Placid::Model do
|
|
117
119
|
|
118
120
|
describe "#errors" do
|
119
121
|
it "returns errors set on initialization" do
|
120
|
-
thing =
|
122
|
+
thing = subject.new(:errors => ['missing id'])
|
121
123
|
thing.errors = ['missing id']
|
122
124
|
thing.errors.should == ['missing id']
|
123
125
|
end
|
124
126
|
|
125
127
|
it "returns errors set after initialization" do
|
126
|
-
thing =
|
128
|
+
thing = subject.new
|
127
129
|
thing.errors = ['missing id']
|
128
130
|
thing.errors.should == ['missing id']
|
129
131
|
end
|
130
132
|
|
131
133
|
it "returns [] if errors are not set" do
|
132
|
-
thing =
|
134
|
+
thing = subject.new
|
133
135
|
thing.errors.should == []
|
134
136
|
end
|
135
137
|
|
136
138
|
it "returns [] if errors is set to nil" do
|
137
|
-
thing =
|
139
|
+
thing = subject.new
|
138
140
|
thing.errors = nil
|
139
141
|
thing.errors.should == []
|
140
142
|
end
|
@@ -142,23 +144,23 @@ describe Placid::Model do
|
|
142
144
|
|
143
145
|
describe "#errors?" do
|
144
146
|
it "returns true if errors is set to a nonempty value" do
|
145
|
-
thing =
|
147
|
+
thing = subject.new(:errors => ['missing id'])
|
146
148
|
thing.errors?.should be_true
|
147
149
|
end
|
148
150
|
|
149
151
|
it "returns false if errors it not set" do
|
150
|
-
thing =
|
152
|
+
thing = subject.new
|
151
153
|
thing.errors?.should be_false
|
152
154
|
end
|
153
155
|
|
154
156
|
it "returns false if errors is set to nil" do
|
155
|
-
thing =
|
157
|
+
thing = subject.new
|
156
158
|
thing.errors = nil
|
157
159
|
thing.errors?.should be_false
|
158
160
|
end
|
159
161
|
|
160
162
|
it "returns false if errors is set to an empty list" do
|
161
|
-
thing =
|
163
|
+
thing = subject.new
|
162
164
|
thing.errors = []
|
163
165
|
thing.errors?.should be_false
|
164
166
|
end
|
@@ -166,7 +168,7 @@ describe Placid::Model do
|
|
166
168
|
|
167
169
|
describe "helpers" do
|
168
170
|
it "can call #request on an instance" do
|
169
|
-
thing =
|
171
|
+
thing = subject.new
|
170
172
|
RestClient.should_receive(:get).
|
171
173
|
with('http://localhost/thing/foo', {:params => {:x => 'y'}}).
|
172
174
|
and_return('{}')
|
@@ -207,7 +209,7 @@ describe Placid::Model do
|
|
207
209
|
RestClient.should_receive(:get).
|
208
210
|
with('http://localhost/thing/meta', {:params => {}}).
|
209
211
|
and_return(JSON(thing_meta))
|
210
|
-
|
212
|
+
subject.meta.should == thing_meta
|
211
213
|
end
|
212
214
|
|
213
215
|
it "only sends a GET meta request once for the class" do
|
@@ -216,30 +218,30 @@ describe Placid::Model do
|
|
216
218
|
}
|
217
219
|
RestClient.stub(:get => JSON(thing_meta))
|
218
220
|
RestClient.should_receive(:get).at_most(:once)
|
219
|
-
|
220
|
-
|
221
|
-
|
221
|
+
subject.meta.should == thing_meta
|
222
|
+
subject.meta.should == thing_meta
|
223
|
+
subject.meta.should == thing_meta
|
222
224
|
end
|
223
225
|
|
224
226
|
it "stores meta-data separately for each derived class" do
|
225
227
|
class ThingOne < Placid::Model; end
|
226
228
|
class ThingTwo < Placid::Model; end
|
227
|
-
|
228
229
|
thing_one_meta = {
|
229
230
|
'one' => {'type' => 'String', 'required' => true}
|
230
231
|
}
|
231
|
-
RestClient.should_receive(:get).
|
232
|
-
with('http://localhost/thing_one/meta', {:params => {}}).
|
233
|
-
and_return(JSON(thing_one_meta))
|
234
|
-
ThingOne.meta.should == thing_one_meta
|
235
|
-
|
236
232
|
thing_two_meta = {
|
237
233
|
'two' => {'type' => 'String', 'required' => false}
|
238
234
|
}
|
239
|
-
RestClient.
|
235
|
+
RestClient.stub(:get).
|
236
|
+
with('http://localhost/thing_one/meta', {:params => {}}).
|
237
|
+
and_return(JSON(thing_one_meta))
|
238
|
+
RestClient.stub(:get).
|
240
239
|
with('http://localhost/thing_two/meta', {:params => {}}).
|
241
240
|
and_return(JSON(thing_two_meta))
|
241
|
+
|
242
|
+
ThingOne.meta.should == thing_one_meta
|
242
243
|
ThingTwo.meta.should == thing_two_meta
|
244
|
+
ThingOne.meta.should_not == ThingTwo.meta
|
243
245
|
end
|
244
246
|
end
|
245
247
|
|
@@ -250,10 +252,10 @@ describe Placid::Model do
|
|
250
252
|
{'name' => 'Bar'},
|
251
253
|
]
|
252
254
|
RestClient.stub(:get => JSON(data))
|
253
|
-
things =
|
255
|
+
things = subject.list
|
254
256
|
things.should == data
|
255
257
|
things.each do |thing|
|
256
|
-
thing.should be_a(
|
258
|
+
thing.should be_a(subject)
|
257
259
|
end
|
258
260
|
end
|
259
261
|
end
|
@@ -262,8 +264,8 @@ describe Placid::Model do
|
|
262
264
|
it "returns a Model instance matching the given id" do
|
263
265
|
data = {'name' => 'Foo'}
|
264
266
|
RestClient.stub(:get => JSON(data))
|
265
|
-
thing =
|
266
|
-
thing.should be_a(
|
267
|
+
thing = subject.find(1)
|
268
|
+
thing.should be_a(subject)
|
267
269
|
thing.should == data
|
268
270
|
end
|
269
271
|
end
|
@@ -273,24 +275,24 @@ describe Placid::Model do
|
|
273
275
|
it "posted attributes if no attributes were returned" do
|
274
276
|
RestClient.stub(:post => '{}')
|
275
277
|
attrs = {'name' => 'Foo'}
|
276
|
-
thing =
|
277
|
-
thing.should be_a(
|
278
|
+
thing = subject.create(attrs)
|
279
|
+
thing.should be_a(subject)
|
278
280
|
thing.should == {'name' => 'Foo'}
|
279
281
|
end
|
280
282
|
|
281
283
|
it "returned attributes if no attributes were posted" do
|
282
284
|
RestClient.stub(:post => '{"uri": "foo"}')
|
283
285
|
attrs = {}
|
284
|
-
thing =
|
285
|
-
thing.should be_a(
|
286
|
+
thing = subject.create(attrs)
|
287
|
+
thing.should be_a(subject)
|
286
288
|
thing.should == {'uri' => 'foo'}
|
287
289
|
end
|
288
290
|
|
289
291
|
it "original attributes merged with returned attributes" do
|
290
292
|
RestClient.stub(:post => '{"uri": "foo"}')
|
291
293
|
attrs = {'name' => 'Foo'}
|
292
|
-
thing =
|
293
|
-
thing.should be_a(
|
294
|
+
thing = subject.create(attrs)
|
295
|
+
thing.should be_a(subject)
|
294
296
|
thing.should == {'name' => 'Foo', 'uri' => 'foo'}
|
295
297
|
end
|
296
298
|
end
|
@@ -298,8 +300,8 @@ describe Placid::Model do
|
|
298
300
|
it "sets errors on the Model instance" do
|
299
301
|
data = {'errors' => ['name is required']}
|
300
302
|
RestClient.stub(:post => JSON(data))
|
301
|
-
thing =
|
302
|
-
thing.should be_a(
|
303
|
+
thing = subject.create()
|
304
|
+
thing.should be_a(subject)
|
303
305
|
thing.errors.should == ['name is required']
|
304
306
|
end
|
305
307
|
end
|
@@ -309,25 +311,25 @@ describe Placid::Model do
|
|
309
311
|
it "posted attributes if no attributes were returned" do
|
310
312
|
RestClient.stub(:put => '{}')
|
311
313
|
attrs = {'name' => 'Foo'}
|
312
|
-
result =
|
313
|
-
thing =
|
314
|
-
thing.should be_a(
|
314
|
+
result = subject.update(1, attrs)
|
315
|
+
thing = subject.update(1, attrs)
|
316
|
+
thing.should be_a(subject)
|
315
317
|
thing.should == {'name' => 'Foo'}
|
316
318
|
end
|
317
319
|
|
318
320
|
it "returned attributes if no attributes were posted" do
|
319
321
|
RestClient.stub(:put => '{"uri": "foo"}')
|
320
322
|
attrs = {}
|
321
|
-
thing =
|
322
|
-
thing.should be_a(
|
323
|
+
thing = subject.update(1, attrs)
|
324
|
+
thing.should be_a(subject)
|
323
325
|
thing.should == {'uri' => 'foo'}
|
324
326
|
end
|
325
327
|
|
326
328
|
it "original attributes merged with returned attributes" do
|
327
329
|
RestClient.stub(:put => '{"uri": "foo"}')
|
328
330
|
attrs = {'name' => 'Foo'}
|
329
|
-
thing =
|
330
|
-
thing.should be_a(
|
331
|
+
thing = subject.update(1, attrs)
|
332
|
+
thing.should be_a(subject)
|
331
333
|
thing.should == {'name' => 'Foo', 'uri' => 'foo'}
|
332
334
|
end
|
333
335
|
end
|
@@ -335,8 +337,8 @@ describe Placid::Model do
|
|
335
337
|
it "sets errors on the Model instance" do
|
336
338
|
data = {'errors' => ['name is required']}
|
337
339
|
RestClient.stub(:put => JSON(data))
|
338
|
-
thing =
|
339
|
-
thing.should be_a(
|
340
|
+
thing = subject.update(1, {})
|
341
|
+
thing.should be_a(subject)
|
340
342
|
thing.errors.should == ['name is required']
|
341
343
|
end
|
342
344
|
end
|
@@ -345,7 +347,43 @@ describe Placid::Model do
|
|
345
347
|
it "returns the parsed JSON response" do
|
346
348
|
data = {'status' => 'ok'}
|
347
349
|
RestClient.stub(:delete => JSON(data))
|
348
|
-
|
350
|
+
subject.destroy(1).should == data
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
describe "#coerce" do
|
355
|
+
before(:each) do
|
356
|
+
class User < Placid::Model
|
357
|
+
end
|
358
|
+
class Tweet < Placid::Model
|
359
|
+
coerce_key :user, 'user', User
|
360
|
+
end
|
361
|
+
@user_hash = {:email => 'foo@bar.com'}
|
362
|
+
end
|
363
|
+
|
364
|
+
it "coerces during initialization" do
|
365
|
+
pending("Awaiting release of https://github.com/intridea/hashie/issues/95")
|
366
|
+
tweet = Tweet.new({:message => "Hello", :user => @user_hash})
|
367
|
+
#tweet = Tweet.new('user' => @user_hash)
|
368
|
+
tweet.user.should be_a(User)
|
369
|
+
end
|
370
|
+
|
371
|
+
it "coerces using attribute reference" do
|
372
|
+
tweet = Tweet.new
|
373
|
+
tweet.user = @user_hash
|
374
|
+
tweet.user.should be_a(User)
|
375
|
+
end
|
376
|
+
|
377
|
+
it "coerces using string key" do
|
378
|
+
tweet = Tweet.new
|
379
|
+
tweet['user'] = @user_hash
|
380
|
+
tweet.user.should be_a(User)
|
381
|
+
end
|
382
|
+
|
383
|
+
it "coerces using symbolic key" do
|
384
|
+
tweet = Tweet.new
|
385
|
+
tweet[:user] = @user_hash
|
386
|
+
tweet.user.should be_a(User)
|
349
387
|
end
|
350
388
|
end
|
351
389
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: placid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Eric Pierce
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2013-06-10 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: hashie
|
@@ -25,10 +25,12 @@ dependencies:
|
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
hash:
|
28
|
+
hash: 7
|
29
29
|
segments:
|
30
|
+
- 2
|
30
31
|
- 0
|
31
|
-
|
32
|
+
- 4
|
33
|
+
version: 2.0.4
|
32
34
|
type: :runtime
|
33
35
|
version_requirements: *id001
|
34
36
|
- !ruby/object:Gem::Dependency
|
@@ -151,9 +153,9 @@ files:
|
|
151
153
|
- lib/placid/helper.rb
|
152
154
|
- lib/placid/model.rb
|
153
155
|
- placid.gemspec
|
154
|
-
- spec/
|
155
|
-
- spec/
|
156
|
-
- spec/
|
156
|
+
- spec/placid/config_spec.rb
|
157
|
+
- spec/placid/helper_spec.rb
|
158
|
+
- spec/placid/model_spec.rb
|
157
159
|
- spec/spec_helper.rb
|
158
160
|
homepage: http://github.com/a-e/placid
|
159
161
|
licenses: []
|
@@ -184,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
186
|
requirements: []
|
185
187
|
|
186
188
|
rubyforge_project:
|
187
|
-
rubygems_version: 1.8.
|
189
|
+
rubygems_version: 1.8.25
|
188
190
|
signing_key:
|
189
191
|
specification_version: 3
|
190
192
|
summary: Models from REST
|