nice_hash 1.14.0 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c2618d70584a37e351a02db7c4771aa4feff1264ded1b592d85a392014e7104
4
- data.tar.gz: 3ce0ddf1b7dae7709aebb8267ec46d251704d7976184251ce795dbee0abcdc22
3
+ metadata.gz: 5f7ac29e16ee8ddcaed4f42d365f58c322a0345781ba9579be3b3cb57b067d2e
4
+ data.tar.gz: b1c38c87b0699cdbc167d8e6acc490475bdd085e5fae02c8b8f716c7e843ac59
5
5
  SHA512:
6
- metadata.gz: eebb8367920fb12254cf9b73deb46fd0391816a34727039871e8f89f6d70434dee02fc658b496e32169c00ae04a9d71853a2ca78d61d7d931444da524e188b74
7
- data.tar.gz: db2d81ad6b7b94ec58aff98ccfb471cd09d9c7c036cdaee4fe75a53ee37649f11b5a85fb2a81fae21398482c975c400b712f8dba934937590b34ff8c286d4427
6
+ metadata.gz: '0608b70a2dcc0964aa80399d1b03ed40568ad67936ba0260c1bda08a8c6f4d0d90680e1141df051edc5bb60da18353ff5d64b68e285f009e1234e4683aff7409'
7
+ data.tar.gz: f6b2ce5f4108a92f550b6caad39a0d6e37a3e0c8354ebe6e8464a69db8da1e6290d9d7170ccfcbc0fe465fc000e0c26b30ee3358a36866dcc073138c2951d7e4
data/.yardopts CHANGED
@@ -2,4 +2,9 @@
2
2
  --title 'nice_hash - NiceHash creates hashes following certain patterns so your testing will be much easier. You can easily generates all the hashes you want following the criteria you specify.'
3
3
  --charset utf-8
4
4
  --markup markdown
5
- 'lib/**/*.rb' - '*.md' - 'LICENSE'
5
+ -
6
+ lib/**/*.rb
7
+ lib/nice_hash.rb
8
+ lib/nice/hash/add_to_ruby.rb
9
+ *.md
10
+ LICENSE
data/README.md CHANGED
@@ -175,6 +175,8 @@ new_hash = my_hash.generate
175
175
  puts new_hash.get_values(:address) #> {:address=>"21 Doom Av"}
176
176
  puts new_hash.get_values(:address, :zip) #> {:zip=>{:default=>"00000", :correct=>"42782"}, :address=>"21 Doom Av"}
177
177
  puts new_hash.get_values(:drawId) #> {:drawId=>["84914", "21158"]}
178
+ #using nested keys
179
+ puts new_hash.get_values(:'draws.drawId') #> {:'draws.drawId'=>["84914", "21158"]}
178
180
  ```
179
181
 
180
182
  In case of an array of hashes, you will be able also to access the different keys, for example:
@@ -276,6 +278,29 @@ On this example new_hash will contain:
276
278
  }
277
279
  ```
278
280
 
281
+ Also you can filter the hash you want and return only the speficied keys by using the `nice_filter` method
282
+
283
+ ```ruby
284
+ my_hash = { user: {
285
+ address: {
286
+ city: 'Madrid',
287
+ country: 'Spain'
288
+ },
289
+ name: 'Peter',
290
+ age: 33,
291
+ customers: [{name: 'Peter', currency: 'Euro'}, {name:'John', currency: 'Euro'}]
292
+ },
293
+ customer: true
294
+ }
295
+ pp my_hash.nice_filter([:'user.address.city', :'customer', :'user.customers.name'])
296
+ #> {:user=>
297
+ #> {:address=>{:city=>"Madrid"},
298
+ #> :customers=>[{:name=>"Peter"}, {:name=>"John"}]
299
+ #> },
300
+ #> :customer=>true
301
+ #> }
302
+ ```
303
+
279
304
  ### How to generate the hash with the criteria we want
280
305
 
281
306
  You can use the 'generate' method and everytime will be generated a different hash with different values.
@@ -98,6 +98,16 @@ class Array
98
98
  json_string = "[#{join(",")}]"
99
99
  json_string.json(*keys)
100
100
  end
101
+
102
+
103
+ ###########################################################################
104
+ # Filter the array of hashes and returns only the specified keys
105
+ # More info: NiceHash.nice_filter
106
+ ###########################################################################
107
+ def nice_filter(keys)
108
+ NiceHash.nice_filter(self, keys)
109
+ end
110
+
101
111
  end
102
112
 
103
113
  require "date"
@@ -263,6 +273,14 @@ class Hash
263
273
  !!keys.detect{ |key| key =~ search }
264
274
  end
265
275
 
276
+ ###########################################################################
277
+ # Filter the hash and returns only the specified keys
278
+ # More info: NiceHash.nice_filter
279
+ ###########################################################################
280
+ def nice_filter(keys)
281
+ NiceHash.nice_filter(self, keys)
282
+ end
283
+
266
284
  alias gen generate
267
285
  alias val validate
268
286
  alias patterns pattern_fields
@@ -1,4 +1,6 @@
1
1
  SP_ADD_TO_RUBY = true if !defined?(SP_ADD_TO_RUBY)
2
+ #todo: add SP_USE_NESTED_KEYS = true
3
+
2
4
  require_relative "nice/hash/add_to_ruby" if SP_ADD_TO_RUBY
