nice_hash 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +21 -0
- data/lib/nice/hash/add_to_ruby.rb +91 -29
- data/lib/nice_hash.rb +128 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b547b217f676c7ddc188941e8ca40a075e96296719f2105b20dd6c3dda055195
|
4
|
+
data.tar.gz: dd9de32c94ecc5b6c2088f8f2a7816693b3030ddc3a4f545467c98944240eb19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d4fdfc2239e82ccb4549b6f2e793fe1a85347c849f2fea3dbe7c0ae7b1296c6abdaa2b6192a026f5b0a8dc1884e505edeca23c62b97f9d9bcaa7c2461426f49
|
7
|
+
data.tar.gz: 179e667f98084f40178e3308c991d61247b8a6538fe58a80b88c3f561a250b4dbbc94d6d80877cef52a046f8baebc17f8c93e696acb3b5334a053aaf8f161f9b
|
data/README.md
CHANGED
@@ -8,6 +8,8 @@ You can easily generates all the hashes you want following the criteria you spec
|
|
8
8
|
|
9
9
|
Many other features coming to Hash class like the methods 'bury' or select_key, access the keys like methods: my_hash.my_key.other_key. You will be able to generate thousands of different hashes just declaring one and test easily APIs based on JSON for example.
|
10
10
|
|
11
|
+
You can also parse and filter a json string very easily.
|
12
|
+
|
11
13
|
To generate the strings following a pattern take a look at the documentation for string_pattern gem: https://github.com/MarioRuiz/string_pattern
|
12
14
|
|
13
15
|
## Installation
|
@@ -103,6 +105,16 @@ In case you want one pattern to be generated with unique values, so never repeat
|
|
103
105
|
|
104
106
|
```
|
105
107
|
|
108
|
+
Also if you have a JSON string you want to parse it and get the values of certain keys you can use the json method we added to nice_hash:
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
my_json_string="{\"id\":344,\"customer\":{\"name\":\"Peter Smith\",\"phone\":334334333},\"tickets\":[{\"idt\":345,\"name\":\"myFavor1\"},{\"idt\":3123},{\"idt\":3145,\"name\":\"Special ticket\"}]}"
|
112
|
+
puts my_json_string.json(:idt)
|
113
|
+
#> [345, 3123, 3145]
|
114
|
+
|
115
|
+
puts my_json_string.json(:idt, :name)
|
116
|
+
#> {:name=>["Peter Smith", ["myFavor1", "Special ticket"]], :idt=>[345, 3123, 3145]}
|
117
|
+
```
|
106
118
|
|
107
119
|
### How to access the different keys
|
108
120
|
|
@@ -137,6 +149,15 @@ By using the string_pattern gem you can generate single strings following the sp
|
|
137
149
|
puts my_hash._zip._correct.gen # gen is an alias for generate method #>84584
|
138
150
|
```
|
139
151
|
|
152
|
+
If you want to search for all the values of one or more keys use get_values method:
|
153
|
+
|
154
|
+
```ruby
|
155
|
+
new_hash = my_hash.generate
|
156
|
+
puts new_hash.get_values(:address) #> {:address=>"21 Doom Av"}
|
157
|
+
puts new_hash.get_values(:address, :zip) #> {:zip=>{:default=>"00000", :correct=>"42782"}, :address=>"21 Doom Av"}
|
158
|
+
puts new_hash.get_values(:drawId) #> {:drawId=>["84914", "21158"]}
|
159
|
+
```
|
160
|
+
|
140
161
|
### Filtering / Selecting an specific key on the hash and subhashes
|
141
162
|
|
142
163
|
In case you supply different possibilities to be used like for example on fields: owner, zip, city and mobilePhone, and you one to use a concrete one, use the method select_key
|
@@ -1,5 +1,49 @@
|
|
1
|
-
class
|
1
|
+
class String
|
2
|
+
###########################################################################
|
3
|
+
# In case the string is a json it will return the keys specified. the keys need to be provided as symbols
|
4
|
+
# input:
|
5
|
+
# keys:
|
6
|
+
# 1 value with key or an array of keys
|
7
|
+
# In case the key supplied doesn't exist in the hash then it will be returned nil for that one
|
8
|
+
# output:
|
9
|
+
# if keys given: a hash of (keys, values) or the value, if the key is found more than once in the json string, then it will be return a hash op arrays
|
10
|
+
# if no keys given, an empty hash
|
11
|
+
###########################################################################
|
12
|
+
def json(*keys)
|
13
|
+
require 'json'
|
14
|
+
feed_symbols = JSON.parse(self, symbolize_names: true)
|
15
|
+
result = {}
|
16
|
+
if !keys.empty?
|
17
|
+
result_tmp = if keys[0].is_a?(Symbol)
|
18
|
+
NiceHash.get_values(feed_symbols, keys)
|
19
|
+
else
|
20
|
+
{}
|
21
|
+
end
|
22
|
+
|
23
|
+
if result_tmp.size == 1
|
24
|
+
result = if result_tmp.values.is_a?(Array) && (result_tmp.values.size == 1)
|
25
|
+
result_tmp.values[0]
|
26
|
+
else
|
27
|
+
result_tmp.values
|
28
|
+
end
|
29
|
+
else
|
30
|
+
result_tmp.each do |key, value|
|
31
|
+
result[key] = if (value.is_a?(Array) || value.is_a?(Hash)) && (value.size == 1)
|
32
|
+
value[0]
|
33
|
+
else
|
34
|
+
value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
else
|
40
|
+
result = feed_symbols
|
41
|
+
end
|
42
|
+
result
|
43
|
+
end
|
44
|
+
end
|
2
45
|
|
46
|
+
class Array
|
3
47
|
###########################################################################
|
4
48
|
# Stores a value on the location indicated
|
5
49
|
# input:
|
@@ -10,14 +54,28 @@ class Array
|
|
10
54
|
# my_array.bury([2, 1, :original],"the value to set") #array of array of hash
|
11
55
|
###########################################################################
|
12
56
|
def bury(where, value)
|
13
|
-
me=self
|
14
|
-
where[0..-2].each
|
15
|
-
me=me[key]
|
16
|
-
|
17
|
-
me[where[-1]]=value
|
57
|
+
me = self
|
58
|
+
where[0..-2].each do |key|
|
59
|
+
me = me[key]
|
60
|
+
end
|
61
|
+
me[where[-1]] = value
|
18
62
|
end
|
19
|
-
end
|
20
63
|
|
64
|
+
###########################################################################
|
65
|
+
# In case of an array of json strings will return the keys specified. The keys need to be provided as symbols
|
66
|
+
# input:
|
67
|
+
# keys:
|
68
|
+
# 1 value with key or an array of keys
|
69
|
+
# In case the key supplied doesn't exist in the hash then it will be return nil for that one
|
70
|
+
# output:
|
71
|
+
# if keys given: a hash of (keys, values) or the value, if the key is found more than once in the json string, then it will be return a hash of arrays
|
72
|
+
# if no keys given, an empty hash
|
73
|
+
###########################################################################
|
74
|
+
def json(*keys)
|
75
|
+
json_string = "[#{join(',')}]"
|
76
|
+
json_string.json(*keys)
|
77
|
+
end
|
78
|
+
end
|
21
79
|
|
22
80
|
class Hash
|
23
81
|
###########################################################################
|
@@ -33,13 +91,11 @@ class Hash
|
|
33
91
|
# my_hash.products[1].price.wrong="AAAAA"
|
34
92
|
###########################################################################
|
35
93
|
def method_missing(m, *arguments, &block)
|
36
|
-
if m[0]=='_'
|
37
|
-
|
38
|
-
end
|
39
|
-
if self.keys.include?(m)
|
94
|
+
m = m[1..-1].to_sym if m[0] == '_'
|
95
|
+
if key?(m)
|
40
96
|
self[m]
|
41
|
-
elsif m.to_s[-1]==
|
42
|
-
self[m.to_s.chop.to_sym]=arguments[0]
|
97
|
+
elsif m.to_s[-1] == '='
|
98
|
+
self[m.to_s.chop.to_sym] = arguments[0]
|
43
99
|
else
|
44
100
|
super
|
45
101
|
end
|
@@ -55,15 +111,15 @@ class Hash
|
|
55
111
|
# my_hash.bury([:original, 1, :doom],"the value to set") #hash of array of hash
|
56
112
|
###########################################################################
|
57
113
|
def bury(where, value)
|
58
|
-
me=self
|
59
|
-
where[0..-2].each
|
60
|
-
me=me[key]
|
61
|
-
|
62
|
-
key=where[-1]
|
63
|
-
key=[key] unless where[-1].
|
64
|
-
key.each
|
65
|
-
me[k]=value
|
66
|
-
|
114
|
+
me = self
|
115
|
+
where[0..-2].each do |key|
|
116
|
+
me = me[key]
|
117
|
+
end
|
118
|
+
key = where[-1]
|
119
|
+
key = [key] unless where[-1].is_a?(Array) # for the case same value for different keys, for example pwd1, pwd2, pwd3
|
120
|
+
key.each do |k|
|
121
|
+
me[k] = value
|
122
|
+
end
|
67
123
|
end
|
68
124
|
|
69
125
|
###########################################################################
|
@@ -82,7 +138,7 @@ class Hash
|
|
82
138
|
# More info: NiceHash.generate
|
83
139
|
# alias: gen
|
84
140
|
###########################################################################
|
85
|
-
def generate(select_hash_key=nil, expected_errors: [], **synonyms)
|
141
|
+
def generate(select_hash_key = nil, expected_errors: [], **synonyms)
|
86
142
|
NiceHash.generate(self, select_hash_key, expected_errors: expected_errors, **synonyms)
|
87
143
|
end
|
88
144
|
|
@@ -91,7 +147,7 @@ class Hash
|
|
91
147
|
# More info: NiceHash.validate
|
92
148
|
# alias: val
|
93
149
|
###########################################################################
|
94
|
-
def validate(select_hash_key=nil, values_hash_to_validate)
|
150
|
+
def validate(select_hash_key = nil, values_hash_to_validate)
|
95
151
|
NiceHash.validate([self, select_hash_key], values_hash_to_validate, only_patterns: false)
|
96
152
|
end
|
97
153
|
|
@@ -99,7 +155,7 @@ class Hash
|
|
99
155
|
# Validates a given values_hash_to_validate with string patterns
|
100
156
|
# More info: NiceHash.validate
|
101
157
|
###########################################################################
|
102
|
-
def validate_patterns(select_hash_key=nil, values_hash_to_validate)
|
158
|
+
def validate_patterns(select_hash_key = nil, values_hash_to_validate)
|
103
159
|
NiceHash.validate([self, select_hash_key], values_hash_to_validate, only_patterns: true)
|
104
160
|
end
|
105
161
|
|
@@ -119,9 +175,15 @@ class Hash
|
|
119
175
|
NiceHash.select_fields(self, *select_hash_key)
|
120
176
|
end
|
121
177
|
|
178
|
+
###########################################################################
|
179
|
+
# Get values of the keys supplied from the Hash structure.
|
180
|
+
# More info: NiceHash.get_values
|
181
|
+
###########################################################################
|
182
|
+
def get_values(*keys)
|
183
|
+
NiceHash.get_values(self, keys)
|
184
|
+
end
|
122
185
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
186
|
+
alias gen generate
|
187
|
+
alias val validate
|
188
|
+
alias patterns pattern_fields
|
127
189
|
end
|
data/lib/nice_hash.rb
CHANGED
@@ -579,4 +579,132 @@ class NiceHash
|
|
579
579
|
return array
|
580
580
|
end
|
581
581
|
|
582
|
+
|
583
|
+
##################################################
|
584
|
+
# Get values from the Hash structure (array of Hashes allowed)
|
585
|
+
# In case the key supplied doesn't exist in the hash then it will be return nil for that one
|
586
|
+
# input:
|
587
|
+
# hash: a simple hash or a hash containing arrays. Example:
|
588
|
+
# example={"id"=>344,
|
589
|
+
# "customer"=>{
|
590
|
+
# "name"=>"Peter Smith",
|
591
|
+
# "phone"=>334334333
|
592
|
+
# },
|
593
|
+
# "tickets"=>[
|
594
|
+
# {"idt"=>345,"name"=>"myFavor1"},
|
595
|
+
# {"idt"=>3123},
|
596
|
+
# {"idt"=>3145,"name"=>"Special ticket"}
|
597
|
+
# ]
|
598
|
+
# }
|
599
|
+
# keys: one key (string) or an array of keys
|
600
|
+
# output:
|
601
|
+
# a Hash of Arrays with all values found.
|
602
|
+
# Example of output with example.get_values("id","name")
|
603
|
+
# {"id"=>[334],"name"=>["Peter North"]}
|
604
|
+
# Example of output with example.get_values("idt")
|
605
|
+
# {"idt"=>[345,3123,3145]}
|
606
|
+
#
|
607
|
+
####################################################
|
608
|
+
def NiceHash.get_values(hash,keys)
|
609
|
+
if keys.kind_of?(String) or keys.kind_of?(Symbol) then
|
610
|
+
keys=[keys]
|
611
|
+
end
|
612
|
+
result=Hash.new()
|
613
|
+
number_of_results=Hash.new()
|
614
|
+
keys.each {|key|
|
615
|
+
number_of_results[key]=0
|
616
|
+
}
|
617
|
+
if hash.kind_of?(Array) then
|
618
|
+
hash.each {|tmp|
|
619
|
+
if tmp.kind_of?(Array) or tmp.kind_of?(Hash) then
|
620
|
+
n_result=get_values(tmp, keys)
|
621
|
+
if n_result!=:error then
|
622
|
+
n_result.each {|n_key, n_value|
|
623
|
+
if result.has_key?(n_key) then
|
624
|
+
if !result[n_key].kind_of?(Array) or
|
625
|
+
(result[n_key].kind_of?(Array) and number_of_results[n_key] < result[n_key].size) then
|
626
|
+
if result[n_key].kind_of?(Hash) or result[n_key].kind_of?(Array) then
|
627
|
+
res_tx=result[n_key].dup()
|
628
|
+
else
|
629
|
+
res_tx=result[n_key]
|
630
|
+
end
|
631
|
+
result[n_key]=Array.new()
|
632
|
+
result[n_key].push(res_tx)
|
633
|
+
result[n_key].push(n_value)
|
634
|
+
else
|
635
|
+
result[n_key].push(n_value)
|
636
|
+
end
|
637
|
+
else
|
638
|
+
result[n_key]=n_value
|
639
|
+
end
|
640
|
+
number_of_results[n_key]+=1
|
641
|
+
}
|
642
|
+
end
|
643
|
+
end
|
644
|
+
}
|
645
|
+
elsif hash.kind_of?(Hash) then
|
646
|
+
hash.each {|key, value|
|
647
|
+
#if keys.include?(key) then
|
648
|
+
#added to be able to access the keys with symbols to strings and opposite
|
649
|
+
if keys.include?(key) or keys.include?(key.to_s) or keys.include?(key.to_sym) then
|
650
|
+
#added to be able to access the keys with symbols to strings and opposite
|
651
|
+
key=key.to_s() if keys.include?(key.to_s)
|
652
|
+
key=key.to_sym() if keys.include?(key.to_sym)
|
653
|
+
|
654
|
+
if result.has_key?(key) then
|
655
|
+
if !result[key].kind_of?(Array) or
|
656
|
+
(result[key].kind_of?(Array) and number_of_results[key] < result[key].size) then
|
657
|
+
if result[key].kind_of?(Hash) or result[key].kind_of?(Array) then
|
658
|
+
res_tx=result[key].dup()
|
659
|
+
else
|
660
|
+
res_tx=result[key]
|
661
|
+
end
|
662
|
+
result[key]=Array.new()
|
663
|
+
result[key].push(res_tx)
|
664
|
+
result[key].push(value)
|
665
|
+
else
|
666
|
+
result[key].push(value)
|
667
|
+
end
|
668
|
+
else
|
669
|
+
result[key]=value
|
670
|
+
end
|
671
|
+
number_of_results[key]+=1
|
672
|
+
end
|
673
|
+
if value.kind_of?(Array) or value.kind_of?(Hash) then
|
674
|
+
n_result=get_values(value, keys)
|
675
|
+
if n_result!=:error then
|
676
|
+
n_result.each {|n_key, n_value|
|
677
|
+
if result.has_key?(n_key) then
|
678
|
+
if !result[n_key].kind_of?(Array) or
|
679
|
+
(result[n_key].kind_of?(Array) and number_of_results[n_key] < result[n_key].size) then
|
680
|
+
if result[n_key].kind_of?(Hash) or result[n_key].kind_of?(Array) then
|
681
|
+
res_tx=result[n_key].dup()
|
682
|
+
else
|
683
|
+
res_tx=result[n_key]
|
684
|
+
end
|
685
|
+
result[n_key]=Array.new()
|
686
|
+
result[n_key].push(res_tx)
|
687
|
+
result[n_key].push(n_value)
|
688
|
+
else
|
689
|
+
result[n_key].push(n_value)
|
690
|
+
end
|
691
|
+
else
|
692
|
+
result[n_key]=n_value
|
693
|
+
end
|
694
|
+
number_of_results[n_key]+=1
|
695
|
+
}
|
696
|
+
end
|
697
|
+
end
|
698
|
+
}
|
699
|
+
else
|
700
|
+
return :error
|
701
|
+
end
|
702
|
+
if result.kind_of?(Hash) and caller[0]["get_values"].nil? then #no error or anything weird
|
703
|
+
(keys-result.keys).each {|k| #in case some keys don't exist in the hash
|
704
|
+
result[k]=nil
|
705
|
+
}
|
706
|
+
end
|
707
|
+
return result
|
708
|
+
end
|
709
|
+
|
582
710
|
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.
|
4
|
+
version: 1.3.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: 2018-
|
11
|
+
date: 2018-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: string_pattern
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '1.4'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 1.4.
|
22
|
+
version: 1.4.1
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '1.4'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 1.4.
|
32
|
+
version: 1.4.1
|
33
33
|
description: 'You can easily generates all the hashes you want following the criteria
|
34
34
|
you specify. Many other features coming to Hash class like the methods ''bury''
|
35
35
|
or select_key, access the keys like methods: my_hash.my_key.other_key. You will
|
@@ -71,5 +71,5 @@ rubygems_version: 2.7.6
|
|
71
71
|
signing_key:
|
72
72
|
specification_version: 4
|
73
73
|
summary: NiceHash creates hashes following certain patterns so your testing will be
|
74
|
-
much easier.
|
74
|
+
much easier. Parse and filter JSON.
|
75
75
|
test_files: []
|