lite-ruby 1.3.1 → 2.0.1
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 +4 -4
- data/CHANGELOG.md +21 -1
- data/Gemfile.lock +1 -1
- data/README.md +26 -6
- data/docs/HASH.md +13 -0
- data/lib/generators/lite/ruby/install_generator.rb +0 -2
- data/lib/generators/lite/ruby/templates/install.rb +18 -6
- data/lib/lite/ruby.rb +2 -15
- data/lib/lite/ruby/all.rb +16 -0
- data/lib/lite/ruby/array.rb +218 -220
- data/lib/lite/ruby/boolean.rb +17 -19
- data/lib/lite/ruby/date.rb +13 -20
- data/lib/lite/ruby/enumerable.rb +153 -155
- data/lib/lite/ruby/formats/date_stamps.yml +34 -0
- data/lib/lite/ruby/formats/date_units.yml +42 -0
- data/lib/lite/ruby/formats/integer_roman_numerals.yml +13 -0
- data/lib/lite/ruby/formats/string_transliterations.yml +189 -0
- data/lib/lite/ruby/formats/time_stamps.yml +42 -0
- data/lib/lite/ruby/formats/time_units.yml +28 -0
- data/lib/lite/ruby/hash.rb +313 -301
- data/lib/lite/ruby/helpers/date_time_helper.rb +24 -0
- data/lib/lite/ruby/integer.rb +62 -63
- data/lib/lite/ruby/kernel.rb +19 -21
- data/lib/lite/ruby/numeric.rb +175 -177
- data/lib/lite/ruby/object.rb +128 -130
- data/lib/lite/ruby/open_struct.rb +17 -19
- data/lib/lite/ruby/range.rb +19 -21
- data/lib/lite/ruby/safe/object.rb +10 -8
- data/lib/lite/ruby/safe/string.rb +8 -7
- data/lib/lite/ruby/string.rb +348 -384
- data/lib/lite/ruby/struct.rb +7 -9
- data/lib/lite/ruby/time.rb +25 -30
- data/lib/lite/ruby/version.rb +1 -1
- metadata +10 -5
- data/lib/lite/ruby/configuration.rb +0 -38
- data/lib/lite/ruby/helpers/date_helper.rb +0 -107
- data/lib/lite/ruby/helpers/time_helper.rb +0 -86
@@ -0,0 +1,34 @@
|
|
1
|
+
weekday: '%d'
|
2
|
+
weekday_blank: '%_d'
|
3
|
+
weekday_padded: '%d'
|
4
|
+
weekday_unpadded: '%-d'
|
5
|
+
weekday_name: '%A'
|
6
|
+
weekday_name_abbr: '%a'
|
7
|
+
month: '%m'
|
8
|
+
month_blank: '%_m'
|
9
|
+
month_padded: '%m'
|
10
|
+
month_unpadded: '%-m'
|
11
|
+
month_name: '%B'
|
12
|
+
month_name_abbr: '%b'
|
13
|
+
week_iso: '%V'
|
14
|
+
week_monday: '%W'
|
15
|
+
week_sunday: '%U'
|
16
|
+
year: '%Y'
|
17
|
+
yr: '%y'
|
18
|
+
year_abbr: '%y'
|
19
|
+
day: '%B %-d'
|
20
|
+
day_abbr: '%b %-d'
|
21
|
+
day_iso: '%m-%d'
|
22
|
+
month_year: '%m %Y'
|
23
|
+
month_blank_year: '%_m %Y'
|
24
|
+
month_padded_year: '%m %Y'
|
25
|
+
month_unpadded_year: '%-m %Y'
|
26
|
+
month_name_year: '%B %Y'
|
27
|
+
month_name_abbr_year: '%b %Y'
|
28
|
+
week_year_iso: '%V-%G'
|
29
|
+
year_day: '%Y-%m-%d'
|
30
|
+
year_month: '%Y-%m'
|
31
|
+
year_week: '%G-%V'
|
32
|
+
date: '%B %-d %Y'
|
33
|
+
date_abbr: '%b %-d %Y'
|
34
|
+
date_iso: '%Y-%m-%d'
|
@@ -0,0 +1,42 @@
|
|
1
|
+
w: 'u'
|
2
|
+
weekday: 'u'
|
3
|
+
ww: 'w'
|
4
|
+
weekday_offset: 'w'
|
5
|
+
www: 'A'
|
6
|
+
weekday_name: 'A'
|
7
|
+
wwww: 'a'
|
8
|
+
weekday_name_abbr: 'a'
|
9
|
+
d: 'd'
|
10
|
+
day: 'd'
|
11
|
+
day_padded: 'd'
|
12
|
+
dd: '-d'
|
13
|
+
Day: '-d'
|
14
|
+
day_unpadded: '-d'
|
15
|
+
ddd: '_d'
|
16
|
+
DAY: '_d'
|
17
|
+
day_blank: '_d'
|
18
|
+
dddd: 'j'
|
19
|
+
day_of_the_year: 'j'
|
20
|
+
m: 'm'
|
21
|
+
month: 'm'
|
22
|
+
month_padded: 'm'
|
23
|
+
mm: '-m'
|
24
|
+
Month: '-m'
|
25
|
+
month_unpadded: '-m'
|
26
|
+
mmm: '_m'
|
27
|
+
MONTH: '_m'
|
28
|
+
month_blank: '_m'
|
29
|
+
mmmm: 'B'
|
30
|
+
month_name: 'B'
|
31
|
+
mmmmm: 'b'
|
32
|
+
month_name_abbr: 'b'
|
33
|
+
swe: 'U'
|
34
|
+
sunday_week: 'U'
|
35
|
+
mwe: 'W'
|
36
|
+
monday_week: 'W'
|
37
|
+
we: 'V'
|
38
|
+
week: 'V'
|
39
|
+
yy: 'y'
|
40
|
+
yr: 'y'
|
41
|
+
year: 'Y'
|
42
|
+
yyyy: 'Y'
|
@@ -0,0 +1,189 @@
|
|
1
|
+
'À': 'A'
|
2
|
+
'Á': 'A'
|
3
|
+
'Â': 'A'
|
4
|
+
'Ã': 'A'
|
5
|
+
'Ä': 'A'
|
6
|
+
'Å': 'A'
|
7
|
+
'Æ': 'Ae'
|
8
|
+
'Ç': 'C'
|
9
|
+
'È': 'E'
|
10
|
+
'É': 'E'
|
11
|
+
'Ê': 'E'
|
12
|
+
'Ë': 'E'
|
13
|
+
'Ì': 'I'
|
14
|
+
'Í': 'I'
|
15
|
+
'Î': 'I'
|
16
|
+
'Ï': 'I'
|
17
|
+
'Ð': 'D'
|
18
|
+
'Ñ': 'N'
|
19
|
+
'Ò': 'O'
|
20
|
+
'Ó': 'O'
|
21
|
+
'Ô': 'O'
|
22
|
+
'Õ': 'O'
|
23
|
+
'Ö': 'O'
|
24
|
+
'Ø': 'O'
|
25
|
+
'Ù': 'U'
|
26
|
+
'Ú': 'U'
|
27
|
+
'Û': 'U'
|
28
|
+
'Ü': 'U'
|
29
|
+
'Ý': 'Y'
|
30
|
+
'Þ': 'Th'
|
31
|
+
'ß': 'ss'
|
32
|
+
'à': 'a'
|
33
|
+
'á': 'a'
|
34
|
+
'â': 'a'
|
35
|
+
'ã': 'a'
|
36
|
+
'ä': 'a'
|
37
|
+
'å': 'a'
|
38
|
+
'æ': 'ae'
|
39
|
+
'ç': 'c'
|
40
|
+
'è': 'e'
|
41
|
+
'é': 'e'
|
42
|
+
'ê': 'e'
|
43
|
+
'ë': 'e'
|
44
|
+
'ì': 'i'
|
45
|
+
'í': 'i'
|
46
|
+
'î': 'i'
|
47
|
+
'ï': 'i'
|
48
|
+
'ð': 'd'
|
49
|
+
'ñ': 'n'
|
50
|
+
'ò': 'o'
|
51
|
+
'ó': 'o'
|
52
|
+
'ô': 'o'
|
53
|
+
'õ': 'o'
|
54
|
+
'ö': 'o'
|
55
|
+
'ø': 'o'
|
56
|
+
'ù': 'u'
|
57
|
+
'ú': 'u'
|
58
|
+
'û': 'u'
|
59
|
+
'ü': 'u'
|
60
|
+
'ý': 'y'
|
61
|
+
'þ': 'th'
|
62
|
+
'ÿ': 'y'
|
63
|
+
'Ā': 'A'
|
64
|
+
'ā': 'a'
|
65
|
+
'Ă': 'A'
|
66
|
+
'ă': 'a'
|
67
|
+
'Ą': 'A'
|
68
|
+
'ą': 'a'
|
69
|
+
'Ć': 'C'
|
70
|
+
'ć': 'c'
|
71
|
+
'Ĉ': 'C'
|
72
|
+
'ĉ': 'c'
|
73
|
+
'Ċ': 'C'
|
74
|
+
'ċ': 'c'
|
75
|
+
'Č': 'C'
|
76
|
+
'č': 'c'
|
77
|
+
'Ď': 'D'
|
78
|
+
'ď': 'd'
|
79
|
+
'Đ': 'D'
|
80
|
+
'đ': 'd'
|
81
|
+
'Ē': 'E'
|
82
|
+
'ē': 'e'
|
83
|
+
'Ĕ': 'E'
|
84
|
+
'ĕ': 'e'
|
85
|
+
'Ė': 'E'
|
86
|
+
'ė': 'e'
|
87
|
+
'Ę': 'E'
|
88
|
+
'ę': 'e'
|
89
|
+
'Ě': 'E'
|
90
|
+
'ě': 'e'
|
91
|
+
'Ĝ': 'G'
|
92
|
+
'ĝ': 'g'
|
93
|
+
'Ğ': 'G'
|
94
|
+
'ğ': 'g'
|
95
|
+
'Ġ': 'G'
|
96
|
+
'ġ': 'g'
|
97
|
+
'Ģ': 'G'
|
98
|
+
'ģ': 'g'
|
99
|
+
'Ĥ': 'H'
|
100
|
+
'ĥ': 'h'
|
101
|
+
'Ħ': 'H'
|
102
|
+
'ħ': 'h'
|
103
|
+
'Ĩ': 'I'
|
104
|
+
'ĩ': 'i'
|
105
|
+
'Ī': 'I'
|
106
|
+
'ī': 'i'
|
107
|
+
'Ĭ': 'I'
|
108
|
+
'ĭ': 'i'
|
109
|
+
'Į': 'I'
|
110
|
+
'į': 'i'
|
111
|
+
'İ': 'I'
|
112
|
+
'ı': 'i'
|
113
|
+
'IJ': 'Ij'
|
114
|
+
'ij': 'ij'
|
115
|
+
'Ĵ': 'J'
|
116
|
+
'ĵ': 'j'
|
117
|
+
'Ķ': 'K'
|
118
|
+
'ķ': 'k'
|
119
|
+
'ĸ': 'k'
|
120
|
+
'Ĺ': 'L'
|
121
|
+
'ĺ': 'l'
|
122
|
+
'Ļ': 'L'
|
123
|
+
'ļ': 'l'
|
124
|
+
'Ľ': 'L'
|
125
|
+
'ľ': 'l'
|
126
|
+
'Ŀ': 'L'
|
127
|
+
'ŀ': 'l'
|
128
|
+
'Ł': 'L'
|
129
|
+
'ł': 'l'
|
130
|
+
'Ń': 'N'
|
131
|
+
'ń': 'n'
|
132
|
+
'Ņ': 'N'
|
133
|
+
'ņ': 'n'
|
134
|
+
'Ň': 'N'
|
135
|
+
'ň': 'n'
|
136
|
+
'ʼn': 'n'
|
137
|
+
'Ŋ': 'Ng'
|
138
|
+
'ŋ': 'ng'
|
139
|
+
'Ō': 'O'
|
140
|
+
'ō': 'o'
|
141
|
+
'Ŏ': 'O'
|
142
|
+
'ŏ': 'o'
|
143
|
+
'Ő': 'O'
|
144
|
+
'ő': 'o'
|
145
|
+
'Œ': 'OE'
|
146
|
+
'œ': 'oe'
|
147
|
+
'Ŕ': 'R'
|
148
|
+
'ŕ': 'r'
|
149
|
+
'Ŗ': 'R'
|
150
|
+
'ŗ': 'r'
|
151
|
+
'Ř': 'R'
|
152
|
+
'ř': 'r'
|
153
|
+
'Ś': 'S'
|
154
|
+
'ś': 's'
|
155
|
+
'Ŝ': 'S'
|
156
|
+
'ŝ': 's'
|
157
|
+
'Ş': 'S'
|
158
|
+
'ş': 's'
|
159
|
+
'Š': 'S'
|
160
|
+
'š': 's'
|
161
|
+
'Ţ': 'T'
|
162
|
+
'ţ': 't'
|
163
|
+
'Ť': 'T'
|
164
|
+
'ť': 't'
|
165
|
+
'Ŧ': 'T'
|
166
|
+
'ŧ': 't'
|
167
|
+
'Ũ': 'U'
|
168
|
+
'ũ': 'u'
|
169
|
+
'Ū': 'U'
|
170
|
+
'ū': 'u'
|
171
|
+
'Ŭ': 'U'
|
172
|
+
'ŭ': 'u'
|
173
|
+
'Ů': 'U'
|
174
|
+
'ů': 'u'
|
175
|
+
'Ű': 'U'
|
176
|
+
'ű': 'u'
|
177
|
+
'Ų': 'U'
|
178
|
+
'ų': 'u'
|
179
|
+
'Ŵ': 'W'
|
180
|
+
'ŵ': 'w'
|
181
|
+
'Ŷ': 'Y'
|
182
|
+
'ŷ': 'y'
|
183
|
+
'Ÿ': 'Y'
|
184
|
+
'Ź': 'Z'
|
185
|
+
'ź': 'z'
|
186
|
+
'Ż': 'Z'
|
187
|
+
'ż': 'z'
|
188
|
+
'Ž': 'Z'
|
189
|
+
'ž': 'z'
|
@@ -0,0 +1,42 @@
|
|
1
|
+
hour: '%H'
|
2
|
+
hour_blank: '%k'
|
3
|
+
hour_padded: '%H'
|
4
|
+
hour12: '%I'
|
5
|
+
hour12_padded: '%I'
|
6
|
+
hour12_blank: '%l'
|
7
|
+
minute: '%M'
|
8
|
+
second: '%S'
|
9
|
+
ampm: '%P'
|
10
|
+
meridian: '%p'
|
11
|
+
time_zone: '%z'
|
12
|
+
time_zone_offset: '%:z'
|
13
|
+
time_zone_offset_full: '%::z'
|
14
|
+
time_zone_name: '%Z'
|
15
|
+
time: '%H:%M'
|
16
|
+
time_blank: '%k:%M'
|
17
|
+
time_padded: '%H:%M'
|
18
|
+
time_tz: '%H:%M %z'
|
19
|
+
time_tzn: '%H:%M %Z'
|
20
|
+
time12: '%I:%M %P'
|
21
|
+
time12_padded: '%I:%M %P'
|
22
|
+
time12_blank: '%l:%M %P'
|
23
|
+
time12_tz: '%I:%M %P %z'
|
24
|
+
time12_tzn: '%I:%M %P %Z'
|
25
|
+
daytime: '%B %-d %H:%M'
|
26
|
+
daytime_abbr: '%b %-d %H:%M'
|
27
|
+
daytime_iso: '%m-%d %H:%M'
|
28
|
+
daytime12: '%B %-d %I:%M %P'
|
29
|
+
daytime12_abbr: '%b %-d %I:%M %P'
|
30
|
+
daytime12_iso: '%m-%d %I:%M %P'
|
31
|
+
datetime: '%B %-d %Y %H:%M'
|
32
|
+
datetime_abbr: '%b %-d %Y %H:%M'
|
33
|
+
datetime_iso: '%Y-%m-%d %H:%M'
|
34
|
+
datetime12: '%B %-d %Y %I:%M %P'
|
35
|
+
datetime12_abbr: '%b %-d %Y %I:%M %P'
|
36
|
+
datetime12_iso: '%Y-%m-%d %I:%M %P'
|
37
|
+
datetime_tzn: '%B %-d %Y %H:%M %Z'
|
38
|
+
datetime_abbr_tzn: '%b %-d %Y %H:%M %Z'
|
39
|
+
datetime_iso_tzn: '%Y-%m-%d %H:%M %z'
|
40
|
+
datetime12_tzn: '%B %-d %Y %I:%M %P %Z'
|
41
|
+
datetime12_abbr_tzn: '%b %-d %Y %I:%M %P %Z'
|
42
|
+
datetime12_iso_tzn: '%Y-%m-%d %I:%M %P %z'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
h: 'H'
|
2
|
+
hour: 'H'
|
3
|
+
hour_padded: 'H'
|
4
|
+
hh: 'k'
|
5
|
+
HOUR: 'k'
|
6
|
+
hour_blank: 'k'
|
7
|
+
hhh: 'I'
|
8
|
+
hour12: 'I'
|
9
|
+
hour12_padded: 'I'
|
10
|
+
hhhh: 'l'
|
11
|
+
HOUR12: 'l'
|
12
|
+
hour12_blank: 'l'
|
13
|
+
n: 'M'
|
14
|
+
minute: 'M'
|
15
|
+
s: 'S'
|
16
|
+
second: 'S'
|
17
|
+
ampm: 'P'
|
18
|
+
meridian: 'P'
|
19
|
+
AMPM: 'p'
|
20
|
+
MERIDIAN: 'p'
|
21
|
+
z: 'z'
|
22
|
+
time_zone: 'z'
|
23
|
+
zz: ':z'
|
24
|
+
time_zone_offset: ':z'
|
25
|
+
zzz: '::z'
|
26
|
+
time_zone_offset_full: '::z'
|
27
|
+
zzzz: 'Z'
|
28
|
+
time_zone_name: 'Z'
|
data/lib/lite/ruby/hash.rb
CHANGED
@@ -1,408 +1,420 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
class Hash
|
3
|
+
class Hash
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
def zip(keys, values)
|
9
|
-
keys.size.times.with_object({}) { |i, hash| hash[keys[i]] = values[i] }
|
10
|
-
end
|
5
|
+
class << self
|
11
6
|
|
7
|
+
def zip(keys, values)
|
8
|
+
keys.size.times.with_object({}) { |i, hash| hash[keys[i]] = values[i] }
|
12
9
|
end
|
13
10
|
|
14
|
-
|
15
|
-
self[new_key] = self[old_key] if key?(old_key)
|
16
|
-
self
|
17
|
-
end
|
18
|
-
|
19
|
-
def assert_min_keys!(*valid_keys)
|
20
|
-
return self if empty?
|
21
|
-
|
22
|
-
valid_keys.each do |key|
|
23
|
-
next if key?(key)
|
24
|
-
|
25
|
-
raise ArgumentError,
|
26
|
-
"Missing key: #{key.inspect}. " \
|
27
|
-
"Minimum keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
28
|
-
end
|
11
|
+
end
|
29
12
|
|
30
|
-
|
31
|
-
|
13
|
+
def aka(new_key, old_key)
|
14
|
+
self[new_key] = self[old_key] if key?(old_key)
|
15
|
+
self
|
16
|
+
end
|
32
17
|
|
33
|
-
|
34
|
-
|
18
|
+
def assert_min_keys!(*valid_keys)
|
19
|
+
return self if empty?
|
35
20
|
|
36
|
-
|
37
|
-
|
21
|
+
valid_keys.each do |key|
|
22
|
+
next if key?(key)
|
38
23
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
raise ArgumentError,
|
43
|
-
"Invalid key: #{key.inspect}. " \
|
44
|
-
"Allowed keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
45
|
-
elsif value.respond_to?(:blank?) ? value.blank? : !value
|
46
|
-
raise ArgumentError, "A #{value.inspect} value for #{key.inspect} is not allowed"
|
47
|
-
end
|
48
|
-
end
|
24
|
+
raise ArgumentError,
|
25
|
+
"Missing key: #{key.inspect}. " \
|
26
|
+
"Minimum keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
49
27
|
end
|
50
28
|
|
51
|
-
|
52
|
-
|
29
|
+
self
|
30
|
+
end
|
53
31
|
|
54
|
-
|
55
|
-
|
32
|
+
def assert_all_min_keys!(*valid_keys)
|
33
|
+
return assert_min_keys!(*valid_keys) unless empty?
|
56
34
|
|
57
|
-
|
58
|
-
|
59
|
-
next if valid_keys.include?(key)
|
35
|
+
raise ArgumentError, 'An empty hash is not allowed'
|
36
|
+
end
|
60
37
|
|
38
|
+
def assert_pair_presence!(*valid_keys)
|
39
|
+
each do |key, value|
|
40
|
+
if !valid_keys.include?(key)
|
61
41
|
raise ArgumentError,
|
62
42
|
"Invalid key: #{key.inspect}. " \
|
63
43
|
"Allowed keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
44
|
+
elsif value.respond_to?(:blank?) ? value.blank? : !value
|
45
|
+
raise ArgumentError, "A #{value.inspect} value for #{key.inspect} is not allowed"
|
64
46
|
end
|
65
47
|
end
|
48
|
+
end
|
66
49
|
|
67
|
-
|
68
|
-
|
50
|
+
def assert_all_pair_presence!(*valid_keys)
|
51
|
+
return assert_pair_presence!(*valid_keys) unless empty?
|
69
52
|
|
70
|
-
|
71
|
-
|
53
|
+
raise ArgumentError, 'An empty hash is not allowed'
|
54
|
+
end
|
72
55
|
|
73
|
-
|
74
|
-
|
75
|
-
|
56
|
+
def assert_valid_keys!(*valid_keys)
|
57
|
+
each_key do |key|
|
58
|
+
next if valid_keys.include?(key)
|
76
59
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
60
|
+
raise ArgumentError,
|
61
|
+
"Invalid key: #{key.inspect}. " \
|
62
|
+
"Allowed keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
81
63
|
end
|
64
|
+
end
|
82
65
|
|
83
|
-
|
84
|
-
|
66
|
+
def assert_all_valid_keys!(*valid_keys)
|
67
|
+
return assert_valid_keys!(*valid_keys) unless empty?
|
85
68
|
|
86
|
-
|
87
|
-
|
69
|
+
raise ArgumentError, 'An empty hash is not allowed'
|
70
|
+
end
|
88
71
|
|
89
|
-
|
90
|
-
|
91
|
-
if
|
92
|
-
raise ArgumentError, '2 or more arguments required'
|
93
|
-
elsif args.count == 2
|
94
|
-
self[args[0]] = args[1]
|
95
|
-
else
|
96
|
-
arg = args.shift
|
97
|
-
self[arg] = {} unless self[arg]
|
98
|
-
self[arg].bury(*args) unless args.empty?
|
99
|
-
end
|
72
|
+
def assert_valid_values!(*valid_values)
|
73
|
+
each_value do |value|
|
74
|
+
next if valid_values.include?(value)
|
100
75
|
|
101
|
-
|
76
|
+
raise ArgumentError,
|
77
|
+
"Invalid value: #{value.inspect}. " \
|
78
|
+
"Allowed values are: #{valid_values.map(&:inspect).join(', ')}"
|
102
79
|
end
|
103
|
-
|
80
|
+
end
|
104
81
|
|
105
|
-
|
106
|
-
|
107
|
-
hash = {}
|
82
|
+
def assert_all_valid_values!(*valid_values)
|
83
|
+
return assert_valid_values!(*valid_values) unless empty?
|
108
84
|
|
109
|
-
|
85
|
+
raise ArgumentError, 'An empty hash is not allowed'
|
86
|
+
end
|
110
87
|
|
111
|
-
|
112
|
-
|
113
|
-
|
88
|
+
# rubocop:disable Style/GuardClause
|
89
|
+
def bury(*args)
|
90
|
+
if args.count < 2
|
91
|
+
raise ArgumentError, '2 or more arguments required'
|
92
|
+
elsif args.count == 2
|
93
|
+
self[args[0]] = args[1]
|
94
|
+
else
|
95
|
+
arg = args.shift
|
96
|
+
self[arg] = {} unless self[arg]
|
97
|
+
self[arg].bury(*args) unless args.empty?
|
98
|
+
end
|
114
99
|
|
115
|
-
|
100
|
+
self
|
101
|
+
end
|
102
|
+
# rubocop:enable Style/GuardClause
|
116
103
|
|
117
|
-
|
118
|
-
|
119
|
-
|
104
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
105
|
+
def collate(*others)
|
106
|
+
hash = {}
|
120
107
|
|
121
|
-
|
122
|
-
hash
|
123
|
-
end
|
124
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
108
|
+
each_key { |key| hash[key] = [] }
|
125
109
|
|
126
|
-
|
127
|
-
|
110
|
+
others.each do |other|
|
111
|
+
other.each_key { |key| hash[key] = [] }
|
128
112
|
end
|
129
113
|
|
130
|
-
|
131
|
-
keys.map(&block)
|
132
|
-
end
|
114
|
+
each { |key, val| hash[key] << val }
|
133
115
|
|
134
|
-
|
135
|
-
|
116
|
+
others.each do |other|
|
117
|
+
other.each { |key, val| hash[key] << val }
|
136
118
|
end
|
137
119
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
else val
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
120
|
+
hash.each_value(&:flatten!)
|
121
|
+
hash
|
122
|
+
end
|
123
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
146
124
|
|
147
|
-
|
148
|
-
|
149
|
-
|
125
|
+
def collate!(other_hash)
|
126
|
+
replace(collate(other_hash))
|
127
|
+
end
|
150
128
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
when Array then val.size < 2 ? val[0] : val
|
155
|
-
else val
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
129
|
+
def collect_keys(&block)
|
130
|
+
keys.map(&block)
|
131
|
+
end
|
159
132
|
|
160
|
-
|
161
|
-
|
162
|
-
|
133
|
+
def collect_values(&block)
|
134
|
+
values.map(&block)
|
135
|
+
end
|
163
136
|
|
164
|
-
|
165
|
-
|
137
|
+
def dearray_values(idx = 0)
|
138
|
+
each_with_object({}) do |(key, val), hash|
|
139
|
+
hash[key] = case val
|
140
|
+
when Array then val[idx] || val[-1]
|
141
|
+
else val
|
142
|
+
end
|
166
143
|
end
|
144
|
+
end
|
167
145
|
|
168
|
-
|
169
|
-
|
170
|
-
|
146
|
+
def dearray_values!(idx = 0)
|
147
|
+
replace(dearray_values(idx))
|
148
|
+
end
|
171
149
|
|
172
|
-
|
173
|
-
|
174
|
-
|
150
|
+
def dearray_singular_values
|
151
|
+
each_with_object({}) do |(key, val), hash|
|
152
|
+
hash[key] = case val
|
153
|
+
when Array then val.size < 2 ? val[0] : val
|
154
|
+
else val
|
155
|
+
end
|
175
156
|
end
|
157
|
+
end
|
176
158
|
|
177
|
-
|
178
|
-
|
179
|
-
|
159
|
+
def dearray_singular_values!
|
160
|
+
replace(dearray_singular_values)
|
161
|
+
end
|
180
162
|
|
181
|
-
|
182
|
-
|
163
|
+
def deep_key?(*keys)
|
164
|
+
last_hash = self
|
165
|
+
found_key = false
|
183
166
|
|
184
|
-
|
185
|
-
|
186
|
-
end
|
167
|
+
keys.each do |key|
|
168
|
+
break found_key = false unless last_hash.key?(key)
|
187
169
|
|
188
|
-
|
189
|
-
|
170
|
+
last_hash = last_hash[key]
|
171
|
+
found_key = true
|
190
172
|
end
|
191
173
|
|
192
|
-
|
193
|
-
|
194
|
-
end
|
174
|
+
found_key
|
175
|
+
end
|
195
176
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
h1.merge(h2)
|
200
|
-
end
|
177
|
+
def delete_unless
|
178
|
+
delete_if { |key, val| !yield(key, val) }
|
179
|
+
end
|
201
180
|
|
202
|
-
|
203
|
-
|
204
|
-
|
181
|
+
def delete_values(*values)
|
182
|
+
each_key.with_object([]) do |key, array|
|
183
|
+
next unless values.include?(self[key])
|
205
184
|
|
206
|
-
|
207
|
-
|
185
|
+
array << key
|
186
|
+
delete(key)
|
208
187
|
end
|
188
|
+
end
|
209
189
|
|
210
|
-
|
211
|
-
|
190
|
+
def demote(key)
|
191
|
+
dup.demote!(key)
|
192
|
+
end
|
212
193
|
|
213
|
-
|
214
|
-
|
215
|
-
end
|
194
|
+
def demote!(key)
|
195
|
+
return self unless key?(key)
|
216
196
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
val.each { |x| hash[x] = (hash.key?(x) ? [key, hash[x]].flatten : key) }
|
221
|
-
else
|
222
|
-
hash[val] = (hash.key?(val) ? [key, hash[val]].flatten : key)
|
223
|
-
end
|
224
|
-
end
|
225
|
-
end
|
197
|
+
self[key] = delete(key)
|
198
|
+
self
|
199
|
+
end
|
226
200
|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
end
|
201
|
+
def denillify(identity = 0)
|
202
|
+
dup.denillify!(identity)
|
203
|
+
end
|
231
204
|
|
232
|
-
|
233
|
-
|
234
|
-
|
205
|
+
def denillify!(identity = 0)
|
206
|
+
each { |key, val| self[key] = val || identity }
|
207
|
+
end
|
235
208
|
|
236
|
-
|
237
|
-
|
238
|
-
|
209
|
+
def diff(hash)
|
210
|
+
h1 = dup.delete_if { |k, v| hash[k] == v }
|
211
|
+
h2 = hash.dup.delete_if { |k, _| key?(k) }
|
212
|
+
h1.merge(h2)
|
213
|
+
end
|
214
|
+
|
215
|
+
def hmap(&block)
|
216
|
+
dup.hmap!(&block)
|
217
|
+
end
|
218
|
+
|
219
|
+
def hmap!
|
220
|
+
inject(self) { |hash, (key, val)| hash.merge(yield(key, val)) }
|
221
|
+
end
|
239
222
|
|
240
|
-
|
223
|
+
def insert(name, value)
|
224
|
+
return false if key?(name)
|
225
|
+
|
226
|
+
store(name, value)
|
227
|
+
true
|
228
|
+
end
|
229
|
+
|
230
|
+
def invert
|
231
|
+
each_pair.with_object({}) do |(key, val), hash|
|
232
|
+
if val.is_a?(Array)
|
233
|
+
val.each { |x| hash[x] = (hash.key?(x) ? [key, hash[x]].flatten : key) }
|
234
|
+
else
|
235
|
+
hash[val] = (hash.key?(val) ? [key, hash[val]].flatten : key)
|
241
236
|
end
|
242
237
|
end
|
238
|
+
end
|
243
239
|
|
244
|
-
|
245
|
-
|
246
|
-
|
240
|
+
def keys?(*check_keys)
|
241
|
+
unknown_keys = check_keys - keys
|
242
|
+
unknown_keys.empty?
|
243
|
+
end
|
247
244
|
|
248
|
-
|
249
|
-
|
250
|
-
|
245
|
+
def nillify
|
246
|
+
dup.nillify!
|
247
|
+
end
|
251
248
|
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
end
|
249
|
+
def nillify!
|
250
|
+
each do |key, val|
|
251
|
+
next if val.nil?
|
256
252
|
|
257
|
-
|
258
|
-
self[key] == value
|
253
|
+
self[key] = nil if respond_to?(:blank?) ? val.blank? : !val
|
259
254
|
end
|
255
|
+
end
|
260
256
|
|
261
|
-
|
262
|
-
|
263
|
-
|
257
|
+
def only_fill(*keys, placeholder: nil)
|
258
|
+
keys.each_with_object({}) { |key, hash| hash[key] = key?(key) ? self[key] : placeholder }
|
259
|
+
end
|
264
260
|
|
265
|
-
|
266
|
-
|
261
|
+
def only_fill!(*keys, placeholder: nil)
|
262
|
+
replace(only_fill(*keys, placeholder: placeholder))
|
263
|
+
end
|
267
264
|
|
268
|
-
|
269
|
-
|
265
|
+
def only_keys?(*check_keys)
|
266
|
+
unknown_keys = keys - check_keys
|
267
|
+
unknown_keys.empty?
|
268
|
+
end
|
270
269
|
|
271
|
-
|
272
|
-
|
273
|
-
|
270
|
+
def pair?(key, value)
|
271
|
+
self[key] == value
|
272
|
+
end
|
274
273
|
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
end
|
274
|
+
def promote(key)
|
275
|
+
dup.promote!(key)
|
276
|
+
end
|
279
277
|
|
280
|
-
|
281
|
-
|
282
|
-
[key, fetch(key)]
|
283
|
-
end
|
278
|
+
def promote!(key)
|
279
|
+
return self unless key?(key)
|
284
280
|
|
285
|
-
|
286
|
-
|
287
|
-
delete(key)
|
288
|
-
[key, value]
|
289
|
-
end
|
281
|
+
{ key => delete(key) }.merge(self)
|
282
|
+
end
|
290
283
|
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
end
|
284
|
+
def rename_keys(*keys)
|
285
|
+
dup.rename_keys!(*keys)
|
286
|
+
end
|
295
287
|
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
end
|
288
|
+
def rename_keys!(*keys)
|
289
|
+
keys = Hash[*keys]
|
290
|
+
keys.each_with_object(self) { |(key, val), hash| hash[val] = delete(key) if hash[key] }
|
291
|
+
end
|
301
292
|
|
302
|
-
|
303
|
-
|
304
|
-
|
293
|
+
def sample
|
294
|
+
key = sample_key
|
295
|
+
[key, fetch(key)]
|
296
|
+
end
|
305
297
|
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
298
|
+
def sample!
|
299
|
+
key, value = sample
|
300
|
+
delete(key)
|
301
|
+
[key, value]
|
302
|
+
end
|
311
303
|
|
312
|
-
|
313
|
-
|
314
|
-
|
304
|
+
def sample_key
|
305
|
+
hash_keys = keys
|
306
|
+
hash_keys.at(Random.rand(hash_keys.size - 1))
|
307
|
+
end
|
315
308
|
|
316
|
-
|
317
|
-
|
318
|
-
|
309
|
+
def sample_key!
|
310
|
+
key, _val = sample
|
311
|
+
delete(key)
|
312
|
+
key
|
313
|
+
end
|
319
314
|
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
hash.default = default
|
324
|
-
hash.default_proc = default_proc if default_proc
|
325
|
-
replace(hash)
|
326
|
-
omit
|
327
|
-
end
|
315
|
+
def sample_value
|
316
|
+
fetch(sample_key)
|
317
|
+
end
|
328
318
|
|
329
|
-
|
330
|
-
|
331
|
-
|
319
|
+
def sample_value!
|
320
|
+
key, value = sample
|
321
|
+
delete(key)
|
322
|
+
value
|
323
|
+
end
|
332
324
|
|
333
|
-
|
334
|
-
|
335
|
-
|
325
|
+
def shuffle
|
326
|
+
to_a.sample(size).to_h
|
327
|
+
end
|
336
328
|
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
new_key = begin
|
341
|
-
str = key.dup.to_s
|
342
|
-
str.gsub!(/::/, '/') || str
|
343
|
-
str.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2') || str
|
344
|
-
str.gsub!(/([a-z\d])([A-Z])/, '\1_\2') || str
|
345
|
-
str.tr!(' -', '_') || str
|
346
|
-
str.downcase!
|
347
|
-
str.to_sym
|
348
|
-
rescue StandardError
|
349
|
-
key
|
350
|
-
end
|
351
|
-
|
352
|
-
hash[new_key] = val
|
353
|
-
end
|
354
|
-
end
|
355
|
-
# rubocop:enable Metrics/MethodLength
|
329
|
+
def shuffle!
|
330
|
+
replace(shuffle)
|
331
|
+
end
|
356
332
|
|
357
|
-
|
358
|
-
|
359
|
-
|
333
|
+
def slice!(*keys)
|
334
|
+
omit = slice(*self.keys - keys)
|
335
|
+
hash = slice(*keys)
|
336
|
+
hash.default = default
|
337
|
+
hash.default_proc = default_proc if default_proc
|
338
|
+
replace(hash)
|
339
|
+
omit
|
340
|
+
end
|
360
341
|
|
361
|
-
|
362
|
-
|
363
|
-
|
342
|
+
def strip
|
343
|
+
reject { |_, val| respond_to?(:blank?) ? val.blank? : !val }
|
344
|
+
end
|
364
345
|
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
struct
|
369
|
-
end
|
346
|
+
def strip!
|
347
|
+
reject! { |_, val| respond_to?(:blank?) ? val.blank? : !val }
|
348
|
+
end
|
370
349
|
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
350
|
+
# rubocop:disable Metrics/MethodLength
|
351
|
+
def symbolize_and_underscore_keys
|
352
|
+
each_with_object({}) do |(key, val), hash|
|
353
|
+
new_key = begin
|
354
|
+
str = key.dup.to_s
|
355
|
+
str.gsub!(/::/, '/') || str
|
356
|
+
str.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2') || str
|
357
|
+
str.gsub!(/([a-z\d])([A-Z])/, '\1_\2') || str
|
358
|
+
str.tr!(' -', '_') || str
|
359
|
+
str.downcase!
|
360
|
+
str.to_sym
|
361
|
+
rescue StandardError
|
362
|
+
key
|
363
|
+
end
|
375
364
|
|
376
|
-
|
377
|
-
replace(each_with_object({}) { |(key, val), hash| hash.update(yield(key, val)) })
|
365
|
+
hash[new_key] = val
|
378
366
|
end
|
367
|
+
end
|
368
|
+
# rubocop:enable Metrics/MethodLength
|
379
369
|
|
380
|
-
|
381
|
-
|
370
|
+
def symbolize_and_underscore_keys!
|
371
|
+
replace(symbolize_and_underscore_keys)
|
372
|
+
end
|
382
373
|
|
383
|
-
|
384
|
-
|
374
|
+
def to_object
|
375
|
+
JSON.parse(to_json, object_class: OpenStruct)
|
376
|
+
end
|
385
377
|
|
386
|
-
|
387
|
-
|
378
|
+
def to_open_struct(lazy: true)
|
379
|
+
struct = OpenStruct.new(self)
|
380
|
+
struct.methods(lazy)
|
381
|
+
struct
|
382
|
+
end
|
388
383
|
|
389
|
-
|
390
|
-
|
384
|
+
def to_struct
|
385
|
+
struct = Struct.new(*keys)
|
386
|
+
struct.new(*values)
|
387
|
+
end
|
391
388
|
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
389
|
+
def update_each
|
390
|
+
replace(each_with_object({}) { |(key, val), hash| hash.update(yield(key, val)) })
|
391
|
+
end
|
392
|
+
|
393
|
+
def update_keys
|
394
|
+
return to_enum(:update_keys) unless defined?(yield)
|
395
|
+
|
396
|
+
replace(each_with_object({}) { |(key, val), hash| hash[yield(key)] = val })
|
397
|
+
end
|
396
398
|
|
397
|
-
|
398
|
-
|
399
|
-
alias map_keys collect_keys
|
400
|
-
alias map_values collect_values
|
401
|
-
alias only slice
|
402
|
-
alias only! slice!
|
403
|
-
alias to_o to_object
|
399
|
+
def update_values
|
400
|
+
return to_enum(:update_values) unless defined?(yield)
|
404
401
|
|
402
|
+
replace(each_with_object({}) { |(key, val), hash| hash[key] = yield(val) })
|
405
403
|
end
|
406
404
|
|
407
|
-
|
405
|
+
def vacant?(key)
|
406
|
+
value = self[key]
|
407
|
+
respond_to?(:blank?) ? value.blank? : !value
|
408
|
+
end
|
409
|
+
|
410
|
+
alias has_keys? keys?
|
411
|
+
alias has_only_keys? only_keys?
|
412
|
+
alias map_keys collect_keys
|
413
|
+
alias map_values collect_values
|
414
|
+
alias only slice
|
415
|
+
alias only! slice!
|
416
|
+
alias to_o to_object
|
417
|
+
|
408
418
|
end
|
419
|
+
|
420
|
+
require 'lite/ruby/safe/hash' unless defined?(ActiveSupport)
|