acfs 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -0
  3. data/README.md +3 -4
  4. data/acfs.gemspec +19 -10
  5. data/lib/acfs.rb +2 -0
  6. data/lib/acfs/adapter/base.rb +6 -8
  7. data/lib/acfs/adapter/typhoeus.rb +26 -7
  8. data/lib/acfs/collection.rb +2 -1
  9. data/lib/acfs/collections/paginatable.rb +2 -1
  10. data/lib/acfs/configuration.rb +14 -7
  11. data/lib/acfs/errors.rb +33 -12
  12. data/lib/acfs/global.rb +12 -2
  13. data/lib/acfs/location.rb +9 -5
  14. data/lib/acfs/middleware/base.rb +5 -1
  15. data/lib/acfs/middleware/json.rb +2 -0
  16. data/lib/acfs/middleware/logger.rb +2 -0
  17. data/lib/acfs/middleware/msgpack.rb +2 -0
  18. data/lib/acfs/middleware/print.rb +2 -0
  19. data/lib/acfs/middleware/serializer.rb +2 -0
  20. data/lib/acfs/operation.rb +5 -3
  21. data/lib/acfs/request.rb +3 -0
  22. data/lib/acfs/request/callbacks.rb +5 -1
  23. data/lib/acfs/resource.rb +2 -0
  24. data/lib/acfs/resource/attributes.rb +3 -2
  25. data/lib/acfs/resource/attributes/base.rb +2 -1
  26. data/lib/acfs/resource/attributes/boolean.rb +2 -0
  27. data/lib/acfs/resource/attributes/date_time.rb +2 -1
  28. data/lib/acfs/resource/attributes/dict.rb +2 -0
  29. data/lib/acfs/resource/attributes/float.rb +5 -3
  30. data/lib/acfs/resource/attributes/integer.rb +2 -0
  31. data/lib/acfs/resource/attributes/list.rb +2 -0
  32. data/lib/acfs/resource/attributes/string.rb +2 -0
  33. data/lib/acfs/resource/attributes/uuid.rb +4 -3
  34. data/lib/acfs/resource/dirty.rb +2 -0
  35. data/lib/acfs/resource/initialization.rb +2 -0
  36. data/lib/acfs/resource/loadable.rb +2 -0
  37. data/lib/acfs/resource/locatable.rb +10 -6
  38. data/lib/acfs/resource/operational.rb +2 -1
  39. data/lib/acfs/resource/persistence.rb +7 -4
  40. data/lib/acfs/resource/query_methods.rb +5 -3
  41. data/lib/acfs/resource/service.rb +3 -1
  42. data/lib/acfs/resource/validation.rb +3 -1
  43. data/lib/acfs/response.rb +2 -0
  44. data/lib/acfs/response/formats.rb +2 -0
  45. data/lib/acfs/response/status.rb +3 -1
  46. data/lib/acfs/rspec.rb +2 -0
  47. data/lib/acfs/runner.rb +6 -1
  48. data/lib/acfs/service.rb +8 -2
  49. data/lib/acfs/service/middleware.rb +2 -0
  50. data/lib/acfs/service/middleware/stack.rb +5 -3
  51. data/lib/acfs/singleton_resource.rb +4 -2
  52. data/lib/acfs/stub.rb +33 -11
  53. data/lib/acfs/util.rb +2 -0
  54. data/lib/acfs/version.rb +3 -1
  55. data/lib/acfs/yard.rb +1 -0
  56. data/spec/acfs/adapter/typhoeus_spec.rb +30 -3
  57. data/spec/acfs/collection_spec.rb +7 -5
  58. data/spec/acfs/configuration_spec.rb +2 -0
  59. data/spec/acfs/global_spec.rb +48 -1
  60. data/spec/acfs/location_spec.rb +25 -0
  61. data/spec/acfs/middleware/json_spec.rb +2 -0
  62. data/spec/acfs/middleware/msgpack_spec.rb +2 -0
  63. data/spec/acfs/operation_spec.rb +2 -0
  64. data/spec/acfs/request/callbacks_spec.rb +2 -0
  65. data/spec/acfs/request_spec.rb +3 -1
  66. data/spec/acfs/resource/attributes/boolean_spec.rb +2 -0
  67. data/spec/acfs/resource/attributes/date_time_spec.rb +2 -0
  68. data/spec/acfs/resource/attributes/dict_spec.rb +4 -2
  69. data/spec/acfs/resource/attributes/float_spec.rb +2 -0
  70. data/spec/acfs/resource/attributes/integer_spec.rb +2 -0
  71. data/spec/acfs/resource/attributes/list_spec.rb +5 -3
  72. data/spec/acfs/resource/attributes/uuid_spec.rb +2 -0
  73. data/spec/acfs/resource/attributes_spec.rb +6 -4
  74. data/spec/acfs/resource/dirty_spec.rb +2 -0
  75. data/spec/acfs/resource/initialization_spec.rb +8 -2
  76. data/spec/acfs/resource/loadable_spec.rb +2 -0
  77. data/spec/acfs/resource/locatable_spec.rb +2 -0
  78. data/spec/acfs/resource/persistance_spec.rb +10 -4
  79. data/spec/acfs/resource/query_methods_spec.rb +25 -18
  80. data/spec/acfs/resource/validation_spec.rb +2 -0
  81. data/spec/acfs/response/formats_spec.rb +3 -1
  82. data/spec/acfs/response/status_spec.rb +2 -0
  83. data/spec/acfs/runner_spec.rb +6 -8
  84. data/spec/acfs/service/middleware_spec.rb +2 -0
  85. data/spec/acfs/service_spec.rb +3 -1
  86. data/spec/acfs/singleton_resource_spec.rb +2 -0
  87. data/spec/acfs/stub_spec.rb +2 -0
  88. data/spec/acfs_spec.rb +2 -0
  89. data/spec/spec_helper.rb +11 -6
  90. data/spec/support/hash.rb +2 -0
  91. data/spec/support/response.rb +2 -0
  92. data/spec/support/service.rb +1 -0
  93. data/spec/support/shared/find_callbacks.rb +2 -0
  94. metadata +12 -11
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Middleware::JSON do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Middleware::MessagePack do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ::Acfs::Operation do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Request::Callbacks do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Request do
@@ -18,7 +20,7 @@ describe Acfs::Request do
18
20
  let(:params) { {id: 10} }
