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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -1
  3. data/Gemfile.lock +1 -1
  4. data/README.md +26 -6
  5. data/docs/HASH.md +13 -0
  6. data/lib/generators/lite/ruby/install_generator.rb +0 -2
  7. data/lib/generators/lite/ruby/templates/install.rb +18 -6
  8. data/lib/lite/ruby.rb +2 -15
  9. data/lib/lite/ruby/all.rb +16 -0
  10. data/lib/lite/ruby/array.rb +218 -220
  11. data/lib/lite/ruby/boolean.rb +17 -19
  12. data/lib/lite/ruby/date.rb +13 -20
  13. data/lib/lite/ruby/enumerable.rb +153 -155
  14. data/lib/lite/ruby/formats/date_stamps.yml +34 -0
  15. data/lib/lite/ruby/formats/date_units.yml +42 -0
  16. data/lib/lite/ruby/formats/integer_roman_numerals.yml +13 -0
  17. data/lib/lite/ruby/formats/string_transliterations.yml +189 -0
  18. data/lib/lite/ruby/formats/time_stamps.yml +42 -0
  19. data/lib/lite/ruby/formats/time_units.yml +28 -0
  20. data/lib/lite/ruby/hash.rb +313 -301
  21. data/lib/lite/ruby/helpers/date_time_helper.rb +24 -0
  22. data/lib/lite/ruby/integer.rb +62 -63
  23. data/lib/lite/ruby/kernel.rb +19 -21
  24. data/lib/lite/ruby/numeric.rb +175 -177
  25. data/lib/lite/ruby/object.rb +128 -130
  26. data/lib/lite/ruby/open_struct.rb +17 -19
  27. data/lib/lite/ruby/range.rb +19 -21
  28. data/lib/lite/ruby/safe/object.rb +10 -8
  29. data/lib/lite/ruby/safe/string.rb +8 -7
  30. data/lib/lite/ruby/string.rb +348 -384
  31. data/lib/lite/ruby/struct.rb +7 -9
  32. data/lib/lite/ruby/time.rb +25 -30
  33. data/lib/lite/ruby/version.rb +1 -1
  34. metadata +10 -5
  35. data/lib/lite/ruby/configuration.rb +0 -38
  36. data/lib/lite/ruby/helpers/date_helper.rb +0 -107
  37. 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,13 @@
1
+ M: 1000
2
+ CM: 900
3
+ D: 500
4
+ CD: 400
5
+ C: 100
6
+ XC: 90
7
+ L: 50,
8
+ XL: 40
9
+ X: 10
10
+ IX: 9
11
+ V: 5
12
+ IV: 4
13
+ I: 1
@@ -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'
@@ -1,408 +1,420 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- if Lite::Ruby.configuration.monkey_patches.include?('hash')
4
- class Hash
3
+ class Hash
5
4
 
6
- class << self
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
- def aka(new_key, old_key)
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
- self
31
- end
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
- def assert_all_min_keys!(*valid_keys)
34
- return assert_min_keys!(*valid_keys) unless empty?
18
+ def assert_min_keys!(*valid_keys)
19
+ return self if empty?
35
20
 
36
- raise ArgumentError, 'An empty hash is not allowed'
37
- end
21
+ valid_keys.each do |key|
22
+ next if key?(key)
38
23
 
39
- def assert_pair_presence!(*valid_keys)
40
- each do |key, value|
41
- if !valid_keys.include?(key)
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
- def assert_all_pair_presence!(*valid_keys)
52
- return assert_pair_presence!(*valid_keys) unless empty?
29
+ self
30
+ end
53
31
 
54
- raise ArgumentError, 'An empty hash is not allowed'
55
- end
32
+ def assert_all_min_keys!(*valid_keys)
33
+ return assert_min_keys!(*valid_keys) unless empty?
56
34
 
57
- def assert_valid_keys!(*valid_keys)
58
- each_key do |key|
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
- def assert_all_valid_keys!(*valid_keys)
68
- return assert_valid_keys!(*valid_keys) unless empty?
50
+ def assert_all_pair_presence!(*valid_keys)
51
+ return assert_pair_presence!(*valid_keys) unless empty?
69
52
 
