callable_tree 0.1.0 → 0.1.1

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: 3d3a8425d7d4634140f8ae67d37b00212909bfefb2055fd75d98e8d6f851b5be
4
- data.tar.gz: 0103f8cda6b99b7f122b79f95f6b70bfdd8c8b5aecc01791e870941b0d5d2f36
3
+ metadata.gz: ea52457dd99aca79ec45ac97716f53824b14dde4d479486b9d9fa6571a714c76
4
+ data.tar.gz: 4fa5ee37a4a061b7c92f3373131b588bd30f12a351f344646dab2ec2d1089718
5
5
  SHA512:
6
- metadata.gz: 6722db751a4b784f8983aa9164371bf9f933c3ea7a1e00b3e0595970a3842f93fd86357da48fc6958babdb7add5d0018d5ace986049ae286961bf328ddcc36ab
7
- data.tar.gz: 74fd411e58ef8b04d810504f2003809f50488e6fabcc8ff9ff4b596e509b750eaeb4e333698d259dd6a39ce3293f84f2755bcaa3d296a5364d17bbb315128ff9
6
+ metadata.gz: 5f6e91b80e81f89d0e8f1c15ac5043de2b100245232de6b3584e900d1378952ad91442e4a55f80c59cfe8a01e5a9b34cf277b3a213290cf0b5aa8e0985edc7ca
7
+ data.tar.gz: 2a89b0e60761fa826c1e083b34f24138693c9f44743c0c3c018f6dcbf330a6471481421dc9c99b4f4d5ae2f410aaeec293bed4ed46f10f28482280ea582f895a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.1] - 2021-05-27
4
+
5
+ - Add `CallableTree::Node::Internal#broadcast` (experimental)
6
+
3
7
  ## [0.1.0] - 2021-05-19
4
8
 
