lhs 9.0.2 → 9.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0073ba2cc1f6367f97cd507e4437aebb252f5f5b
4
- data.tar.gz: 52687195c84cf5a5f5f122d41d8fb52389ff3b54
3
+ metadata.gz: a94202476f1970242cdb7215def030000b3ee3b9
4
+ data.tar.gz: 074bb140334dcd7e09f1fdb93896edea6935c72c
5
5
  SHA512:
6
- metadata.gz: 29226d8c8a1504a986321f5a25e0ff84358b50545404d5dfbb423af85dce4abeaeb9eaf0e68b19e64c1ce11e0b69df8b70e7fb45389bc051a9632520c5043747
7
- data.tar.gz: 86a699cc56dad77686ed4e2b0428fd4ee56acb074d6dddde697001a61737b293242fdadb317f39662cd7b2e98d63e0ee59a92ebf825e7b770494a9fe34bce40f
6
+ metadata.gz: 3d300ee0903b0c74999cb3b8cccc46bda9efdc2005ac18e9bddb01ec64e274063f7d12782b36578fca4ef97f38cbbf06640bc46f92a95326e3c421ba553c9634
7
+ data.tar.gz: 0556539c40153065c023cb49638d4f799391e814abd8d3150fdebad5a952df3a1c6ad7d1f9f174db159f489288840a07286ad86c1a815f3f2ba6a44f9e53c80b
@@ -30,7 +30,7 @@ class LHS::Complex
30
30
  merge_into_array!(other)
31
31
  elsif data.is_a?(Hash)
32
32
  merge_into_hash!(other)
33
- else
33
+ elsif unwrap != other.unwrap
34
34
  raise ArgumentError, "Cannot merge #{unwrap} with #{other.unwrap}"
35
35
  end
36
36
 
@@ -9,7 +9,8 @@ class LHS::Record
9
9
  def request(options)
10
10
  options ||= {}
11
11
  options = options.deep_dup
12
- if options.is_a? Array
12
+ if options.is_a?(Array)
13
+ filter_request_options!(options)
13
14
  multiple_requests(options)
14
15
  else
15
16
  single_request(options)
@@ -18,6 +19,13 @@ class LHS::Record
18
19
 
19
20
  private
20
21
 
22
+ def filter_request_options!(options)
23
+ options.each_with_index do |option, index|
24
+ next if !option || !option.key?(:url) || !option[:url].nil?
25
+ options[index] = nil
26
+ end
27
+ end
28
+
21
29
  # Applies limit to the first request of an all request chain
22
30
  # Tries to apply an high value for limit and reacts on the limit
23
31
  # returned by the endpoint to make further requests
@@ -72,7 +80,7 @@ class LHS::Record
72
80
 
73
81
  def extend_base_array!(data, addition, key)
74
82
  data[key].zip(addition) do |item, additional_item|
75
- item._raw.merge!(additional_item._raw)
83
+ item._raw.merge!(additional_item._raw) if additional_item.present?
76
84
  end
77
85
  end
78
86
 
@@ -159,8 +167,8 @@ class LHS::Record
159
167
  return options unless references
160
168
  options ||= {}
161
169
  if options.is_a?(Array)
162
- options.map { |request_options| request_options.merge(references) }
163
- else
170
+ options.map { |request_options| request_options.merge(references) if request_options.present? }
171
+ elsif options.present?
164
172
  options.merge(references)
165
173
  end
166
174
  end
@@ -216,20 +224,28 @@ class LHS::Record
216
224
  begin
217
225
  prepare_options_for_include_request!(options, sub_includes, references)
218
226
  if references && references[:all] # include all linked resources
219
- prepare_options_for_include_all_request!(options)
220
- data = load_all_included!(record, options)
221
- references.delete(:all) # for this all remote objects have been fetched
222
- continue_including(data, sub_includes, references)
227
+ load_include_all!(options, record, sub_includes, references)
223
228
  else # simply request first page/batch
224
- data = record.request(options)
225
- warn "[WARNING] You included `#{options[:url]}`, but this endpoint is paginated. You might want to use `includes_all` instead of `includes` (https://github.com/local-ch/lhs#includes_all-for-paginated-endpoints)." if paginated?(data._raw)
226
- data
229
+ load_include_simple!(options, record)
227
230
  end
228
231
  rescue LHC::NotFound
229
232
  LHS::Data.new({}, data, record)
230
233
  end
231
234
  end
232
235
 