70
- raise ArgumentError, 'An empty hash is not allowed'
71
- end
53
+ raise ArgumentError, 'An empty hash is not allowed'
54
+ end
72
55
 
73
- def assert_valid_values!(*valid_values)
74
- each_value do |value|
75
- next if valid_values.include?(value)
56
+ def assert_valid_keys!(*valid_keys)
57
+ each_key do |key|
58
+ next if valid_keys.include?(key)
76
59
 
77
- raise ArgumentError,
78
- "Invalid value: #{value.inspect}. " \
79
- "Allowed values are: #{valid_values.map(&:inspect).join(', ')}"
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
- def assert_all_valid_values!(*valid_values)
84
- return assert_valid_values!(*valid_values) unless empty?
66
+ def assert_all_valid_keys!(*valid_keys)
67
+ return assert_valid_keys!(*valid_keys) unless empty?
85
68
 
86
- raise ArgumentError, 'An empty hash is not allowed'
87
- end
69
+ raise ArgumentError, 'An empty hash is not allowed'
70
+ end
88
71
 
89
- # rubocop:disable Style/GuardClause
90
- def bury(*args)
91
- if args.count < 2
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
- self
76
+ raise ArgumentError,
77
+ "Invalid value: #{value.inspect}. " \
78
+ "Allowed values are: #{valid_values.map(&:inspect).join(', ')}"
102
79
  end
103
- # rubocop:enable Style/GuardClause
80
+ end
104
81
 
105
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
106
- def collate(*others)
107
- hash = {}
82
+ def assert_all_valid_values!(*valid_values)
83
+ return assert_valid_values!(*valid_values) unless empty?
108
84
 
109
- each_key { |key| hash[key] = [] }
85
+ raise ArgumentError, 'An empty hash is not allowed'
86
+ end
110
87
 
111
- others.each do |other|
112
- other.each_key { |key| hash[key] = [] }
113
- end
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
- each { |key, val| hash[key] << val }
100
+ self
101
+ end
102
+ # rubocop:enable Style/GuardClause
116
103
 
117
- others.each do |other|
118
- other.each { |key, val| hash[key] << val }
119
- end
104
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
105
+ def collate(*others)
106
+ hash = {}
120
107
 
121
- hash.each_value(&:flatten!)
122
- hash
123
- end
124
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
108
+ each_key { |key| hash[key] = [] }
125
109
 
126
- def collate!(other_hash)
127
- replace(collate(other_hash))
110
+ others.each do |other|
111
+ other.each_key { |key| hash[key] = [] }
128
112
  end
129
113
 
130
- def collect_keys(&block)
131
- keys.map(&block)
132
- end
114
+ each { |key, val| hash[key] << val }
133
115
 
134
- def collect_values(&block)
135
- values.map(&block)
116
+ others.each do |other|
117
+ other.each { |key, val| hash[key] << val }
136
118
  end
137
119
 
138
- def dearray_values(idx = 0)
139
- each_with_object({}) do |(key, val), hash|
140
- hash[key] = case val
141
- when Array then val[idx] || val[-1]
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
- def dearray_values!(idx = 0)
148
- replace(dearray_values(idx))
149
- end
125
+ def collate!(other_hash)
126
+ replace(collate(other_hash))
127
+ end
150
128
 
151
- def dearray_singular_values
152
- each_with_object({}) do |(key, val), hash|
153
- hash[key] = case val
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
- def dearray_singular_values!
161
- replace(dearray_singular_values)
162
- end
133
+ def collect_values(&block)
134
+ values.map(&block)
135
+ end
163
136
 
164
- def delete_unless
165
- delete_if { |key, val| !yield(key, val) }
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
- def delete_values(*values)
169
- each_key.with_object([]) do |key, array|
170
- next unless values.include?(self[key])
146
+ def dearray_values!(idx = 0)
147
+ replace(dearray_values(idx))
148
+ end
171
149
 
172
- array << key
173
- delete(key)
174
- end
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
- def demote(key)
178
- dup.demote!(key)
179
- end
159
+ def dearray_singular_values!
160
+ replace(dearray_singular_values)
161
+ end
180
162
 
181
- def demote!(key)
182
- return self unless key?(key)
163
+ def deep_key?(*keys)
164
+ last_hash = self
165
+ found_key = false
183
166
 