5
9
  - Initial release
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- callable_tree (0.1.0)
4
+ callable_tree (0.1.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -136,7 +136,7 @@ tree = CallableTree::Node::Root.new.append(
136
136
 
137
137
  Dir.glob(__dir__ + '/docs/*') do |file|
138
138
  options = { foo: :bar }
139
- puts tree.call(file, **options)
139
+ pp tree.call(file, **options)
140
140
  puts '---'
141
141
  end
142
142
  ```
@@ -181,13 +181,25 @@ tree = CallableTree::Node::Root.new.append(
181
181
  Run `examples/example2.rb`:
182
182
  ```sh
183
183
  % ruby examples/example2.rb
184
- #<struct CallableTree::Node::External::Output value={"Dog"=>"🐶", "Cat"=>"🐱"}, options={:foo=>:bar}, routes=[Node::JSON::Scraper, Node::JSON::Parser, CallableTree::Node::Root]>
184
+ #<struct CallableTree::Node::External::Output
185
+ value={"Dog"=>"🐶", "Cat"=>"🐱"},
186
+ options={:foo=>:bar},
187
+ routes=[Node::JSON::Scraper, Node::JSON::Parser, CallableTree::Node::Root]>
185
188
  ---
186
- #<struct CallableTree::Node::External::Output value={"Dog"=>"🐶", "Cat"=>"🐱"}, options={:foo=>:bar}, routes=[Node::XML::Scraper, Node::XML::Parser, CallableTree::Node::Root]>
189
+ #<struct CallableTree::Node::External::Output
190
+ value={"Dog"=>"🐶", "Cat"=>"🐱"},
191
+ options={:foo=>:bar},
192
+ routes=[Node::XML::Scraper, Node::XML::Parser, CallableTree::Node::Root]>
187
193
  ---
188
- #<struct CallableTree::Node::External::Output value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"}, options={:foo=>:bar}, routes=[Node::JSON::Scraper, Node::JSON::Parser, CallableTree::Node::Root]>
194
+ #<struct CallableTree::Node::External::Output
195
+ value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"},
196
+ options={:foo=>:bar},
197
+ routes=[Node::JSON::Scraper, Node::JSON::Parser, CallableTree::Node::Root]>
189
198
  ---
190
- #<struct CallableTree::Node::External::Output value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"}, options={:foo=>:bar}, routes=[Node::XML::Scraper, Node::XML::Parser, CallableTree::Node::Root]>
199
+ #<struct CallableTree::Node::External::Output
200
+ value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"},
201
+ options={:foo=>:bar},
202
+ routes=[Node::XML::Scraper, Node::XML::Parser, CallableTree::Node::Root]>
191
203
  ---
192
204
  ```
193
205
 
@@ -257,13 +269,45 @@ end
257
269
  Run `examples/example3.rb`:
258
270
  ```sh
259
271
  % ruby examples/example3.rb
260
- #<struct CallableTree::Node::External::Output value={"Dog"=>"🐶", "Cat"=>"🐱"}, options={:foo=>:bar}, routes=[#<Node::Identity:0x00007ff1f78e09e0 @klass=Node::JSON::Scraper, @type=:animals>, Node::JSON::Parser, CallableTree::Node::Root]>
272
+ #<struct CallableTree::Node::External::Output
273
+ value={"Dog"=>"🐶", "Cat"=>"🐱"},
274
+ options={:foo=>:bar},
275
+ routes=
276
+ [#<Node::Identity:0x00007fb4378a9718
277
+ @klass=Node::JSON::Scraper,
278
+ @type=:animals>,
279
+ Node::JSON::Parser,
280
+ CallableTree::Node::Root]>
261
281
  ---
262
- #<struct CallableTree::Node::External::Output value={"Dog"=>"🐶", "Cat"=>"🐱"}, options={:foo=>:bar}, routes=[#<Node::Identity:0x00007ff1e7885208 @klass=Node::XML::Scraper, @type=:animals>, Node::XML::Parser, CallableTree::Node::Root]>
282
+ #<struct CallableTree::Node::External::Output
283
+ value={"Dog"=>"🐶", "Cat"=>"🐱"},
284
+ options={:foo=>:bar},
285
+ routes=
286
+ [#<Node::Identity:0x00007fb41002b6d0
287
+ @klass=Node::XML::Scraper,
288
+ @type=:animals>,
289
+ Node::XML::Parser,
290
+ CallableTree::Node::Root]>
263
291
  ---
264
- #<struct CallableTree::Node::External::Output value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"}, options={:foo=>:bar}, routes=[#<Node::Identity:0x00007ff1e78771a8 @klass=Node::JSON::Scraper, @type=:fruits>, Node::JSON::Parser, CallableTree::Node::Root]>
292
+ #<struct CallableTree::Node::External::Output
293
+ value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"},
294
+ options={:foo=>:bar},
295
+ routes=
296
+ [#<Node::Identity:0x00007fb41001b3e8
297
+ @klass=Node::JSON::Scraper,
298
+ @type=:fruits>,
299
+ Node::JSON::Parser,
300
+ CallableTree::Node::Root]>
265
301
  ---
266
- #<struct CallableTree::Node::External::Output value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"}, options={:foo=>:bar}, routes=[#<Node::Identity:0x00007ff1f20d7f50 @klass=Node::XML::Scraper, @type=:fruits>, Node::XML::Parser, CallableTree::Node::Root]>
302
+ #<struct CallableTree::Node::External::Output
303
+ value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"},
304
+ options={:foo=>:bar},
305
+ routes=
306
+ [#<Node::Identity:0x00007fb410049d38
307
+ @klass=Node::XML::Scraper,
308
+ @type=:fruits>,
309
+ Node::XML::Parser,
310
+ CallableTree::Node::Root]>
267
311
  ---
268
312
  ```
269
313
 
@@ -351,21 +395,45 @@ Run `examples/example4.rb`:
351
395
  * Node::JSON::Scraper(animals): [matched: true]
352
396
  Input : {"animals"=>[{"name"=>"Dog", "emoji"=>"🐶"}, {"name"=>"Cat", "emoji"=>"🐱"}]}
353
397
  Output: {"Dog"=>"🐶", "Cat"=>"🐱"}
354
- #<struct CallableTree::Node::External::Output value={"Dog"=>"🐶", "Cat"=>"🐱"}, options={:foo=>:bar}, routes=[#<Node::Identity:0x00007f9737074060 @klass=Node::JSON::Scraper, @type=:animals>, Node::JSON::Parser, CallableTree::Node::Root]>
398
+ #<struct CallableTree::Node::External::Output
399
+ value={"Dog"=>"🐶", "Cat"=>"🐱"},
400
+ options={:foo=>:bar},
401
+ routes=
402
+ [#<Node::Identity:0x00007ffd840347b8
403
+ @klass=Node::JSON::Scraper,
404
+ @type=:animals>,
405
+ Node::JSON::Parser,
406
+ CallableTree::Node::Root]>
355
407
  ---
356
408
  * Node::JSON::Parser: [matched: false]
357
409
  * Node::XML::Parser: [matched: true]
358
410
  * Node::XML::Scraper(animals): [matched: true]
359
411
  Input : <root><animals><animal emoji='🐶' name='Dog'/><animal emoji='🐱' name='Cat'/></animals></root>
360
412
  Output: {"Dog"=>"🐶", "Cat"=>"🐱"}
361
- #<struct CallableTree::Node::External::Output value={"Dog"=>"🐶", "Cat"=>"🐱"}, options={:foo=>:bar}, routes=[#<Node::Identity:0x00007f973710d0f8 @klass=Node::XML::Scraper, @type=:animals>, Node::XML::Parser, CallableTree::Node::Root]>
413
+ #<struct CallableTree::Node::External::Output
414
+ value={"Dog"=>"🐶", "Cat"=>"🐱"},
415
+ options={:foo=>:bar},
416
+ routes=
417
+ [#<Node::Identity:0x00007ffd7403f1f0
418
+ @klass=Node::XML::Scraper,
419
+ @type=:animals>,
420
+ Node::XML::Parser,
421
+ CallableTree::Node::Root]>
362
422
  ---
363
423
  * Node::JSON::Parser: [matched: true]
364
424
  * Node::JSON::Scraper(animals): [matched: false]
365
425
  * Node::JSON::Scraper(fruits): [matched: true]
366
426
  Input : {"fruits"=>[{"name"=>"Red Apple", "emoji"=>"🍎"}, {"name"=>"Green Apple", "emoji"=>"🍏"}]}
367
427
  Output: {"Red Apple"=>"🍎", "Green Apple"=>"🍏"}
368
- #<struct CallableTree::Node::External::Output value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"}, options={:foo=>:bar}, routes=[#<Node::Identity:0x00007f97370ffed0 @klass=Node::JSON::Scraper, @type=:fruits>, Node::JSON::Parser, CallableTree::Node::Root]>
428
+ #<struct CallableTree::Node::External::Output
429
+ value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"},
430
+ options={:foo=>:bar},
431
+ routes=
432
+ [#<Node::Identity:0x00007ffd8512bdf0
433
+ @klass=Node::JSON::Scraper,
434
+ @type=:fruits>,
435
+ Node::JSON::Parser,
436
+ CallableTree::Node::Root]>
369
437
  ---
370
438
  * Node::JSON::Parser: [matched: false]
371
439
  * Node::XML::Parser: [matched: true]
@@ -373,7 +441,15 @@ Run `examples/example4.rb`:
373
441
  * Node::XML::Scraper(fruits): [matched: true]
374
442
  Input : <root><fruits><fruit emoji='🍎' name='Red Apple'/><fruit emoji='🍏' name='Green Apple'/></fruits></root>
375
443
  Output: {"Red Apple"=>"🍎", "Green Apple"=>"🍏"}
376
- #<struct CallableTree::Node::External::Output value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"}, options={:foo=>:bar}, routes=[#<Node::Identity:0x00007f97370cceb8 @klass=Node::XML::Scraper, @type=:fruits>, Node::XML::Parser, CallableTree::Node::Root]>
444
+ #<struct CallableTree::Node::External::Output
445
+ value={"Red Apple"=>"🍎", "Green Apple"=>"🍏"},
446
+ options={:foo=>:bar},
447
+ routes=
448
+ [#<Node::Identity:0x00007ffd8407a740
449
+ @klass=Node::XML::Scraper,
450
+ @type=:fruits>,
451
+ Node::XML::Parser,
452
+ CallableTree::Node::Root]>
377
453
  ---
378
454
  ```
379
455
 
@@ -427,6 +503,41 @@ after_call output: 8
427
503
  result: 16
428
504
  ```
429
505
 
506
+ #### `CallableTree::Node::Internal#broadcast` (experimental)
507
+
508
+ If you want to call and output all child nodes of the internal node, call it. Broadcast strategy ignores the `terminate?` method of the child node.
509
+
510
+ `examples/example6.rb`:
511
+ ```ruby
512
+ ...
513
+
514
+ tree = CallableTree::Node::Root.new.append(
515
+ Node::JSON::Parser.new.append(
516
+ Node::JSON::Scraper.new(type: :animals),
517
+ Node::JSON::Scraper.new(type: :fruits)
518
+ ).broadcast,
519
+ Node::XML::Parser.new.append(
520
+ Node::XML::Scraper.new(type: :animals),
521
+ Node::XML::Scraper.new(type: :fruits)
522
+ ).broadcast
523
+ )
524
+
525
+ ...
526
+ ```
527
+
528
+ Run `examples/example6.rb`:
529
+ ```sh
530
+ % ruby examples/example6.rb
531
+ [{"Dog"=>"🐶", "Cat"=>"🐱"}, nil]
532
+ ---
533
+ [{"Dog"=>"🐶", "Cat"=>"🐱"}, nil]
534
+ ---
535
+ [nil, {"Red Apple"=>"🍎", "Green Apple"=>"🍏"}]
536
+ ---
537
+ [nil, {"Red Apple"=>"🍎", "Green Apple"=>"🍏"}]
538
+ ---
539
+ ```
540
+
430
541
  ## Contributing
431
542
 
432
543
  Bug reports and pull requests are welcome on GitHub at https://github.com/jsmmr/callable_tree.
@@ -8,15 +8,15 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ['jsmmr']
9
9
  spec.email = ['jsmmr@icloud.com']
10
10
 
11
- spec.summary = 'Builds a tree by linking callable nodes. The nodes that match the calling condition are called in a chain from the root node to the leaf node. This is like nested case statements.'
12
- spec.description = 'Builds a tree by linking callable nodes. The nodes that match the calling condition are called in a chain from the root node to the leaf node. This is like nested case statements.'
11
+ spec.summary = 'Builds a tree by linking callable nodes. The nodes that match the calling condition are called in a chain from the root node to the leaf node. These are like nested case statements.'
12
+ spec.description = 'Builds a tree by linking callable nodes. The nodes that match the calling condition are called in a chain from the root node to the leaf node. These are like nested case statements.'
13
13
  spec.homepage = 'https://github.com/jsmmr/ruby_callable_tree'
14
14
  spec.license = 'MIT'
15
15
  spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
16
16
 
17
17
  spec.metadata['homepage_uri'] = spec.homepage
18
18
  spec.metadata['source_code_uri'] = 'https://github.com/jsmmr/ruby_callable_tree'
19
- spec.metadata['changelog_uri'] = 'https://github.com/jsmmr/ruby_callable_tree/CHANGELOG.md'
19
+ spec.metadata['changelog_uri'] = 'https://github.com/jsmmr/ruby_callable_tree/blob/v#{version}/CHANGELOG.md'
20
20
 
21
21
  # Specify which files should be added to the gem when it is released.
22
22
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
data/examples/example1.rb CHANGED
@@ -96,6 +96,6 @@ tree = CallableTree::Node::Root.new.append(
96
96
 
97
97
  Dir.glob(__dir__ + '/docs/*') do |file|
98
98
  options = { foo: :bar }
99
- puts tree.call(file, **options)
99
+ pp tree.call(file, **options)
100
100
  puts '---'
101
101
  end
data/examples/example2.rb CHANGED
@@ -96,6 +96,6 @@ tree = CallableTree::Node::Root.new.append(
96
96
 
97
97
  Dir.glob(__dir__ + '/docs/*') do |file|
98
98
  options = { foo: :bar }
99
- puts tree.call(file, **options)
99
+ pp tree.call(file, **options)
100
100
  puts '---'
101
101
  end
data/examples/example3.rb CHANGED
@@ -117,6 +117,6 @@ tree = CallableTree::Node::Root.new.append(
117
117
 
118
118
  Dir.glob(__dir__ + '/docs/*') do |file|
119
119
  options = { foo: :bar }
120
- puts tree.call(file, **options)
120
+ pp tree.call(file, **options)
121
121
  puts '---'
122
122
  end
data/examples/example4.rb CHANGED
@@ -153,6 +153,6 @@ tree = CallableTree::Node::Root.new.append(
153
153
 
154
154
  Dir.glob(__dir__ + '/docs/*') do |file|
155
155
  options = { foo: :bar }
156
- puts tree.call(file, **options)
156
+ pp tree.call(file, **options)
157
157
  puts '---'
158
158
  end
@@ -0,0 +1,101 @@
1
+ require 'callable_tree'
2
+ require 'json'
3
+ require 'rexml/document'
4
+
5
+ module Node
6
+ module JSON
7
+ class Parser
8
+ include CallableTree::Node::Internal
9
+
10
+ def match?(input, **options)
11
+ File.extname(input) == '.json'
12
+ end
13
+
14
+ def call(input, **options)
15
+ File.open(input) do |file|
16
+ json = ::JSON.load(file)
17
+ super(json, **options)
18
+ end
19
+ end
20
+
21
+ def terminate?(_output, **)
22
+ true
23
+ end
24
+ end
25
+
26
+ class Scraper
27
+ include CallableTree::Node::External
28
+
29
+ def initialize(type:)
30
+ @type = type
31
+ end
32
+
33
+ def match?(input, **options)
34
+ !!input[@type.to_s]
35
+ end
36
+
37
+ def call(input, **options)
38
+ input[@type.to_s]
39
+ .map { |element| [element['name'], element['emoji']] }
40
+ .to_h
41
+ end
42
+ end
43
+ end
44
+
45
+ module XML
46
+ class Parser
47
+ include CallableTree::Node::Internal
48
+
49
+ def match?(input, **options)
50
+ File.extname(input) == '.xml'
51
+ end
52
+
53
+ def call(input, **options)
54
+ File.open(input) do |file|
55
+ super(REXML::Document.new(file), **options)
56
+ end
57
+ end
58
+
59
+ def terminate?(_output, **)
60
+ true
61
+ end
62
+ end
63
+
64
+ class Scraper
65
+ include CallableTree::Node::External
66
+
67
+ def initialize(type:)
68
+ @type = type
69
+ end
70
+
71
+ def match?(input, **options)
72
+ !input.get_elements("//#{@type}").empty?
73
+ end
74
+
75
+ def call(input, **options)
76
+ input
77
+ .get_elements("//#{@type}")
78
+ .first
79
+ .map { |element| [element['name'], element['emoji']] }
80
+ .to_h
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ tree = CallableTree::Node::Root.new.append(
87
+ Node::JSON::Parser.new.append(
88
+ Node::JSON::Scraper.new(type: :animals),
89
+ Node::JSON::Scraper.new(type: :fruits)
90
+ ).broadcast,
91
+ Node::XML::Parser.new.append(
92
+ Node::XML::Scraper.new(type: :animals),
93
+ Node::XML::Scraper.new(type: :fruits)
94
+ ).broadcast
95
+ )
96
+
97
+ Dir.glob(__dir__ + '/docs/*') do |file|
98
+ options = { foo: :bar }
99
+ pp tree.call(file, **options)
100
+ puts '---'
101
+ end
data/lib/callable_tree.rb CHANGED
@@ -7,8 +7,10 @@ end
7
7
  require 'forwardable'
8
8
  require_relative 'callable_tree/version'
9
9
  require_relative 'callable_tree/node'
10
+ require_relative 'callable_tree/node/hooks/call'
11
+ require_relative 'callable_tree/node/internal/broadcast'
12
+ require_relative 'callable_tree/node/internal/seek'
10
13
  require_relative 'callable_tree/node/external/verbose'
11
14
  require_relative 'callable_tree/node/external'
12
- require_relative 'callable_tree/node/hooks/call'
13
15
  require_relative 'callable_tree/node/internal'
14
16
  require_relative 'callable_tree/node/root'
@@ -31,54 +31,36 @@ module CallableTree
31
31
  end
32
32
 
33
33
  def call(input = nil, **options)
34
- children
35
- .lazy
36
- .map { |node| Input.new(input, options, node) }
37
- .select { |input| input.valid? }
38
- .map { |input| input.call }
39
- .select { |output| output.valid? }
40
- .map { |output| output.call }
41
- .first
34
+ strategy.call(children, input: input, options: options)
42
35
  end
43
36
 
44
- class Input < BasicObject
45
- def initialize(value, options, node)
46
- @value = value
47
- @options = options
48
- @node = node
49
- end
50
-
51
- def valid?
52
- @node.match?(@value, **@options)
53
- end
54
-
55
- def call
56
- value = @node.call(@value, **@options)
57
- Output.new(value, @options, @node)
37
+ def seek
38
+ if strategy.is_a?(Seek)
39
+ self
40
+ else
41
+ clone.tap do |node|
42
+ node.send(:strategy=, Seek.new)
43
+ end
58
44
  end
59
45
  end
60
46
 
61
- class Output < BasicObject
62
- def initialize(value, options, node)
63
- @value = value
64
- @options = options
65
- @node = node
66
- end
67
-
68
- def valid?
69
- @node.terminate?(@value, **@options)
70
- end
71
-
72
- def call
73
- @value
47
+ def broadcast
48
+ if strategy.is_a?(Broadcast)
49
+ self
50
+ else
51
+ clone.tap do |node|
52
+ node.send(:strategy=, Broadcast.new)
53
+ end
74
54
  end
75
55
  end
76
56
 
77
- private_constant :Input, :Output
78
-
79
57
  private
80
58
 
81
- attr_writer :children
59
+ attr_writer :children, :strategy
60
+
61
+ def strategy
62
+ @strategy ||= Seek.new
63
+ end
82
64
 
83
65
  def initialize_copy(_node)
84
66
  super
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CallableTree
4
+ module Node
5
+ module Internal
6
+ class Broadcast
7
+ def call(nodes, input:, options:)
8
+ nodes.map do |node|
9
+ if node.match?(input, **options)
10
+ node.call(input, **options)
11
+ else
12
+ nil
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CallableTree
4
+ module Node
5
+ module Internal
6
+ class Seek
7
+ def call(nodes, input:, options:)
8
+ nodes
9
+ .lazy
10
+ .select { |node| node.match?(input, **options) }
11
+ .map do |node|
12
+ output = node.call(input, **options)
13
+ terminated = node.terminate?(output, **options)
14
+ [output, terminated]
15
+ end
16
+ .select { |_output, terminated| terminated }
17
+ .map { |output, _terminated| output }
18
+ .first
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CallableTree
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
5
5
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: callable_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - jsmmr
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-19 00:00:00.000000000 Z
11
+ date: 2021-05-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Builds a tree by linking callable nodes. The nodes that match the calling
14
- condition are called in a chain from the root node to the leaf node. This is like
14
+ condition are called in a chain from the root node to the leaf node. These are like
15
15
  nested case statements.
16
16
  email:
17
17
  - jsmmr@icloud.com
@@ -41,13 +41,15 @@ files:
41
41
  - examples/example3.rb
42
42
  - examples/example4.rb
43
43
  - examples/example5.rb
44
+ - examples/example6.rb
44
45
  - lib/callable_tree.rb
45
46
  - lib/callable_tree/node.rb
46
- - lib/callable_tree/node/branch.rb
47
47
  - lib/callable_tree/node/external.rb
48
48
  - lib/callable_tree/node/external/verbose.rb
49
49
  - lib/callable_tree/node/hooks/call.rb
50
50
  - lib/callable_tree/node/internal.rb
51
+ - lib/callable_tree/node/internal/broadcast.rb
52
+ - lib/callable_tree/node/internal/seek.rb
51
53
  - lib/callable_tree/node/root.rb
52
54
  - lib/callable_tree/version.rb
53
55
  homepage: https://github.com/jsmmr/ruby_callable_tree
@@ -56,7 +58,7 @@ licenses:
56
58
  metadata:
57
59
  homepage_uri: https://github.com/jsmmr/ruby_callable_tree
58
60
  source_code_uri: https://github.com/jsmmr/ruby_callable_tree
59
- changelog_uri: https://github.com/jsmmr/ruby_callable_tree/CHANGELOG.md
61
+ changelog_uri: https://github.com/jsmmr/ruby_callable_tree/blob/v#{version}/CHANGELOG.md
60
62
  post_install_message:
61
63
  rdoc_options: []
62
64
  require_paths:
@@ -76,6 +78,6 @@ rubygems_version: 3.2.16
76
78
  signing_key:
77
79
  specification_version: 4
78
80
  summary: Builds a tree by linking callable nodes. The nodes that match the calling
79
- condition are called in a chain from the root node to the leaf node. This is like
81
+ condition are called in a chain from the root node to the leaf node. These are like
80
82
  nested case statements.
81
83
  test_files: []
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CallableTree
4
- module Node
5
- module Branch
6
- attr_reader :parent
7
-
8
- def ancestors
9
- ::Enumerator.new do |y|
10
- node = self
11
- while node = node&.parent
12
- y << node
13
- end
14
- end
15
- end
16
-
17
- def routes
18
- ::Enumerator.new do |y|
19
- y << self.class
20
- ancestors.each { |node| y << node.class }
21
- end
22
- end
23
-
24
- def depth
25
- parent.nil? ? 0 : parent.depth + 1
26
- end
27
-
28
- private
29
-
30
- attr_writer :parent
31
- end
32
-
33
- private_constant :Branch
34
- end
35
- end