coaster 1.3.17 → 1.3.18
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/coaster/util.rb +39 -5
- data/lib/coaster/version.rb +1 -1
- data/test/test_util.rb +16 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65e15c20364ddf5904a27bacf4444b398fc3c1546358d1dea7bc528b3b3d8984
|
4
|
+
data.tar.gz: f404e8e526232d2d1989cf34599b448fab05f85b01be2d71a841fd75510c1369
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c5a2801171bb3e725a28763efdeb9585f4200d9ae651c167efe3efca7b1840417853d7ac684ac7f52f28f537ddf53b6309798715aed42da106e542b4f715800
|
7
|
+
data.tar.gz: 464be9d5a8c7af75fc8f005645203c4b7c19ffd236ecb27431bf8ae9653df2de3ad58650c93087139baf8a91322e5d14d7e386f06fd1d7507cc12527e565e663
|
data/lib/coaster/util.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
module Coaster
|
2
2
|
module Util
|
3
3
|
FLATTEN_HASH_DELIMITER = '.'.freeze
|
4
|
+
ARRAY_START = 0
|
4
5
|
|
5
6
|
class << self
|
6
|
-
def flatten_hashify(object, delimiter: FLATTEN_HASH_DELIMITER, breadcrumbs: [],
|
7
|
+
def flatten_hashify(object, delimiter: FLATTEN_HASH_DELIMITER, breadcrumbs: [], array_start: nil)
|
7
8
|
case object
|
8
9
|
when Hash
|
9
10
|
object.each_with_object({}) do |(key, value), memo|
|
10
|
-
memo.merge!(flatten_hashify(value, delimiter: delimiter, breadcrumbs: breadcrumbs + [key],
|
11
|
+
memo.merge!(flatten_hashify(value, delimiter: delimiter, breadcrumbs: breadcrumbs + [key], array_start: array_start))
|
11
12
|
end
|
12
13
|
when Array
|
13
|
-
if
|
14
|
-
object.each.with_index(
|
15
|
-
memo.merge!(flatten_hashify(element, delimiter: delimiter, breadcrumbs: breadcrumbs + [ix],
|
14
|
+
if array_start
|
15
|
+
object.each.with_index(array_start).with_object({}) do |(element, ix), memo|
|
16
|
+
memo.merge!(flatten_hashify(element, delimiter: delimiter, breadcrumbs: breadcrumbs + [ix], array_start: array_start))
|
16
17
|
end
|
17
18
|
else
|
18
19
|
{breadcrumbs.join(delimiter) => object}
|
@@ -21,6 +22,39 @@ module Coaster
|
|
21
22
|
{breadcrumbs.join(delimiter) => object}
|
22
23
|
end
|
23
24
|
end
|
25
|
+
|
26
|
+
def roughen_hashify(object, delimiter: FLATTEN_HASH_DELIMITER, array_start: ARRAY_START)
|
27
|
+
step1 = object.each_with_object({}) do |(key, value), memo|
|
28
|
+
sp_keys = key.split(delimiter)
|
29
|
+
k = sp_keys.shift
|
30
|
+
if sp_keys.present?
|
31
|
+
memo[k] ||= {}
|
32
|
+
memo[k][sp_keys.join(delimiter)] = value
|
33
|
+
else
|
34
|
+
memo[k] = value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
step2 = step1.each_with_object({}) do |(key, value), memo|
|
39
|
+
case value
|
40
|
+
when Hash
|
41
|
+
memo[key] = roughen_hashify(value, delimiter: delimiter, array_start: array_start)
|
42
|
+
else
|
43
|
+
memo[key] = value
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
array_keys = (array_start...(step2.keys.size+array_start)).to_a
|
48
|
+
if array_keys == step2.keys.map(&:to_i).sort
|
49
|
+
step3 = []
|
50
|
+
array_keys.map(&:to_s).each do |k|
|
51
|
+
step3 << step2[k]
|
52
|
+
end
|
53
|
+
step3
|
54
|
+
else
|
55
|
+
step2
|
56
|
+
end
|
57
|
+
end
|
24
58
|
end
|
25
59
|
end
|
26
60
|
end
|
data/lib/coaster/version.rb
CHANGED
data/test/test_util.rb
CHANGED
@@ -11,19 +11,31 @@ module Coaster
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_flatten_hashify
|
14
|
-
|
14
|
+
a = {'a'=>[1], 'b'=>{'aa'=>1, 'bb'=>[2, 1]}}
|
15
|
+
res = Util.flatten_hashify(a)
|
15
16
|
assert_equal({"a"=>[1], "b.aa"=>1, "b.bb"=>[2, 1]}, res)
|
16
|
-
|
17
|
+
b = Util.roughen_hashify(res)
|
18
|
+
assert_equal(a, b)
|
19
|
+
res = Util.flatten_hashify(a, array_start: 1)
|
17
20
|
assert_equal({"a.1"=>1, "b.aa"=>1, "b.bb.1"=>2, "b.bb.2"=>1}, res)
|
21
|
+
b = Util.roughen_hashify(res, array_start: 1)
|
22
|
+
assert_equal(a, b)
|
23
|
+
res = Util.flatten_hashify(a, array_start: 0)
|
24
|
+
assert_equal({"a.0"=>1, "b.aa"=>1, "b.bb.0"=>2, "b.bb.1"=>1}, res)
|
25
|
+
b = Util.roughen_hashify(res)
|
26
|
+
assert_equal(a, b)
|
18
27
|
res = Util.flatten_hashify([{a: 1}, 22, [33, 44], {b: {c: [33, {d: 4}]}}])
|
19
28
|
assert_equal({""=>[{:a=>1}, 22, [33, 44], {:b=>{:c=>[33, {:d=>4}]}}]}, res) # no meaning result
|
20
|
-
res = Util.flatten_hashify([{a: 1}, 22, [33, 44], {b: {c: [33, {d: 4}]}}],
|
29
|
+
res = Util.flatten_hashify([{a: 1}, 22, [33, 44], {b: {c: [33, {d: 4}]}}], array_start: 1)
|
21
30
|
assert_equal({"1.a"=>1, "2"=>22, "3.1"=>33, "3.2"=>44, "4.b.c.1"=>33, "4.b.c.2.d"=>4}, res)
|
22
31
|
end
|
23
32
|
|
24
33
|
def test_flatten_hashify_delimiter
|
25
|
-
|
34
|
+
a = [{'a'=>1}, 22, [33, 44], {'b'=>{'c'=>[33, {'d'=>4}]}}]
|
35
|
+
res = Util.flatten_hashify(a, array_start: 1, delimiter: '/')
|
26
36
|
assert_equal({"1/a"=>1, "2"=>22, "3/1"=>33, "3/2"=>44, "4/b/c/1"=>33, "4/b/c/2/d"=>4}, res)
|
37
|
+
b = Util.roughen_hashify(res, array_start: 1, delimiter: '/')
|
38
|
+
assert_equal(a, b)
|
27
39
|
end
|
28
40
|
end
|
29
41
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- buzz jung
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|