callable_tree 0.1.2 → 0.1.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: 822f8080ff2652895cd3cb7255d856eea72290564dbe7054d93c2fca01ac6149
4
- data.tar.gz: 783496e58325e0d5be2595b3c33b0acd1095c61400b89addc0ce9d8fc8e845db
3
+ metadata.gz: 8fa06f3d5119313cc62468deec9349bb902f92ff6267f9b0051d5625eea8a866
4
+ data.tar.gz: 8679ef5bd22e419d6379b18fdc0a509074938073c9edaff37b4a7bee6029cda8
5
5
  SHA512:
6
- metadata.gz: '0381d33a9f1a82b524aa176574d24961e7585ebb4ea76185759be2d17d739b9c84612b0ed9f7f2323083a71515acbf6fa622b65528c5a903dd911147bebfb7c7'
7
- data.tar.gz: 9b715d2b2fd6ca25c1bf8c446574a2097271525facc306198695d01fbadffd2e7823866e16c58c83cb8a7f08dc8047909023ecc8256d083f07854b9c714a57ac
6
+ metadata.gz: 6ccdf3baffda301532c51510b84d066cec428961f773618ddc8d344917c9af26ca3da3d6186d6748585a8eceb0eabac0d7e652bcbcafb28b3a4a9e74622eb98f
7
+ data.tar.gz: e1aa253c87040bebc9f03080ad25f704c1cbde0410355b4ffb70bbe969338d3ec7a88804abe856d582b9e351a182db43a7abe4b2f0b89c3f7d97fc6bb64bf1eb
data/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.3] - 2021-06-12
4
+ - Minor improvements
5
+
3
6
  ## [0.1.2] - 2021-05-29
4
7
 
5
8
  - Add `CallableTree::Node::Internal#compose` (experimental)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- callable_tree (0.1.2)
4
+ callable_tree (0.1.3)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -18,19 +18,22 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
+ Builds a tree by linking instances of the nodes. The `call` method of the node where the `match?` method returns a truthy value is called in a chain from the root node to the leaf node.
22
+
21
23
  - `CallableTree::Node::Internal`
22
- - This `module` is used to define a node that can have child nodes.
24
+ - This `module` is used to define a node that can have child nodes. An instance of this node has several strategies. The strategy can be changed by calling the method of the instance.
23
25
  - `CallableTree::Node::External`
24
26
  - This `module` is used to define a leaf node that cannot have child nodes.
25
27
  - `CallableTree::Node::Root`
26
28
  - This `class` includes `CallableTree::Node::Internal`. When there is no need to customize the internal node, use this `class`.
27
29
 
28
- Builds a tree by linking instances of the nodes. The `call` method of the node where the `match?` method returns a truthy value is called in a chain from the root node to the leaf node.
29
- If the `call` method returns a value other than `nil`, the next sibling node does not be called. This behavior is changeable by overriding the `terminate?` method.
30
-
31
30
  ### Basic
32
31
 
33
- `examples/example1.rb`:
32
+ #### `CallableTree::Node::Internal#seek` (default)
33
+
34
+ This strategy does not call the next sibling node if the `call` method of the current node returns a value other than `nil`. This behavior is changeable by overriding the `terminate?` method.
35
+
36
+ `examples/internal-seek.rb`:
34
37
  ```ruby
35
38
  module Node
36
39
  module JSON
@@ -123,16 +126,17 @@ module Node
123
126
  end
124
127
  end
125
128
 
129
+ # The `seek` method call can be omitted since it is the default strategy.
126
130
  tree = CallableTree::Node::Root.new.append(
127
131
  Node::JSON::Parser.new.append(
128
132
  Node::JSON::Scraper.new(type: :animals),
129
133
  Node::JSON::Scraper.new(type: :fruits)
130
- ),
134
+ ),#.seek,
131
135
  Node::XML::Parser.new.append(
132
136
  Node::XML::Scraper.new(type: :animals),
133
137
  Node::XML::Scraper.new(type: :fruits)
134
- )
135
- )
138
+ )#.seek
139
+ )#.seek
136
140
 
137
141
  Dir.glob(__dir__ + '/docs/*') do |file|
138
142
  options = { foo: :bar }
@@ -141,9 +145,9 @@ Dir.glob(__dir__ + '/docs/*') do |file|
141
145
  end
142
146
  ```
