acfs 0.42.0 → 0.43.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 (93) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +8 -9
  4. data/acfs.gemspec +3 -3
  5. data/lib/acfs.rb +0 -2
  6. data/lib/acfs/adapter/base.rb +0 -2
  7. data/lib/acfs/adapter/typhoeus.rb +6 -9
  8. data/lib/acfs/collection.rb +3 -3
  9. data/lib/acfs/collections/paginatable.rb +16 -16
  10. data/lib/acfs/configuration.rb +3 -5
  11. data/lib/acfs/errors.rb +8 -7
  12. data/lib/acfs/global.rb +1 -1
  13. data/lib/acfs/location.rb +11 -11
  14. data/lib/acfs/middleware/base.rb +1 -2
  15. data/lib/acfs/middleware/json.rb +0 -1
  16. data/lib/acfs/middleware/logger.rb +0 -2
  17. data/lib/acfs/middleware/print.rb +0 -2
  18. data/lib/acfs/middleware/serializer.rb +3 -6
  19. data/lib/acfs/operation.rb +3 -4
  20. data/lib/acfs/request.rb +2 -3
  21. data/lib/acfs/request/callbacks.rb +2 -3
  22. data/lib/acfs/resource.rb +34 -5
  23. data/lib/acfs/{model → resource}/attributes.rb +70 -46
  24. data/lib/acfs/{model → resource}/attributes/base.rb +10 -6
  25. data/lib/acfs/resource/attributes/boolean.rb +33 -0
  26. data/lib/acfs/resource/attributes/date_time.rb +32 -0
  27. data/lib/acfs/{model → resource}/attributes/dict.rb +1 -3
  28. data/lib/acfs/{model → resource}/attributes/float.rb +3 -6
  29. data/lib/acfs/{model → resource}/attributes/integer.rb +3 -6
  30. data/lib/acfs/{model → resource}/attributes/list.rb +2 -5
  31. data/lib/acfs/{model → resource}/attributes/string.rb +4 -6
  32. data/lib/acfs/{model → resource}/attributes/uuid.rb +18 -8
  33. data/lib/acfs/resource/dirty.rb +47 -0
  34. data/lib/acfs/{model → resource}/initialization.rb +8 -10
  35. data/lib/acfs/{model → resource}/loadable.rb +3 -4
  36. data/lib/acfs/{model → resource}/locatable.rb +22 -23
  37. data/lib/acfs/{model → resource}/operational.rb +2 -3
  38. data/lib/acfs/resource/persistence.rb +257 -0
  39. data/lib/acfs/{model → resource}/query_methods.rb +81 -66
  40. data/lib/acfs/{model → resource}/service.rb +10 -9
  41. data/lib/acfs/resource/validation.rb +28 -0
  42. data/lib/acfs/response.rb +1 -2
  43. data/lib/acfs/response/formats.rb +1 -2
  44. data/lib/acfs/response/status.rb +3 -5
  45. data/lib/acfs/runner.rb +4 -5
  46. data/lib/acfs/service.rb +4 -6
  47. data/lib/acfs/service/middleware.rb +1 -3
  48. data/lib/acfs/singleton_resource.rb +11 -24
  49. data/lib/acfs/stub.rb +30 -22
  50. data/lib/acfs/util.rb +1 -1
  51. data/lib/acfs/version.rb +4 -2
  52. data/spec/acfs/adapter/typhoeus_spec.rb +4 -4
  53. data/spec/acfs/collection_spec.rb +33 -33
  54. data/spec/acfs/configuration_spec.rb +0 -1
  55. data/spec/acfs/global_spec.rb +3 -3
  56. data/spec/acfs/middleware/json_spec.rb +2 -2
  57. data/spec/acfs/middleware/msgpack_spec.rb +4 -4
  58. data/spec/acfs/request/callbacks_spec.rb +8 -8
  59. data/spec/acfs/request_spec.rb +5 -5
  60. data/spec/acfs/{model → resource}/attributes/boolean_spec.rb +2 -2
  61. data/spec/acfs/{model → resource}/attributes/date_time_spec.rb +7 -7
  62. data/spec/acfs/{model → resource}/attributes/dict_spec.rb +6 -6
  63. data/spec/acfs/{model → resource}/attributes/float_spec.rb +3 -3
  64. data/spec/acfs/{model → resource}/attributes/list_spec.rb +5 -5
  65. data/spec/acfs/{model → resource}/attributes/uuid_spec.rb +6 -6
  66. data/spec/acfs/{model → resource}/attributes_spec.rb +31 -17
  67. data/spec/acfs/{model → resource}/dirty_spec.rb +7 -5
  68. data/spec/acfs/{model → resource}/initialization_spec.rb +7 -7
  69. data/spec/acfs/{model → resource}/loadable_spec.rb +4 -3
  70. data/spec/acfs/{model → resource}/locatable_spec.rb +24 -14
  71. data/spec/acfs/{model → resource}/persistance_spec.rb +34 -34
  72. data/spec/acfs/{model → resource}/query_methods_spec.rb +171 -130
  73. data/spec/acfs/{model → resource}/validation_spec.rb +5 -6
  74. data/spec/acfs/response/formats_spec.rb +1 -1
  75. data/spec/acfs/response/status_spec.rb +1 -1
  76. data/spec/acfs/runner_spec.rb +2 -3
  77. data/spec/acfs/service/middleware_spec.rb +1 -1
  78. data/spec/acfs/service_spec.rb +3 -5
  79. data/spec/acfs/singleton_resource_spec.rb +3 -3
  80. data/spec/acfs/stub_spec.rb +52 -24
  81. data/spec/acfs_spec.rb +22 -19
  82. data/spec/spec_helper.rb +1 -1
  83. data/spec/support/hash.rb +9 -0
  84. data/spec/support/service.rb +4 -7
  85. data/spec/support/shared/find_callbacks.rb +7 -7
  86. metadata +52 -52
  87. data/lib/acfs/model.rb +0 -43
  88. data/lib/acfs/model/attributes/boolean.rb +0 -38
  89. data/lib/acfs/model/attributes/date_time.rb +0 -30
  90. data/lib/acfs/model/dirty.rb +0 -49
  91. data/lib/acfs/model/persistence.rb +0 -243
  92. data/lib/acfs/model/relations.rb +0 -10
  93. data/lib/acfs/model/validation.rb +0 -30
