lhs 15.3.1 → 15.3.2

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 (129) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.localch.yml +158 -21
  3. data/.rubocop.yml +9 -3
  4. data/lhs.gemspec +10 -9
  5. data/lib/lhs/complex.rb +1 -1
  6. data/lib/lhs/concerns/autoload_records.rb +1 -1
  7. data/lib/lhs/concerns/collection/handle_nested.rb +1 -1
  8. data/lib/lhs/concerns/inspect.rb +1 -1
  9. data/lib/lhs/concerns/item/validation.rb +2 -2
  10. data/lib/lhs/concerns/proxy/accessors.rb +1 -1
  11. data/lib/lhs/concerns/proxy/problems.rb +1 -1
  12. data/lib/lhs/concerns/record/chainable.rb +1 -1
  13. data/lib/lhs/concerns/record/endpoints.rb +2 -2
  14. data/lib/lhs/concerns/record/model.rb +1 -1
  15. data/lib/lhs/concerns/record/request.rb +5 -5
  16. data/lib/lhs/data.rb +5 -4
  17. data/lib/lhs/endpoint.rb +1 -1
  18. data/lib/lhs/item.rb +8 -0
  19. data/lib/lhs/pagination/base.rb +0 -1
  20. data/lib/lhs/problems/base.rb +1 -1
  21. data/lib/lhs/record.rb +1 -1
  22. data/lib/lhs/version.rb +1 -1
  23. data/spec/autoloading_spec.rb +4 -4
  24. data/spec/collection/accessors_spec.rb +1 -1
  25. data/spec/collection/collection_items_spec.rb +1 -1
  26. data/spec/collection/configurable_spec.rb +1 -1
  27. data/spec/collection/meta_data_spec.rb +1 -1
  28. data/spec/collection/to_a_spec.rb +1 -1
  29. data/spec/collection/to_ary_spec.rb +6 -2
  30. data/spec/collection/without_object_items_spec.rb +1 -1
  31. data/spec/complex/reduce_spec.rb +2 -2
  32. data/spec/concerns/record/request_spec.rb +1 -1
  33. data/spec/data/collection_spec.rb +1 -1
  34. data/spec/data/equality_spec.rb +1 -1
  35. data/spec/data/inspect_spec.rb +1 -1
  36. data/spec/data/is_item_or_collection_spec.rb +1 -1
  37. data/spec/data/item_spec.rb +1 -1
  38. data/spec/data/merge_spec.rb +1 -1
  39. data/spec/data/parent_spec.rb +1 -1
  40. data/spec/data/raw_spec.rb +1 -1
  41. data/spec/data/respond_to_spec.rb +3 -3
  42. data/spec/data/root_spec.rb +1 -1
  43. data/spec/data/select_spec.rb +1 -1
  44. data/spec/data/to_ary_spec.rb +26 -0
  45. data/spec/data/to_json_spec.rb +1 -1
  46. data/spec/endpoint/for_url_spec.rb +1 -1
  47. data/spec/item/access_errors_spec.rb +1 -1
  48. data/spec/item/accessors_spec.rb +1 -1
  49. data/spec/item/add_error_spec.rb +1 -1
  50. data/spec/item/becomes_spec.rb +1 -1
  51. data/spec/item/blacklisted_keywords_spec.rb +1 -1
  52. data/spec/item/delegate_spec.rb +1 -1
  53. data/spec/item/destroy_spec.rb +2 -2
  54. data/spec/item/dig_spec.rb +1 -1
  55. data/spec/item/error_codes_spec.rb +1 -1
  56. data/spec/item/errors_spec.rb +22 -22
  57. data/spec/item/fetch_spec.rb +1 -1
  58. data/spec/item/getter_spec.rb +1 -1
  59. data/spec/item/internal_data_structure_spec.rb +1 -1
  60. data/spec/item/map_spec.rb +1 -1
  61. data/spec/item/partial_update_spec.rb +3 -3
  62. data/spec/item/save_spec.rb +2 -2
  63. data/spec/item/setter_spec.rb +1 -1
  64. data/spec/item/translate_errors_spec.rb +1 -1
  65. data/spec/item/update_spec.rb +1 -1
  66. data/spec/item/validation_spec.rb +4 -4
  67. data/spec/item/warning_codes_spec.rb +1 -1
  68. data/spec/item/warnings_spec.rb +1 -3
  69. data/spec/pagination/pages_left_spec.rb +1 -1
  70. data/spec/pagination/parameters_spec.rb +1 -1
  71. data/spec/proxy/create_sub_resource_spec.rb +5 -5
  72. data/spec/proxy/load_spec.rb +8 -10
  73. data/spec/proxy/record_identification_spec.rb +1 -1
  74. data/spec/record/all_spec.rb +3 -3
  75. data/spec/record/build_spec.rb +1 -1
  76. data/spec/record/cast_nested_data_spec.rb +1 -1
  77. data/spec/record/chain_error_handling_spec.rb +1 -1
  78. data/spec/record/create_spec.rb +4 -4
  79. data/spec/record/creation_failed_spec.rb +2 -2
  80. data/spec/record/definitions_spec.rb +1 -1
  81. data/spec/record/destroy_spec.rb +1 -1
  82. data/spec/record/dig_configuration_spec.rb +1 -1
  83. data/spec/record/endpoint_inheritance_spec.rb +3 -3
  84. data/spec/record/endpoint_options_spec.rb +2 -2
  85. data/spec/record/endpoints_spec.rb +7 -7
  86. data/spec/record/equality_spec.rb +1 -1
  87. data/spec/record/expanded_spec.rb +1 -1
  88. data/spec/record/fetch_spec.rb +1 -1
  89. data/spec/record/find_by_chains_spec.rb +1 -1
  90. data/spec/record/find_by_spec.rb +2 -2
  91. data/spec/record/find_each_spec.rb +1 -1
  92. data/spec/record/find_in_batches_spec.rb +2 -2
  93. data/spec/record/find_in_parallel_spec.rb +2 -2
  94. data/spec/record/find_spec.rb +3 -3
  95. data/spec/record/first_spec.rb +2 -2
  96. data/spec/record/handle_includes_errors_spec.rb +1 -1
  97. data/spec/record/has_many_spec.rb +3 -3
  98. data/spec/record/ignore_errors_spec.rb +5 -14
  99. data/spec/record/immutable_chains_spec.rb +1 -1
  100. data/spec/record/includes_all_spec.rb +6 -6
  101. data/spec/record/includes_spec.rb +13 -13
  102. data/spec/record/includes_warning_spec.rb +1 -1
  103. data/spec/record/item_key_spec.rb +1 -1
  104. data/spec/record/items_created_key_configuration_spec.rb +1 -1
  105. data/spec/record/mapping_spec.rb +1 -1
  106. data/spec/record/model_name_spec.rb +1 -1
  107. data/spec/record/new_spec.rb +5 -5
  108. data/spec/record/options_spec.rb +5 -5
  109. data/spec/record/paginatable_collection_spec.rb +5 -6
  110. data/spec/record/pagination_chain_spec.rb +3 -3
  111. data/spec/record/pagination_links_spec.rb +1 -1
  112. data/spec/record/pagination_spec.rb +1 -1
  113. data/spec/record/persisted_spec.rb +2 -1
  114. data/spec/record/references_spec.rb +1 -1
  115. data/spec/record/reload_by_id_spec.rb +1 -1
  116. data/spec/record/reload_spec.rb +2 -2
  117. data/spec/record/request_spec.rb +3 -3
  118. data/spec/record/scope_chains_spec.rb +1 -1
  119. data/spec/record/to_hash_spec.rb +1 -1
  120. data/spec/record/to_json_spec.rb +1 -1
  121. data/spec/record/where_chains_spec.rb +3 -3
  122. data/spec/record/where_spec.rb +1 -1
  123. data/spec/record/where_values_hash_spec.rb +1 -1
  124. data/spec/request_cycle_cache/main_spec.rb +2 -1
  125. data/spec/require_lhs_spec.rb +1 -1
  126. data/spec/support/cleanup.rb +1 -1
  127. data/spec/support/request_cycle_cache.rb +1 -1
  128. data/spec/views/form_for_spec.rb +1 -1
  129. metadata +47 -31
