simple-immutable 1.0.5 → 1.0.6

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: 573eb118f7b46e8ecf7b89a0932cc1eba443a06d43572b2364c86a4d9ea1138d
4
- data.tar.gz: 535879ee9c6697d0d106c809c56f92b84adb0e431bd5329acaf6fb33669cdb49
3
+ metadata.gz: 8b64e7bb0ef88ead17af2b5d1bca5ea4dc3a19c566a441ee8fe519afe7ac47c3
4
+ data.tar.gz: 4dedaf9317e816780dc86427b99a2b070a1ec46da22ca56446e8ceb120ba615a
5
5
  SHA512:
6
- metadata.gz: '0475929a5809411bb352e8d1e7e87edbdf9301b6a6da44267a06993b60eed5939a46dacddf27d2eb5391e5bb707cba160bb9096116e4232bea584c7f2f373453'
7
- data.tar.gz: b920bc63f731e455d53c4ff93fdcf8f9ca8dd6254505bd42340749bbdfda6b77a2bc61cd7a51aa351b2c0a8907064e17e954eb07cbecf65424946ac3f737249d
6
+ metadata.gz: '0029d88bfa9788f39948eacc0707af394d2702b31800ec86ef83e76f9e1b4dbeb672ce619877a5f0e9f09da93b9b1edcdf3a0dc471c84b73fd1fd8415f168a6e'
7
+ data.tar.gz: abd71b228155f72f7953868cd445722c013b3ce9067d9ecc2075cd5c518a12905a0cd3ed768d7adec505291b53f6f383ce0fc6b63e2b1181ff0887f2fdf7c09c
data/.rubocop.yml CHANGED
@@ -30,3 +30,6 @@ Style/NumericPredicate:
30
30
 
31
31
  Metrics/MethodLength:
32
32
  Max: 20
33
+
34
+ Lint/IneffectiveAccessModifier:
35
+ Enabled: false
data/Makefile CHANGED
@@ -4,6 +4,7 @@ default: test
4
4
 
5
5
  test:
6
6
  ruby test/immutable_test.rb
7
+ ruby test/immutable_w_null_record_test.rb
7
8
  bin/rubocop
8
9
 
9
10
  release:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.5
1
+ 1.0.6
@@ -6,14 +6,14 @@ class Simple::Immutable
6
6
 
7
7
  # turns an object, which can be a hash or array of hashes, arrays, and scalars
8
8
  # into an object which you can use to access with dot methods.
9
- def self.create(object, max_depth = 8)
9
+ def self.create(object, max_depth: 8, null_record: nil)
10
10
  case object
11
11
  when Array
12
12
  raise ArgumentError, "Object nested too deep (or inner loop?)" if max_depth < 0
13
13
 
14
- object.map { |obj| create obj, max_depth - 1 }
14
+ object.map { |obj| create obj, null_record: null_record, max_depth: max_depth - 1 }
15
15
  when Hash
16
- new(object)
16
+ new(object, null_record)
17
17
  else
18
18
  object
19
19
  end
@@ -22,7 +22,14 @@ class Simple::Immutable
22
22
  def self.raw_data(immutable)
23
23
  case immutable
24
24
  when SELF
25
- immutable.instance_variable_get :@hsh
25
+ hsh = immutable.instance_variable_get :@hsh
26
+ null_record = immutable.instance_variable_get :@null_record
27
+
28
+ if null_record
29
+ null_record.merge(hsh)
30
+ else
31
+ hsh
32
+ end
26
33
  when Array
27
34
  immutable.map { |e| raw_data(e) }
28
35
  else
@@ -37,19 +44,35 @@ class Simple::Immutable
37
44
 
38
45
  private
39
46
 
40
- def initialize(hsh)
47
+ def initialize(hsh, null_record = nil)
41
48
  @hsh = hsh
49
+ @null_record = null_record
50
+ end
51
+
52
+ # rubycop:disable Lint/IneffectiveAccessModifier
53
+
54
+ # fetches key from a hsh, regardless of it being a Symbol or a String.
55
+ # Yields the block if the key cannot be found.
56
+ def self.fetch_symbol_or_string_from_hash(hsh, key, &block)
57
+ if hsh
58
+ hsh.fetch(key.to_sym) do
59
+ hsh.fetch(key.to_s, &block)
60
+ end
61
+ else
62
+ yield
63
+ end
42
64
  end
