her 0.8.2 → 0.9.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -1
  3. data/.rubocop.yml +1291 -0
  4. data/.travis.yml +2 -0
  5. data/README.md +23 -3
  6. data/her.gemspec +1 -3
  7. data/lib/her/middleware/json_api_parser.rb +1 -1
  8. data/lib/her/model/associations/association.rb +31 -0
  9. data/lib/her/model/associations/association_proxy.rb +1 -1
  10. data/lib/her/model/attributes.rb +2 -0
  11. data/lib/her/model/orm.rb +79 -6
  12. data/lib/her/model/parse.rb +8 -12
  13. data/lib/her/model/relation.rb +45 -1
  14. data/lib/her/version.rb +1 -1
  15. data/spec/api_spec.rb +34 -31
  16. data/spec/collection_spec.rb +25 -10
  17. data/spec/json_api/model_spec.rb +75 -72
  18. data/spec/middleware/accept_json_spec.rb +1 -1
  19. data/spec/middleware/first_level_parse_json_spec.rb +20 -20
  20. data/spec/middleware/json_api_parser_spec.rb +26 -7
  21. data/spec/middleware/second_level_parse_json_spec.rb +8 -9
  22. data/spec/model/associations/association_proxy_spec.rb +2 -5
  23. data/spec/model/associations_spec.rb +248 -161
  24. data/spec/model/attributes_spec.rb +106 -99
  25. data/spec/model/callbacks_spec.rb +58 -26
  26. data/spec/model/dirty_spec.rb +30 -29
  27. data/spec/model/http_spec.rb +67 -35
  28. data/spec/model/introspection_spec.rb +26 -22
  29. data/spec/model/nested_attributes_spec.rb +31 -31
  30. data/spec/model/orm_spec.rb +312 -155
  31. data/spec/model/parse_spec.rb +77 -77
  32. data/spec/model/paths_spec.rb +109 -109
  33. data/spec/model/relation_spec.rb +76 -68
  34. data/spec/model/validations_spec.rb +6 -6
  35. data/spec/model_spec.rb +17 -17
  36. data/spec/spec_helper.rb +2 -3
  37. data/spec/support/macros/model_macros.rb +2 -2
  38. metadata +32 -59
@@ -4,14 +4,14 @@ require File.join(File.dirname(__FILE__), "../spec_helper.rb")
4
4
  describe Her::Model::Parse do
5
5
  context "when include_root_in_json is set" do
6
6
  before do
7
- Her::API.setup :url => "https://api.example.com" do |builder|
7
+ Her::API.setup url: "https://api.example.com" do |builder|
8
8
  builder.use Her::Middleware::FirstLevelParseJSON
9
9
  builder.use Faraday::Request::UrlEncoded
10
10
  end
11
11
 
12
12
  Her::API.default_api.connection.adapter :test do |stub|
13
- stub.post("/users") { |env| [200, {}, { :user => { :id => 1, :fullname => params(env)[:user][:fullname] } }.to_json] }
14
- stub.post("/users/admins") { |env| [200, {}, { :user => { :id => 1, :fullname => params(env)[:user][:fullname] } }.to_json] }
13
+ stub.post("/users") { |env| [200, {}, { user: { id: 1, fullname: params(env)[:user][:fullname] } }.to_json] }
14
+ stub.post("/users/admins") { |env| [200, {}, { user: { id: 1, fullname: params(env)[:user][:fullname] } }.to_json] }
15
15
  end
16
16
  end
17
17
 
@@ -25,13 +25,13 @@ describe Her::Model::Parse do
25
25
  end
26
26
 
27
27
  it "wraps params in the element name in `to_params`" do
28
- @new_user = Foo::User.new(:fullname => "Tobias Fünke")
29
- @new_user.to_params.should == { :user => { :fullname => "Tobias Fünke" } }
28
+ @new_user = Foo::User.new(fullname: "Tobias Fünke")
29
+ expect(@new_user.to_params).to eq(user: { fullname: "Tobias Fünke" })
30
30
  end
31
31
 
32
32
  it "wraps params in the element name in `.create`" do