@@ -1,10 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Acfs::Model::Dirty do
3
+ describe Acfs::Resource::Dirty do
4
4
  let(:model) { MyUser.new }
5
5
  before do
6
- stub_request(:get, "http://users.example.org/users/1").to_return response({ id: 1, name: 'Anon', age: 12 })
7
- stub_request(:post, 'http://users.example.org/users').to_return response({ id: 5, name: 'dhh', age: 12 })
6
+ stub_request(:get, 'http://users.example.org/users/1')
7
+ .to_return response id: 1, name: 'Anon', age: 12
8
+ stub_request(:post, 'http://users.example.org/users')
9
+ .to_return response id: 5, name: 'dhh', age: 12
8
10
  end
9
11
 
10
12
  it 'includes ActiveModel::Dirty' do
@@ -25,7 +27,7 @@ describe Acfs::Model::Dirty do
25
27
 
26
28
  context 'after model load' do
27
29
  let(:user) { MyUser.find 1 }
28
- before { user; Acfs.run}
30
+ before { user && Acfs.run }
29
31
 
30
32
  it { expect(user).to_not be_changed }
31
33
  end
@@ -37,7 +39,7 @@ describe Acfs::Model::Dirty do
37
39
  end
38
40
 
39
41
  context 'after model new with attrs' do
40
- let(:user) { MyUser.new name: "Uschi" }
42
+ let(:user) { MyUser.new name: 'Uschi' }
41
43
 
42
44
  it { expect(user).to be_changed }
43
45
  end
@@ -1,10 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Acfs::Model::Initialization' do
3
+ describe 'Acfs::Resource::Initialization' do
4
4
  let(:model) do
5
- Class.new.tap do |c|
5
+ Class.new(Acfs::Resource).tap do |c|
6
6
  c.class_eval do
7
- include Acfs::Model
8
7
  attr_accessor :name, :age
9
8
  private :age=
10
9
  end
@@ -13,18 +12,19 @@ describe 'Acfs::Model::Initialization' do
13
12
 
14
13
  describe '#initialize' do
15
14
  it 'should allow to set attributes with initializer' do
16
- m = model.new name: "John"
17
- expect(m.name).to be == "John"
15
+ m = model.new name: 'John'
16
+ expect(m.name).to eq 'John'
18
17
  end
19
18
 
20
19
  it 'should raise error when attributes with private setters are given' do
21
- expect { model.new(age: 25) }.to raise_error(NoMethodError)
20
+ expect { model.new age: 25 }.to raise_error(NoMethodError)
22
21
  end
23
22
  end
24
23
 
25
24
  describe '#persisted?' do
25
+ subject { model.new.persisted? }
26
26
  it 'should be false' do
27
- expect(model.new.persisted?).to be false
27
+ should be false
28
28
  end
29
29
  end
30
30
  end
@@ -1,9 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Acfs::Model::Loadable do
3
+ describe Acfs::Resource::Loadable do
4
4
  let(:model) { MyUser.find 1 }
5
5
  before do
6
- stub_request(:get, "http://users.example.org/users/1").to_return response({ id: 1, name: "Anon", age: 12 })
6
+ stub_request(:get, 'http://users.example.org/users/1')
7
+ .to_return response id: 1, name: 'Anon', age: 12
7
8
  end
8
9
 
9
10
  describe '#loaded?' do
@@ -12,7 +13,7 @@ describe Acfs::Model::Loadable do
12
13
  end
13
14
 
14
15
  context 'afer Acfs#run' do
15
- before { model; Acfs.run}
16
+ before { model && Acfs.run }
16
17
  it { expect(model).to be_loaded }
17
18
  end
18
19
  end
@@ -1,10 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Acfs::Model::Locatable do
3
+ describe Acfs::Resource::Locatable do
4
4
  let(:model) { MyUser }
5
5
  before do
6
- stub_request(:get, 'http://users.example.org/users/1').to_return response({id: 1, name: 'Anon', age: 12})
7
- stub_request(:get, 'http://users.example.org/users/1/profile').to_return response({user_id: 2, twitter_handle: '@anon'})
6
+ stub_request(:get, 'http://users.example.org/users/1')
7
+ .to_return response id: 1, name: 'Anon', age: 12
8
+ stub_request(:get, 'http://users.example.org/users/1/profile')
9
+ .to_return response user_id: 2, twitter_handle: '@anon'
8
10
  end
9
11
 
10
12
  describe '.url' do
@@ -20,12 +22,13 @@ describe Acfs::Model::Locatable do
20
22
  let(:model) { Profile }
21
23
 
22
24
  it 'should replace placeholder' do
23
- expect(model.url(user_id: 1)).to eq 'http://users.example.org/users/1/profile'
25
+ expect(model.url(user_id: 1))
26
+ .to eq 'http://users.example.org/users/1/profile'
24
27
  end
25
28
 
26
29
  context 'without attributes' do
27
30
  it 'should raise an error if attribute is missing' do
28
- expect{ model.url }.to raise_error ArgumentError
31
+ expect { model.url }.to raise_error ArgumentError
29
32
  end
30
33
  end
31
34
  end
@@ -37,7 +40,10 @@ describe Acfs::Model::Locatable do
37
40
 
38
41
  context ':list location' do
39
42
  let(:action) { :list }
40
- its(:raw_uri) { should eq 'http://users.example.org/users/:user_id/sessions' }
43
+
44
+ its(:raw_uri) do
45
+ should eq 'http://users.example.org/users/:user_id/sessions'
46
+ end
41
47
  end
