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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 5625f342352443e40d3e719abcf21d367f3f7893
4
- data.tar.gz: 1680ecca284dc1b43bb011024c20989fb0ad88ef
2
+ SHA256:
3
+ metadata.gz: 9ba4d0ece8c4ca9c48eab3d744413e822cee6418ee8bd10ae3ab809af2a97a32
4
+ data.tar.gz: 35dec5980d7e368d423a948eef8a81731707e9ab6c2f51c2c359dbb427a2034e
5
5
  SHA512:
6
- metadata.gz: ca3e97edf6852f3550552ef75b47f9c1a7519103746f74fddbdaeaa7995b2633e026a94a7d060dfd23be60bc00b791f69286f17fbb7490258d5c45d129869dc3
7
- data.tar.gz: 1391dcdfda479097fcc1533f2cf888050e497a48bc94d5fa85a600df7860ef0f07eac8734de3d22677ab6e8cbb5b057b7c6bec0092cfc4287b11a0da1ec9b61c
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
@@ -35,4 +35,5 @@ Gem::Specification.new do |spec|
35
35
  spec.add_development_dependency "bundler", "~> 1.16"
36
36
  spec.add_development_dependency "rake", "~> 10.0"
37
37
  spec.add_development_dependency "minitest", "~> 5.0"
38
+ spec.add_development_dependency "activesupport", "5.2.0"
38
39
  end
@@ -1,3 +1,3 @@
1
1
  module HashieMappy
2
- VERSION = "0.1.1"
2
+ VERSION = "0.3.0"
3
3
  end
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
- output = normalize_hash(self.target_map, input_hash)
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.1.1
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: 2018-12-06 00:00:00.000000000 Z
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.5.2.3
109
+ rubygems_version: 2.7.8
95
110
  signing_key:
96
111
  specification_version: 4
97
112
  summary: Easy way of mapping hashes