aduki 0.2.4 → 0.2.6

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
2
  SHA1:
3
- metadata.gz: d05eacb8c1fcf4375cf8ccdd1214f2327f36956c
4
- data.tar.gz: 234193b89c439e6300a85c6b50f23f1c8d57a0c2
3
+ metadata.gz: b85c60d97a71915e789b12de6530f1bbabb45eb7
4
+ data.tar.gz: 77743c74d0d3fc6182941742c22b98ea06a6d906
5
5
  SHA512:
6
- metadata.gz: 61ebf8352dbf342a2fcd4b1032d9508813ea502016788ae931040e9fd36b34565df12db112d729ea04265c30979c8dd12a9ccbfa0c898dce6e1a8459bd9c5cfa
7
- data.tar.gz: 74692ea9100157125497e39a85c5e00b093c2f927d5139a11aa05b9cb21ae5521c998577038e560587342a70dc3efff478c96c7e43ab2508b05d8612a9298c2d
6
+ metadata.gz: 55e9eff182433b8a42591f97ef97f108ddef3f824a5d7b969b26cd2db7ee83288e833aa35b0acc23c9473d841883125c8cb01f6d2b17eae49077d58dca0aacbc
7
+ data.tar.gz: f7a1bab6b2cae7502d5e649fce9810d4f8ccff24d8e5cf77c0d9bfebf4c245a209b13b6cfd21a64d6555ba39ca14fb9132ac0a8194e53eb6ff324418cf4e3a3a
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
16
16
  gem.homepage = "https://github.com/conanite/aduki"
17
17
 
18
18
 
19
- gem.add_development_dependency 'rspec', '~> 2.9'
19
+ gem.add_development_dependency 'rspec', '~> 3.1'
20
20
  gem.add_development_dependency 'rspec_numbering_formatter'
21
21
 
22
22
  gem.files = `git ls-files`.split($/)
@@ -5,6 +5,11 @@ require "aduki/recursive_hash"
5
5
  require "aduki/attr_finder"
6
6
 
7
7
  module Aduki
8
+ def self.install_monkey_patches
9
+ require 'core_ext/array'
10
+ require 'core_ext/hash'
11
+ end
12
+
8
13
  def self.to_aduki obj, collector={ }, key="", join=""
9
14
  case obj
10
15
  when Hash
@@ -40,7 +45,7 @@ module Aduki
40
45
  return value.map { |v| to_value klass, setter, v} if value.is_a? Array
41
46
 
42
47
  type = klass.aduki_type_for_attribute_name setter
43
- if type && (value.class <= type)
48
+ if type && type.is_a?(Class) && (value.class <= type)
44
49
  value
45
50
  elsif type.is_a? Hash
46
51
  to_typed_hash type.values.first, value
@@ -82,7 +87,7 @@ module Aduki
82
87
  setters[first] ||= { }
83
88
  setters[first][rest] = value
84
89
  else
85
- setters[setter] = value
90
+ setters[setter.to_s] = value
86
91
  end
87
92
  end
88
93
  setters
@@ -182,10 +187,11 @@ module Aduki
182
187
  module Initializer
183
188
  def initialize attrs={ }
184
189
  self.class.get_aduki_initializers.each { |initializer| send initializer }
185
- Aduki.apply_attributes self, attrs
190
+ aduki_apply_attributes attrs
186
191
  aduki_after_initialize
187
192
  end
188
193
 
194
+ def aduki_apply_attributes attrs ; Aduki.apply_attributes self, attrs ; end
189
195
  def aduki_after_initialize ; end
190
196
 
191
197
  def self.included(base)
@@ -1,3 +1,3 @@
1
1
  module Aduki
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.6"
3
3
  end