33
- @new_user = Foo::User.admins(:fullname => "Tobias Fünke")
34
- @new_user.fullname.should == "Tobias Fünke"
33
+ @new_user = Foo::User.admins(fullname: "Tobias Fünke")
34
+ expect(@new_user.fullname).to eq("Tobias Fünke")
35
35
  end
36
36
  end
37
37
 
@@ -44,8 +44,8 @@ describe Her::Model::Parse do
44
44
  end
45
45
 
46
46
  it "wraps params in the specified value" do
47
- @new_user = Foo::User.new(:fullname => "Tobias Fünke")
48
- @new_user.to_params.should == { :person => { :fullname => "Tobias Fünke" } }
47
+ @new_user = Foo::User.new(fullname: "Tobias Fünke")
48
+ expect(@new_user.to_params).to eq(person: { fullname: "Tobias Fünke" })
49
49
  end
50
50
  end
51
51
 
@@ -58,15 +58,15 @@ describe Her::Model::Parse do
58
58
  end
59
59
 
60
60
  it "wraps params with the class name" do
61
- @new_user = User.new(:fullname => "Tobias Fünke")
62
- @new_user.to_params.should == { :user => { :fullname => "Tobias Fünke" } }
61
+ @new_user = User.new(fullname: "Tobias Fünke")
62
+ expect(@new_user.to_params).to eq(user: { fullname: "Tobias Fünke" })
63
63
  end
64
64
  end
65
65
  end
66
66
 
67
67
  context "when parse_root_in_json is set" do
68
68
  before do
69
- Her::API.setup :url => "https://api.example.com" do |builder|
69
+ Her::API.setup url: "https://api.example.com" do |builder|
70
70
  builder.use Her::Middleware::FirstLevelParseJSON
71
71
  builder.use Faraday::Request::UrlEncoded
72
72
  end
@@ -75,11 +75,11 @@ describe Her::Model::Parse do
75
75
  context "to true" do
76
76
  before do
77
77
  Her::API.default_api.connection.adapter :test do |stub|
78
- stub.post("/users") { |env| [200, {}, { :user => { :id => 1, :fullname => "Lindsay Fünke" } }.to_json] }
79
- stub.get("/users") { |env| [200, {}, [{ :user => { :id => 1, :fullname => "Lindsay Fünke" } }].to_json] }
80
- stub.get("/users/admins") { |env| [200, {}, [{ :user => { :id => 1, :fullname => "Lindsay Fünke" } }].to_json] }
81
- stub.get("/users/1") { |env| [200, {}, { :user => { :id => 1, :fullname => "Lindsay Fünke" } }.to_json] }
82
- stub.put("/users/1") { |env| [200, {}, { :user => { :id => 1, :fullname => "Tobias Fünke Jr." } }.to_json] }
78
+ stub.post("/users") { [200, {}, { user: { id: 1, fullname: "Lindsay Fünke" } }.to_json] }
79
+ stub.get("/users") { [200, {}, [{ user: { id: 1, fullname: "Lindsay Fünke" } }].to_json] }
80
+ stub.get("/users/admins") { [200, {}, [{ user: { id: 1, fullname: "Lindsay Fünke" } }].to_json] }
81
+ stub.get("/users/1") { [200, {}, { user: { id: 1, fullname: "Lindsay Fünke" } }.to_json] }
82
+ stub.put("/users/1") { [200, {}, { user: { id: 1, fullname: "Tobias Fünke Jr." } }.to_json] }
83
83
  end
84
84
 
85
85
  spawn_model("Foo::User") do
@@ -89,53 +89,53 @@ describe Her::Model::Parse do
89
89
  end
90
90
 
91
91
  it "parse the data from the JSON root element after .create" do
92
- @new_user = Foo::User.create(:fullname => "Lindsay Fünke")
93
- @new_user.fullname.should == "Lindsay Fünke"
92
+ @new_user = Foo::User.create(fullname: "Lindsay Fünke")
93
+ expect(@new_user.fullname).to eq("Lindsay Fünke")
94
94
  end
95
95
 
96
96
  it "parse the data from the JSON root element after an arbitrary HTTP request" do
97
97
  @new_user = Foo::User.admins