data/lib/lhs/data.rb CHANGED
@@ -18,7 +18,8 @@ class LHS::Data
18
18
  delegate :instance_methods, :items_key, :limit_key, :total_key, :pagination_key, to: :class
19
19
 
20
20
  # prevent clashing with attributes of underlying data
21
- attr_accessor :_proxy, :_raw, :_parent, :_record, :_request, :_endpoint
21
+ attr_accessor :_proxy, :_parent, :_record, :_request, :_endpoint
22
+ attr_reader :_raw
22
23
 
23
24
  def initialize(input, parent = nil, record = nil, request = nil, endpoint = nil)
24
25
  self._raw = raw_from_input(input)
@@ -47,12 +48,12 @@ class LHS::Data
47
48
 
48
49
  def _root
49
50
  root = self
50
- root = root._parent while root && root._parent
51
+ root = root._parent while root&._parent
51
52
  root
52
53
  end
53
54
 
54
55
  def parent
55
- if _parent && _parent._record
56
+ if _parent&._record
56
57
  _parent._record.new(_parent, false)
57
58
  else
58
59
  _parent
@@ -65,7 +66,7 @@ class LHS::Data
65
66
 
66
67
  # enforce internal data structure to have deep symbolized keys
67
68
  def _raw=(raw)
68
- raw.to_hash.deep_symbolize_keys! if raw && raw.respond_to?(:to_hash)
69
+ raw.to_hash.deep_symbolize_keys! if raw&.respond_to?(:to_hash)
69
70
  @_raw = raw