236
+ def load_include_all!(options, record, sub_includes, references)
237
+ prepare_options_for_include_all_request!(options)
238
+ data = load_all_included!(record, options)
239
+ references.delete(:all) # for this reference all remote objects have been fetched
240
+ continue_including(data, sub_includes, references)
241
+ end
242
+
243
+ def load_include_simple!(options, record)
244
+ data = record.request(options)
245
+ warn "[WARNING] You included `#{options[:url]}`, but this endpoint is paginated. You might want to use `includes_all` instead of `includes` (https://github.com/local-ch/lhs#includes_all-for-paginated-endpoints)." if paginated?(data._raw)
246
+ data
247
+ end
248
+
233
249
  # Continues loading included resources after one complete batch/level has been fetched
234
250
  def continue_including(data, including, referencing)
235
251
  handle_includes(including, data, referencing) if including.present? && data.present?
@@ -263,6 +279,7 @@ class LHS::Record
263
279
  # When including all resources on one level, don't forward :includes & :references
264
280
  # as we have to fetch all resources on this level first, before we continue_including
265
281
  def prepare_option_for_include_all_request!(option)
282
+ return option unless option.present?
266
283
  option[:params] ||= {}
267
284
  option[:params].merge!(limit_key => option.fetch(:params, {}).fetch(limit_key, LHS::Pagination::Base::DEFAULT_LIMIT))
268
285
  option.delete(:including)
@@ -302,8 +319,8 @@ class LHS::Record
302
319
  data = LHC.request(options.compact).map do |response|
303
320
  LHS::Data.new(response.body, nil, self, response.request)
304
321
  end
305
- including = LHS::Complex.reduce options.compact.map { |options| options.delete(:including) }.compact
306
- referencing = LHS::Complex.reduce options.compact.map { |options| options.delete(:referencing) }.compact
322
+ including = LHS::Complex.reduce(options.compact.map { |options| options.delete(:including) }.compact)
323
+ referencing = LHS::Complex.reduce(options.compact.map { |options| options.delete(:referencing) }.compact)
307
324
  data = restore_with_nils(data, locate_nils(options)) # nil objects in data provide location information for mapping
308
325
  data = LHS::Data.new(data, nil, self)
309
326
  handle_includes(including, data, referencing) if including.present? && data.present?
@@ -1,3 +1,3 @@
1
1
  module LHS
2
- VERSION = "9.0.2"
2
+ VERSION = "9.0.3"
3
3
  end
@@ -15,6 +15,12 @@ describe LHS::Complex do
15
15
  }.to raise_error(ArgumentError)
16
16
  end
17
17
 
18
+ it 'does not fail trying to merge primitive types when they are the same' do
19
+ expect {
20
+ LHS::Complex.reduce([{ entry: true }, { entry: true }])
21
+ }.not_to raise_error
22
+ end
23
+
18
24
  context 'first level' do
19
25
  context 'reduces symbols into/with X' do
20
26
  it 'reduces symbols into hash' do
@@ -121,19 +121,41 @@ describe LHS::Record do
121
121
  class Contract < LHS::Record
122
122
  endpoint 'http://datastore/contracts/:id'
123
123
  end
124
- stub_request(:get, "http://datastore/contracts/1")
124
+ stub_request(:get, %r{http://datastore/contracts/\d})
125
125
  .to_return(body: {
126
- options: []
126
+ options: nested_resources
127
127
  }.to_json)
128
128
  end
129
129
 
130
- it 'includes_all in case of an empty array' do
131
- expect(lambda do
132
- Contract
133
- .includes(:product)
134
- .includes_all(:options)
135
- .find(1)
136
- end).not_to raise_error
130
+ context 'empty array' do
131
+ let(:nested_resources) { [] }
132
+
133
+ it 'includes_all in case of an empty array' do
134
+ expect(
135
+ -> { Contract.includes(:product).includes_all(:options).find(1) }
136
+ ).not_to raise_error
137
+ expect(
138
+ -> { Contract.includes(:product).includes_all(:options).find(1, 2) }
139
+ ).not_to raise_error
140
+ end
141
+ end
142
+
143
+ context 'weird array without hrefs' do
144
+ before(:each) do
145
+ stub_request(:get, "http://datastore/options/1?limit=100")
146
+ .to_return(body: { type: 'REACH_EXT' }.to_json)
147
+ end
148
+
149
+ let(:nested_resources) { [{ href: 'http://datastore/options/1' }, { type: 'E_COMMERCE' }] }
150
+
151
+ it 'includes_all in case of an unexpect objects within array' do
152
+ expect(
153
+ -> { Contract.includes(:product).includes_all(:options).find(1) }
154
+ ).not_to raise_error
155
+ expect(
156
+ -> { Contract.includes(:product).includes_all(:options).find(1, 2) }
157
+ ).not_to raise_error
158
+ end
137
159
  end
138
160
  end
139
161
  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: 9.0.2
4
+ version: 9.0.3
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-02-22 00:00:00.000000000 Z
11
+ date: 2017-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lhc