lhs 15.2.1 → 15.2.2.pre.favorites.1
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 +4 -4
- data/README.md +36 -3
- data/lib/lhs/concerns/record/request.rb +7 -3
- data/lib/lhs/version.rb +1 -1
- data/spec/concerns/record/request_spec.rb +36 -0
- data/spec/record/includes_all_spec.rb +84 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0aee048c57cc0d33d0460f7b1887576f387896bd
|
4
|
+
data.tar.gz: 9bcbc261eacb20732cf29313dc0757b2f822c903
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b44c9ca36f2fd2d2154b27810394d6dfcc565e25712695bf7ef0dee0483ad4db2a8063a52e3882b0fa174060a734c66979c61725b2ce33054a7222789c72da72
|
7
|
+
data.tar.gz: 43d5d60d653ce74d32a3d7f7392f90cb98f8ebf1923ee8d5b7b4862a24600e910ab588dbc90e9ee6fcd4ad5a697a43c00f3ca04dc463212a092fc7b8000b90db
|
data/README.md
CHANGED
@@ -53,8 +53,39 @@ class Record < LHS::Record
|
|
53
53
|
end
|
54
54
|
```
|
55
55
|
|
56
|
-
|
57
|
-
|
56
|
+
### Configuring endpoint hosts
|
57
|
+
|
58
|
+
Please use placeholders when configuring hosts for endpoints. Otherwise LHS will match them strictly, which can result in problems when a services dynamically returns `hrefs` and mixes `http`, `https` or no protocol at all. See: [LHC Placeholder Configuration](https://github.com/local-ch/lhc/blob/master/docs/configuration.md#placeholders)
|
59
|
+
|
60
|
+
Please DO NOT mix host placeholders with endpoints (paths), LHS need to know what part of an endpoint is a host and what part of an endpoint is a path, if you use a placeholders in your records endpoint configuration:
|
61
|
+
|
62
|
+
**DO**
|
63
|
+
```ruby
|
64
|
+
LHC.configure do |config|
|
65
|
+
config.placeholder(:search_service, 'http://tel.search.ch')
|
66
|
+
end
|
67
|
+
|
68
|
+
class Record < LHS::Record
|
69
|
+
|
70
|
+
endpoint '{+search_service}/api/search.json'
|
71
|
+
|
72
|
+
end
|
73
|
+
```
|
74
|
+
|
75
|
+
**DON'T**
|
76
|
+
```ruby
|
77
|
+
LHC.configure do |config|
|
78
|
+
config.placeholder(:search_service, 'http://tel.search.ch/api/search.json')
|
79
|
+
end
|
80
|
+
|
81
|
+
class Record < LHS::Record
|
82
|
+
|
83
|
+
endpoint '{+search_service}'
|
84
|
+
|
85
|
+
end
|
86
|
+
```
|
87
|
+
|
88
|
+
### Endpoint clashing
|
58
89
|
|
59
90
|
If you try to setup a LHS::Record with clashing endpoints it will immediately raise an exception.
|
60
91
|
|
@@ -399,7 +430,7 @@ end
|
|
399
430
|
)
|
400
431
|
```
|
401
432
|
|
402
|
-
See [Validation](#
|
433
|
+
See [Validation](#validation) for handling validation errors when creating records.
|
403
434
|
|
404
435
|
### Endpoint paramters and paramter injection during creation
|
405
436
|
|
@@ -842,6 +873,8 @@ or with parameters:
|
|
842
873
|
|
843
874
|
In order to validate LHS::Records before persisting them, you can use the `valid?` (`validate` alias) method.
|
844
875
|
|
876
|
+
It's not recommended to validate records anywhere but with the endpoint that also provides to create them.
|
877
|
+
|
845
878
|
The specific endpoint has to support validations without persistence. An endpoint has to be enabled (opt-in) for validations in the service configuration.
|
846
879
|
|
847
880
|
```ruby
|
@@ -267,14 +267,18 @@ class LHS::Record
|
|
267
267
|
|
268
268
|
def load_and_merge_set_of_paginated_collections!(data, options)
|
269
269
|
options_for_this_batch = []
|
270
|
-
|
270
|
+
data_record = data._record
|
271
|
+
data = data.compact
|
272
|
+
options.compact.each_with_index do |_, index|
|
271
273
|
record = data[index]._record
|
272
274
|
pagination = record.pagination(data[index])
|
273
275
|
next if pagination.pages_left.zero?
|
274
276
|
options_for_this_batch.push(options_for_next_batch(record, pagination, options[index], data[index]))
|
275
277
|
end
|
276
|
-
|
277
|
-
|
278
|
+
if data_record.present?
|
279
|
+
data_record.request(options_for_this_batch.flatten).each do |batch_data|
|
280
|
+
merge_batch_data_with_parent!(batch_data, batch_data._request.options[:parent_data])
|
281
|
+
end
|
278
282
|
end
|
279
283
|
end
|
280
284
|
|
data/lib/lhs/version.rb
CHANGED
@@ -73,4 +73,40 @@ describe LHS::Record::Request do
|
|
73
73
|
params: { limit: 100 })
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
describe 'load_and_merge_set_of_paginated_collections!' do
|
78
|
+
let(:options) do
|
79
|
+
[
|
80
|
+
{
|
81
|
+
url: 'http://localhost:3000/test/resource?abc=def&limit=1&offset=3&test=1',
|
82
|
+
all: true,
|
83
|
+
auth: { bearer: 'xxx' },
|
84
|
+
params: { limit: 100 }
|
85
|
+
},
|
86
|
+
nil,
|
87
|
+
{
|
88
|
+
url: 'http://localhost:3000/test/resource?abc=def&limit=1&offset=3&test=3',
|
89
|
+
all: true,
|
90
|
+
auth: { bearer: 'xxx' },
|
91
|
+
params: { limit: 100 }
|
92
|
+
},
|
93
|
+
]
|
94
|
+
end
|
95
|
+
|
96
|
+
let(:data_array) do
|
97
|
+
[
|
98
|
+
LHS::Record.new,
|
99
|
+
nil,
|
100
|
+
LHS::Record.new,
|
101
|
+
]
|
102
|
+
end
|
103
|
+
|
104
|
+
let(:data) do
|
105
|
+
LHS::Record.new(data_array)
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'does not raise an error when data has nil objects' do
|
109
|
+
expect(subject.send(:load_and_merge_set_of_paginated_collections!, data, options)).to_not be_nil
|
110
|
+
end
|
111
|
+
end
|
76
112
|
end
|
@@ -381,4 +381,88 @@ describe LHS::Record do
|
|
381
381
|
expect(place.contracts.first.customer.name).to eq 'Swisscom Directories AG'
|
382
382
|
end
|
383
383
|
end
|
384
|
+
|
385
|
+
context 'nested includes_all' do
|
386
|
+
context 'with optional children' do
|
387
|
+
before do
|
388
|
+
class Favorite < LHS::Record
|
389
|
+
endpoint 'http://datastore/favorites'
|
390
|
+
end
|
391
|
+
|
392
|
+
class Place < LHS::Record
|
393
|
+
endpoint 'http://datastore/places/{id}'
|
394
|
+
end
|
395
|
+
|
396
|
+
class Contract < LHS::Record
|
397
|
+
endpoint 'http://datastore/places/{place_id}/contracts'
|
398
|
+
end
|
399
|
+
|
400
|
+
stub_request(:get, %r{http://datastore/favorites})
|
401
|
+
.to_return(
|
402
|
+
body: {
|
403
|
+
items: [{
|
404
|
+
href: "http://datastore/favorites/1",
|
405
|
+
place: {
|
406
|
+
href: "http://datastore/places/1"
|
407
|
+
}
|
408
|
+
}, {
|
409
|
+
href: "http://datastore/favorite/2",
|
410
|
+
place: {
|
411
|
+
href: "http://datastore/places/2"
|
412
|
+
}
|
413
|
+
}],
|
414
|
+
total: 2,
|
415
|
+
offset: 0,
|
416
|
+
limit: 100
|
417
|
+
}.to_json
|
418
|
+
)
|
419
|
+
|
420
|
+
stub_request(:get, %r{http://datastore/places/1})
|
421
|
+
.to_return(
|
422
|
+
body: {
|
423
|
+
href: "http://datastore/places/1",
|
424
|
+
name: 'Place 1',
|
425
|
+
contracts: {
|
426
|
+
href: "http://datastore/places/1/contracts"
|
427
|
+
}
|
428
|
+
}.to_json
|
429
|
+
)
|
430
|
+
|
431
|
+
stub_request(:get, %r{http://datastore/places/1/contracts})
|
432
|
+
.to_return(
|
433
|
+
body: {
|
434
|
+
items: [{
|
435
|
+
href: "http://datastore/places/1/contracts/1",
|
436
|
+
name: 'Contract 1'
|
437
|
+
}],
|
438
|
+
total: 1,
|
439
|
+
offset: 0,
|
440
|
+
limit: 10
|
441
|
+
}.to_json
|
442
|
+
)
|
443
|
+
|
444
|
+
stub_request(:get, %r{http://datastore/places/2})
|
445
|
+
.to_return(
|
446
|
+
body: {
|
447
|
+
href: "http://datastore/places/2",
|
448
|
+
name: 'Place 2'
|
449
|
+
}.to_json
|
450
|
+
)
|
451
|
+
end
|
452
|
+
|
453
|
+
it 'includes nested objects when they exist' do
|
454
|
+
favorites = Favorite.includes(:place).includes_all(place: :contracts).all
|
455
|
+
|
456
|
+
expect(favorites.first.place.name).to eq('Place 1')
|
457
|
+
expect(favorites.first.place.contracts.first.name).to eq('Contract 1')
|
458
|
+
end
|
459
|
+
|
460
|
+
it 'does not include nested objects when they are not there' do
|
461
|
+
favorites = Favorite.includes(:place).includes_all(place: :contracts).all
|
462
|
+
|
463
|
+
expect(favorites.last.place.name).to eq('Place 2')
|
464
|
+
expect(favorites.last.place.contracts).to be(nil)
|
465
|
+
end
|
466
|
+
end
|
467
|
+
end
|
384
468
|
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: 15.2.1
|
4
|
+
version: 15.2.2.pre.favorites.1
|
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: 2018-
|
11
|
+
date: 2018-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lhc
|
@@ -431,13 +431,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
431
431
|
version: 2.3.0
|
432
432
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
433
433
|
requirements:
|
434
|
-
- - "
|
434
|
+
- - ">"
|
435
435
|
- !ruby/object:Gem::Version
|
436
|
-
version:
|
436
|
+
version: 1.3.1
|
437
437
|
requirements:
|
438
438
|
- Ruby >= 2.3.0
|
439
439
|
rubyforge_project:
|
440
|
-
rubygems_version: 2.
|
440
|
+
rubygems_version: 2.5.1
|
441
441
|
signing_key:
|
442
442
|
specification_version: 4
|
443
443
|
summary: Rails gem providing an easy, active-record-like interface for http json services
|