98
- @new_user.first.fullname.should == "Lindsay Fünke"
98
+ expect(@new_user.first.fullname).to eq("Lindsay Fünke")
99
99
  end
100
100
 
101
101
  it "parse the data from the JSON root element after .all" do
102
102
  @users = Foo::User.all
103
- @users.first.fullname.should == "Lindsay Fünke"
103
+ expect(@users.first.fullname).to eq("Lindsay Fünke")
104
104
  end
105
105
 
106
106
  it "parse the data from the JSON root element after .find" do
107
107
  @user = Foo::User.find(1)
108
- @user.fullname.should == "Lindsay Fünke"
108
+ expect(@user.fullname).to eq("Lindsay Fünke")
109
109
  end
110
110
 
111
111
  it "parse the data from the JSON root element after .save" do
112
112
  @user = Foo::User.find(1)
113
113
  @user.fullname = "Tobias Fünke"
114
114
  @user.save
115
- @user.fullname.should == "Tobias Fünke Jr."
115
+ expect(@user.fullname).to eq("Tobias Fünke Jr.")
116
116
  end
117
117
  end
118
118
 
119
119
  context "to a symbol" do
120
120
  before do
121
121
  Her::API.default_api.connection.adapter :test do |stub|
122
- stub.post("/users") { |env| [200, {}, { :person => { :id => 1, :fullname => "Lindsay Fünke" } }.to_json] }
122
+ stub.post("/users") { [200, {}, { person: { id: 1, fullname: "Lindsay Fünke" } }.to_json] }
123
123
  end
124
124
 
125
125
  spawn_model("Foo::User") { parse_root_in_json :person }
126
126
  end
127
127
 
128
128
  it "parse the data with the symbol" do
129
- @new_user = Foo::User.create(:fullname => "Lindsay Fünke")
130
- @new_user.fullname.should == "Lindsay Fünke"
129
+ @new_user = Foo::User.create(fullname: "Lindsay Fünke")
130
+ expect(@new_user.fullname).to eq("Lindsay Fünke")
131
131
  end
132
132
  end
133
133
 
134
134
  context "in the parent class" do
135
135
  before do
136
136
  Her::API.default_api.connection.adapter :test do |stub|
137
- stub.post("/users") { |env| [200, {}, { :user => { :id => 1, :fullname => "Lindsay Fünke" } }.to_json] }
138
- stub.get("/users") { |env| [200, {}, { :users => [ { :id => 1, :fullname => "Lindsay Fünke" } ] }.to_json] }
137
+ stub.post("/users") { [200, {}, { user: { id: 1, fullname: "Lindsay Fünke" } }.to_json] }
138
+ stub.get("/users") { [200, {}, { users: [{ id: 1, fullname: "Lindsay Fünke" }] }.to_json] }
139
139
  end
140
140
 
141
141
  spawn_model("Foo::Model") { parse_root_in_json true, format: :active_model_serializers }
@@ -147,155 +147,155 @@ describe Her::Model::Parse do
147
147
  end
148
148
 
149
149
  it "parse the data with the symbol" do
150
- @new_user = User.create(:fullname => "Lindsay Fünke")
151
- @new_user.fullname.should == "Lindsay Fünke"
150
+ @new_user = User.create(fullname: "Lindsay Fünke")
151
+ expect(@new_user.fullname).to eq("Lindsay Fünke")
152
152
  end
153
153
 
154
154
  it "parses the collection of data" do
155
155
  @users = User.all
156
- @users.first.fullname.should == "Lindsay Fünke"
156
+ expect(@users.first.fullname).to eq("Lindsay Fünke")
157
157
  end
158
158
  end
159
159
 
160
- context "to true with :format => :active_model_serializers" do
160
+ context "to true with format: :active_model_serializers" do
161
161
  before do
162
162
  Her::API.default_api.connection.adapter :test do |stub|
