flattenator 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 +4 -4
- data/CHANGELOG.markdown +5 -1
- data/README.markdown +59 -5
- data/lib/flattenator.rb +2 -2
- data/lib/flattenator/hash.rb +43 -0
- data/lib/flattenator/version.rb +1 -1
- metadata +3 -3
- data/.travis.yml +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b92cd0d6ef19e1f44533d54ad8a681903cba243a137ba11c5cb860c9abcf2f1
|
4
|
+
data.tar.gz: 81dc044b46d5b9509e2221e4bcd8ed8ab1eff15a2a187bbbf951590dda048801
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7192f5c026ee85154cb5c7ac7254a9519f91a79395f6ac65d8a26f1b11401e4afebe61431db5f513eae8a5722c389930068bd15142fe3091e025d08b7e52eb62
|
7
|
+
data.tar.gz: f062533cc3e3e351418116aedeb63003eceee5cbef1cb4e4e9f116135a3acc93c032009ee5a4146344c321d448dd5e8e1a71410d4aef88d5f2ea0d0ee1fbe86e
|
data/CHANGELOG.markdown
CHANGED
data/README.markdown
CHANGED
@@ -14,10 +14,10 @@ Converts a deeply nested hash with a flattened hash, prefixing the keys for chil
|
|
14
14
|
}
|
15
15
|
# end with this
|
16
16
|
{
|
17
|
-
foo
|
18
|
-
baz_apple
|
19
|
-
baz_banana
|
20
|
-
baz_carrot
|
17
|
+
"foo" => "bar",
|
18
|
+
"baz_apple" => 2,
|
19
|
+
"baz_banana" => 5,
|
20
|
+
"baz_carrot" => 0,
|
21
21
|
}
|
22
22
|
```
|
23
23
|
|
@@ -40,7 +40,61 @@ Or install it yourself as:
|
|
40
40
|
## Usage
|
41
41
|
|
42
42
|
```
|
43
|
-
Flattenator.new(hash).flattened
|
43
|
+
Flattenator::Hash.new(hash).flattened
|
44
|
+
```
|
45
|
+
|
46
|
+
By default, a JSON-encoded version of the object being flattened will be included in the flattened hash, but this can be turned off.
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
original = {
|
50
|
+
foo: "bar",
|
51
|
+
options: {
|
52
|
+
jiggle_handle: true,
|
53
|
+
tighten_valve: false,
|
54
|
+
},
|
55
|
+
}
|
56
|
+
|
57
|
+
Flattenator::Hash.new(original).flattened
|
58
|
+
{
|
59
|
+
"foo" => "bar",
|
60
|
+
"options" => "{\"jiggle_handle\":true,\"tighten_valve\":false}"
|
61
|
+
"options_jiggle_handle" => true,
|
62
|
+
"options_tighten_valve" => false,
|
63
|
+
}
|
64
|
+
|
65
|
+
Flattenator::Hash.new(original, include_unflattened: false).flattened
|
66
|
+
{
|
67
|
+
"foo" => "bar",
|
68
|
+
"options_jiggle_handle" => true,
|
69
|
+
"options_tighten_valve" => false,
|
70
|
+
}
|
71
|
+
```
|
72
|
+
|
73
|
+
Additionally, arrays are flattened into the form `{key}_{index}`, like so:
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
original = {
|
77
|
+
fruits: [
|
78
|
+
"apple",
|
79
|
+
"banana",
|
80
|
+
"citrus",
|
81
|
+
],
|
82
|
+
vegetables: [
|
83
|
+
"daikon",
|
84
|
+
"eggplant",
|
85
|
+
],
|
86
|
+
}
|
87
|
+
|
88
|
+
Flattenator::Hash.new(original).flattened
|
89
|
+
{
|
90
|
+
"fruits" => "[\"apple\",\"banana\",\"citrus\"]",
|
91
|
+
"fruits_0" => "apple",
|
92
|
+
"fruits_1" => "banana",
|
93
|
+
"fruits_2" => "citrus",
|
94
|
+
"vegetables" => "[\"daikon\",\"eggplant\"]",
|
95
|
+
"vegetables_0" => "daikon",
|
96
|
+
"vegetables_1" => "eggplant",
|
97
|
+
}
|
44
98
|
```
|
45
99
|
|
46
100
|
## Development
|
data/lib/flattenator.rb
CHANGED
@@ -0,0 +1,43 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
class Flattenator::Hash
|
4
|
+
attr_reader *%i(
|
5
|
+
flattened
|
6
|
+
source
|
7
|
+
)
|
8
|
+
|
9
|
+
def initialize(source, include_unflattened: true)
|
10
|
+
raise ArgumentError.new("Source object does not respond to each_pair") unless source.respond_to?(:each_pair)
|
11
|
+
|
12
|
+
@source = source
|
13
|
+
@flattened = {}
|
14
|
+
@include_unflattened = !!include_unflattened
|
15
|
+
|
16
|
+
source.each_pair do |key, value|
|
17
|
+
flatten(key: key, value: value, destination: @flattened)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def include_unflattened?
|
22
|
+
@include_unflattened
|
23
|
+
end
|
24
|
+
|
25
|
+
private def flatten(key:, value:, destination:, prefix: nil)
|
26
|
+
fullkey = [prefix, key].compact.join("_").tr("-", "_")
|
27
|
+
|
28
|
+
case value
|
29
|
+
when Hash
|
30
|
+
destination[fullkey] = JSON.dump(value) if include_unflattened?
|
31
|
+
value.each do |k, v|
|
32
|
+
flatten(key: k, value: v, destination: destination, prefix: fullkey)
|
33
|
+
end
|
34
|
+
when Array
|
35
|
+
destination[fullkey] = JSON.dump(value) if include_unflattened?
|
36
|
+
value.each_with_index do |item, i|
|
37
|
+
destination["#{fullkey}_#{i}"] = item
|
38
|
+
end
|
39
|
+
else
|
40
|
+
destination[fullkey] = value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/flattenator/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flattenator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Patrick Byrne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02-
|
11
|
+
date: 2020-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -19,7 +19,6 @@ extra_rdoc_files: []
|
|
19
19
|
files:
|
20
20
|
- ".gitignore"
|
21
21
|
- ".semaphore/semaphore.yml"
|
22
|
-
- ".travis.yml"
|
23
22
|
- CHANGELOG.markdown
|
24
23
|
- CODE_OF_CONDUCT.md
|
25
24
|
- Gemfile
|
@@ -30,6 +29,7 @@ files:
|
|
30
29
|
- bin/setup
|
31
30
|
- flattenator.gemspec
|
32
31
|
- lib/flattenator.rb
|
32
|
+
- lib/flattenator/hash.rb
|
33
33
|
- lib/flattenator/version.rb
|
34
34
|
homepage: https://github.com/pbyrne/flattenator
|
35
35
|
licenses:
|