ja2r 0.4.1 → 0.5.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
  SHA256:
3
- metadata.gz: 6c57261c49614b634002798afb8e910871587b82430fe03fbcb07ede01e00da5
4
- data.tar.gz: 6962fea0c94bd87ce6a2b567ebae944ca8b28b560fb4141b9471314dc7526e8a
3
+ metadata.gz: 85329bfdaab8daf72abc6e3b3abd412a17a7c8bc3fc7a50edee17f1fd0fc11fb
4
+ data.tar.gz: 3e29a68124549de538bd97a435d81167968274dd575f533cd2da327f88bceda4
5
5
  SHA512:
6
- metadata.gz: b67fb5528e863a0e9aff8d60b98d8b188d4d243df133df1b726e0fc8f38b65d9c558e1d082469a65285f9fb1be8bc932346b12c669637eecc63233e5b763c373
7
- data.tar.gz: 8ec89d361eece21bb856f0849216f9b4a8bdf74a07ee79c5891cf3d499de47708e06860f7eaf116040693edd6aa3223f2113e045da18d6e6d805f7165b17f47a
6
+ metadata.gz: 95da927b61189a1e50992983ee8cd1ac668fc83fddc22044e3260da815c0d7ede6a0f2813266d0e1a085003a261240c0a243086ee0d844b28ec2598d1e1dfc47
7
+ data.tar.gz: f730cd5323db36e8f41cf5a19b539a640edce2943d29df34ba053f12c551b779f814b4b77ec99e128a448da6d2f9bbbe9e43500928705c3bf27e2511714a34e4
data/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  # JA2R
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/ja2r.svg)](https://badge.fury.io/rb/ja2r)
4
- [![Build Status](https://travis-ci.org/mkon/ja2r.svg?branch=master)](https://travis-ci.org/mkon/ja2r)
4
+ ![](https://github.com/mkon/ja2r/workflows/Test/badge.svg?branch=master)
5
+ [![Depfu](https://badges.depfu.com/badges/c63f1c5b6394bba4eb73d3b1063cc0be/overview.svg)](https://depfu.com/github/mkon/ja2r?project_id=5963)
5
6
 
6
7
  JASON-API to Ruby Object
7
8
 
@@ -41,3 +42,18 @@ JSON
41
42
  bart = JA2R.parse(JSON.parse(json))
42
43
  bart.sister.name # Lisa
43
44
  ```
45
+
46
+ ## Options
47
+
48
+ You can pass options to `JA2R#parse` as second argument. Currently the only supported options are:
49
+
50
+ | Name | Type | Description |
51
+ |---------------|---------|------------------------------------------------------------------------------------------------------------------------|
52
+ | safe_traverse | boolean | When setting this option to true, unknown relationships or attributes will return nil instead of raising NoMethodError |
53
+
54
+ Example:
55
+
56
+ ```ruby
57
+ bart = JA2R.parse(hash, safe_traverse: true)
58
+ bart.uncle&.name # nil
59
+ ```
data/lib/ja2r.rb CHANGED
@@ -3,13 +3,14 @@ require 'active_support/core_ext/hash'
3
3
 
4
4
  module JA2R
5
5
  autoload :Element, 'ja2r/element'
6
+ autoload :InvalidData, 'ja2r/invalid_data'
6
7
  autoload :KlassRegistry, 'ja2r/klass_registry'
7
8
  autoload :Parser, 'ja2r/parser'
8
9
 
9
10
  module_function
10
11
 
11
- def parse(hash)
12
- Parser.new(hash).call
12
+ def parse(hash, options = {})
13
+ Parser.new(hash, options).call
13
14
  end
14
15
 
15
16
  def klass_for(hash)
data/lib/ja2r/element.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  module JA2R
2
2
  class Element
3
- def initialize(origin_data)
3
+ def initialize(origin_data, options = {})
4
4
  @origin_data = origin_data.with_indifferent_access
5
+ @options = options
5
6
  @relationships = origin_data['relationships'] ? convert_relationships(origin_data['relationships']) : {}
6
7
  end
7
8
 
@@ -42,22 +43,27 @@ module JA2R
42
43
  return attributes[symbol] if attributes&.key? symbol
43
44
  return relationships[symbol] if relationships&.key? symbol
44
45
 
45
- super
46
+ safe_traverse? ? nil : super
46
47
  end
47
48
 
48
49
  def respond_to_missing?(symbol, include_all = false)
49
50
  return true if attributes&.key?(symbol)
50
51
  return true if relationships&.key?(symbol)
51
52
 
52
- super
53
+ safe_traverse? ? true : super
54
+ end
55
+
56
+ def safe_traverse?
57
+ @options[:safe_traverse]
53
58
  end
54
59
 
55
60
  def convert_relationships(hash)
56
61
  hash.each_with_object(ActiveSupport::HashWithIndifferentAccess.new) do |(key, data), memo|
57
- memo[key] = if data&.[]('data').is_a?(Array)
58
- data['data'].map { |d| KlassRegistry.instantiate(d) }
59
- elsif data&.[]('data').is_a?(Hash)
60
- KlassRegistry.instantiate(data&.[]('data'))
62
+ memo[key] = case data&.[]('data')
63
+ when Array
64
+ data['data'].map { |d| KlassRegistry.instantiate(d, @options) }
65
+ when Hash
66
+ KlassRegistry.instantiate(data&.[]('data'), @options)
61
67
  end
62
68
  end
63
69
  end
@@ -0,0 +1,10 @@
1
+ module JA2R
2
+ class InvalidData < RuntimeError
3
+ def initialize(message, data)
4
+ @data = data
5
+ super message
6
+ end
7
+
8
+ attr_reader :data
9
+ end
10
+ end
@@ -2,10 +2,10 @@ module JA2R
2
2
  module KlassRegistry
3
3
  extend self
4
4
 
5
- def instantiate(hash)
5
+ def instantiate(hash, options)
6
6
  return unless hash&.key? 'type'
7
7
 
8
- lookup(hash['type']).new(hash)
8
+ lookup(hash['type']).new(hash, options)
9
9
  end
10
10
 
11
11
  def lookup(type)
data/lib/ja2r/parser.rb CHANGED
@@ -1,12 +1,15 @@
1
1
  module JA2R
2
2
  class Parser
3
- def initialize(hash)
3
+ def initialize(hash, options = {})
4
4
  @hash = hash
5
+ @options = options
5
6
  @object_space = []
6
7
  end
7
8
 
8
9
  def call
9
10
  data = parse_data
11
+ raise InvalidData.new('Hash does not appear to be valid json-api', @hash) unless data
12
+
10
13
  parse_included
11
14
  object_space.each do |object|
12
15
  assign_relationships object, object_map
@@ -19,28 +22,29 @@ module JA2R
19
22
  attr_reader :hash, :object_space
20
23
 
21
24
  def parse_data
22
- if hash&.[]('data').is_a?(Array)
25
+ case hash&.[]('data')
26
+ when Array
23
27
  parse_list
24
- elsif hash&.[]('data').is_a?(Hash)
28
+ when Hash
25
29
  parse_single
26
30
  end
27
31
  end
28
32
 
29
33
  def parse_single
30
- root = KlassRegistry.instantiate(hash['data'])
34
+ root = KlassRegistry.instantiate(hash['data'], @options)
31
35
  object_space << root
32
36
  root
33
37
  end
34
38
 
35
39
  def parse_list
36
- root = hash['data'].map { |data| KlassRegistry.instantiate(data) }
40
+ root = hash['data'].map { |data| KlassRegistry.instantiate(data, @options) }
37
41
  object_space.push(*root)
38
42
  root
39
43
  end
40
44
 
41
45
  def parse_included
42
46
  hash['included']&.map do |data|
43
- object_space.push KlassRegistry.instantiate(data)
47
+ object_space.push KlassRegistry.instantiate(data, @options)
44
48
  end
45
49
  end
46
50
 
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.1
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - mkon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-21 00:00:00.000000000 Z
11
+ date: 2021-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '4.2'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '6'
22
+ version: '7'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '4.2'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '6'
32
+ version: '7'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rspec
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -50,28 +50,28 @@ dependencies:
50
50
  requirements:
51
51
  - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: 0.63.1
53
+ version: 1.18.2
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.63.1
60
+ version: 1.18.2
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rubocop-rspec
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - '='
66
66
  - !ruby/object:Gem::Version
67
- version: 1.32.0
67
+ version: 2.4.0
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - '='
73
73
  - !ruby/object:Gem::Version
74
- version: 1.32.0
74
+ version: 2.4.0
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: simplecov
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -97,6 +97,7 @@ files:
97
97
  - README.md
98
98
  - lib/ja2r.rb
99
99
  - lib/ja2r/element.rb
100
+ - lib/ja2r/invalid_data.rb
100
101
  - lib/ja2r/klass_registry.rb
101
102
  - lib/ja2r/parser.rb
102
103
  homepage: https://github.com/mkon/ja2r
@@ -111,14 +112,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
112
  requirements:
112
113
  - - ">="
113
114
  - !ruby/object:Gem::Version
114
- version: '0'
115
+ version: '2.6'
116
+ - - "<"
117
+ - !ruby/object:Gem::Version
118
+ version: '3.1'
115
119
  required_rubygems_version: !ruby/object:Gem::Requirement
116
120
  requirements:
117
121
  - - ">="
118
122
  - !ruby/object:Gem::Version
119
123
  version: '0'
120
124
  requirements: []
121
- rubygems_version: 3.0.2
125
+ rubygems_version: 3.1.6
122
126
  signing_key:
123
127
  specification_version: 4
124
128
  summary: Simple JSON-API to ruby object conversion