163
- stub.post("/users") { |env| [200, {}, { :user => { :id => 1, :fullname => "Lindsay Fünke" } }.to_json] }
164
- stub.get("/users") { |env| [200, {}, { :users => [ { :id => 1, :fullname => "Lindsay Fünke" } ] }.to_json] }
165
- stub.get("/users/admins") { |env| [200, {}, { :users => [ { :id => 1, :fullname => "Lindsay Fünke" } ] }.to_json] }
166
- stub.get("/users/1") { |env| [200, {}, { :user => { :id => 1, :fullname => "Lindsay Fünke" } }.to_json] }
167
- stub.put("/users/1") { |env| [200, {}, { :user => { :id => 1, :fullname => "Tobias Fünke Jr." } }.to_json] }
163
+ stub.post("/users") { [200, {}, { user: { id: 1, fullname: "Lindsay Fünke" } }.to_json] }
164
+ stub.get("/users") { [200, {}, { users: [{ id: 1, fullname: "Lindsay Fünke" }] }.to_json] }
165
+ stub.get("/users/admins") { [200, {}, { users: [{ id: 1, fullname: "Lindsay Fünke" }] }.to_json] }
166
+ stub.get("/users/1") { [200, {}, { user: { id: 1, fullname: "Lindsay Fünke" } }.to_json] }
167
+ stub.put("/users/1") { [200, {}, { user: { id: 1, fullname: "Tobias Fünke Jr." } }.to_json] }
168
168
  end
169
169
 
170
170
  spawn_model("Foo::User") do
171
- parse_root_in_json true, :format => :active_model_serializers
171
+ parse_root_in_json true, format: :active_model_serializers
172
172
  custom_get :admins
173
173
  end
174
174
  end
175
175
 
176
176
  it "parse the data from the JSON root element after .create" do
177
- @new_user = Foo::User.create(:fullname => "Lindsay Fünke")
178
- @new_user.fullname.should == "Lindsay Fünke"
177
+ @new_user = Foo::User.create(fullname: "Lindsay Fünke")
178
+ expect(@new_user.fullname).to eq("Lindsay Fünke")
179
179
  end
180
180
 
181
181
  it "parse the data from the JSON root element after an arbitrary HTTP request" do
182
182
  @users = Foo::User.admins
183
- @users.first.fullname.should == "Lindsay Fünke"
183
+ expect(@users.first.fullname).to eq("Lindsay Fünke")
184
184
  end
185
185
 
186
186
  it "parse the data from the JSON root element after .all" do
187
187
  @users = Foo::User.all
188
- @users.first.fullname.should == "Lindsay Fünke"
188
+ expect(@users.first.fullname).to eq("Lindsay Fünke")
189
189
  end
190
190
 
191
191
  it "parse the data from the JSON root element after .find" do
192
192
  @user = Foo::User.find(1)
193
- @user.fullname.should == "Lindsay Fünke"
193
+ expect(@user.fullname).to eq("Lindsay Fünke")
194
194
  end
195
195
 
196
196
  it "parse the data from the JSON root element after .save" do
197
197
  @user = Foo::User.find(1)
198
198
  @user.fullname = "Tobias Fünke"
199
199
  @user.save
200
- @user.fullname.should == "Tobias Fünke Jr."
200
+ expect(@user.fullname).to eq("Tobias Fünke Jr.")
201
201
  end
202
202
  end
203
203
  end
204
204
 
205
205
  context "when to_params is set" do
206
206
  before do
207
- Her::API.setup :url => "https://api.example.com" do |builder|
207
+ Her::API.setup url: "https://api.example.com" do |builder|
208
208
  builder.use Her::Middleware::FirstLevelParseJSON
209
209
  builder.use Faraday::Request::UrlEncoded
210
210
  builder.adapter :test do |stub|
211
- stub.post("/users") { |env| ok! :id => 1, :fullname => params(env)['fullname'] }
211
+ stub.post("/users") { |env| ok! id: 1, fullname: params(env)["fullname"] }
212
212
  end
213
213
  end
214
214
 
215
215
  spawn_model "Foo::User" do
216
216
  def to_params
217
- { :fullname => "Lindsay Fünke" }
217
+ { fullname: "Lindsay Fünke" }
218
218
  end
219
219
  end
220
220
  end
221
221
 
222
222
  it "changes the request parameters for one-line resource creation" do