70
71
  end
71
72
 
data/lib/lhs/endpoint.rb CHANGED
@@ -5,6 +5,6 @@ class LHS::Endpoint
5
5
  template, record = LHS::Record::Endpoints.all.detect do |template, _record|
6
6
  LHC::Endpoint.match?(url, template)
7
7
  end
8
- record.endpoints.detect { |endpoint| endpoint.url == template } if record
8
+ record&.endpoints&.detect { |endpoint| endpoint.url == template }
9
9
  end
10
10
  end
data/lib/lhs/item.rb CHANGED
@@ -28,6 +28,14 @@ class LHS::Item < LHS::Proxy
28
28
  true
29
29
  end
30
30
 
31
+ def respond_to?(sym, include_all = false)
32
+ if sym == :to_ary
33
+ false
34
+ else
35
+ super(sym, include_all)
36
+ end
37
+ end
38
+
31
39
  protected
32
40
 
33
41
  def method_missing(name, *args, &_block)
@@ -27,7 +27,6 @@ module LHS::Pagination
27
27
  def offset
28
28
  data._raw.dig(*_record.pagination_key(:body)) || self.class::DEFAULT_OFFSET
29
29
  end
30
- alias current_page offset
31
30
  alias start offset
32
31
 
33
32
  def pages_left
@@ -67,7 +67,7 @@ module LHS::Problems
67
67
  end
68
68
 
69
69
  def empty?
70
- all? { |_k, v| v && v.empty? && !v.is_a?(String) }
70
+ all? { |_k, v| v&.empty? && !v.is_a?(String) }
71
71
  end
72
72
 
73
73
  private
data/lib/lhs/record.rb CHANGED
@@ -61,7 +61,7 @@ class LHS::Record
61
61
  delegate :_proxy, :_endpoint, :merge_raw!, :select, :becomes, to: :_data
62
62
 
63
63
  def initialize(data = nil, apply_customer_setters = true)
64
- data = LHS::Data.new({}, nil, self.class) unless data
64
+ data ||= LHS::Data.new({}, nil, self.class)
65
65
  data = LHS::Data.new(data, nil, self.class) unless data.is_a?(LHS::Data)