43
65
 
44
66
  def method_missing(sym, *args, &block)
45
67
  if args.empty? && !block
46
- begin
47
- value = @hsh.fetch(sym.to_sym) { @hsh.fetch(sym.to_s) }
48
- return SELF.create(value)
49
- rescue KeyError
50
- # STDERR.puts "Missing attribute #{sym} for Immutable w/#{@hsh.inspect}"
51
- nil
68
+ value = SELF.fetch_symbol_or_string_from_hash(@hsh, sym) do
69
+ SELF.fetch_symbol_or_string_from_hash(@null_record, sym) do
70
+ # STDERR.puts "Missing attribute #{sym} for Immutable w/#{@hsh.inspect}"
71
+ super
72
+ end
52
73
  end
74
+
75
+ return SELF.create(value)
53
76
  end
54
77
 
55
78
  super
@@ -85,7 +85,6 @@ class Simple::Immutable::TestCase < Test::Unit::TestCase
85
85
  end
86
86
 
87
87
  def test_raw_data
88
- immutable = Immutable.create(hsh)
89
88
  expected = hsh
90
89
 
91
90
  assert_equal(expected, Immutable.raw_data(immutable))
@@ -0,0 +1,63 @@
1
+ # rubocop:disable Metrics/AbcSize
2
+
3
+ require "test-unit"
4
+ require_relative "../lib/simple-immutable"
5
+
6
+ class Simple::Immutable::WithNullRecordTestCase < Test::Unit::TestCase
7
+ Immutable = ::Simple::Immutable
8
+
9
+ def hsh
10
+ {
11
+ a: "a-value",
12
+ "b": "b-value",
13
+ "child": {
14
+ name: "childname",
15
+ grandchild: {
16
+ name: "grandchildname"
17
+ }
18
+ },
19
+ "children": [
20
+ "anna",
21
+ "arthur",
22
+ {
23
+ action: {
24
+ keep_your_mouth_shut: true
25
+ }
26
+ }
27
+ ]
28
+ }
29
+ end
30
+
31
+ def null_record
32
+ {
33
+ foo: "foo-value",
34
+ "bar" => "bar-value"
35
+ }
36
+ end
37
+
38
+ def immutable
39
+ Immutable.create hsh, null_record: null_record
40
+ end
41
+
42
+ def test_hash_access
43
+ assert_equal "a-value", immutable.a
44
+ assert_equal "b-value", immutable.b
45
+ end
46
+
47
+ def test_null_record_access
48
+ assert_equal "foo-value", immutable.foo
49
+ assert_equal "bar-value", immutable.bar
50
+ end
51
+
52
+ def test_missing_keys
53
+ assert_raise(NoMethodError) do
54
+ immutable.unknown
55
+ end
56
+ end
57
+
58
+ def test_raw_data
59
+ # raw data does contain null_record
60
+ expected = hsh.merge(null_record)
61
+ assert_equal(expected, Immutable.raw_data(immutable))
62
+ end
63
+ end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple-immutable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - radiospiel
8
8
  - mediapeers GmbH
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-07-23 00:00:00.000000000 Z
12
+ date: 2021-07-13 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Immutable ruby objects implementing dot and [] accessors.
15
15
  email: eno@radiospiel.org
@@ -33,10 +33,11 @@ files:
33
33
  - scripts/release.rb
34
34
  - simple-immutable.gemspec
35
35
  - test/immutable_test.rb
36
+ - test/immutable_w_null_record_test.rb
36
37
  homepage: http://github.com/radiospiel/simple-immutable
37
38
  licenses: []
38
39
  metadata: {}
39
- post_install_message:
40
+ post_install_message:
40
41
  rdoc_options: []
41
42
  require_paths:
42
43
  - lib
@@ -51,9 +52,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
51
52
  - !ruby/object:Gem::Version
52
53
  version: '0'
53
54
  requirements: []
54
- rubygems_version: 3.0.6
55
- signing_key:
55
+ rubygems_version: 3.1.4
56
+ signing_key:
56
57
  specification_version: 4
57
58
  summary: Immutable ruby objects
58
59
  test_files:
59
60
  - test/immutable_test.rb
61
+ - test/immutable_w_null_record_test.rb