42
48
 
43
49
  context ':create location' do
@@ -52,12 +58,16 @@ describe Acfs::Model::Locatable do
52
58
 
53
59
  context ':update location' do
54
60
  let(:action) { :update }
55
- its(:raw_uri) { expect{ subject }.to raise_error(ArgumentError, /update.*disabled/)}
61
+ its(:raw_uri) do
62
+ expect { subject }.to raise_error ArgumentError, /update.*disabled/
63
+ end
56
64
  end
57
65
 
58
66
  context ':delete location' do
59
67
  let(:action) { :delete }
60
- its(:raw_uri) { should eq 'http://users.example.org/users/:user_id/sessions/del/:id' }
68
+ its(:raw_uri) do
69
+ should eq 'http://users.example.org/users/:user_id/sessions/del/:id'
70
+ end
61
71
  end
62
72
  end
63
73
  end
@@ -67,30 +77,30 @@ describe Acfs::Model::Locatable do
67
77
  let(:m) { model.new }
68
78
 
69
79
  it 'should return nil' do
70
- expect(m.url).to be == nil
80
+ expect(m.url).to be_nil
71
81
  end
72
82
 
73
83
  context 'new resource with id' do
74
84
  let(:m) { model.new id: 475 }
75
85
 
76
86
  it 'should return resource URL' do
77
- expect(m.url).to be == 'http://users.example.org/users/475'
87
+ expect(m.url).to eq 'http://users.example.org/users/475'
78
88
  end
79
89
  end
80
90
 
81
91
  context 'with attribute in path' do
82
92
  it 'should return nil' do
83
- expect(m.url).to be == nil
93
+ expect(m.url).to be_nil
84
94
  end
85
95
  end
86
96
  end
87
97
 
88
98
  context 'loaded resource' do
89
99
  let(:m) { model.find 1 }
90
- before { m; Acfs.run }
100
+ before { m && Acfs.run }
91
101
 
92
102
  it "should return resource's URL" do
93
- expect(m.url).to be == 'http://users.example.org/users/1'
103
+ expect(m.url).to eq 'http://users.example.org/users/1'
94
104
  end
95
105
 
96
106
  context 'with attribute in path' do
@@ -98,7 +108,7 @@ describe Acfs::Model::Locatable do
98
108
  let(:m) { model.find user_id: 1 }
99
109
 
100
110
  it "should return resource's URL" do
101
- expect(m.url).to be == 'http://users.example.org/users/2/profile'
111
+ expect(m.url).to eq 'http://users.example.org/users/2/profile'
102
112
  end
103
113
  end
104
114
  end
@@ -1,33 +1,33 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Acfs::Model::Persistence do
3
+ describe Acfs::Resource::Persistence do
4
4
  let(:model_class) { MyUser }
5
5
  before do
6
- @get_stub = stub_request(:get, 'http://users.example.org/users/1').to_return response({ id: 1, name: 'Anon', age: 12 })
6
+ @get_stub = stub_request(:get, 'http://users.example.org/users/1').to_return response(id: 1, name: 'Anon', age: 12)
7
7
 
8
8
  @patch_stub = stub_request(:put, 'http://users.example.org/users/1')
9
- .with(body: '{"id":1,"name":"Idefix","age":12}')
10
- .to_return response({ id: 1, name: 'Idefix', age: 12 })
9
+ .with(body: '{"id":1,"name":"Idefix","age":12}')
10
+ .to_return response(id: 1, name: 'Idefix', age: 12)
11
11
 
12
12
  @post_stub = stub_request(:post, 'http://users.example.org/users')
13
- .with(body: '{"id":null,"name":"Idefix","age":12}')
14
- .to_return response({ id: 5, name: 'Idefix', age: 12 })
13
+ .with(body: '{"id":null,"name":"Idefix","age":12}')
14
+ .to_return response(id: 5, name: 'Idefix', age: 12)
15
15
 
16
16
  stub_request(:post, 'http://users.example.org/users')
17
17
  .with(body: '{"id":null,"name":"Anon","age":null}')
18
- .to_return response({ id: 5, name: 'Anon', age: 12 })
18
+ .to_return response(id: 5, name: 'Anon', age: 12)
19
19
 
20
20
  stub_request(:post, 'http://users.example.org/users')
21
21
  .with(body: '{id:null,"name":"Idefix","age":12}')
22
- .to_return response({ id: 5, name: 'Idefix', age: 12 })
22
+ .to_return response(id: 5, name: 'Idefix', age: 12)
23
23
 
24
24
  stub_request(:post, 'http://users.example.org/users')
25
25
  .with(body: '{"id":null,"name":null,"age":12}')
26
- .to_return response({ errors: { name: [ 'required' ] }}, status: 422)
26
+ .to_return response({errors: {name: ['required']}}, {status: 422})
27
27
 
28
28
  @del = stub_request(:delete, 'http://users.example.org/users/1')
29
- .with(body: '{}')
30
- .to_return response({ id: 1, name: 'Idefix', age: 12 }, status: 200)
29
+ .with(body: '{}')
30
+ .to_return response({id: 1, name: 'Idefix', age: 12}, {status: 200})
31
31
  end
32
32
 
33
33
  context 'new model' do
@@ -65,7 +65,7 @@ describe Acfs::Model::Persistence do
65
65
  let!(:req) do
66
66
  stub_request(:post, 'http://users.example.org/users')
67
67
  .with(body: '{"id":null,"name":"Idefix","age":null,"born_at":"Berlin"}')
68
- .to_return response({id: 5, name: 'Idefix', age: 12, wuff: 'woa'})
68
+ .to_return response(id: 5, name: 'Idefix', age: 12, wuff: 'woa')
69
69
  end
70
70
  let(:model) { model_class.new name: 'Idefix', born_at: 'Berlin' }