143
147
 
144
- Run `examples/example1.rb`:
148
+ Run `examples/internal-seek.rb`:
145
149
  ```sh
146
- % ruby examples/example1.rb
150
+ % ruby examples/internal-seek.rb
147
151
  {"Dog"=>"🐶", "Cat"=>"🐱"}
148
152
  ---
149
153
  {"Dog"=>"🐶", "Cat"=>"🐱"}
@@ -154,13 +158,121 @@ Run `examples/example1.rb`:
154
158
  ---
155
159
  ```
156
160
 
161
+ #### `CallableTree::Node::Internal#broadcast` (experimental)
162
+
163
+ This strategy calls all child nodes of the internal node and ignores their `terminate?` methods, and then outputs their results as array.
164
+
165
+ `examples/internal-broadcast.rb`:
166
+ ```ruby
167
+ module Node
168
+ class LessThan
169
+ include CallableTree::Node::Internal
170
+
171
+ def initialize(num)
172
+ @num = num
173
+ end
174
+
175
+ def match?(input)
176
+ super && input < @num
177
+ end
178
+ end
179
+ end
180
+
181
+ tree = CallableTree::Node::Root.new.append(
182
+ Node::LessThan.new(5).append(
183
+ lambda { |input, **| input * 2 }, # anonymous external node
184
+ lambda { |input, **| input + 1 } # anonymous external node
185
+ ).broadcast,
186
+ Node::LessThan.new(10).append(
187
+ lambda { |input, **| input * 3 }, # anonymous external node
188
+ lambda { |input, **| input - 1 } # anonymous external node
189
+ ).broadcast
190
+ ).broadcast
191
+
192
+ (0..10).each do |input|
193
+ output = tree.call(input)
194
+ puts "#{input} -> #{output}"
195
+ end
196
+
197
+ ```
198
+
199
+ Run `examples/internal-broadcast.rb`:
200
+ ```sh
201
+ % ruby examples/internal-broadcast.rb
202
+ 0 -> [[0, 1], [0, -1]]
203
+ 1 -> [[2, 2], [3, 0]]
204
+ 2 -> [[4, 3], [6, 1]]
205
+ 3 -> [[6, 4], [9, 2]]
206
+ 4 -> [[8, 5], [12, 3]]
207
+ 5 -> [nil, [15, 4]]
208
+ 6 -> [nil, [18, 5]]
209
+ 7 -> [nil, [21, 6]]
210
+ 8 -> [nil, [24, 7]]
211
+ 9 -> [nil, [27, 8]]
212
+ 10 -> [nil, nil]
213
+ ```
214
+
215
+ #### `CallableTree::Node::Internal#compose` (experimental)
216
+
217
+ This strategy calls all child nodes of the internal node in order to input the output of the previous node to the next node and ignores their `terminate?` methods, and then outputs a single result.
218
+
219
+ `examples/internal-compose.rb`:
220
+ ```ruby
221
+ module Node
222
+ class LessThan
223
+ include CallableTree::Node::Internal
224
+
225
+ def initialize(num)
226
+ @num = num
227
+ end
228
+
229
+ def match?(input)
230
+ super && input < @num
231
+ end
232
+ end
233
+ end
234
+
235
+ tree = CallableTree::Node::Root.new.append(
236
+ Node::LessThan.new(5).append(
237
+ proc { |input| input * 2 }, # anonymous external node
238
+ proc { |input| input + 1 } # anonymous external node
239
+ ).compose,
240
+ Node::LessThan.new(10).append(
241
+ proc { |input| input * 3 }, # anonymous external node
242
+ proc { |input| input - 1 } # anonymous external node
243
+ ).compose
244
+ ).compose
245
+
246
+ (0..10).each do |input|
247
+ output = tree.call(input)
248
+ puts "#{input} -> #{output}"
249
+ end
250
+
251
+ ```
252
+
253
+ Run `examples/internal-compose.rb`:
254
+ ```sh
255
+ % ruby examples/internal-compose.rb
256
+ 0 -> 2
257
+ 1 -> 8
258
+ 2 -> 14
259
+ 3 -> 20
260
+ 4 -> 26
261
+ 5 -> 14
262
+ 6 -> 17
263
+ 7 -> 20
264
+ 8 -> 23
265
+ 9 -> 26
266
+ 10 -> 10
267
+ ```
268
+
157
269
  ### Advanced
