lhs 13.0.1 → 13.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 163b82a58eaed908884ea40ab28605f01323a4bd
4
- data.tar.gz: 66320f0e30fcecc454702e089a4a3f2630cd6dce
3
+ metadata.gz: 619fa442b169b251cb6501e59940d0c587010de6
4
+ data.tar.gz: e0fdac02b30115bab5c2e98eb8e1f0847d042921
5
5
  SHA512:
6
- metadata.gz: 3bb2c9f3b2725aaa43724025054e2ed1a53e21c62c8c2fb5ed26bbd2e9fedf399a20c1d5d3d422fa6ea35602fddb1a19e39fc3336d18388f9a755a5fa1bd9cb5
7
- data.tar.gz: 4a90025e71d0ee499cde8ee06faf08363ad15aea0c2eea44e1d7de7c1b72331f00bc34a5184ab1eb0c5e378c9460d24c9af2bf9c4c9707d58fdbb269497601bf
6
+ metadata.gz: ab7fcafa5689e4796f82a7c2da65600c60068dbb2325763775f8d5db833d1814730d91b1819e97f7e29aa51001cc5225e983b2fb58a52ae106fcc269a3f27dd7
7
+ data.tar.gz: 6f73e3433aa5e955c336da8b2dddc8aebd9b557b8256efd2bf4adc6503376fb75951055d0cddc759f8b3f6efa4509a64c280bf052be8791d0cad00edb4b3bda6
data/README.md CHANGED
@@ -181,6 +181,16 @@ record = Record.where(color: 'blue')
181
181
 