71
71
 
@@ -100,12 +100,12 @@ describe Acfs::Model::Persistence do
100
100
 
101
101
  describe '#update_attributes' do
102
102
  subject { -> { model.update_attributes name: 'John' } }
103
- it { expect{ subject.call }.to raise_error Acfs::ResourceNotLoaded }
103
+ it { expect { subject.call }.to raise_error Acfs::ResourceNotLoaded }
104
104
  end
105
105
 
106
106
  describe '#update_attributes!' do
107
107
  subject { -> { model.update_attributes! name: 'John' } }
108
- it { expect{ subject.call }.to raise_error Acfs::ResourceNotLoaded }
108
+ it { expect { subject.call }.to raise_error Acfs::ResourceNotLoaded }
109
109
  end
110
110
  end
111
111
 
@@ -145,24 +145,24 @@ describe Acfs::Model::Persistence do
145
145
  end
146
146
 
147
147
  describe 'correct URL generation' do
148
- let(:model_class) {PathArguments}
149
- let(:model) {model_class.find 1, params: {required_arg: 'some_value'}}
148
+ let(:model_class) { PathArguments }
149
+ let(:model) { model_class.find 1, params: {required_arg: 'some_value'} }
150
150
 
151
151
  before :each do
152
152
  resource_url = 'http://users.example.org/some_value/users/1'
153
153
  @my_get_stub = stub_request(:get, resource_url)
154
- .to_return response({ id: 1, required_arg: 'some_value' })
154
+ .to_return response(id: 1, required_arg: 'some_value')
155
155
  @my_delete_stub = stub_request(:delete, resource_url)
156
- .with(body: '{}')
157
- .to_return response({ id: 1, required_arg: 'some_value' }, status: 200)
156
+ .with(body: '{}')
157
+ .to_return response({id: 1, required_arg: 'some_value'}, {status: 200})
158
158
  model
159
159
  Acfs.run
160
160
  end
161
161
 
162
162
  it 'should not raise an error on URL generation' do
163
- expect {
163
+ expect do
164
164
  model.delete!
165
- }.not_to raise_error
165
+ end.not_to raise_error
166
166
  end
167
167
 
168
168
  it 'should request the delete' do
@@ -187,8 +187,8 @@ describe Acfs::Model::Persistence do
187
187
  end
188
188
 
189
189
  it 'should pass second hash to save' do
190
- expect(model.__getobj__).to receive(:save).with({ bla: 'blub' })
191
- model.update_attributes({ name: 'Idefix' }, { bla: 'blub' })
190
+ expect(model.__getobj__).to receive(:save).with(bla: 'blub')
191
+ model.update_attributes({name: 'Idefix'}, {bla: 'blub'})
192
192
  end
193
193
  end
194
194
 
@@ -207,8 +207,8 @@ describe Acfs::Model::Persistence do
207
207
  end
208
208
 
209
209
  it 'should pass second hash to save' do
210
- expect(model.__getobj__).to receive(:save!).with({ bla: 'blub' })
211
- model.update_attributes!({ name: 'Idefix' }, { bla: 'blub' })
210
+ expect(model.__getobj__).to receive(:save!).with(bla: 'blub')
211
+ model.update_attributes!({name: 'Idefix'}, {bla: 'blub'})
212
212
  end
213
213
  end
214
214
  end
@@ -221,13 +221,13 @@ describe Acfs::Model::Persistence do
221
221
  before do
222
222
  stub_request(:put, 'http://users.example.org/users/1')
223
223
  .with(body: '{"id":1,"name":"","age":12}')
224
- .to_return response({ errors: { name: [ 'required' ] }}, status: 422)
224
+ .to_return response({errors: {name: ['required']}}, {status: 422})
225
225
  end
226
226
 
227
227
  it 'should set local errors hash' do
228
228
  model.name = ''
229
229
  model.save! rescue nil
230
- expect(model.errors.to_hash).to be == { name: %w(required) }
230
+ expect(model.errors.to_hash).to be == {name: %w(required)}
231
231
  end
232
232
  end
233
233
 
@@ -237,15 +237,15 @@ describe Acfs::Model::Persistence do
237
237
 
238
238
  before do
239
239
  stub_request(:put, 'http://users.example.org/users/1')
240
- .with(body: '{"id":1,"name":"","age":12}')
241
- .to_return response({ errors: { name: [ 'required' ] }}, status: 422)
240
+ .with(body: '{"id":1,"name":"","age":12}')
241
+ .to_return response({errors: {name: ['required']}}, {status: 422})
242
242
  end
243
243
  end
244
244
  end
245
245
 
246
246
  describe '.create!' do
247
247
  context 'with valid data' do
248
- let(:data) { { name: 'Idefix', age: 12 } }
248
+ let(:data) { {name: 'Idefix', age: 12} }
249
249
 
250
250
  it 'should create new resource' do
251
251
  model = model_class.create! data
@@ -263,9 +263,9 @@ describe Acfs::Model::Persistence do
263
263
  let(:data) { {name: nil, age: 12} }
264
264
 
265
265
  it 'should raise an error' do
266
- expect{ model_class.create! data }.to \
266
+ expect { model_class.create! data }.to \
267
267
  raise_error(::Acfs::InvalidResource) do |error|
268
- expect(error.errors).to be == { 'name' => %w(required) }
268
+ expect(error.errors).to be == {'name' => %w(required)}
269
269
  end
270
270
  end
271
271
  end
@@ -303,13 +303,13 @@ describe Acfs::Model::Persistence do
303
303
  let!(:req) do
304
304
  stub_request(:post, 'http://users.example.org/users')
305
305
  .with(body: '{"id":null,"name":"Anon","age":9,"born_at":"today"}')
306
- .to_return response({id: 5, name: 'Anon', age: 9})
306
+ .to_return response(id: 5, name: 'Anon', age: 9)
307
307
  end
