placid 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|