3
5
 
4
6
  require "string_pattern"
@@ -772,19 +774,26 @@ class NiceHash
772
774
  # {"idt"=>3145,"name"=>"Special ticket"}
773
775
  # ]
774
776
  # }
775
- # keys: one key (string) or an array of keys
777
+ # keys: one key (string) or an array of keys. key can be a nested key
776
778
  # output:
777
779
  # a Hash of Arrays with all values found.
778
780
  # Example of output with example.get_values("id","name")
779
781
  # {"id"=>[334],"name"=>["Peter North"]}
780
782
  # Example of output with example.get_values("idt")
781
783
  # {"idt"=>[345,3123,3145]}
784
+ # Example of output with example.get_values(:'tickets.idt')
785
+ # {:"tickets.idt"=>[345,3123,3145]}
782
786
  #
783
787
  ####################################################
784
788
  def NiceHash.get_values(hashv, keys)
785
789
  if keys.kind_of?(String) or keys.kind_of?(Symbol)
786
790
  keys = [keys]
787
791
  end
792
+ if (keys.grep(/\./)).empty?
793
+ nested = false
794
+ else
795
+ nested = true
796
+ end
788
797
  result = Hash.new()
789
798
  number_of_results = Hash.new()
790
799
  keys.each { |key|
@@ -823,6 +832,7 @@ class NiceHash
823
832
  #if keys.include?(key) then
824
833
  #added to be able to access the keys with symbols to strings and opposite
825
834
  if keys.include?(key) or keys.include?(key.to_s) or keys.include?(key.to_sym)
835
+ #todo: check on next ruby versions since it will be not necessary to do it
826
836
  #added to be able to access the keys with symbols to strings and opposite
827
837
  key = key.to_s() if keys.include?(key.to_s)
828
838
  key = key.to_sym() if keys.include?(key.to_sym)
@@ -847,7 +857,19 @@ class NiceHash
847
857
  number_of_results[key] += 1
848
858
  end
849
859
  if value.kind_of?(Array) or value.kind_of?(Hash)
850
- n_result = get_values(value, keys)
860
+ if nested
861
+ keys_nested = []
862
+ keys.grep(/^#{key}\./).each do |k|
863
+ keys_nested << k.to_s.gsub(/^#{key}\./,'').to_sym
864
+ end
865
+ n_result_tmp = get_values(value, keys_nested)
866
+ n_result = {}
867
+ n_result_tmp.each do |k,v|
868
+ n_result["#{key}.#{k}".to_sym] = v
869
+ end
870
+ else
871
+ n_result = get_values(value, keys)
872
+ end
851
873
  if n_result != :error
852
874
  n_result.each { |n_key, n_value|
853
875
  if result.has_key?(n_key)
@@ -1090,4 +1112,55 @@ class NiceHash
1090
1112
  end
1091
1113
  return hash
1092
1114
  end
1115
+
1116
+ ##################################################
1117
+ # Filter the hash supplied and returns only the specified keys
1118
+ #
1119
+ # @param hash [Hash] The hash we want to filter
1120
+ # @param keys [Array] [Symbol] Array of symbols or symbol. Nested keys can be used: 'uno.dos.tres'
1121
+ #
1122
+ # @return [Hash]
1123
+ #
1124
+ # @example
1125
+ # my_hash = { user: {
1126
+ # address: {
1127
+ # city: 'Madrid',
1128
+ # country: 'Spain'
1129
+ # },
1130
+ # name: 'Peter',
1131
+ # age: 33,
1132
+ # customers: [{name: 'Peter', currency: 'Euro'}, {name:'John', currency: 'Euro'}]
1133
+ # },
1134
+ # customer: true
1135
+ # }
1136
+ # NiceHash.nice_filter(my_hash, [:'user.address.city', :'customer', :'user.customers.name'])
1137
+ # #> {:user => {:address => {:city => "Madrid"}, :customers => [{:name => "Peter"}, {:name => "John"}]}, :customer => true}
1138
+ ##################################################
1139
+ def self.nice_filter(hash, keys)
1140
+ result = {}
1141
+ keys = [keys] unless keys.is_a?(Array)
1142
+ keys.each do |k|
1143
+ kn = k.to_s.split('.')
1144
+ if hash.is_a?(Hash) and hash.key?(k)
1145
+ if hash[k].is_a?(Hash)
1146
+ result[k] = {} unless result.key?(k)
1147
+ else
1148
+ result[k] = hash[k]
1149
+ end
1150
+ elsif hash.is_a?(Hash) and hash.key?(kn.first.to_sym)
1151
+ keys_nested = []
1152
+ keys.grep(/^#{kn.first}\./).each do |k2|
1153
+ keys_nested << k2.to_s.gsub(/^#{kn.first}\./,'').to_sym
1154
+ end
1155
+ result[kn.first.to_sym] = nice_filter(hash[kn.first.to_sym], keys_nested)
1156
+ elsif hash.is_a?(Array)
1157
+ result = []
1158
+ hash.each do |a|
1159
+ res = nice_filter(a, keys)
1160
+ result << res unless res.empty?
1161
+ end
1162
+ end
1163
+ end
1164
+ return result
1165
+ end
1093
1166
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nice_hash
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.14.0
4
+ version: 1.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mario Ruiz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-30 00:00:00.000000000 Z
11
+ date: 2019-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: string_pattern