308
308
  let(:data) { {age: 9, born_at: 'today'} }
309
309
 
310
310
  it 'should store them in attributes' do
311
311
  expect(subject.attributes).to eq 'id' => 5, 'name' => 'Anon',
312
- 'age' => 9, 'born_at' => 'today'
312
+ 'age' => 9, 'born_at' => 'today'
313
313
  end
314
314
  end
315
315
  end
@@ -1,25 +1,28 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Acfs::Model::QueryMethods do
3
+ describe Acfs::Resource::QueryMethods do
4
4
  let(:model) { MyUser }
5
5
 
6
6
  describe '.find' do
7
7
  context 'with single id' do
8
8
  context 'with successful response' do
9
9
  before do
10
- stub_request(:get, 'http://users.example.org/users/1').to_return response({id: 1, name: 'Anon', age: 12, born_at: 'Berlin'})
11
- stub_request(:get, 'http://users.example.org/users/2').to_return response({id: 2, type: 'Customer', name: 'Clare Customer', age: 24})
10
+ stub_request(:get, 'http://users.example.org/users/1')
11
+ .to_return response id: 1, name: 'Anon', age: 12, born_at: 'Berlin'
12
+ stub_request(:get, 'http://users.example.org/users/2')
13
+ .to_return response id: 2, type: 'Customer',
14
+ name: 'Clare Customer', age: 24
12
15
  end
13
16
 
14
- let(:action) { lambda { |cb=nil| model.find 1, &cb } }
17
+ let(:action) { ->(cb = nil) { model.find(1, &cb) } }
15
18
  it_behaves_like 'a query method with multi-callback support'
16
19
 
17
20
  it 'should load a single remote resource' do
18
21
  user = action.call
19
22
  Acfs.run
20
23
 
21
- expect(user.attributes).to eq(
22
- {id: 1, name: 'Anon', age: 12, born_at: 'Berlin'}.stringify_keys)
24
+ expect(user.attributes).to eq id: 1, name: 'Anon',
25
+ age: 12, born_at: 'Berlin'
23
26
  end
24
27
 
25
28
  context 'with resource type inheritance' do
@@ -40,7 +43,8 @@ describe Acfs::Model::QueryMethods do
40
43
 
41
44
  context 'with 404 response' do
42
45
  before do
43
- stub_request(:get, 'http://users.example.org/users/1').to_return response({error: 'not found'}, status: 404)
46
+ stub_request(:get, 'http://users.example.org/users/1')
47
+ .to_return response({error: 'not found'}, {status: 404})
44
48
  end
45
49
 
46
50
  it 'should raise a NotFound error' do
@@ -54,7 +58,8 @@ describe Acfs::Model::QueryMethods do
54
58
 
55
59
  context 'with 500 response' do
56
60
  before do
57
- stub_request(:get, 'http://users.example.org/users/1').to_return response(nil, status: 500)
61
+ stub_request(:get, 'http://users.example.org/users/1')
62
+ .to_return response(nil, status: 500)
58
63
  end
59
64
 
60
65
  it 'should raise a response error' do
@@ -69,55 +74,59 @@ describe Acfs::Model::QueryMethods do
69
74
 
70
75
  context 'with multiple ids' do
71
76
  before do
72
- stub_request(:get, 'http://users.example.org/users/1').to_return response({id: 1, name: 'Anon', age: 12})
73
- stub_request(:get, 'http://users.example.org/users/2').to_return response({id: 2, name: 'Johnny', age: 42})
74
- stub_request(:get, 'http://users.example.org/users/3').to_return response({id: 3, type: 'Customer', name: 'Anon', age: 12})
75
- stub_request(:get, 'http://users.example.org/users/4').to_return response({id: 4, name: 'Johnny', age: 42})
77
+ stub_request(:get, 'http://users.example.org/users/1')
78
+ .to_return response id: 1, name: 'Anon', age: 12
79
+ stub_request(:get, 'http://users.example.org/users/2')
80
+ .to_return response id: 2, name: 'Johnny', age: 42
81
+ stub_request(:get, 'http://users.example.org/users/3')
82
+ .to_return response id: 3, type: 'Customer', name: 'Anon', age: 12
83
+ stub_request(:get, 'http://users.example.org/users/4')
84
+ .to_return response id: 4, name: 'Johnny', age: 42
76
85
  end
77
86
 
78
87
  context 'with successful response' do
79
88
  it 'should load a multiple remote resources' do
80
- users = model.find 1, 2
89
+ users = model.find([1, 2])
81
90
  Acfs.run
82
91
 
83
92
  expect(users.size).to be == 2
84
- expect(users[0].attributes).to be == {id: 1, name: 'Anon', age: 12}.stringify_keys
85
- expect(users[1].attributes).to be == {id: 2, name: 'Johnny', age: 42}.stringify_keys
93
+ expect(users[0].attributes).to eq id: 1, name: 'Anon', age: 12
94
+ expect(users[1].attributes).to eq id: 2, name: 'Johnny', age: 42
86
95
  end
87
96
 
88
97
  it 'should invoke callback after all models are loaded' do
89
- proc = Proc.new {}
90
- expect(proc).to receive(:call) do |users|
91
- expect(users).to be === @users
98
+ block = proc {}
99
+ expect(block).to receive(:call) do |users|
100
+ expect(users).to equal @users
92
101
  expect(users.size).to be == 2
93
102
  expect(users).to be_loaded
94
103
  end
95
104
 
96
- @users = model.find 1, 2, &proc
105
+ @users = model.find([1, 2], &block)
97
106
  Acfs.run
98
107
  end
99
108
 
100
109
  it 'should invoke multiple callback after all models are loaded' do
101
- proc1 = Proc.new {}
102
- proc2 = Proc.new {}
110
+ proc1 = proc {}
111
+ proc2 = proc {}
103
112
  expect(proc1).to receive(:call) do |users|
