ja2r 0.1.2 → 0.2.0
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 +3 -0
- data/lib/ja2r/element.rb +47 -0
- data/lib/ja2r/klass_registry.rb +23 -0
- data/lib/ja2r/parser.rb +4 -3
- data/lib/ja2r.rb +7 -36
- metadata +20 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a63874306c133ab82461114f0162d0acf55758122c631eaf421a3efcb515d70
|
4
|
+
data.tar.gz: 8001da58d5d720839e4e84772a02e41e6d7a08c7e940fcf6096bda08e22b76dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a255f27f9d7511c06ed90f62b13b1ee3bef19296548732bd37852f18059534edce253ac147f4833bdadd59db3686c9104c51ae4ea14fd67ff729bd6293b4a06
|
7
|
+
data.tar.gz: 3616d5c1c52ee42179276e735b4e26a59ddcea542669c875d7076417fa020cdc2ead536b3b1122f224a4cc5ece8ea288512771657a271cc62b5a17a43d780e2e
|
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# JA2R
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/ja2r)
|
4
|
+
[](https://travis-ci.org/mkon/ja2r)
|
5
|
+
|
3
6
|
JASON-API to Ruby Object
|
4
7
|
|
5
8
|
Converts a JSON-API payload into a ruby object which supports navigation over relationships.
|
data/lib/ja2r/element.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
module JA2R
|
2
|
+
class Element
|
3
|
+
def initialize(payload)
|
4
|
+
@id = payload['id']
|
5
|
+
@type = payload['type']
|
6
|
+
@attributes = (payload['attributes'] || {}).with_indifferent_access
|
7
|
+
@meta = (payload['meta'] || {}).with_indifferent_access
|
8
|
+
@relationships = payload['relationships'] ? convert_relationship(payload['relationships']) : {}
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :id, :type, :attributes, :relationships
|
12
|
+
|
13
|
+
def attribute(key)
|
14
|
+
@attributes[key]
|
15
|
+
end
|
16
|
+
|
17
|
+
def meta(key)
|
18
|
+
@meta[key]
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def method_missing(method, *args)
|
24
|
+
return attributes[method] if attributes&.key? method
|
25
|
+
return relationships[method] if relationships&.key? method
|
26
|
+
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
30
|
+
def respond_to_missing?(symbol, include_all = false)
|
31
|
+
return true if attributes&.key?(symbol.to_s)
|
32
|
+
return true if relationships&.key?(symbol.to_s)
|
33
|
+
|
34
|
+
super
|
35
|
+
end
|
36
|
+
|
37
|
+
def convert_relationship(hash)
|
38
|
+
Hash[hash.map do |key, data|
|
39
|
+
if data['data'].is_a? Array
|
40
|
+
[key, data['data'].map { |d| KlassRegistry.instantiate(d) }]
|
41
|
+
else
|
42
|
+
[key, KlassRegistry.instantiate(data['data'])]
|
43
|
+
end
|
44
|
+
end].with_indifferent_access
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module JA2R
|
2
|
+
module KlassRegistry
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def instantiate(hash)
|
6
|
+
lookup(hash['type']).new(hash)
|
7
|
+
end
|
8
|
+
|
9
|
+
def lookup(type)
|
10
|
+
registry.fetch(type) { Element }
|
11
|
+
end
|
12
|
+
|
13
|
+
def register(type, klass)
|
14
|
+
registry[type] = klass
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def registry
|
20
|
+
@registry ||= {}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/ja2r/parser.rb
CHANGED
@@ -23,20 +23,20 @@ module JA2R
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def parse_single
|
26
|
-
root =
|
26
|
+
root = KlassRegistry.instantiate(hash['data'])
|
27
27
|
object_space << root
|
28
28
|
root
|
29
29
|
end
|
30
30
|
|
31
31
|
def parse_list
|
32
|
-
root = hash['data'].map { |data|
|
32
|
+
root = hash['data'].map { |data| KlassRegistry.instantiate(data) }
|
33
33
|
object_space.push(*root)
|
34
34
|
root
|
35
35
|
end
|
36
36
|
|
37
37
|
def parse_included
|
38
38
|
hash['included']&.map do |data|
|
39
|
-
object_space.push
|
39
|
+
object_space.push KlassRegistry.instantiate(data)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -54,6 +54,7 @@ module JA2R
|
|
54
54
|
end
|
55
55
|
else
|
56
56
|
next unless (obj = object_space.dig(relationship.type, relationship.id))
|
57
|
+
|
57
58
|
element.relationships[key] = obj
|
58
59
|
end
|
59
60
|
end
|
data/lib/ja2r.rb
CHANGED
@@ -2,46 +2,17 @@ require 'active_support/core_ext/array'
|
|
2
2
|
require 'active_support/core_ext/hash'
|
3
3
|
|
4
4
|
module JA2R
|
5
|
-
autoload :
|
5
|
+
autoload :Element, 'ja2r/element'
|
6
|
+
autoload :KlassRegistry, 'ja2r/klass_registry'
|
7
|
+
autoload :Parser, 'ja2r/parser'
|
6
8
|
|
7
9
|
module_function
|
8
10
|
|
9
|
-
class Element
|
10
|
-
def initialize(payload)
|
11
|
-
@id = payload['id']
|
12
|
-
@type = payload['type']
|
13
|
-
@attributes = (payload['attributes'] || {}).with_indifferent_access
|
14
|
-
@relationships = payload['relationships'] ? convert_relationship(payload['relationships']) : {}
|
15
|
-
end
|
16
|
-
|
17
|
-
attr_reader :id, :type, :attributes, :relationships
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def method_missing(method, *args)
|
22
|
-
return attributes[method] if attributes&.key? method
|
23
|
-
return relationships[method] if relationships&.key? method
|
24
|
-
super
|
25
|
-
end
|
26
|
-
|
27
|
-
def respond_to_missing?(symbol, include_all = false)
|
28
|
-
return true if attributes&.key?(symbol.to_s)
|
29
|
-
return true if relationships&.key?(symbol.to_s)
|
30
|
-
super
|
31
|
-
end
|
32
|
-
|
33
|
-
def convert_relationship(hash)
|
34
|
-
Hash[hash.map do |key, data|
|
35
|
-
if data['data'].is_a? Array
|
36
|
-
[key, data['data'].map { |d| Element.new(d) }]
|
37
|
-
else
|
38
|
-
[key, Element.new(data['data'])]
|
39
|
-
end
|
40
|
-
end].with_indifferent_access
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
11
|
def parse(hash)
|
45
12
|
Parser.new(hash).call
|
46
13
|
end
|
14
|
+
|
15
|
+
def klass_for(hash)
|
16
|
+
KlassRegistry.call(hash['type'])
|
17
|
+
end
|
47
18
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ja2r
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mkon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -50,14 +50,28 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - '='
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.
|
53
|
+
version: 0.60.0
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - '='
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: 0.
|
60
|
+
version: 0.60.0
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rubocop-rspec
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - '='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 1.30.1
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - '='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 1.30.1
|
61
75
|
- !ruby/object:Gem::Dependency
|
62
76
|
name: simplecov
|
63
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,6 +96,8 @@ files:
|
|
82
96
|
- LICENSE
|
83
97
|
- README.md
|
84
98
|
- lib/ja2r.rb
|
99
|
+
- lib/ja2r/element.rb
|
100
|
+
- lib/ja2r/klass_registry.rb
|
85
101
|
- lib/ja2r/parser.rb
|
86
102
|
homepage: https://github.com/mkon/ja2r
|
87
103
|
licenses:
|