structure_walker 0.1.2 → 2.0.0
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 +4 -4
- data/README.md +7 -8
- data/lib/structure_walker.rb +7 -15
- data/lib/structure_walker/stepper.rb +11 -0
- data/lib/structure_walker/steps.rb +15 -0
- data/lib/structure_walker/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b475d3a1d902704f86c8a63a378229ffdef56bb2
|
4
|
+
data.tar.gz: 0d878b6d9de5636ab82bffc2cdfa6f78160f38a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3fab7aa67d72bdc8a2794e75081d84aa7885fa71b5e03b00faeb1f4d23d7903def07e7edf2898d30b0ed616ee75f7ff0ab78183bf9f2e5773a2991bd20e9e27
|
7
|
+
data.tar.gz: 8cd1a126bdd72371bcf6308b3db9fd2ace516e90868c7a3f9686a4a13be89d7888f3d98bc9f62350bbaf644d477643fbecfcf5a286f7c79679252c60946b252b
|
data/README.md
CHANGED
@@ -26,9 +26,9 @@ Examples:
|
|
26
26
|
|
27
27
|
handler = ->(data) { data[:example_key] = 'some_value'; data }
|
28
28
|
|
29
|
-
data = { some_key: { specific_key: [{ key: 'value' }, { key: 'value' }], another_key: { key: 'value' } } }
|
29
|
+
data = { some_key: { specific_key: [{ key: 'value' }, { key: 'value' }], another_key: { key: 'value' } } }
|
30
30
|
|
31
|
-
steps = [
|
31
|
+
steps = [:hash, [:key, :specific_key], :array]
|
32
32
|
|
33
33
|
walker = StructureWalker::Builder.invoke(handler)
|
34
34
|
|
@@ -42,22 +42,21 @@ Example with multiple keys:
|
|
42
42
|
|
43
43
|
data = { key: { specific_key: [{ key: 'value' }], another_key: [{ key: 'value' }], one_more_key: [{ key: 'value' }] } }
|
44
44
|
|
45
|
-
steps = [
|
45
|
+
steps = [:hash, [:keys, [:specific_key, :one_more_key]], :array]
|
46
46
|
|
47
47
|
walker = StructureWalker::Builder.invoke(handler)
|
48
48
|
|
49
49
|
result = walker.call(steps, data)
|
50
50
|
|
51
|
-
result # => { key: { specific_key: [{ key: 'value', new_key: 'value' }], another_key: [{ key: 'value' }], one_more_key: [{ key: 'value', new_key: 'value' }]
|
51
|
+
result # => { key: { specific_key: [{ key: 'value', new_key: 'value' }], another_key: [{ key: 'value' }], one_more_key: [{ key: 'value', new_key: 'value' }]} }
|
52
52
|
|
53
53
|
Available steps:
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
|
55
|
+
:hash - walk through hash elements value
|
56
|
+
:array - walk through array elements
|
57
57
|
[:key, :some_key] - walk on value of key :some_key
|
58
58
|
[:keys, [:key_one, :key_two]] - walk on values of keys key_one and key_two
|
59
59
|
|
60
|
-
|
61
60
|
## Contributing
|
62
61
|
Fork it
|
63
62
|
Create your feature branch (git checkout -b my-new-feature)
|
data/lib/structure_walker.rb
CHANGED
@@ -1,29 +1,21 @@
|
|
1
|
-
require
|
1
|
+
require 'structure_walker/version'
|
2
|
+
require 'structure_walker/stepper'
|
3
|
+
require 'structure_walker/steps'
|
2
4
|
|
3
5
|
module StructureWalker
|
4
6
|
class Builder
|
5
7
|
class << self
|
6
8
|
def invoke(proc)
|
7
|
-
walker = ->
|
9
|
+
walker = ->(steps, data) do
|
8
10
|
return if data.nil?
|
11
|
+
|
9
12
|
if steps.empty?
|
10
13
|
result = proc.call(data)
|
11
14
|
else
|
12
15
|
steps = steps.clone
|
13
16
|
step = steps.shift
|
14
|
-
|
15
|
-
|
16
|
-
result = case key
|
17
|
-
when :enum
|
18
|
-
if data_type == :hash
|
19
|
-
data.each { |_k,v| walker.call(steps, v) }
|
20
|
-
elsif data_type == :array
|
21
|
-
data.each { |v| walker.call(steps, v) }
|
22
|
-
end
|
23
|
-
when :key, :keys
|
24
|
-
data_types = [data_type].flatten
|
25
|
-
data_types.each { |type| walker.call(steps, data[type]) }
|
26
|
-
end
|
17
|
+
type, keys = step.is_a?(Array) ? [step.first, step.last] : [step, nil]
|
18
|
+
result = StructureWalker::Stepper.invoke(type).call(data, steps, walker, keys)
|
27
19
|
end
|
28
20
|
result
|
29
21
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module StructureWalker
|
2
|
+
module Steps
|
3
|
+
HASH_STEP = [:hash, ->(data, steps, walker, _keys) { data.each { |_k, v| walker.call(steps, v) } }]
|
4
|
+
|
5
|
+
ARRAY_STEP = [:array, ->(data, steps, walker, _keys) { data.each { |v| walker.call(steps, v) } }]
|
6
|
+
|
7
|
+
LAMBDA_FOR_KEY = ->(data, steps, walker, keys) do
|
8
|
+
keys = [keys].flatten; keys.each { |type| walker.call(steps, data[type]) }
|
9
|
+
end
|
10
|
+
|
11
|
+
KEY_STEP = [:key, LAMBDA_FOR_KEY]
|
12
|
+
|
13
|
+
KEYS_STEP = [:keys, LAMBDA_FOR_KEY]
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: structure_walker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kadavar
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -69,6 +69,8 @@ files:
|
|
69
69
|
- bin/console
|
70
70
|
- bin/setup
|
71
71
|
- lib/structure_walker.rb
|
72
|
+
- lib/structure_walker/stepper.rb
|
73
|
+
- lib/structure_walker/steps.rb
|
72
74
|
- lib/structure_walker/version.rb
|
73
75
|
- structure_walker.gemspec
|
74
76
|
homepage: https://github.com/Kadavar32/walker.git
|