66
66
  define_singleton_method(:_data) { data }
67
67
  apply_custom_setters! if apply_customer_setters
data/lib/lhs/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module LHS
2
- VERSION = '15.3.1'
2
+ VERSION = '15.3.2'
3
3
  end
@@ -6,14 +6,14 @@ describe LHS, type: :request do
6
6
  because it's necessary for endpoint-to-record-class-discovery",
7
7
  cleanup_before: false do
8
8
  all_endpoints = LHS::Record::Endpoints.all
9
- expect(all_endpoints['http://datastore/v2/users']).to be
10
- expect(all_endpoints['http://datastore/v2/users/{id}']).to be
9
+ expect(all_endpoints['http://datastore/v2/users']).to be_present
10
+ expect(all_endpoints['http://datastore/v2/users/{id}']).to be_present
11
11
  expect(
12
12
  User.endpoints.detect { |endpoint| endpoint.url == 'http://datastore/v2/users' }
13
- ).to be
13
+ ).to be_present
14
14
  expect(
15
15
  User.endpoints.detect { |endpoint| endpoint.url == 'http://datastore/v2/users/{id}' }
16
- ).to be
16
+ ).to be_present
17
17
  end
18
18
  end
19
19
  end
@@ -14,7 +14,7 @@ describe LHS::Collection do
14
14
  }
15
15
  end
16
16
 
17
- before(:each) do
17
+ before do
18
18
  class Record < LHS::Record
19
19
  endpoint 'http://datastore/records`'
20
20
  end
@@ -5,7 +5,7 @@ describe LHS::Collection do
5
5
  let(:items) { [{ name: 'Steve' }] }
6
6
  let(:collection) { Account.where }
7
7
 
8
- before(:each) do
8
+ before do
9
9
  LHC.config.placeholder('datastore', datastore)
10
10
  class Account < LHS::Record
11
11
  endpoint '{+datastore}/accounts'
@@ -5,7 +5,7 @@ describe LHS::Collection do
5
5
  let(:limit) { 10 }
6
6
  let(:total) { 20 }
7
7
 
8
- before(:each) do
8
+ before do
9
9
  LHC.config.placeholder('search', search)
10
10
  class Search < LHS::Record
11
11
  configuration items_key: :docs, limit_key: :size, pagination_key: :start, pagination_strategy: :start, total_key: :totalResults
@@ -26,7 +26,7 @@ describe LHS::Collection do
26
26
 
27
27
  let(:datastore) { 'http://local.ch/v2' }
28
28
 
29
- before(:each) do
29
+ before do
30
30
  LHC.config.placeholder('datastore', datastore)
31
31
  class Feedback < LHS::Record
32
32
  endpoint '{+datastore}/feedbacks'
@@ -16,7 +16,7 @@ describe LHS::Collection do
16
16
 
17
17
  let(:subject) { collection.to_a }
18
18
 
19
- before(:each) do
19
+ before do
20
20
  class Record < LHS::Record
21
21
  endpoint 'http://datastore/records`'
22
22
  end
@@ -6,7 +6,7 @@ describe LHS::Collection do
6
6
  let(:collection) { Record.where }
7
7
 
8
8
  context 'to_ary' do
9
- before(:each) do
9
+ before do
10
10
  class Record < LHS::Record
11
11
  endpoint 'http://datastore/records`'
12
12
  end
@@ -25,10 +25,14 @@ describe LHS::Collection do
25
25
  let(:subject) { collection.to_ary }
26
26
 
27
27
  it 'returns an array' do
28
- expect(subject).to be
28
+ expect(subject).to be_present
29
29
  expect(subject).to be_kind_of Array
30
30
  expect(subject[0]).to be_kind_of Record
31
31
  expect(subject[0].name).to eq 'Steve'
32
32
  end
33
+
34
+ it 'responds to to_ary' do
35
+ expect(subject.respond_to?(:to_ary)).to eq true
36
+ end
33
37
  end
34
38
  end
@@ -3,7 +3,7 @@ require 'rails_helper'
3
3
  describe LHS::Collection do
