hashie_mappy 0.1.1 → 0.3.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 +5 -5
- data/Gemfile.lock +34 -0
- data/README.md +0 -3
- data/hashie_mappy.gemspec +1 -0
- data/lib/hashie_mappy/version.rb +1 -1
- data/lib/hashie_mappy.rb +37 -4
- metadata +18 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 9ba4d0ece8c4ca9c48eab3d744413e822cee6418ee8bd10ae3ab809af2a97a32
|
|
4
|
+
data.tar.gz: 35dec5980d7e368d423a948eef8a81731707e9ab6c2f51c2c359dbb427a2034e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b8b444bacc366c41c24c27c1f5b8c14292e4b40d59049b5046f607ffd956325bc2ca10b438a345cbb2431a214f574ec5bead4f763e48feb783852e033ac76acc
|
|
7
|
+
data.tar.gz: eb9cc2cbecfa75ea77a7fe4bf0e6cd05e186bb545982f730866e4c14e82d79713121d850a1134ee0e2a1c795198ea8d1c9287d32f3775334c1744c2ef0c615c0
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
hashie_mappy (0.3.0)
|
|
5
|
+
|
|
6
|
+
GEM
|
|
7
|
+
remote: https://rubygems.org/
|
|
8
|
+
specs:
|
|
9
|
+
activesupport (5.2.0)
|
|
10
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
11
|
+
i18n (>= 0.7, < 2)
|
|
12
|
+
minitest (~> 5.1)
|
|
13
|
+
tzinfo (~> 1.1)
|
|
14
|
+
concurrent-ruby (1.1.4)
|
|
15
|
+
i18n (1.5.3)
|
|
16
|
+
concurrent-ruby (~> 1.0)
|
|
17
|
+
minitest (5.11.3)
|
|
18
|
+
rake (10.5.0)
|
|
19
|
+
thread_safe (0.3.6)
|
|
20
|
+
tzinfo (1.2.5)
|
|
21
|
+
thread_safe (~> 0.1)
|
|
22
|
+
|
|
23
|
+
PLATFORMS
|
|
24
|
+
ruby
|
|
25
|
+
|
|
26
|
+
DEPENDENCIES
|
|
27
|
+
activesupport (= 5.2.0)
|
|
28
|
+
bundler (~> 1.16)
|
|
29
|
+
hashie_mappy!
|
|
30
|
+
minitest (~> 5.0)
|
|
31
|
+
rake (~> 10.0)
|
|
32
|
+
|
|
33
|
+
BUNDLED WITH
|
|
34
|
+
1.16.6
|
data/README.md
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
# HashieMappy
|
|
2
2
|
|
|
3
|
-
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/hashie_mappy`. To experiment with that code, run `bin/console` for an interactive prompt.
|
|
4
|
-
|
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
|
6
3
|
|
|
7
4
|
## Installation
|
|
8
5
|
|
data/hashie_mappy.gemspec
CHANGED
data/lib/hashie_mappy/version.rb
CHANGED
data/lib/hashie_mappy.rb
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
require "hashie_mappy/version"
|
|
2
|
+
require "active_support/core_ext/hash"
|
|
2
3
|
|
|
3
4
|
module HashieMappy
|
|
4
5
|
attr_accessor :target_map, :output, :after
|
|
5
6
|
|
|
7
|
+
ALLOWED_TYPES = [Fixnum, String, Float, Bignum]
|
|
8
|
+
|
|
6
9
|
def self.extended(base)
|
|
7
10
|
base.class_eval do
|
|
8
11
|
self.target_map = nil
|
|
@@ -18,16 +21,33 @@ module HashieMappy
|
|
|
18
21
|
end
|
|
19
22
|
|
|
20
23
|
def normalize(input_hash)
|
|
21
|
-
|
|
24
|
+
input_hash = convert_to_hash(input_hash) unless input_hash.is_a?(Hash)
|
|
25
|
+
output = normalize_hash(self.target_map, input_hash) if input_hash.keys.any?
|
|
22
26
|
output = after.call(input_hash, output) if after
|
|
23
|
-
output
|
|
27
|
+
output.with_indifferent_access
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def convert_to_hash(input)
|
|
31
|
+
hash = input.instance_variables.each_with_object({}) do |var, obj|
|
|
32
|
+
if ALLOWED_TYPES.include?(input.instance_variable_get(var).class)
|
|
33
|
+
obj[var.to_s.delete('@')] = input.instance_variable_get(var)
|
|
34
|
+
else
|
|
35
|
+
obj[var.to_s.delete('@')] = convert_to_hash(input.instance_variable_get(var))
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
hash
|
|
24
39
|
end
|
|
25
40
|
|
|
26
41
|
def normalize_hash(target_map, input, buried_keys = [], output = {})
|
|
27
42
|
target_map.keys.each do |key|
|
|
28
43
|
if key.include?('*')
|
|
29
44
|
keys = key.split('*')
|
|
30
|
-
handle_array(input[keys[1]], target_map[key], keys[0], output)
|
|
45
|
+
handle_array(input[keys[1]], target_map[key], keys[0], output) if input.is_a?(Hash)
|
|
46
|
+
begin
|
|
47
|
+
handle_array(input.send(keys[1]), target_map[key], keys[0], output)
|
|
48
|
+
rescue NoMethodError
|
|
49
|
+
nil
|
|
50
|
+
end
|
|
31
51
|
else
|
|
32
52
|
buried_keys.push(key)
|
|
33
53
|
if target_map[key].is_a?(Hash)
|
|
@@ -43,26 +63,39 @@ module HashieMappy
|
|
|
43
63
|
|
|
44
64
|
def handle_array(input, target_map, key, output)
|
|
45
65
|
output[key] = input.map {|i| normalize_hash(target_map, i)}
|
|
66
|
+
rescue NoMethodError
|
|
67
|
+
nil
|
|
46
68
|
end
|
|
47
69
|
|
|
48
70
|
def find_input_value(obj, key)
|
|
49
71
|
return recurse_dig(key.split('#'), obj) if key.split('#').count > 1
|
|
50
72
|
if obj.respond_to?(:key?) && obj.key?(key)
|
|
51
73
|
obj[key]
|
|
74
|
+
elsif obj.respond_to?(:key?) && obj.key?(key.to_sym)
|
|
75
|
+
obj[key.to_sym]
|
|
52
76
|
elsif obj.respond_to?(:each)
|
|
53
77
|
r = nil
|
|
54
78
|
obj.find{ |*a| r = find_input_value(a.last, key) }
|
|
55
79
|
r
|
|
80
|
+
else
|
|
81
|
+
begin
|
|
82
|
+
obj.send(key)
|
|
83
|
+
rescue NoMethodError
|
|
84
|
+
nil
|
|
85
|
+
end
|
|
56
86
|
end
|
|
57
87
|
end
|
|
58
88
|
|
|
59
89
|
def recurse_dig(keys, obj)
|
|
60
90
|
if keys.count > 1
|
|
61
91
|
key = keys.shift
|
|
62
|
-
recurse_dig(keys, obj.dig(key))
|
|
92
|
+
return recurse_dig(keys, obj.dig(key)) if obj.is_a?(Hash)
|
|
93
|
+
recurse_dig(keys, obj.send(key))
|
|
63
94
|
else
|
|
64
95
|
return obj.dig(keys.shift)
|
|
65
96
|
end
|
|
97
|
+
rescue NoMethodError
|
|
98
|
+
nil
|
|
66
99
|
end
|
|
67
100
|
end
|
|
68
101
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hashie_mappy
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Nik Weinmeister
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2019-02-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -52,6 +52,20 @@ dependencies:
|
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '5.0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: activesupport
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - '='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 5.2.0
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - '='
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 5.2.0
|
|
55
69
|
description: Easy way to map hashes
|
|
56
70
|
email:
|
|
57
71
|
- nik.weinmeister@excella.com
|
|
@@ -63,6 +77,7 @@ files:
|
|
|
63
77
|
- ".travis.yml"
|
|
64
78
|
- CODE_OF_CONDUCT.md
|
|
65
79
|
- Gemfile
|
|
80
|
+
- Gemfile.lock
|
|
66
81
|
- LICENSE.txt
|
|
67
82
|
- README.md
|
|
68
83
|
- Rakefile
|
|
@@ -91,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
91
106
|
version: '0'
|
|
92
107
|
requirements: []
|
|
93
108
|
rubyforge_project:
|
|
94
|
-
rubygems_version: 2.
|
|
109
|
+
rubygems_version: 2.7.8
|
|
95
110
|
signing_key:
|
|
96
111
|
specification_version: 4
|
|
97
112
|
summary: Easy way of mapping hashes
|