19
21
 
20
22
  it 'should return URL without query' do
21
- expect(request.url).to be == "#{url}"
23
+ expect(request.url).to be == url.to_s
22
24
  end
23
25
  end
24
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Attributes::Boolean do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Attributes::DateTime do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Attributes::Dict do
@@ -13,12 +15,12 @@ describe Acfs::Resource::Attributes::Dict do
13
15
 
14
16
  context 'with blank string (I)' do
15
17
  let(:value) { '' }
16
- it { expect(subject.call).to eq Hash.new }
18
+ it { expect(subject.call).to eq({}) }
17
19
  end
18
20
 
19
21
  context 'with blank string (II)' do
20
22
  let(:value) { " \t" }
21
- it { expect(subject.call).to eq Hash.new }
23
+ it { expect(subject.call).to eq({}) }
22
24
  end
23
25
 
24
26
  context 'with hash' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Attributes::Float do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Attributes::Integer do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Attributes::List do
@@ -13,16 +15,16 @@ describe Acfs::Resource::Attributes::List do
13
15
 
14
16
  context 'with blank string (I)' do
15
17
  let(:value) { '' }
16
- it { expect(subject.call).to eq Array.new }
18
+ it { expect(subject.call).to eq [] }
17
19
  end
18
20
 
19
21
  context 'with blank string (II)' do
20
22
  let(:value) { " \t" }
21
- it { expect(subject.call).to eq Array.new }
23
+ it { expect(subject.call).to eq [] }
22
24
  end
23
25
 
24
26
  context 'with array' do
25
- let(:value) { %w(abc cde efg) }
27
+ let(:value) { %w[abc cde efg] }
26
28
  it { expect(subject.call).to eq value }
27
29
  end
28
30
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Attributes::UUID do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Attributes do
@@ -52,7 +54,7 @@ describe Acfs::Resource::Attributes do
52
54
  let(:action) { -> { m.write_attributes(*args) } }
53
55
  subject { action }
54
56
 
55
- it 'should update attributes' do
57
+ it 'should update attributes' do
56
58
  should change(m, :attributes)
57
59
  .from(name: 'The Great John', age: 25)
58
60
  .to(name: 'The Great James', age: 25)
@@ -70,7 +72,7 @@ describe Acfs::Resource::Attributes do
70
72
 
71
73
  it { should_not raise_error }
72
74
 
73
- it 'should update known attributes and store unknown' do
75
+ it 'should update known attributes and store unknown' do
74
76
  should change(m, :attributes)
75
77
  .from(name: 'The Great John', age: 25)
76
78
  .to(name: 'The Great James', age: 25, born_at: 'today')
@@ -85,7 +87,7 @@ describe Acfs::Resource::Attributes do
85
87
  expect do
86
88
  begin
87
89
  subject.call
88
- rescue
90
+ rescue StandardError
89
91
  true
90
92
  end
91
93
  end.to_not change(m, :attributes)
@@ -171,7 +173,7 @@ describe Acfs::Resource::Attributes do
171
173
  end
172
174
 
173
175
  it 'includes superclass attributes' do