223
- @user = Foo::User.create(:fullname => "Tobias Fünke")
224
- @user.fullname.should == "Lindsay Fünke"
223
+ @user = Foo::User.create(fullname: "Tobias Fünke")
224
+ expect(@user.fullname).to eq("Lindsay Fünke")
225
225
  end
226
226
 
227
227
  it "changes the request parameters for Model.new + #save" do
228
- @user = Foo::User.new(:fullname => "Tobias Fünke")
228
+ @user = Foo::User.new(fullname: "Tobias Fünke")
229
229
  @user.save
230
- @user.fullname.should == "Lindsay Fünke"
230
+ expect(@user.fullname).to eq("Lindsay Fünke")
231
231
  end
232
232
  end
233
233
 
234
234
  context "when parse_root_in_json set json_api to true" do
235
235
  before do
236
- Her::API.setup :url => "https://api.example.com" do |builder|
236
+ Her::API.setup url: "https://api.example.com" do |builder|
237
237
  builder.use Her::Middleware::FirstLevelParseJSON
238
238
  builder.use Faraday::Request::UrlEncoded
239
239
  builder.adapter :test do |stub|
240
- stub.get("/users") { |env| [200, {}, { :users => [{ :id => 1, :fullname => "Lindsay Fünke" }] }.to_json] }
241
- stub.get("/users/admins") { |env| [200, {}, { :users => [{ :id => 1, :fullname => "Lindsay Fünke" }] }.to_json] }
242
- stub.get("/users/1") { |env| [200, {}, { :users => [{ :id => 1, :fullname => "Lindsay Fünke" }] }.to_json] }
243
- stub.post("/users") { |env| [200, {}, { :users => [{ :fullname => "Lindsay Fünke" }] }.to_json] }
244
- stub.put("/users/1") { |env| [200, {}, { :users => [{ :id => 1, :fullname => "Tobias Fünke Jr." }] }.to_json] }
240
+ stub.get("/users") { [200, {}, { users: [{ id: 1, fullname: "Lindsay Fünke" }] }.to_json] }
241
+ stub.get("/users/admins") { [200, {}, { users: [{ id: 1, fullname: "Lindsay Fünke" }] }.to_json] }
242
+ stub.get("/users/1") { [200, {}, { users: [{ id: 1, fullname: "Lindsay Fünke" }] }.to_json] }
243
+ stub.post("/users") { [200, {}, { users: [{ fullname: "Lindsay Fünke" }] }.to_json] }
244
+ stub.put("/users/1") { [200, {}, { users: [{ id: 1, fullname: "Tobias Fünke Jr." }] }.to_json] }
245
245
  end
246
246
  end
247
247
 
248
248
  spawn_model("Foo::User") do
249
- parse_root_in_json true, :format => :json_api
249
+ parse_root_in_json true, format: :json_api
250
250
  include_root_in_json true
251
251
  custom_get :admins
252
252
  end
253
253
  end
254
254
 
255
255
  it "parse the data from the JSON root element after .create" do
256
- @new_user = Foo::User.create(:fullname => "Lindsay Fünke")
257
- @new_user.fullname.should == "Lindsay Fünke"
256
+ @new_user = Foo::User.create(fullname: "Lindsay Fünke")
257
+ expect(@new_user.fullname).to eq("Lindsay Fünke")
258
258
  end
259
259
 
260
260
  it "parse the data from the JSON root element after an arbitrary HTTP request" do
261
261
  @new_user = Foo::User.admins
262
- @new_user.first.fullname.should == "Lindsay Fünke"
262
+ expect(@new_user.first.fullname).to eq("Lindsay Fünke")
263
263
  end
264
264
 
265
265
  it "parse the data from the JSON root element after .all" do
266
266
  @users = Foo::User.all
267
- @users.first.fullname.should == "Lindsay Fünke"
267
+ expect(@users.first.fullname).to eq("Lindsay Fünke")
268
268
  end
269
269
 
270
270
  it "parse the data from the JSON root element after .find" do
271
271
  @user = Foo::User.find(1)
272
- @user.fullname.should == "Lindsay Fünke"
272
+ expect(@user.fullname).to eq("Lindsay Fünke")
273
273
  end