158
270
 
159
271
  #### `CallableTree::Node::External#verbosify`
160
272
 
161
- If you want verbose result, call it.
273
+ If you want verbose output results, call this method.
162
274
 
163
- `examples/example2.rb`:
275
+ `examples/external-verbosify.rb`:
164
276
  ```ruby
165
277
  ...
166
278
 
@@ -178,9 +290,9 @@ tree = CallableTree::Node::Root.new.append(
178
290
  ...
179
291
  ```
180
292
 
181
- Run `examples/example2.rb`:
293
+ Run `examples/external-verbosify.rb`:
182
294
  ```sh
183
- % ruby examples/example2.rb
295
+ % ruby examples/external-verbosify.rb
184
296
  #<struct CallableTree::Node::External::Output
185
297
  value={"Dog"=>"🐶", "Cat"=>"🐱"},
186
298
  options={:foo=>:bar},
@@ -208,9 +320,9 @@ You can work around it by overriding the `identity` method of the node.
208
320
 
209
321
  #### `CallableTree::Node#identity`
210
322
 
211
- If you want to customize the node identity, override it.
323
+ If you want to customize the node identity, override this method.
212
324
 
213
- `examples/example3.rb`:
325
+ `examples/identity.rb`:
214
326
  ```ruby
215
327
  module Node
216
328
  class Identity
@@ -266,9 +378,9 @@ end
266
378
  ...
267
379
  ```
268
380
 
269
- Run `examples/example3.rb`:
381
+ Run `examples/identity.rb`:
270
382
  ```sh
271
- % ruby examples/example3.rb
383
+ % ruby examples/identity.rb
272
384
  #<struct CallableTree::Node::External::Output
273
385
  value={"Dog"=>"🐶", "Cat"=>"🐱"},
274
386
  options={:foo=>:bar},
@@ -315,7 +427,7 @@ Run `examples/example3.rb`:
315
427
 
316
428
  This is an example of logging.
317
429
 
318
- `examples/example4.rb`:
430
+ `examples/logging.rb`:
319
431
  ```ruby
320
432
  module Node
321
433
  module Logging
@@ -388,9 +500,9 @@ end
388
500
  ...
389
501
  ```
390
502
 
391
- Run `examples/example4.rb`:
503
+ Run `examples/logging.rb`:
392
504
  ```sh
393
- % ruby examples/example4.rb
505
+ % ruby examples/logging.rb
394
506
  * Node::JSON::Parser: [matched: true]
395
507
  * Node::JSON::Scraper(animals): [matched: true]
396
508
  Input : {"animals"=>[{"name"=>"Dog", "emoji"=>"🐶"}, {"name"=>"Cat", "emoji"=>"🐱"}]}
@@ -455,7 +567,7 @@ Run `examples/example4.rb`:
455
567
 
456
568
  #### `CallableTree::Node::Hooks::Call` (experimental)
457
569
 
458
- `examples/example5.rb`:
570
+ `examples/hooks-call.rb`:
459
571
  ```ruby
460
572
  module Node
461
573
  class HooksSample
@@ -493,9 +605,9 @@ Node::HooksSample.new
493
605
  end
494
606
  ```
495
607
 
496
- Run `examples/example5.rb`:
608
+ Run `examples/hooks-call.rb`:
497
609
  ```sh
498
- % ruby examples/example5.rb
610
+ % ruby examples/hooks-call.rb
499
611
  before_call input: 1
500
612
  external input: 2
501
613
  around_call input: 2
@@ -504,95 +616,6 @@ after_call output: 8
504
616
  result: 16
505
617
  ```
506
618
 