182
182
  [List of possible error classes](https://github.com/local-ch/lhc/tree/master/lib/lhc/errors)
183
183
 
184
+ If an error handler returns `nil` an empty LHS::Record is returned, not `nil`!
185
+
186
+ In case you want to ignore errores and continue working with `nil` in those cases,
187
+ please use `ignore`:
188
+
189
+ ```ruby
190
+ record = Record.ignore(LHC::NotFound).find_by(color: 'blue')
191
+ record # nil
192
+ ```
193
+
184
194
  ## Resolve chains
185
195
 
186
196
  LHS Chains can be resolved with `fetch`, similiar to ActiveRecord:
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.requirements << 'Ruby >= 2.3.0'
21
21
  s.required_ruby_version = '>= 2.3.0'
22
22
 
23
- s.add_dependency 'lhc', '>= 6.3.0'
23
+ s.add_dependency 'lhc', '>= 6.3.1'
24
24
  s.add_dependency 'activesupport', '> 4.2'
25
25
  s.add_dependency 'activemodel'
26
26
 
@@ -45,6 +45,10 @@ class LHS::Record
45
45
  Chain.new(self, ErrorHandling.new(error_class => handler))
46
46
  end
47
47
 
48
+ def ignore(error_class)
49
+ Chain.new(self, IgnoredError.new(error_class))
50
+ end
51
+
48
52
  def includes(*args)
49
53
  Chain.new(self, Include.new(Chain.unfold(args)))
50
54
  end
@@ -108,6 +112,10 @@ class LHS::Record
108
112
  end
109
113
  end
110
114
 
115
+ # IgnoredError: Ignore certain LHC errors when resolving the chain
116
+ class IgnoredError < Link
117
+ end
118
+
111
119
  # A sequence of links
112
120
  class Chain
113
121
 
@@ -193,6 +201,10 @@ class LHS::Record
193
201
  push(Option.new(hash))
194
202
  end
195
203
 
204
+ def ignore(error_class)
205
+ push(IgnoredError.new(error_class))
206
+ end
207
+
196
208
  def page(page)
197
209
  push(Pagination.new(page: page))
198
210
  end
@@ -300,6 +312,7 @@ class LHS::Record
300
312
  options = chain_options
301
313
  options = options.deep_merge(params: chain_parameters.merge(chain_pagination))
302
314
  options = options.merge(error_handler: chain_error_handler) if chain_error_handler.present?
315
+ options = options.merge(ignored_errors: chain_ignored_errors) if chain_ignored_errors.present?
303
316
  options = options.merge(including: chain_includes) if chain_includes.present?
304
317
  options = options.merge(referencing: chain_references) if chain_references.present?
305
318
  options
@@ -350,23 +363,29 @@ class LHS::Record
350
363
  end
351
364
 
352
365
  def chain_parameters
353
- merge_links(_links.select { |link| link.is_a? Parameter })
366
+ @chain_parameters ||= merge_links(_links.select { |link| link.is_a? Parameter })
354
367
  end
355
368
 
356
369
  def chain_options
357
- merge_links(_links.select { |link| link.is_a? Option })
370
+ @chain_options ||= merge_links(_links.select { |link| link.is_a? Option })
358
371
  end
359
372
 
360
373
  def chain_error_handler
361
- _links.select { |link| link.is_a? ErrorHandling }
374
+ @chain_error_handler ||= _links.select { |link| link.is_a? ErrorHandling }
375
+ end
376
+
377
+ def chain_ignored_errors
378
+ @chain_ignored_errors ||= _links
379
+ .select { |link| link.is_a? IgnoredError }
380
+ .map { |link| link.data }
362
381
  end
363
382
 
364
383
  def chain_pagination
365
- resolve_pagination _links.select { |link| link.is_a? Pagination }
384
+ @chain_pagination ||= resolve_pagination _links.select { |link| link.is_a? Pagination }
366
385
  end
367
386
 
368
387
  def chain_includes
369
- LHS::Complex.reduce(
388
+ @chain_includes ||= LHS::Complex.reduce(
370
389
  _links
371
390
  .select { |link| link.is_a?(Include) && link.data.present? }
372
391
  .map { |link| link.data }
@@ -374,7 +393,7 @@ class LHS::Record
374
393
  end
375
394
 
376
395
  def chain_references
377
- LHS::Complex.reduce(
396
+ @chain_references ||= LHS::Complex.reduce(
378
397
  _links
379
398
  .select { |link| link.is_a?(Reference) && link.data.present? }
380
399
  .map { |link| link.data }
@@ -9,10 +9,11 @@ class LHS::Record
9
9
  module ClassMethods
10
10
  def request(options)
11
11
  options ||= {}
12
- options = options.deep_dup
12
+ options = options.freeze
13
13
  if options.is_a?(Array)
14
- filter_request_options!(options)
15
- multiple_requests(options)
14
+ multiple_requests(
15
+ filter_empty_request_options(options)
16
+ )
16
17
  else
17
18
  single_request(options)
18
19
  end
@@ -20,10 +21,9 @@ class LHS::Record
20
21
 
21
22
  private
22
23
 
23
- def filter_request_options!(options)
24
- options.each_with_index do |option, index|
25
- next if !option || !option.key?(:url) || !option[:url].nil?
26
- options[index] = nil
24
+ def filter_empty_request_options(options)
25
+ options.each_with_index.map do |option|
26
+ option if !option || !option.key?(:url) || !option[:url].nil?
27
27
  end
28
28
  end
29
29
 
@@ -399,7 +399,9 @@ class LHS::Record
399
399
 
400
400
  # Merge explicit params and take configured endpoints options as base
401
401
  def process_options(options, endpoint)
402
+ ignored_errors = options[:ignored_errors]
402
403
  options = options.deep_dup
404
+ options[:ignored_errors] = ignored_errors if ignored_errors.present?
403
405
  options[:params].deep_symbolize_keys! if options[:params]
404
406
  options[:error_handler] = merge_error_handlers(options[:error_handler]) if options[:error_handler]
405
407
  options = (endpoint.options || {}).merge(options)
@@ -1,3 +1,3 @@
1
1
  module LHS
2
- VERSION = "13.0.1"
2
+ VERSION = "13.1.0"
3
3
  end
@@ -0,0 +1,57 @@
1
+ require 'rails_helper'
2
+
3
+ describe LHS::Record do
4
+ let(:handler) { spy('handler') }
5
+
6
+ before(:each) do
7
+ class Record < LHS::Record
8
+ endpoint 'http://local.ch/v2/records'
9
+ endpoint 'http://local.ch/v2/records/:id'
10
+ end
11
+ end
12
+
13
+ context 'ignore errors' do
14
+ before(:each) do
15
+ stub_request(:get, "http://local.ch/v2/records?color=blue").to_return(status: 404)
16
+ end
17
+
18
+ it 'allows to ignore errors' do
19
+ record = Record
20
+ .where(color: 'blue')
21
+ .ignore(LHC::NotFound)
22
+ .fetch
23
+ expect(record).to eq nil
24
+ end
25
+ end
26
+
27
+ context 'multiple ignored errors' do
28
+ it 'ignores error if one of them is specified' do
29
+ stub_request(:get, "http://local.ch/v2/records?color=blue").to_return(status: 401)
30
+ record = Record
31
+ .ignore(LHC::Unauthorized)
32
+ .where(color: 'blue')
33
+ .ignore(LHC::NotFound)
34
+ .fetch
35
+ expect(record).to eq nil
36
+ end
37
+
38
+ it 'ignores error if one of them is specified' do
39
+ stub_request(:get, "http://local.ch/v2/records?color=blue").to_return(status: 404)
40
+ record = Record
41
+ .ignore(LHC::Unauthorized)
42
+ .where(color: 'blue')
43
+ .ignore(LHC::NotFound)
44
+ .fetch
45
+ expect(record).to eq nil
46
+ end
47
+ end
48
+
49
+ it 'also can ignore all LHC errors' do
50
+ stub_request(:get, "http://local.ch/v2/records?color=blue").to_return(status: 401)
51
+ record = Record
52
+ .ignore(LHC::Error)
53
+ .where(color: 'blue')
54
+ .fetch
55
+ expect(record).to eq nil
56
+ end
57
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lhs
3
3
  version: !ruby/object:Gem::Version
4
- version: 13.0.1
4
+ version: 13.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - https://github.com/local-ch/lhs/graphs/contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-18 00:00:00.000000000 Z
11
+ date: 2017-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lhc
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 6.3.0
19
+ version: 6.3.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 6.3.0
26
+ version: 6.3.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -358,6 +358,7 @@ files:
358
358
  - spec/record/find_in_parallel_spec.rb
359
359
  - spec/record/find_spec.rb
360
360
  - spec/record/first_spec.rb
361
+ - spec/record/ignore_errors_spec.rb
361
362
  - spec/record/immutable_chains_spec.rb
362
363
  - spec/record/includes_all_spec.rb
363
364
  - spec/record/includes_spec.rb
@@ -414,7 +415,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
414
415
  requirements:
415
416
  - Ruby >= 2.3.0
416
417
  rubyforge_project:
417
- rubygems_version: 2.6.12
418
+ rubygems_version: 2.6.8
418
419
  signing_key:
419
420
  specification_version: 4
420
421
  summary: Rails gem providing an easy, active-record-like interface for http json services
@@ -530,6 +531,7 @@ test_files:
530
531
  - spec/record/find_in_parallel_spec.rb
531
532
  - spec/record/find_spec.rb
532
533
  - spec/record/first_spec.rb
534
+ - spec/record/ignore_errors_spec.rb
533
535
  - spec/record/immutable_chains_spec.rb
534
536
  - spec/record/includes_all_spec.rb
535
537
  - spec/record/includes_spec.rb