ja2r 0.4.1 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
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