104
- expect(users).to be === @users
113
+ expect(users).to equal @users
105
114
  expect(users.size).to be == 2
106
115
  expect(users).to be_loaded
107
116
  end
108
117
  expect(proc2).to receive(:call) do |users|
109
- expect(users).to be === @users
118
+ expect(users).to equal @users
110
119
  expect(users.size).to be == 2
111
120
  expect(users).to be_loaded
112
121
  end
113
122
 
114
- @users = model.find 1, 2, &proc1
123
+ @users = model.find([1, 2], &proc1)
115
124
  Acfs.add_callback(@users, &proc2)
116
125
  Acfs.run
117
126
  end
118
127
 
119
128
  it 'should respect resource type inheritance' do
120
- customers = MyUser.find 3, 4
129
+ customers = MyUser.find [3, 4]
121
130
  Acfs.run
122
131
 
123
132
  expect(customers[0]).to be_a Customer
@@ -127,11 +136,12 @@ describe Acfs::Model::QueryMethods do
127
136
 
128
137
  context 'with one 404 response' do
129
138
  before do
130
- stub_request(:get, 'http://users.example.org/users/1').to_return response({error: 'not found'}, status: 404)
139
+ stub_request(:get, 'http://users.example.org/users/1')
140
+ .to_return response({error: 'not found'}, {status: 404})
131
141
  end
132
142
 
133
143
  it 'should raise resource not found error' do
134
- model.find 1, 2
144
+ model.find [1, 2]
135
145
 
136
146
  expect { Acfs.run }.to raise_error(Acfs::ResourceNotFound)
137
147
  end
@@ -144,24 +154,28 @@ describe Acfs::Model::QueryMethods do
144
154
  let(:pc) { PC }
145
155
  let(:mac) { Mac }
146
156
  before do
147
- stub_request(:get, 'http://computers.example.org/computers').to_return response([{id: 1, type: 'PC'}, {id: 2, type: 'Computer'}, {id: 3, type: 'Mac'}])
157
+ stub_request(:get, 'http://computers.example.org/computers')
158
+ .to_return response [
159
+ {id: 1, type: 'PC'},
160
+ {id: 2, type: 'Computer'},
161
+ {id: 3, type: 'Mac'}]
148
162
  end
149
163
 
150
164
  it 'should invoke multiple callback after all models are loaded' do
151
- proc1 = Proc.new {}
152
- proc2 = Proc.new {}
165
+ proc1 = proc {}
166
+ proc2 = proc {}
153
167
  expect(proc1).to receive(:call) do |computers|
154
- expect(computers).to be === @computers
168
+ expect(computers).to equal @computers
155
169
  expect(computers.size).to be == 3
156
170
  expect(computers).to be_loaded
157
171
  end
158
172
  expect(proc2).to receive(:call) do |computers|
159
- expect(computers).to be === @computers
173
+ expect(computers).to equal @computers
160
174
  expect(computers.size).to be == 3
161
175
  expect(computers).to be_loaded
162
176
  end
163
177
 
164
- @computers = computer.all &proc1
178
+ @computers = computer.all(&proc1)
165
179
  Acfs.add_callback(@computers, &proc2)
166
180
  Acfs.run
167
181
  end
@@ -191,21 +205,33 @@ describe Acfs::Model::QueryMethods do
191
205
 
192
206
  context 'with another resource as type instead' do
193
207
  before do
194
- stub_request(:get, 'http://computers.example.org/computers').to_return response([{id: 1, type: 'MyUser'}, {id: 2, type: 'Computer'}, {id: 3, type: 'Mac'}])
208
+ stub_request(:get, 'http://computers.example.org/computers')
209
+ .to_return response [
210
+ {id: 1, type: 'MyUser'},
211
+ {id: 2, type: 'Computer'},
212
+ {id: 3, type: 'Mac'}]
195
213
  end
196
214
  it_behaves_like 'with invalid type'
197
215
  end
198
216
 
199
217
  context 'with a random string as type instead' do
200
218
  before do
201
- stub_request(:get, 'http://computers.example.org/computers').to_return response([{id: 1, type: 'PC'}, {id: 2, type: 'noValidType'}, {id: 3, type: 'Mac'}])
219
+ stub_request(:get, 'http://computers.example.org/computers')
220
+ .to_return response [
221
+ {id: 1, type: 'PC'},
222
+ {id: 2, type: 'noValidType'},
223
+ {id: 3, type: 'Mac'}]
202
224
  end
203
225
  it_behaves_like 'with invalid type'
204
226
  end
205
227
 
206
228
  context 'with a non-string as type instead' do
207
229
  before do
208
- stub_request(:get, 'http://computers.example.org/computers').to_return response([{id: 1, type: 'PC'}, {id: 2, type: 'Computer'}, {id: 3, type: 42}])
230
+ stub_request(:get, 'http://computers.example.org/computers')
231
+ .to_return response [
232
+ {id: 1, type: 'PC'},
233
+ {id: 2, type: 'Computer'},
234
+ {id: 3, type: 42}]
209
235
  end
210
236
  it_behaves_like 'with invalid type'
211
237
  end
@@ -217,7 +243,7 @@ describe Acfs::Model::QueryMethods do
217
243
  context 'standard resource' do
218
244
  let(:model) { MyUser }
219
245
  let!(:user) { model.send described_method, age: 24 }
220
- subject { Acfs.run; user }
246
+ subject { Acfs.run && user }
221
247
 
222
248
  context 'return value' do
223
249
  subject { user }
@@ -227,7 +253,10 @@ describe Acfs::Model::QueryMethods do
227
253
  end
228
254
 
229
255
  context 'with params' do
230
- let!(:request) { stub_request(:get, 'http://users.example.org/users?age=24').to_return response([{id: 1, name: 'Mike', age: 24}]) }
256
+ let!(:request) do
257
+ stub_request(:get, 'http://users.example.org/users?age=24')
258
+ .to_return response([{id: 1, name: 'Mike', age: 24}])
259
+ end
231
260
 