174
- expect(submodel.attributes.keys).to match_array %w(age born_at)
176
+ expect(submodel.attributes.keys).to match_array %w[age born_at]
175
177
  end
176
178
  end
177
179
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Dirty do
@@ -1,11 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe 'Acfs::Resource::Initialization' do
4
6
  let(:model) do
5
7
  Class.new(Acfs::Resource).tap do |c|
6
8
  c.class_eval do
7
- attr_accessor :name, :age
8
- private :age=
9
+ attr_accessor :name
10
+ attr_reader :age
11
+
12
+ private
13
+
14
+ attr_writer :age
9
15
  end
10
16
  end
11
17
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Loadable do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Locatable do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Persistence do
@@ -226,8 +228,12 @@ describe Acfs::Resource::Persistence do
226
228
 
227
229
  it 'should set local errors hash' do
228
230
  model.name = ''
229
- model.save! rescue nil
230
- expect(model.errors.to_hash).to be == {name: %w(required)}
231
+ begin
232
+ model.save!
233
+ rescue StandardError
234
+ nil
235
+ end
236
+ expect(model.errors.to_hash).to be == {name: %w[required]}
231
237
  end
232
238
  end
233
239
 
@@ -265,7 +271,7 @@ describe Acfs::Resource::Persistence do
265
271
  it 'should raise an error' do
266
272
  expect { model_class.create! data }.to \
267
273
  raise_error(::Acfs::InvalidResource) do |error|
268
- expect(error.errors).to be == {'name' => %w(required)}
274
+ expect(error.errors).to be == {'name' => %w[required]}
269
275
  end
270
276
  end
271
277
  end
@@ -295,7 +301,7 @@ describe Acfs::Resource::Persistence do
295
301
  end
296
302
 
297
303
  it 'should contain error hash' do
298
- expect(subject.errors.to_hash).to eq name: %w(required)
304
+ expect(subject.errors.to_hash).to eq name: %w[required]
299
305
  end
300
306
  end
301
307
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::QueryMethods do
@@ -158,7 +160,8 @@ describe Acfs::Resource::QueryMethods do
158
160
  .to_return response [
159
161
  {id: 1, type: 'PC'},
160
162
  {id: 2, type: 'Computer'},
161
- {id: 3, type: 'Mac'}]
163
+ {id: 3, type: 'Mac'}
164
+ ]
162
165
  end
163
166
 
164
167
  it 'should invoke multiple callback after all models are loaded' do
@@ -209,7 +212,8 @@ describe Acfs::Resource::QueryMethods do
209
212
  .to_return response [
210
213
  {id: 1, type: 'MyUser'},
211
214
  {id: 2, type: 'Computer'},
212
- {id: 3, type: 'Mac'}]
215
+ {id: 3, type: 'Mac'}
216
+ ]
213
217
  end
214
218
  it_behaves_like 'with invalid type'
215
219
  end
@@ -220,7 +224,8 @@ describe Acfs::Resource::QueryMethods do
220
224
  .to_return response [
221
225
  {id: 1, type: 'PC'},
222
226
  {id: 2, type: 'noValidType'},
223
- {id: 3, type: 'Mac'}]
227
+ {id: 3, type: 'Mac'}
228
+ ]
224
229
  end
225
230
  it_behaves_like 'with invalid type'
226
231
  end
@@ -231,7 +236,8 @@ describe Acfs::Resource::QueryMethods do
231
236
  .to_return response [
232
237
  {id: 1, type: 'PC'},
233
238
  {id: 2, type: 'Computer'},
234
- {id: 3, type: 42}]
239
+ {id: 3, type: 42}
240
+ ]
235
241
  end
236
242
  it_behaves_like 'with invalid type'
237
243
  end
@@ -270,7 +276,8 @@ describe Acfs::Resource::QueryMethods do
270
276
  .to_return response [
271
277
  {id: 1, name: 'Mike', age: 24},
272
278
  {id: 4, type: 'Maria', age: 24},
273
- {id: 7, type: 'James', age: 24}]
279
+ {id: 7, type: 'James', age: 24}
280
+ ]
274
281
  end
275
282
 
276
283
  it 'should invoke callback after model is loaded' do
@@ -398,7 +405,7 @@ describe Acfs::Resource::QueryMethods do
398
405
  expect(block).not_to receive(:call)
399
406
 
400
407
  model.find_by! age: 24, &block
401
- expect { Acfs.run }.to raise_error
408
+ expect { Acfs.run }.to raise_error Acfs::ResourceNotFound
402
409
  end
403
410
  end
404
411
  end
