lhs 14.5.0 → 14.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/README.md +31 -1
- data/lib/lhs/concerns/{item → data}/becomes.rb +1 -1
- data/lib/lhs/concerns/proxy/accessors.rb +4 -2
- data/lib/lhs/concerns/record/relations.rb +20 -0
- data/lib/lhs/data.rb +3 -0
- data/lib/lhs/item.rb +0 -3
- data/lib/lhs/proxy.rb +1 -1
- data/lib/lhs/record.rb +4 -1
- data/lib/lhs/version.rb +1 -1
- data/spec/record/has_many_spec.rb +34 -0
- data/spec/support/cleanup.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 077d421d6966d805ebcd502e5a0c093cc6bcf4a4
|
4
|
+
data.tar.gz: c687c58f9bde359b6576812aa9eebd19b984c5cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a63875a01836b652d4b049df0c50b3c314fe2ff6306e37134e149defb1bdf1addc904455406991f974954c6de2ee0906c20205f4bd3ad4127fd583755c64afff
|
7
|
+
data.tar.gz: 78388e5606346ecbb96d944cf25285e2fbbbecdb1b9d6647dac8c940646186ae7a5ec88574cf1ec2d42b164f9f7fc75588dd4927d7d4689719f2515b775b8341
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -266,6 +266,36 @@ After fetching [single](#find-single-records) or [multiple](#find-multiple-recor
|
|
266
266
|
record.parent == records # true
|
267
267
|
```
|
268
268
|
|
269
|
+
## Relations
|
270
|
+
|
271
|
+
Even though, nested data is automatically casted when accessed, see: [Nested records](#nested-records), sometimes api's don't provide dedicated endpoints to retrive these records.
|
272
|
+
|
273
|
+
As those records also don't have an href, nested records can not be casted automatically, when accessed.
|
274
|
+
|
275
|
+
Those kind of relations, you can still configure manually:
|
276
|
+
|
277
|
+
```ruby
|
278
|
+
|
279
|
+
class Location < LHS::Record
|
280
|
+
|
281
|
+
endpoint 'http://uberall/locations/:id'
|
282
|
+
|
283
|
+
has_many :listings
|
284
|
+
|
285
|
+
end
|
286
|
+
|
287
|
+
class Listing < LHS::Record
|
288
|
+
|
289
|
+
def supported?
|
290
|
+
type == 'SUPPORTED'
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
Location.find(1).listings.first.supported? # true
|
295
|
+
|
296
|
+
```
|
297
|
+
|
298
|
+
|
269
299
|
## Request based options
|
270
300
|
|
271
301
|
You can apply options to the request chain. Those options will be forwarded to the request perfomed by the chain/query.
|
@@ -643,7 +673,7 @@ class LocalEntry < LHS::Record
|
|
643
673
|
end
|
644
674
|
```
|
645
675
|
|
646
|
-
|
676
|
+
## Nested records
|
647
677
|
|
648
678
|
Nested records (in nested data) are automaticaly casted when the href matches any defined endpoint of any LHS::Record.
|
649
679
|
|
@@ -67,8 +67,9 @@ class LHS::Proxy
|
|
67
67
|
wrap_return(collection, record, name)
|
68
68
|
end
|
69
69
|
|
70
|
-
# Wraps
|
71
|
-
#
|
70
|
+
# Wraps the return value with a record class.
|
71
|
+
# Adds errors and warnings if existing.
|
72
|
+
# Returns plain data if no record class was found.
|
72
73
|
def wrap_return(value, record, name, args = nil)
|
73
74
|
name = args.first if name == :[]
|
74
75
|
return value unless worth_wrapping?(value)
|
@@ -76,6 +77,7 @@ class LHS::Proxy
|
|
76
77
|
data.errors = LHS::Problems::Nested::Errors.new(errors, name) if errors.any?
|
77
78
|
data.warnings = LHS::Problems::Nested::Warnings.new(warnings, name) if warnings.any?
|
78
79
|
return record.new(data) if record && !value.is_a?(LHS::Record)
|
80
|
+
return data.becomes(_record._relations[name][:record_class_name].constantize) if _record && _record._relations[name]
|
79
81
|
data
|
80
82
|
end
|
81
83
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/core_ext/class/attribute'
|
3
|
+
|
4
|
+
class LHS::Record
|
5
|
+
|
6
|
+
module Relations
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
class_attribute :_relations
|
11
|
+
self._relations = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
def has_many(name)
|
16
|
+
_relations[name] = { record_class_name: name.to_s.singularize.classify }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/lhs/data.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Data provides functionalities to accesses information
|
2
2
|
class LHS::Data
|
3
|
+
autoload :Becomes,
|
4
|
+
'lhs/concerns/data/becomes'
|
3
5
|
autoload :Equality,
|
4
6
|
'lhs/concerns/data/equality'
|
5
7
|
autoload :Json,
|
@@ -7,6 +9,7 @@ class LHS::Data
|
|
7
9
|
autoload :ToHash,
|
8
10
|
'lhs/concerns/data/to_hash'
|
9
11
|
|
12
|
+
include Becomes
|
10
13
|
include Equality
|
11
14
|
include Json
|
12
15
|
include ToHash
|
data/lib/lhs/item.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# An item is a concrete record.
|
2
2
|
# It can be part of another proxy like collection.
|
3
3
|
class LHS::Item < LHS::Proxy
|
4
|
-
autoload :Becomes,
|
5
|
-
'lhs/concerns/item/becomes'
|
6
4
|
autoload :Destroy,
|
7
5
|
'lhs/concerns/item/destroy'
|
8
6
|
autoload :Save,
|
@@ -12,7 +10,6 @@ class LHS::Item < LHS::Proxy
|
|
12
10
|
autoload :Validation,
|
13
11
|
'lhs/concerns/item/validation'
|
14
12
|
|
15
|
-
include Becomes
|
16
13
|
include Create
|
17
14
|
include Destroy
|
18
15
|
include Save
|
data/lib/lhs/proxy.rb
CHANGED
@@ -17,7 +17,7 @@ class LHS::Proxy
|
|
17
17
|
|
18
18
|
# prevent clashing with attributes of underlying data
|
19
19
|
attr_accessor :_data, :_loaded
|
20
|
-
delegate :_record, to: :_data, allow_nil: true
|
20
|
+
delegate :_record, :becomes, to: :_data, allow_nil: true
|
21
21
|
|
22
22
|
def initialize(data)
|
23
23
|
self._data = data
|
data/lib/lhs/record.rb
CHANGED
@@ -27,6 +27,8 @@ class LHS::Record
|
|
27
27
|
'lhs/concerns/record/pagination'
|
28
28
|
autoload :Request,
|
29
29
|
'lhs/concerns/record/request'
|
30
|
+
autoload :Relations,
|
31
|
+
'lhs/concerns/record/relations'
|
30
32
|
autoload :Scope,
|
31
33
|
'lhs/concerns/record/scope'
|
32
34
|
|
@@ -52,10 +54,11 @@ class LHS::Record
|
|
52
54
|
include Model
|
53
55
|
include Pagination
|
54
56
|
include Request
|
57
|
+
include Relations
|
55
58
|
include RequestCycleCache
|
56
59
|
include Scope
|
57
60
|
|
58
|
-
delegate :_proxy, :_endpoint, :merge_raw!, :select, to: :_data
|
61
|
+
delegate :_proxy, :_endpoint, :merge_raw!, :select, :becomes, to: :_data
|
59
62
|
|
60
63
|
def initialize(data = nil, apply_customer_setters = true)
|
61
64
|
data = LHS::Data.new({}, nil, self.class) unless data
|
data/lib/lhs/version.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
describe LHS::Record do
|
4
|
+
before(:each) do
|
5
|
+
class Location < LHS::Record
|
6
|
+
endpoint 'http://uberall/locations'
|
7
|
+
endpoint 'http://uberall/locations/:id'
|
8
|
+
has_many :listings
|
9
|
+
end
|
10
|
+
|
11
|
+
class Listing < LHS::Record
|
12
|
+
|
13
|
+
def supported?
|
14
|
+
true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'has_many' do
|
20
|
+
let(:location) { Location.find(1) }
|
21
|
+
let(:listing) { location.listings.first }
|
22
|
+
|
23
|
+
it 'casts the relation into the correct type' do
|
24
|
+
stub_request(:get, 'http://uberall/locations/1')
|
25
|
+
.to_return(body: {
|
26
|
+
listings: [{
|
27
|
+
directory: { name: 'Instagram' }
|
28
|
+
}]
|
29
|
+
}.to_json)
|
30
|
+
expect(listing).to be_kind_of(Listing)
|
31
|
+
expect(listing.supported?).to eq true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/spec/support/cleanup.rb
CHANGED
@@ -25,7 +25,7 @@ RSpec.configure do |config|
|
|
25
25
|
LHC::Config.instance._cleanup
|
26
26
|
LHS::Record::Endpoints.all = {}
|
27
27
|
LHS::Record::CHILDREN.each do |child|
|
28
|
-
child.endpoints = [] if !child.name['LHS']
|
28
|
+
child.endpoints = [] if !child.name['LHS'] && defined?(child.endpoints)
|
29
29
|
child.configuration({}) if !child.name['LHS']
|
30
30
|
end
|
31
31
|
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: 14.
|
4
|
+
version: 14.6.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-10-
|
11
|
+
date: 2017-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lhc
|
@@ -201,11 +201,11 @@ files:
|
|
201
201
|
- lib/lhs/concerns/collection/handle_nested.rb
|
202
202
|
- lib/lhs/concerns/collection/internal_collection.rb
|
203
203
|
- lib/lhs/concerns/configuration.rb
|
204
|
+
- lib/lhs/concerns/data/becomes.rb
|
204
205
|
- lib/lhs/concerns/data/equality.rb
|
205
206
|
- lib/lhs/concerns/data/json.rb
|
206
207
|
- lib/lhs/concerns/data/to_hash.rb
|
207
208
|
- lib/lhs/concerns/inspect.rb
|
208
|
-
- lib/lhs/concerns/item/becomes.rb
|
209
209
|
- lib/lhs/concerns/item/destroy.rb
|
210
210
|
- lib/lhs/concerns/item/save.rb
|
211
211
|
- lib/lhs/concerns/item/update.rb
|
@@ -227,6 +227,7 @@ files:
|
|
227
227
|
- lib/lhs/concerns/record/mapping.rb
|
228
228
|
- lib/lhs/concerns/record/model.rb
|
229
229
|
- lib/lhs/concerns/record/pagination.rb
|
230
|
+
- lib/lhs/concerns/record/relations.rb
|
230
231
|
- lib/lhs/concerns/record/request.rb
|
231
232
|
- lib/lhs/concerns/record/request_cycle_cache/interceptor.rb
|
232
233
|
- lib/lhs/concerns/record/request_cycle_cache/request_cycle_thread_registry.rb
|
@@ -372,6 +373,7 @@ files:
|
|
372
373
|
- spec/record/find_in_parallel_spec.rb
|
373
374
|
- spec/record/find_spec.rb
|
374
375
|
- spec/record/first_spec.rb
|
376
|
+
- spec/record/has_many_spec.rb
|
375
377
|
- spec/record/ignore_errors_spec.rb
|
376
378
|
- spec/record/immutable_chains_spec.rb
|
377
379
|
- spec/record/includes_all_spec.rb
|
@@ -555,6 +557,7 @@ test_files:
|
|
555
557
|
- spec/record/find_in_parallel_spec.rb
|
556
558
|
- spec/record/find_spec.rb
|
557
559
|
- spec/record/first_spec.rb
|
560
|
+
- spec/record/has_many_spec.rb
|
558
561
|
- spec/record/ignore_errors_spec.rb
|
559
562
|
- spec/record/immutable_chains_spec.rb
|
560
563
|
- spec/record/includes_all_spec.rb
|