232
261
  it 'should include params in URI to index action' do
233
262
  subject
@@ -236,24 +265,30 @@ describe Acfs::Model::QueryMethods do
236
265
  end
237
266
 
238
267
  context 'with non-empty response' do
239
- before { stub_request(:get, 'http://users.example.org/users?age=24').to_return response([{id: 1, name: 'Mike', age: 24}, {id: 4, type: 'Maria', age: 24}, {id: 7, type: 'James', age: 24}]) }
268
+ before do
269
+ stub_request(:get, 'http://users.example.org/users?age=24')
270
+ .to_return response [
271
+ {id: 1, name: 'Mike', age: 24},
272
+ {id: 4, type: 'Maria', age: 24},
273
+ {id: 7, type: 'James', age: 24}]
274
+ end
240
275
 
241
276
  it 'should invoke callback after model is loaded' do
242
- proc = Proc.new {}
277
+ block = proc {}
243
278
 
244
- expect(proc).to receive(:call) do |user|
279
+ expect(block).to receive(:call) do |user|
245
280
  expect(user).to eql @user.__getobj__
246
281
  expect(user).to be_a MyUser
247
282
  expect(user).to be_loaded
248
283
  end
249
284
 
250
- @user = model.send described_method, age: 24, &proc
285
+ @user = model.send described_method, age: 24, &block
251
286
  Acfs.run
252
287
  end
253
288
 
254
289
  it 'should invoke multiple callbacks after model is loaded' do
255
- proc1 = Proc.new {}
256
- proc2 = Proc.new {}
290
+ proc1 = proc {}
291
+ proc2 = proc {}
257
292
 
258
293
  expect(proc1).to receive(:call) do |user|
259
294
  expect(user).to eql @user.__getobj__
@@ -282,7 +317,7 @@ describe Acfs::Model::QueryMethods do
282
317
  let(:model) { Single }
283
318
 
284
319
  it '.find_by should not be defined' do
285
- expect { model.find_by }.to raise_error NoMethodError
320
+ expect { model.find_by }.to raise_error ::Acfs::UnsupportedOperation
286
321
  end
287
322
  end
288
323
  end
@@ -294,28 +329,31 @@ describe Acfs::Model::QueryMethods do
294
329
  context 'standard resource' do
295
330
  let(:model) { MyUser }
296
331
  let!(:user) { model.send described_method, age: 24 }
297
- subject { Acfs.run; user }
332
+ subject { Acfs.run && user }
298
333
 
299
334
  context 'with empty response' do
300
- before { stub_request(:get, 'http://users.example.org/users?age=24').to_return response([]) }
335
+ before do
336
+ stub_request(:get, 'http://users.example.org/users?age=24')
337
+ .to_return response []
338
+ end
301
339
 
302
340
  it { should be_nil }
303
341
 
304
342
  it 'should invoke callback after model is loaded' do
305
- proc = Proc.new {}
343
+ block = proc {}
306
344
 
307
- expect(proc).to receive(:call) do |user|
345
+ expect(block).to receive(:call) do |user|
308
346
  expect(user).to eql @user.__getobj__
309
347
  expect(user).to be_a NilClass
310
348
  end
311
349
 
312
- @user = model.find_by age: 24, &proc
350
+ @user = model.find_by age: 24, &block
313
351
  Acfs.run
314
352
  end
315
353
 
316
354
  it 'should invoke multiple callbacks after model is loaded' do
317
- proc1 = Proc.new {}
318
- proc2 = Proc.new {}
355
+ proc1 = proc {}
356
+ proc2 = proc {}
319
357
 
320
358
  expect(proc1).to receive(:call) do |user|
321
359
  expect(user).to eql @user.__getobj__
@@ -341,10 +379,13 @@ describe Acfs::Model::QueryMethods do
341
379
  context 'standard resource' do
342
380
  let(:model) { MyUser }
343
381
  let!(:user) { model.send described_method, age: 24 }
344
- subject { Acfs.run; user }
382
+ subject { Acfs.run && user }
345
383
 
346
384
  context 'with empty response' do
347
- before { stub_request(:get, 'http://users.example.org/users?age=24').to_return response([]) }
385
+ before do
386
+ stub_request(:get, 'http://users.example.org/users?age=24')
387
+ .to_return response []
388
+ end
348
389
 
349
390
  it 'should raise an ResourceNotFound error' do
350
391
  model.find_by! age: 24
@@ -352,11 +393,11 @@ describe Acfs::Model::QueryMethods do
352
393
  end
353
394
 
354
395
  it 'should not invoke callback after model could not be loaded' do
355
- proc = Proc.new {}
396
+ block = proc {}
356
397
 
357
- expect(proc).not_to receive(:call)
398
+ expect(block).not_to receive(:call)
358
399
 
359
- model.find_by! age: 24, &proc
400
+ model.find_by! age: 24, &block
360
401
  expect { Acfs.run }.to raise_error
361
402
  end
362
403
  end
@@ -365,30 +406,30 @@ describe Acfs::Model::QueryMethods do
365
406
  describe '#each_page' do
366
407
  context 'without parameters' do
367
408
  before do
