lab42_diggy_methods 0.1.0 → 0.1.4

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: a830d7be026a2a9d2d71c16d0a1c0b515e2ddcbc43b6a9511dc1746cc5f1bd37
4
- data.tar.gz: 51b16cbf743a665c67fd3a3e5856139bc2aea48e860daef4d41274efb66b4842
3
+ metadata.gz: d8cbaf0bd7f78a40b8b5a1583c0bf075877e7158c04c7f7295661e497cfbc42d
4
+ data.tar.gz: 425adc58abfa6e92a3d1e4a599db1b5f39df7da1aa4f40b025e25c71b48a86ad
5
5
  SHA512:
6
- metadata.gz: 5cc260531aea413f7cbb7d80b87e8e6580a297852a9c8caf8bfc0b2195d9e9dabc826aa80d6367f8b70906427aa57de45ea1210994d791234c9d00188aa1ffac
7
- data.tar.gz: 33fd3fec59836489cb4e66a9192055c30d37aa1bbfc264984409c844f409d2458e08be1325b81a3568b8f7ff015115ea58f9fd9a906b9d129806339deb395779
6
+ metadata.gz: 331c2a205746618e0e868b110da0128296ab63b5f8047a1935f0fee27cf22a0b25d8da7760324f8e350f984a8044378ff194f7853d7152a2c3b7d76c6f29da3b
7
+ data.tar.gz: 577292e722386233c97d435cf6bfbac4fbcb3111179facf7dda176c45638dae6d962d8141d1af9f8363b38e2d64c971a9f50a1e9fcf2d1b7ed5191eeabd544a1
data/README.md CHANGED
@@ -48,9 +48,19 @@ Then we can access its fields as follows
48
48
  expect(diggy.b.d.e).to eq(3)
49
49
  ```
50
50
 
51
+ And we can use a shortcut for `key.__data__` by using `key!`A
52
+ ```ruby
53
+ expect(diggy.b.d!).to eq(e: 3)
54
+ ```
55
+
56
+ And that works for leave nodes too of course
57
+ ```ruby
58
+ expect(diggy.a!).to eq(1)
59
+ ```
60
+
51
61
  And in case of missing keys
52
62
  ```ruby
53
- expect{ diggy.b.d.f }.to raise_error(KeyError, "key not found: :f")
63
+ expect{ diggy.b.d.f }.to raise_error(KeyError, "key not found: b.d.f")
54
64
  ```
55
65
 
56
66
  If we access unknown keys we get the usual `KeyError` error, however we must not pass, nonhashable data
@@ -60,6 +70,45 @@ But if we pass an array
60
70
  expect{ Diggy([:a]) }.to raise_error(ArgumentError)
61
71
  ```
62
72
 
73
+ ### Context: Using in ERB
74
+
75
+ In order to take advantage of this syntax we want to pass the binding of a `Diggy` object to `ERB`
76
+
77
+ Given an `ERB` template
78
+ ```ruby
79
+ require 'erb'
80
+ let(:template_text) { "<%= data.person.name %>" }
81
+ ```
82
+
83
+ And a `Lab42::DiggyMethod` instance
84
+ ```ruby
85
+ let(:data) { Diggy(data: {person: {name: "YHS"}}) }
86
+ ```
87
+
88
+ Then we can pass the binding to the template
89
+ ```ruby
90
+ expect(ERB.new(template_text).result(data.__binding__)).to eq("YHS")
91
+ ```
92
+
93
+ ### Context: Iteration
94
+
95
+ If an element in a diggy object is an array we descend
96
+
97
+ Given yet another diggy™
98
+ ```ruby
99
+ let(:diggy) { Diggy(a: [b: 1, c: 2]) }
100
+ ```
101
+
102
+ Then we get an enumerator
103
+ ```ruby
104
+ expect(diggy.a).to be_an(Array)
105
+ ```
106
+
107
+ And we can use it to iterate
108
+ ```ruby
109
+ expect(diggy.a.first.b).to eq(1)
110
+ ```
111
+
63
112
  # LICENSE
64
113
 
65
114
  Copyright 2022 Robert Dober robert.dober@gmail.com
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Lab42
4
4
  class DiggyMethods
5
- VERSION = "0.1.0"
5
+ VERSION = "0.1.4"
6
6
  end
7
7
  end
8
+ # SPDX-License-Identifier: Apache-2.0
@@ -3,15 +3,18 @@
3
3
  require_relative 'diggy_methods/kernel'
4
4
  module Lab42
5
5
  class DiggyMethods
6
- attr_reader :data
6
+
7
+ # Expose for ERB
8
+ def __binding__; binding end
7
9
 
8
10
  # In case data has key :data (often the case)
9
11
  def __data__; @data end
10
12
 
11
13
  private
12
14
 
13
- def initialize(a=nil, **data_)
15
+ def initialize(a=nil, __key_chain__: [], **data_)
14
16
  @data = _make_data_from_args(a, data_)
17
+ @keychain = __key_chain__
15
18
  end
16
19
 
17
20
  def _make_data_from_args(a, data_)
@@ -35,14 +38,35 @@ module Lab42
35
38
  raise ArgumentError, "positional argument must be a hash or respond to to_h if present"
36
39
  end
37
40
 
38
- def method_missing(name)
39
- found = data.fetch(name)
41
+ def method_missing(name, *)
42
+ if name.to_s.end_with?"!"
43
+ @data.fetch(name.to_s.sub(/!\z/, "").to_sym)
44
+ else
45
+ _method_missing_try_descend(name)
46
+ end
47
+ end
48
+
49
+ def _make_diggy_array(found)
50
+ found.map { self.class.new(_1) }
51
+ end
52
+
53
+ def _maybe_make_diggy(found)
40
54
  if found.respond_to?(:to_h)
41
- self.class.new(**found)
55
+ self.class.new(**found, __key_chain__: @keychain)
42
56
  else
43
57
  found
44
58
  end
45
59
  end
60
+
61
+ def _method_missing_try_descend(name)
62
+ @keychain << name
63
+ found = @data.fetch(name) { raise KeyError, "key not found: #{@keychain.join(".")}" }
64
+ if Array === found
65
+ _make_diggy_array(found)
66
+ else
67
+ _maybe_make_diggy(found)
68
+ end
69
+ end
46
70
  end
47
71
  end
48
72
  # SPDX-License-Identifier: Apache-2.0
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lab42_diggy_methods
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Dober
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-31 00:00:00.000000000 Z
11
+ date: 2022-02-02 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  Create an instance of me with a Hash and access the (nested) values