@@ -410,25 +417,25 @@ describe Acfs::Resource::QueryMethods do
410
417
  .to_return response([{id: 1, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
411
418
  headers: {
412
419
  'X-Total-Pages' => '4',
413
- 'Link' => '<http://users.example.org/users?page=2>; rel="next"'
420
+ 'Link' => '<http://users.example.org/users?page=2>; rel="next"'
414
421
  })
415
422
  stub_request(:get, 'http://users.example.org/users?page=2')
416
423
  .to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
417
424
  headers: {
418
425
  'X-Total-Pages' => '4',
419
- 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
426
+ 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
420
427
  })
421
428
  stub_request(:get, 'http://users.example.org/users?page=3')
422
429
  .to_return response([{id: 3, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
423
430
  headers: {
424
431
  'X-Total-Pages' => '4',
425
- 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
432
+ 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
426
433
  })
427
434
  stub_request(:get, 'http://users.example.org/users?page=4')
428
435
  .to_return response([{id: 4, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
429
436
  headers: {
430
437
  'X-Total-Pages' => '4',
431
- 'Link' => ''
438
+ 'Link' => ''
432
439
  })
433
440
  end
434
441
 
@@ -452,25 +459,25 @@ describe Acfs::Resource::QueryMethods do
452
459
  .to_return response([{id: 1, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
453
460
  headers: {
454
461
  'X-Total-Pages' => '4',
455
- 'Link' => '<http://users.example.org/users?where=fuu&page=2>; rel="next"'
462
+ 'Link' => '<http://users.example.org/users?where=fuu&page=2>; rel="next"'
456
463
  })
457
464
  stub_request(:get, 'http://users.example.org/users?where=fuu&page=2')
458
465
  .to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
459
466
  headers: {
460
467
  'X-Total-Pages' => '4',
461
- 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
468
+ 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
462
469
  })
463
470
  stub_request(:get, 'http://users.example.org/users?page=3')
464
471
  .to_return response([{id: 3, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
465
472
  headers: {
466
473
  'X-Total-Pages' => '4',
467
- 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
474
+ 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
468
475
  })
469
476
  stub_request(:get, 'http://users.example.org/users?page=4')
470
477
  .to_return response([{id: 4, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
471
478
  headers: {
472
479
  'X-Total-Pages' => '4',
473
- 'Link' => ''
480
+ 'Link' => ''
474
481
  })
475
482
  end
476
483
 
@@ -496,25 +503,25 @@ describe Acfs::Resource::QueryMethods do
496
503
  .to_return response([{id: 1, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
497
504
  headers: {
498
505
  'X-Total-Pages' => '4',
499
- 'Link' => '<http://users.example.org/users?page=2>; rel="next"'
506
+ 'Link' => '<http://users.example.org/users?page=2>; rel="next"'
500
507
  })
501
508
  stub_request(:get, 'http://users.example.org/users?page=2')
502
509
  .to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
503
510
  headers: {
504
511
  'X-Total-Pages' => '4',
505
- 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
512
+ 'Link' => '<http://users.example.org/users?page=3>; rel="next"'
506
513
  })
507
514
  stub_request(:get, 'http://users.example.org/users?page=3')
508
515
  .to_return response([{id: 3, name: 'Anno', age: 1604, born_at: 'Santa Maria'}, {id: 4, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
509
516
  headers: {
510
517
  'X-Total-Pages' => '4',
511
- 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
518
+ 'Link' => '<http://users.example.org/users?page=4>; rel="next"'
512
519
  })
513
520
  stub_request(:get, 'http://users.example.org/users?page=4')
514
521
  .to_return response([{id: 5, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
515
522
  headers: {
516
523
  'X-Total-Pages' => '4',
517
- 'Link' => ''
524
+ 'Link' => ''
518
525
  })
519
526
  end
520
527
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Resource::Validation do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Response::Formats do
@@ -9,7 +11,7 @@ describe Acfs::Response::Formats do
9
11
  let(:response) { Acfs::Response.new request, status: status, headers: headers, body: body }
10
12
 
11
13
  context 'without Content-Type header' do
12
- let(:headers) { {} }
14
+ let(:headers) { {} }
13
15
 
14
16
  it "should fallback on 'text/plain'" do
15
17
  expect(response.content_type).to be == Mime[:text]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Acfs::Response::Status do
@@ -1,25 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  class NullAdapter < Acfs::Adapter::Base
4
6
  # Start processing queued requests.
5
7
  #
6
- def start
7
- end
8
+ def start; end
8
9
 
9
10
  # Abort running and queued requests.
10
11
  #
11
- def abort
12
- end
12
+ def abort; end
13
13
 
14
14
  # Run request right now skipping queue.
15
15
  #
16
- def run(_)
17
- end
16
+ def run(_); end
18
17
 
19
18
  # Enqueue request to be run later.
20
19
  #
21
- def queue(_)
22
- end
20
+ def queue(_); end
23
21
  end
24
22
 
25
23
  class NotificationCollector