507
- #### `CallableTree::Node::Internal#broadcast` (experimental)
508
-
509
- If you want to call all child nodes of the internal node in order to output their results as array, call it. The `broadcast` strategy ignores the `terminate?` method of the nodes.
510
-
511
- `examples/example6.rb`:
512
- ```ruby
513
- ...
514
-
515
- tree = CallableTree::Node::Root.new.append(
516
- Node::JSON::Parser.new.append(
517
- Node::JSON::Scraper.new(type: :animals),
518
- Node::JSON::Scraper.new(type: :fruits)
519
- ).broadcast,
520
- Node::XML::Parser.new.append(
521
- Node::XML::Scraper.new(type: :animals),
522
- Node::XML::Scraper.new(type: :fruits)
523
- ).broadcast
524
- )
525
-
526
- ...
527
- ```
528
-
529
- Run `examples/example6.rb`:
530
- ```sh
531
- % ruby examples/example6.rb
532
- [{"Dog"=>"🐶", "Cat"=>"🐱"}, nil]
533
- ---
534
- [{"Dog"=>"🐶", "Cat"=>"🐱"}, nil]
535
- ---
536
- [nil, {"Red Apple"=>"🍎", "Green Apple"=>"🍏"}]
537
- ---
538
- [nil, {"Red Apple"=>"🍎", "Green Apple"=>"🍏"}]
539
- ---
540
- ```
541
-
542
- #### `CallableTree::Node::Internal#compose` (experimental)
543
-
544
- If you want to call all child nodes of the internal node in order to input the output of the previous node to the next node and output a single result , call it. The `compose` strategy ignores the `terminate?` method of the nodes.
545
-
546
- `examples/example7.rb`:
547
- ```ruby
548
- module Node
549
- class LessThan
550
- include CallableTree::Node::Internal
551
-
552
- def initialize(num)
553
- @num = num
554
- end
555
-
556
- def match?(input)
557
- super && input < @num
558
- end
559
- end
560
- end
561
-
562
- tree = CallableTree::Node::Root.new.append(
563
- Node::LessThan.new(5).append(
564
- proc { |input| input * 2 }, # anonymous external node
565
- proc { |input| input + 1 } # anonymous external node
566
- ).compose,
567
- Node::LessThan.new(10).append(
568
- proc { |input| input * 3 }, # anonymous external node
569
- proc { |input| input - 1 } # anonymous external node
570
- ).compose
571
- ).compose
572
-
573
- (0..10).each do |input|
574
- output = tree.call(input)
575
- puts "#{input} -> #{output}"
576
- end
577
-
578
- ```
579
-
580
- Run `examples/example7.rb`:
581
- ```sh
582
- % ruby examples/example7.rb
583
- 0 -> 2
584
- 1 -> 8
585
- 2 -> 14
586
- 3 -> 20
587
- 4 -> 26
588
- 5 -> 14
589
- 6 -> 17
590
- 7 -> 20
591
- 8 -> 23
592
- 9 -> 26
593
- 10 -> 10
594
- ```
595
-
596
619
  ## Contributing
597
620
 
598
621
  Bug reports and pull requests are welcome on GitHub at https://github.com/jsmmr/callable_tree.
@@ -8,8 +8,8 @@ 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. These are like nested `if` or `case` expressions.'
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 `if` or `case` expressions.'
11
+ spec.summary = 'Builds a tree by linking callable nodes. The nodes that match the conditions are called in a chain from the root node to the leaf node. These are like nested `if` or `case` expressions.'
12
+ spec.description = 'Builds a tree by linking callable nodes. The nodes that match the conditiosn are called in a chain from the root node to the leaf node. These are like nested `if` or `case` expressions.'
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')
File without changes
File without changes
File without changes
@@ -0,0 +1,31 @@
1
+ require 'callable_tree'
2
+
3
+ module Node
4
+ class LessThan
5
+ include CallableTree::Node::Internal
6
+
7
+ def initialize(num)
8
+ @num = num
9
+ end
10
+
11
+ def match?(input)
12
+ super && input < @num
13
+ end
14
+ end
15
+ end
16
+
17
+ tree = CallableTree::Node::Root.new.append(
18
+ Node::LessThan.new(5).append(
19
+ lambda { |input, **| input * 2 }, # anonymous external node
20
+ lambda { |input, **| input + 1 } # anonymous external node
21
+ ).broadcast,
22
+ Node::LessThan.new(10).append(
23
+ lambda { |input, **| input * 3 }, # anonymous external node
24
+ lambda { |input, **| input - 1 } # anonymous external node
25
+ ).broadcast
26
+ ).broadcast
27
+
28
+ (0..10).each do |input|
29
+ output = tree.call(input)
30
+ puts "#{input} -> #{output}"
31
+ end
File without changes
File without changes
File without changes
@@ -9,12 +9,12 @@ module CallableTree
9
9
  Proxy.new(callable)