@@ -0,0 +1,32 @@
1
+ class Array
2
+ def recursively_delete_keys! *keys
3
+ self.each { |v| v.recursively_delete_keys!(*keys) if v.is_a?(Hash) || v.is_a?(Array) } ; self
4
+ end
5
+
6
+ def recursively_replace_keys! &block
7
+ self.each { |v| v.recursively_replace_keys!(&block) if v.is_a?(Hash) || v.is_a?(Array) } ; self
8
+ end
9
+
10
+ def recursively_replace_values &block
11
+ result = []
12
+ each_with_index { |v, i|
13
+ result << ((v.is_a?(Hash) || v.is_a?(Array)) ? v.recursively_replace_values(&block) : yield(i, v))
14
+ }
15
+ result
16
+ end
17
+
18
+ def recursively_remove_by_value! &block
19
+ self.delete_if { |v|
20
+ if v.is_a? Hash
21
+ v.recursively_remove_by_value! &block
22
+ v.empty?
23
+ elsif v.is_a? Array
24
+ v.recursively_remove_by_value! &block
25
+ v.empty?
26
+ else
27
+ yield v
28
+ end
29
+ }
30
+ end
31
+
32
+ end
@@ -0,0 +1,43 @@
1
+ class Hash
2
+ def recursively_delete_keys! *keys_to_delete
3
+ keys_to_delete.each { |k| delete k }
4
+ values.each { |v| v.recursively_delete_keys!(*keys_to_delete) if v.is_a?(Hash) || v.is_a?(Array) }
5
+ self
6
+ end
7
+
8
+ def recursively_replace_keys! &block
9
+ keys.each do |k|
10
+ v = self[k]
11
+ mk = yield k
12
+ if k != mk
13
+ self[mk] = delete k
14
+ end
15
+ v.recursively_replace_keys!(&block) if v.is_a?(Hash) || v.is_a?(Array)
16
+ end
17
+ self
18
+ end
19
+
20
+ def recursively_stringify_keys!
21
+ recursively_replace_keys! { |k| k.to_s }
22
+ end
23
+
24
+ def recursively_remove_by_value! &block
25
+ self.delete_if { |k, v|
26
+ if v.is_a? Hash
27
+ v.recursively_remove_by_value! &block
28
+ v.empty?
29
+ elsif v.is_a? Array
30
+ v.recursively_remove_by_value! &block
31
+ v.empty?
32
+ else
33
+ yield v
34
+ end
35
+ }
36
+ end
37
+
38
+ def recursively_replace_values &block
39
+ each_with_object({ }) { |(k, v), result|
40
+ result[k] = (v.is_a?(Hash) || v.is_a?(Array)) ? v.recursively_replace_values!(&block) : yield(k, v)
41
+ }
42
+ end
43
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hash do
4
+ before { Aduki.install_monkey_patches }
5
+
6
+ describe 'recursively_replace_keys!' do
7
+ it "destructively replaces keys with upcase symbol equivalents" do
8
+ h0 = { "x/y/z" => [1,2,3], "p-q-r" => 123 }
9
+ a = [h0, h0, 10, 11, 12]
10
+ hsh = {
11
+ "Foo_BAR" => 1,
12
+ HEYHO: 2,
13
+ "Tweedlé Dum" => 3,
14
+ "4" => 4,
15
+ " 20 something?" => true,
16
+ "** more fun 2 !! **" => true,
17
+ "ça và" => true,
18
+ "((a b c))" => true,
19
+ :nana => {
20
+ "a b c" => 1,
21
+ "surprise! :)" => a
22
+ }
23
+ }
24
+ expected = {
25
+ :FOO_BAR => 1,
26
+ :HEYHO => 2,
27
+ :"TWEEDLé DUM" => 3,
28
+ :"4" => 4,
29
+ :"20 SOMETHING?" => true,
30
+ :"** MORE FUN 2 !! **" => true,
31
+ :"çA Và" => true,
32
+ :"((A B C))" => true,
33
+ :NANA => {
34
+ :"A B C" => 1,
35
+ :"SURPRISE! :)" =>
36
+ [
37
+ {
38
+ :"X/Y/Z" => [1,2,3],
39
+ :"P-Q-R" => 123
40
+ },
41
+ {
42
+ :"X/Y/Z" => [1,2,3],
43
+ :"P-Q-R" => 123
44
+ },
45
+ 10,
46
+ 11,
47
+ 12
48
+ ]
49
+ }
50
+ }
51
+
52
+ hsh.recursively_replace_keys! { |k| k.to_s.strip.upcase.to_sym }
53
+ expect(hsh).to eq expected
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hash do
4
+ before { Aduki.install_monkey_patches }
5
+
6
+ describe 'recursively_remove_by_value!' do
7
+ class Unwanted < Struct.new(:name)
8
+ def to_s; name; end
9
+ end
10
+
11
+ let(:h) {
12
+ {
13
+ :foo => "bar",
14
+ willy: Unwanted.new("wonka"),
15
+ "titi" => [1,2,3, String, "yellow", Unwanted.new(999), 3.1415, {
16
+ a: :b,
17
+ c: :d,
18
+ 2 => Unwanted.new(Hash),
19
+ 3 => Unwanted.new(Array),
20
+ 4 => Numeric,
21
+ 6 => {
22
+ 7 => "me",
23
+ 8 => "you",
24
+ :foo => Unwanted.new("enough!")}} ],
25
+ thats: :it
26
+ }
27
+ }
28
+
29
+ it "removes unwanted items" do
30
+ h.recursively_remove_by_value! do |v|
31
+ v.is_a? Unwanted
32
+ end
33
+
34
+ expected = {
35
+ foo: "bar",
36
+ thats: :it,
37
+ "titi" => [1, 2, 3, String, "yellow", 3.1415, {:a=>:b, :c=>:d, 4=>Numeric, 6=>{7=>"me", 8=>"you"}}]
38
+ }
39
+
40
+ expect(h).to eq(expected)
41
+ end
42
+
43
+ it "removes more unwanted items" do
44
+ h.recursively_remove_by_value! do |v|
45
+ k = v.class
46
+ true unless k <= String || k <= Symbol || k <= Hash || k <= Array || k <= Numeric
47
+ end
48
+
49
+ expected = {
50
+ foo: "bar",
51
+ thats: :it,
52
+ "titi" => [1, 2, 3, "yellow", 3.1415, {:a=>:b, :c=>:d, 6=>{7=>"me", 8=>"you"}}]
53
+ }
54
+
55
+ expect(h).to eq(expected)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hash do
4
+ before { Aduki.install_monkey_patches }
5
+
6
+ describe 'recursively_delete_keys!' do
7
+ it "should delete the specified keys from itself and all nested hashes, even sub-nested in arrays" do
8
+ h = {
9
+ site_id: "foo",
10
+ "site_id" => :bar,
11
+ things: {
12
+ site_id: "toto",
13
+ "site_id" => :titi,
14
+ 2 => [ { a: 12, b: 53, site_id: 99 },
15
+ { a: 13, b: 54, site_id: 98 },
16
+ { a: 14, b: 55, site_id: 97 },
17
+ { a: 14, b: 56, site_id: 96 } ],
18
+ toto: :titi
19
+ },
20
+ others: [ { name: "Walter", site_id: 95 } ]
21
+ }
22
+
23
+ h.recursively_delete_keys! :site_id, "site_id"
24
+
25
+ h.should == {
26
+ things: {
27
+ 2 => [ { a: 12, b: 53 },
28
+ { a: 13, b: 54 },
29
+ { a: 14, b: 55 },
30
+ { a: 14, b: 56 } ],
31
+ toto: :titi
32
+ },
33
+ others: [ { name: "Walter" } ]
34
+ }
35
+ end
36
+ end
37
+
38
+ describe 'recursively_stringify_keys!' do
39
+ it "should change all keys to strings" do
40
+ h = {
41
+ foo: "bar",
42
+ 12 => 13,
43
+ Date.parse("2013-04-05") => "yes",
44
+ nil => "gotcha",
45
+ [:foo] => "arrrrr"
46
+ }
47
+
48
+ expected = {
49
+ "foo" => "bar",
50
+ "12" => 13,
51
+ "2013-04-05" => "yes",
52
+ "" => "gotcha",
53
+ "[:foo]" => "arrrrr"
54
+ }
55
+
56
+ h.recursively_stringify_keys!
57
+
58
+ expect(h).to eq expected
59
+ end
60
+ end
61
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aduki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Conan Dalton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-14 00:00:00.000000000 Z
11
+ date: 2018-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.9'
19
+ version: '3.1'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.9'
26
+ version: '3.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec_numbering_formatter
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,10 +56,15 @@ files:
56
56
  - lib/aduki/attr_finder.rb
57
57
  - lib/aduki/recursive_hash.rb
58
58
  - lib/aduki/version.rb
59
+ - lib/core_ext/array.rb
60
+ - lib/core_ext/hash.rb
59
61
  - spec/array_attribute_spec.rb
60
62
  - spec/attr_finder_spec.rb
61
63
  - spec/custom_builder_spec.rb
62
64
  - spec/finder_spec.rb
65
+ - spec/hash_recursively_replace_keys_spec.rb
66
+ - spec/hash_remove_by_value_spec.rb
67
+ - spec/hash_spec.rb
63
68
  - spec/initialize_with_object_spec.rb
64
69
  - spec/initializer_spec.rb
65
70
  - spec/merge_attributes_spec.rb
@@ -98,6 +103,9 @@ test_files:
98
103
  - spec/attr_finder_spec.rb
99
104
  - spec/custom_builder_spec.rb
100
105
  - spec/finder_spec.rb
106
+ - spec/hash_recursively_replace_keys_spec.rb
107
+ - spec/hash_remove_by_value_spec.rb
108
+ - spec/hash_spec.rb
101
109
  - spec/initialize_with_object_spec.rb
102
110
  - spec/initializer_spec.rb
103
111
  - spec/merge_attributes_spec.rb