184
- self[key] = delete(key)
185
- self
186
- end
167
+ keys.each do |key|
168
+ break found_key = false unless last_hash.key?(key)
187
169
 
188
- def denillify(identity = 0)
189
- dup.denillify!(identity)
170
+ last_hash = last_hash[key]
171
+ found_key = true
190
172
  end
191
173
 
192
- def denillify!(identity = 0)
193
- each { |key, val| self[key] = val || identity }
194
- end
174
+ found_key
175
+ end
195
176
 
196
- def diff(hash)
197
- h1 = dup.delete_if { |k, v| hash[k] == v }
198
- h2 = hash.dup.delete_if { |k, _| key?(k) }
199
- h1.merge(h2)
200
- end
177
+ def delete_unless
178
+ delete_if { |key, val| !yield(key, val) }
179
+ end
201
180
 
202
- def hmap(&block)
203
- dup.hmap!(&block)
204
- end
181
+ def delete_values(*values)
182
+ each_key.with_object([]) do |key, array|
183
+ next unless values.include?(self[key])
205
184
 
206
- def hmap!
207
- inject(self) { |hash, (key, val)| hash.merge(yield(key, val)) }
185
+ array << key
186
+ delete(key)
208
187
  end
188
+ end
209
189
 
210
- def insert(name, value)
211
- return false if key?(name)
190
+ def demote(key)
191
+ dup.demote!(key)
192
+ end
212
193
 
213
- store(name, value)
214
- true
215
- end
194
+ def demote!(key)
195
+ return self unless key?(key)
216
196
 
217
- def invert
218
- each_pair.with_object({}) do |(key, val), hash|
219
- if val.is_a?(Array)
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
- def keys?(*check_keys)
228
- unknown_keys = check_keys - keys
229
- unknown_keys.empty?
230
- end
201
+ def denillify(identity = 0)
202
+ dup.denillify!(identity)
203
+ end
231
204
 
232
- def nillify
233
- dup.nillify!
234
- end
205
+ def denillify!(identity = 0)
206
+ each { |key, val| self[key] = val || identity }
207
+ end
235
208
 
236
- def nillify!
237
- each do |key, val|
238
- next if val.nil?
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
- self[key] = nil if respond_to?(:blank?) ? val.blank? : !val
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
- def only_fill(*keys, placeholder: nil)
245
- keys.each_with_object({}) { |key, hash| hash[key] = key?(key) ? self[key] : placeholder }
246
- end
240
+ def keys?(*check_keys)
241
+ unknown_keys = check_keys - keys
242
+ unknown_keys.empty?
243
+ end
247
244
 
248
- def only_fill!(*keys, placeholder: nil)
249
- replace(only_fill(*keys, placeholder: placeholder))
250
- end
245
+ def nillify
246
+ dup.nillify!
247
+ end
251
248
 
252
- def only_keys?(*check_keys)
253
- unknown_keys = keys - check_keys
254
- unknown_keys.empty?
255
- end
249
+ def nillify!
250
+ each do |key, val|
251
+ next if val.nil?
256
252
 
257
- def pair?(key, value)
258
- self[key] == value
253
+ self[key] = nil if respond_to?(:blank?) ? val.blank? : !val
259
254
  end
255
+ end
260
256
 
261
- def promote(key)
262
- dup.promote!(key)
263
- end
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
- def promote!(key)
266
- return self unless key?(key)
261
+ def only_fill!(*keys, placeholder: nil)
262
+ replace(only_fill(*keys, placeholder: placeholder))
263
+ end
267
264
 
268
- { key => delete(key) }.merge(self)
269
- end
265
+ def only_keys?(*check_keys)
266
+ unknown_keys = keys - check_keys
267
+ unknown_keys.empty?
268
+ end
270
269
 
271
- def rename_keys(*keys)
272
- dup.rename_keys!(*keys)
273
- end
270
+ def pair?(key, value)
271
+ self[key] == value
272
+ end
274
273
 
275
- def rename_keys!(*keys)
276
- keys = Hash[*keys]
277
- keys.each_with_object(self) { |(key, val), hash| hash[val] = delete(key) if hash[key] }
278
- end
274
+ def promote(key)
275
+ dup.promote!(key)
276
+ end
279
277
 