10
10
  end
11
11
 
12
- def self.proxified?(node)
13
- node.is_a?(Proxy)
12
+ def proxified?
13
+ false
14
14
  end
15
15
 
16
- def self.unproxify(node)
17
- node.callable
16
+ def verbosified?
17
+ false
18
18
  end
19
19
 
20
20
  def verbosify
@@ -23,8 +23,8 @@ module CallableTree
23
23
  end
24
24
 
25
25
  def identity
26
- if External.proxified?(self)
27
- External.unproxify(self)
26
+ if proxified?
27
+ unproxify
28
28
  else
29
29
  self
30
30
  end
@@ -36,11 +36,18 @@ module CallableTree
36
36
  include External
37
37
 
38
38
  def_delegators :@callable, :call
39
- attr_reader :callable
40
39
 
41
40
  def initialize(callable)
42
41
  @callable = callable
43
42
  end
43
+
44
+ def proxified?
45
+ true
46
+ end
47
+
48
+ def unproxify
49
+ @callable
50
+ end
44
51
  end
45
52
 
46
53
  private_constant :Proxy
@@ -6,6 +6,10 @@ module CallableTree
6
6
  Output = Struct.new(:value, :options, :routes)
7
7
 
8
8
  module Verbose
9
+ def verbosified?
10
+ true
11
+ end
12
+
9
13
  def call(input = nil, **options)
10
14
  output = super(input, **options)
11
15
  routes = self.routes
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CallableTree
4
- VERSION = '0.1.2'
4
+ VERSION = '0.1.3'
5
5
  end
metadata CHANGED
@@ -1,18 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: callable_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
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-29 00:00:00.000000000 Z
11
+ date: 2021-06-12 00:00:00.000000000 Z
12
12
  dependencies: []
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. These are like
15
- nested `if` or `case` expressions.
13
+ description: Builds a tree by linking callable nodes. The nodes that match the conditiosn
14
+ are called in a chain from the root node to the leaf node. These are like nested
15
+ `if` or `case` expressions.
16
16
  email:
17
17
  - jsmmr@icloud.com
18
18
  executables: []
@@ -36,13 +36,13 @@ files:
36
36
  - examples/docs/animals.xml
37
37
  - examples/docs/fruits.json
38
38
  - examples/docs/fruits.xml
39
- - examples/example1.rb
40
- - examples/example2.rb
41
- - examples/example3.rb
42
- - examples/example4.rb
43
- - examples/example5.rb
44
- - examples/example6.rb
45
- - examples/example7.rb
39
+ - examples/external-verbosify.rb
40
+ - examples/hooks-call.rb
41
+ - examples/identity.rb
42
+ - examples/internal-broadcast.rb
43
+ - examples/internal-compose.rb
44
+ - examples/internal-seek.rb
45
+ - examples/logging.rb
46
46
  - lib/callable_tree.rb
47
47
  - lib/callable_tree/node.rb
48
48
  - lib/callable_tree/node/external.rb
@@ -60,7 +60,7 @@ licenses:
60
60
  metadata:
61
61
  homepage_uri: https://github.com/jsmmr/ruby_callable_tree
62
62
  source_code_uri: https://github.com/jsmmr/ruby_callable_tree
63
- changelog_uri: https://github.com/jsmmr/ruby_callable_tree/blob/v0.1.2/CHANGELOG.md
63
+ changelog_uri: https://github.com/jsmmr/ruby_callable_tree/blob/v0.1.3/CHANGELOG.md
64
64
  post_install_message:
65
65
  rdoc_options: []
66
66
  require_paths:
@@ -79,7 +79,7 @@ requirements: []
79
79
  rubygems_version: 3.2.16
80
80
  signing_key:
81
81
  specification_version: 4
82
- summary: Builds a tree by linking callable nodes. The nodes that match the calling
83
- condition are called in a chain from the root node to the leaf node. These are like
84
- nested `if` or `case` expressions.
82
+ summary: Builds a tree by linking callable nodes. The nodes that match the conditions
83
+ are called in a chain from the root node to the leaf node. These are like nested
84
+ `if` or `case` expressions.
85
85
  test_files: []
data/examples/example6.rb DELETED
@@ -1,101 +0,0 @@
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