368
- stub_request(:get, 'http://users.example.org/users').
369
- to_return response([{id: 1, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
370
- headers: {
371
- 'X-Total-Pages' => '4',
372
- 'Link' => '<http://users.example.org/users?page=2>; rel="next"'
373
- })
374
- stub_request(:get, 'http://users.example.org/users?page=2').
375
- to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
376
- headers: {
377
- 'X-Total-Pages' => '4',
378
- 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
379
- })
380
- stub_request(:get, 'http://users.example.org/users?page=3').
381
- to_return response([{id: 3, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
382
- headers: {
383
- 'X-Total-Pages' => '4',
384
- 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
385
- })
386
- stub_request(:get, 'http://users.example.org/users?page=4').
387
- to_return response([{id: 4, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
388
- headers: {
389
- 'X-Total-Pages' => '4',
390
- 'Link' => ''
391
- })
409
+ stub_request(:get, 'http://users.example.org/users')
410
+ .to_return response([{id: 1, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
411
+ headers: {
412
+ 'X-Total-Pages' => '4',
413
+ 'Link' => '<http://users.example.org/users?page=2>; rel="next"'
414
+ })
415
+ stub_request(:get, 'http://users.example.org/users?page=2')
416
+ .to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
417
+ headers: {
418
+ 'X-Total-Pages' => '4',
419
+ 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
420
+ })
421
+ stub_request(:get, 'http://users.example.org/users?page=3')
422
+ .to_return response([{id: 3, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
423
+ headers: {
424
+ 'X-Total-Pages' => '4',
425
+ 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
426
+ })
427
+ stub_request(:get, 'http://users.example.org/users?page=4')
428
+ .to_return response([{id: 4, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
429
+ headers: {
430
+ 'X-Total-Pages' => '4',
431
+ 'Link' => ''
432
+ })
392
433
  end
393
434
 
394
435
  it 'should iterate all pages' do
@@ -407,30 +448,30 @@ describe Acfs::Model::QueryMethods do
407
448
 
408
449
  context 'with parameters' do
409
450
  before do
410
- stub_request(:get, 'http://users.example.org/users?param=bla').
411
- to_return response([{id: 1, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
412
- headers: {
413
- 'X-Total-Pages' => '4',
414
- 'Link' => '<http://users.example.org/users?where=fuu&page=2>; rel="next"'
415
- })
416
- stub_request(:get, 'http://users.example.org/users?where=fuu&page=2').
417
- to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
418
- headers: {
419
- 'X-Total-Pages' => '4',
420
- 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
421
- })
422
- stub_request(:get, 'http://users.example.org/users?page=3').
423
- to_return response([{id: 3, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
424
- headers: {
425
- 'X-Total-Pages' => '4',
426
- 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
427
- })
428
- stub_request(:get, 'http://users.example.org/users?page=4').
429
- to_return response([{id: 4, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
430
- headers: {
431
- 'X-Total-Pages' => '4',
432
- 'Link' => ''
433
- })
451
+ stub_request(:get, 'http://users.example.org/users?param=bla')
452
+ .to_return response([{id: 1, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
453
+ headers: {
454
+ 'X-Total-Pages' => '4',
455
+ 'Link' => '<http://users.example.org/users?where=fuu&page=2>; rel="next"'
456
+ })
457
+ stub_request(:get, 'http://users.example.org/users?where=fuu&page=2')
458
+ .to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
459
+ headers: {
460
+ 'X-Total-Pages' => '4',
461
+ 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
462
+ })
463
+ stub_request(:get, 'http://users.example.org/users?page=3')
464
+ .to_return response([{id: 3, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
465
+ headers: {
466
+ 'X-Total-Pages' => '4',
467
+ 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
468
+ })
469
+ stub_request(:get, 'http://users.example.org/users?page=4')
470
+ .to_return response([{id: 4, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
471
+ headers: {
472
+ 'X-Total-Pages' => '4',
473
+ 'Link' => ''
474
+ })
434
475
  end
435
476
 
436
477
  it 'should call first page with params and follow relations' do
@@ -451,30 +492,30 @@ describe Acfs::Model::QueryMethods do
451
492
  describe '#each_item' do
452
493
  context 'without parameters' do
453
494
  before do
454
- stub_request(:get, 'http://users.example.org/users').
455
- to_return response([{id: 1, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
456
- headers: {
457
- 'X-Total-Pages' => '4',
458
- 'Link' => '<http://users.example.org/users?page=2>; rel="next"'
459
- })
460
- stub_request(:get, 'http://users.example.org/users?page=2').
461
- to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
462
- headers: {
463
- 'X-Total-Pages' => '4',
464
- 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
465
- })
466
- stub_request(:get, 'http://users.example.org/users?page=3').
467
- to_return response([{id: 3, name: 'Anno', age: 1604, born_at: 'Santa Maria'},{id: 4, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
468
- headers: {
469
- 'X-Total-Pages' => '4',
470
- 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
471
- })
472
- stub_request(:get, 'http://users.example.org/users?page=4').
473
- to_return response([{id: 5, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
474
- headers: {
475
- 'X-Total-Pages' => '4',
476
- 'Link' => ''
477
- })
495
+ stub_request(:get, 'http://users.example.org/users')
496
+ .to_return response([{id: 1, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
497
+ headers: {
498
+ 'X-Total-Pages' => '4',
499
+ 'Link' => '<http://users.example.org/users?page=2>; rel="next"'
500
+ })
501
+ stub_request(:get, 'http://users.example.org/users?page=2')
502
+ .to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
503
+ headers: {
504
+ 'X-Total-Pages' => '4',
505
+ 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
506
+ })
507
+ stub_request(:get, 'http://users.example.org/users?page=3')
508
+ .to_return response([{id: 3, name: 'Anno', age: 1604, born_at: 'Santa Maria'}, {id: 4, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
509
+ headers: {
510
+ 'X-Total-Pages' => '4',
511
+ 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
512
+ })
513
+ stub_request(:get, 'http://users.example.org/users?page=4')
514
+ .to_return response([{id: 5, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
515
+ headers: {
516
+ 'X-Total-Pages' => '4',
517
+ 'Link' => ''
518
+ })
478
519
  end
479
520
 
480
521
  it 'should iterate all pages' do
@@ -485,7 +526,7 @@ describe Acfs::Model::QueryMethods do
485
526
  end
486
527
  Acfs.run
487
528
 
488
- expect(indecies).to eq [1,2,3,4,5]
529
+ expect(indecies).to eq [1, 2, 3, 4, 5]
489
530
  end
490
531
  end
491
532
  end