280
- def sample
281
- key = sample_key
282
- [key, fetch(key)]
283
- end
278
+ def promote!(key)
279
+ return self unless key?(key)
284
280
 
285
- def sample!
286
- key, value = sample
287
- delete(key)
288
- [key, value]
289
- end
281
+ { key => delete(key) }.merge(self)
282
+ end
290
283
 
291
- def sample_key
292
- hash_keys = keys
293
- hash_keys.at(Random.rand(hash_keys.size - 1))
294
- end
284
+ def rename_keys(*keys)
285
+ dup.rename_keys!(*keys)
286
+ end
295
287
 
296
- def sample_key!
297
- key, _val = sample
298
- delete(key)
299
- key
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
- def sample_value
303
- fetch(sample_key)
304
- end
293
+ def sample
294
+ key = sample_key
295
+ [key, fetch(key)]
296
+ end
305
297
 
306
- def sample_value!
307
- key, value = sample
308
- delete(key)
309
- value
310
- end
298
+ def sample!
299
+ key, value = sample
300
+ delete(key)
301
+ [key, value]
302
+ end
311
303
 
312
- def shuffle
313
- to_a.sample(size).to_h
314
- end
304
+ def sample_key
305
+ hash_keys = keys
306
+ hash_keys.at(Random.rand(hash_keys.size - 1))
307
+ end
315
308
 
316
- def shuffle!
317
- replace(shuffle)
318
- end
309
+ def sample_key!
310
+ key, _val = sample
311
+ delete(key)
312
+ key
313
+ end
319
314
 
320
- def slice!(*keys)
321
- omit = slice(*self.keys - keys)
322
- hash = slice(*keys)
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
- def strip
330
- reject { |_, val| respond_to?(:blank?) ? val.blank? : !val }
331
- end
319
+ def sample_value!
320
+ key, value = sample
321
+ delete(key)
322
+ value
323
+ end
332
324
 
333
- def strip!
334
- reject! { |_, val| respond_to?(:blank?) ? val.blank? : !val }
335
- end
325
+ def shuffle
326
+ to_a.sample(size).to_h
327
+ end
336
328
 
337
- # rubocop:disable Metrics/MethodLength
338
- def symbolize_and_underscore_keys
339
- each_with_object({}) do |(key, val), hash|
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
- def symbolize_and_underscore_keys!
358
- replace(symbolize_and_underscore_keys)
359
- end
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
- def to_object
362
- JSON.parse(to_json, object_class: OpenStruct)
363
- end
342
+ def strip
343
+ reject { |_, val| respond_to?(:blank?) ? val.blank? : !val }
344
+ end
364
345
 
365
- def to_open_struct(lazy: true)
366
- struct = OpenStruct.new(self)
367
- struct.methods(lazy)
368
- struct
369
- end
346
+ def strip!
347
+ reject! { |_, val| respond_to?(:blank?) ? val.blank? : !val }
348
+ end
370
349
 
371
- def to_struct
372
- struct = Struct.new(*keys)
373
- struct.new(*values)
374
- end
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
- def update_each
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
- def update_keys
381
- return to_enum(:update_keys) unless defined?(yield)
370
+ def symbolize_and_underscore_keys!
371
+ replace(symbolize_and_underscore_keys)
372
+ end
382
373
 
383
- replace(each_with_object({}) { |(key, val), hash| hash[yield(key)] = val })
384
- end
374
+ def to_object
375
+ JSON.parse(to_json, object_class: OpenStruct)
376
+ end
385
377
 
386
- def update_values
387
- return to_enum(:update_values) unless defined?(yield)
378
+ def to_open_struct(lazy: true)
379
+ struct = OpenStruct.new(self)
380
+ struct.methods(lazy)
381
+ struct
382
+ end
388
383
 
389
- replace(each_with_object({}) { |(key, val), hash| hash[key] = yield(val) })
390
- end
384
+ def to_struct
385
+ struct = Struct.new(*keys)
386
+ struct.new(*values)
387
+ end
391
388
 
392
- def vacant?(key)
393
- value = self[key]
394
- respond_to?(:blank?) ? value.blank? : !value
395
- end
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
- alias has_keys? keys?
398
- alias has_only_keys? only_keys?
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
- require 'lite/ruby/safe/hash' unless defined?(ActiveSupport)
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)