274
274
 
275
275
  it "parse the data from the JSON root element after .save" do
276
276
  @user = Foo::User.find(1)
277
277
  @user.fullname = "Tobias Fünke"
278
278
  @user.save
279
- @user.fullname.should == "Tobias Fünke Jr."
279
+ expect(@user.fullname).to eq("Tobias Fünke Jr.")
280
280
  end
281
281
 
282
282
  it "parse the data from the JSON root element after new/save" do
283
283
  @user = Foo::User.new
284
284
  @user.fullname = "Lindsay Fünke (before save)"
285
285
  @user.save
286
- @user.fullname.should == "Lindsay Fünke"
286
+ expect(@user.fullname).to eq("Lindsay Fünke")
287
287
  end
288
288
  end
289
289
 
290
290
  context "when include_root_in_json set json_api" do
291
291
  before do
292
- Her::API.setup :url => "https://api.example.com" do |builder|
292
+ Her::API.setup url: "https://api.example.com" do |builder|
293
293
  builder.use Her::Middleware::FirstLevelParseJSON
294
294
  builder.use Faraday::Request::UrlEncoded
295
295
  end
296
296
 
297
297
  Her::API.default_api.connection.adapter :test do |stub|
298
- stub.post("/users") { |env| [200, {}, { :users => [{ :id => 1, :fullname => params(env)[:users][:fullname] }] }.to_json] }
298
+ stub.post("/users") { |env| [200, {}, { users: [{ id: 1, fullname: params(env)[:users][:fullname] }] }.to_json] }
299
299
  end
300
300
  end
301
301
 
@@ -309,26 +309,26 @@ describe Her::Model::Parse do
309
309
  end
310
310
 
311
311
  it "wraps params in the element name in `to_params`" do
312
- @new_user = Foo::User.new(:fullname => "Tobias Fünke")
313
- @new_user.to_params.should == { :users => [{ :fullname => "Tobias Fünke" }] }
312
+ @new_user = Foo::User.new(fullname: "Tobias Fünke")
313
+ expect(@new_user.to_params).to eq(users: [{ fullname: "Tobias Fünke" }])
314
314
  end
315
315
 
316
316
  it "wraps params in the element name in `.where`" do
317
- @new_user = Foo::User.where(:fullname => "Tobias Fünke").build
318
- @new_user.fullname.should == "Tobias Fünke"
317
+ @new_user = Foo::User.where(fullname: "Tobias Fünke").build
318
+ expect(@new_user.fullname).to eq("Tobias Fünke")
319
319
  end
320
320
  end
321
321
  end
322
322
 
323
- context 'when send_only_modified_attributes is set' do
323
+ context "when send_only_modified_attributes is set" do
324
324
  before do
325
- Her::API.setup :url => "https://api.example.com", :send_only_modified_attributes => true do |builder|
325
+ Her::API.setup url: "https://api.example.com", send_only_modified_attributes: true do |builder|
326
326
  builder.use Her::Middleware::FirstLevelParseJSON
327
327
  builder.use Faraday::Request::UrlEncoded
328
328
  end
329
329
 
330
330
  Her::API.default_api.connection.adapter :test do |stub|
331
- stub.get("/users/1") { |env| [200, {}, { :id => 1, :first_name => "Gooby", :last_name => "Pls" }.to_json] }
331
+ stub.get("/users/1") { [200, {}, { id: 1, first_name: "Gooby", last_name: "Pls" }.to_json] }
332
332
  end
333
333
 
334
334
  spawn_model "Foo::User" do
@@ -336,10 +336,10 @@ describe Her::Model::Parse do
336
336
  end
337
337
  end
338
338
 
339
- it 'only sends the attributes that were modified' do
339
+ it "only sends the attributes that were modified" do
340
340
  user = Foo::User.find 1
341
- user.first_name = 'Someone'
342
- expect(user.to_params).to eql(:user => {:first_name => 'Someone'})
341
+ user.first_name = "Someone"
342
+ expect(user.to_params).to eql(user: { first_name: "Someone" })
343
343
  end
344
344
  end
345
345
  end