flattenator 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|