4
4
  let(:datastore) { 'http://local.ch/v2' }
5
5
 
6
- before(:each) do
6
+ before do
7
7
  LHC.config.placeholder('datastore', datastore)
8
8
  class Account < LHS::Record
9
9
  endpoint '{+datastore}/accounts/{id}'
@@ -171,7 +171,7 @@ describe LHS::Complex do
171
171
  )
172
172
  end
173
173
 
174
- it 'reduces another complex multi-level example' do
174
+ it 'reduces another complex multi-level example (single plus array)' do
175
175
  expect(LHS::Complex.reduce([
176
176
  { entries: :products },
177
177
  { entries: [:customer, :contracts] }
@@ -180,7 +180,7 @@ describe LHS::Complex do
180
180
  )
181
181
  end
182
182
 
183
- it 'reduces another complex multi-level example' do
183
+ it 'reduces another complex multi-level example (single hash plus array)' do
184
184
  expect(LHS::Complex.reduce([
185
185
  { entries: { customer: :contracts } },
186
186
  { entries: [:customer, :content_ads] }
@@ -21,7 +21,7 @@ describe LHS::Record::Request do
21
21
  expect(subject.send(:prepare_options_for_include_all_request!, abc: 'def')).to eq(abc: 'def')
22
22
  end
23
23
 
24
- it 'calls correct prepare method for a Hash' do
24
+ it 'calls correct prepare method for a Hash (collection)' do
25
25
  expect(subject).to receive(:prepare_option_for_include_all_request!)
26
26
  .with(abc: 'def').and_return('ignore')
27
27
  expect(subject).to receive(:prepare_option_for_include_all_request!)
@@ -9,7 +9,7 @@ describe LHS::Data do
9
9
  LHS::Data.new(json, nil, Record)
10
10
  end
11
11
 
12
- before(:each) do
12
+ before do
13
13
  class Record < LHS::Record
14
14
  endpoint '{+datastore}/v2/data'
15
15
  end
@@ -2,7 +2,7 @@ require 'rails_helper'
2
2
 
3
3
  describe LHS::Data do
4
4
  context 'equality' do
5
- before(:each) do
5
+ before do
6
6
  class Record < LHS::Record
7
7
  endpoint 'http://local.ch/records'
8
8
  end
@@ -6,7 +6,7 @@ describe LHS::Data do
6
6
  expect(data.inspect).to eq string.gsub(/ +/, '').strip
7
7
  end
8
8
 
9
- before(:each) do
9
+ before do
10
10
  class Record < LHS::Record
11
11
  endpoint 'http://local.ch/records'
12
12
  endpoint 'http://local.ch/records/{id}'
@@ -1,7 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Data do
4
- before(:each) do
4
+ before do
5
5
  class Record < LHS::Record
6
6
  endpoint 'http://local.ch/records'
7
7
  end
@@ -1,7 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Data do
4
- before(:each) do
4
+ before do
5
5
  class Record < LHS::Record
6
6
  endpoint '{+datastore}/v2/{campaign_id}/feedbacks'
7
7
  endpoint '{+datastore}/v2/feedbacks'
@@ -1,7 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Data do
4
- before(:each) do
4
+ before do
5
5
  class Record < LHS::Record
6
6
  endpoint '{+datastore}/v2/{campaign_id}/feedbacks'
7
7
  endpoint '{+datastore}/v2/feedbacks'
@@ -1,7 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Data do
4
- before(:each) do
4
+ before do
5
5
  class Record < LHS::Record
6
6
  endpoint 'http://local.ch/records'
7
7
  end
@@ -1,7 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Data do
4
- before(:each) do
4
+ before do
5
5
  class Record < LHS::Record
6
6
  endpoint '{+datastore}/v2/entries/{entry_id}/content-ads/{campaign_id}/feedbacks'
7
7
  endpoint '{+datastore}/v2/{campaign_id}/feedbacks'
@@ -1,21 +1,21 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Data do
4
- before(:each) do
4
+ before do
5
5
  class Record < LHS::Record
6
6
  map :test_mapping?, ->(_item) { true }
7
7
  end
8
8
  end
9
9
 
10
10
  context '#respond_to?' do
11
- it 'it is true for mappings that are defined' do
11
+ it 'is true for mappings that are defined' do
12
12
  data = LHS::Data.new({ 'campaign' => { 'id' => 123 } }, nil, Record)
13
13
 
14
14
  expect(data.respond_to?(:test_mapping?)).to be(true)
15
15
  end
16
16
 
17
17
  # proxy for this example is LHC::Collection which implements total
18
- it 'it is true for calls forwarded to proxy' do
18
+ it 'is true for calls forwarded to proxy' do
19
19
  data = LHS::Data.new({ 'items' => [{ 'campaign' => { 'id' => 123 } }] }, nil, Record)
20
20
 
21
21
  expect(data.respond_to?(:total)).to be(true)
@@ -1,7 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Data do
4
- before(:each) do
4
+ before do
5
5
  class Record < LHS::Record
6
6
  endpoint '{+datastore}/v2/entries/{entry_id}/content-ads/{campaign_id}/feedbacks'
7
7
  endpoint '{+datastore}/v2/{campaign_id}/feedbacks'
@@ -9,7 +9,7 @@ describe LHS::Data do
9
9
  LHS::Data.new(raw, nil, Record)
10
10
  end
11
11
 
12
- before(:each) do
12
+ before do
13
13
  class Record < LHS::Record
14
14
  endpoint '{+datastore}/v2/data'
15
15
  end
@@ -0,0 +1,26 @@
1
+ require 'rails_helper'
2
+
3
+ describe LHS::Data do
4
+ before(:each) do
5
+ class Record < LHS::Record
6
+ endpoint '{+datastore}/v2/{campaign_id}/feedbacks'
7
+ endpoint '{+datastore}/v2/feedbacks'
8
+ end
9
+ end
10
+
11
+ let(:json) do
12
+ load_json(:feedbacks)
13
+ end
14
+
15
+ let(:data) do
16
+ LHS::Data.new(json, nil, Record)
17
+ end
18
+
19
+ let(:item) do
20
+ data[0]
21
+ end
22
+
23
+ it 'does not respond to to_ary' do
24
+ expect(item.respond_to?(:to_ary)).to eq false
25
+ end
26
+ end
@@ -1,7 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Data do
4
- before(:each) do
4
+ before do
5
5
  class Record < LHS::Record
6
6
  endpoint '{+datastore}/v2/{campaign_id}/feedbacks'
7
7
  endpoint '{+datastore}/v2/feedbacks'
@@ -2,7 +2,7 @@ require 'rails_helper'
2
2
 
3
3
  describe LHS::Endpoint do
4
4
  context 'for url' do
5
- before(:each) do
5
+ before do
6
6
  class Record < LHS::Record
7
7
  endpoint '{+datastore}/entries/{entry_id}/content-ads/{campaign_id}/feedbacks'
8
8
  endpoint '{+datastore}/{campaign_id}/feedbacks'
@@ -4,7 +4,7 @@ describe LHS::Item do
4
4
 
5
5
  context 'make errors available' do
6
6
 
7
- before(:each) do
7
+ before do
8
8
  class Presence < LHS::Record
9
9
  endpoint 'http://opm/presences'
10
10
  end
@@ -2,7 +2,7 @@ require 'rails_helper'
2
2
 
3
3
  describe LHS::Item do
4
4
  context 'accessors' do
5
- before(:each) do
5
+ before do
6
6
  class Record < LHS::Record
7
7
  endpoint 'http://datastore/records'
8
8
  end
@@ -1,7 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Item do
4
- before(:each) do
4
+ before do
5
5
  class Record < LHS::Record
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Item do
4
- before(:each) do
4
+ before do
5
5
  class Location < LHS::Record
6
6
  endpoint 'http://sync/locations'
7
7
  endpoint 'http://sync/locations/{id}'