lite-ruby 1.0.0

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.
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+
5
+ class Date
6
+
7
+ include Lite::Ruby::DateHelper
8
+
9
+ private
10
+
11
+ def default_format
12
+ 'year-month-day'
13
+ end
14
+
15
+ def default_stamp
16
+ :date_iso
17
+ end
18
+
19
+ def format_for(key)
20
+ DATE_UNITS[key]
21
+ end
22
+
23
+ def stamp_for(key)
24
+ DATE_STAMPS[key]
25
+ end
26
+
27
+ end
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Enumerable
4
+
5
+ def cluster
6
+ each_with_object([]) do |ele, results|
7
+ last_res = results.last
8
+
9
+ if last_res && (yield(ele) == yield(last_res.last))
10
+ last_res << ele
11
+ else
12
+ results << [ele]
13
+ end
14
+ end
15
+ end
16
+
17
+ def deduce(identity = 0, &block)
18
+ if block_given?
19
+ map(&block).deduce(identity)
20
+ else
21
+ inject { |key, val| key - val } || identity
22
+ end
23
+ end
24
+
25
+ def divisible(identity = 0, &block)
26
+ if block_given?
27
+ map(&block).divisible(identity)
28
+ else
29
+ inject { |key, val| key / val } || identity
30
+ end
31
+ end
32
+
33
+ def drop_last(num)
34
+ collection_size = to_a.size
35
+ return self if num > collection_size
36
+
37
+ self[0...(collection_size - num)]
38
+ end
39
+
40
+ def drop_last_if
41
+ dropping = true
42
+ reverse_each.with_object([]) do |val, arr|
43
+ next if dropping &&= yield(val)
44
+
45
+ arr.unshift(val)
46
+ end
47
+ end
48
+
49
+ def exactly?(num)
50
+ found_count = 0
51
+
52
+ if block_given?
53
+ each { |*opt| found_count += 1 if yield(*opt) }
54
+ else
55
+ each { |opt| found_count += 1 if opt }
56
+ end
57
+
58
+ found_count > num ? false : num == found_count
59
+ end
60
+
61
+ # rubocop:disable Style/CaseEquality
62
+ def excase?(object)
63
+ none? { |val| object === val }
64
+ end
65
+ # rubocop:enable Style/CaseEquality
66
+
67
+ def exclude?(object)
68
+ !include?(object)
69
+ end
70
+
71
+ def expand
72
+ map { |val| val.is_a?(Enumerable) ? val.expand : val }
73
+ end
74
+
75
+ def exponential(identity = 0, &block)
76
+ if block_given?
77
+ map(&block).exponential(identity)
78
+ else
79
+ inject { |key, val| key**val } || identity
80
+ end
81
+ end
82
+
83
+ # rubocop:disable Style/CaseEquality
84
+ def incase?(object)
85
+ any? { |val| object === val }
86
+ end
87
+ # rubocop:enable Style/CaseEquality
88
+
89
+ # rubocop:disable Metrics/MethodLength
90
+ def interpose(sep, &block)
91
+ enum = Enumerator.new do |val|
92
+ items = each
93
+
94
+ loop do
95
+ begin
96
+ val << items.next
97
+ rescue StopIteration
98
+ break
99
+ end
100
+
101
+ begin
102
+ items.peek
103
+ rescue StopIteration
104
+ break
105
+ else
106
+ val << sep
107
+ end
108
+ end
109
+ end
110
+
111
+ block ? enum.each(&block) : enum
112
+ end
113
+ # rubocop:enable Metrics/MethodLength
114
+
115
+ def many?
116
+ found_count = 0
117
+
118
+ if block_given?
119
+ any? do |val|
120
+ found_count += 1 if yield(val)
121
+ found_count > 1
122
+ end
123
+ else
124
+ any? { (found_count += 1) > 1 }
125
+ end
126
+ end
127
+
128
+ def multiple(identity = 0, &block)
129
+ if block_given?
130
+ map(&block).multiple(identity)
131
+ else
132
+ inject { |key, val| key * val } || identity
133
+ end
134
+ end
135
+
136
+ def occurrences
137
+ each_with_object(Hash.new(0)) { |key, hsh| hsh[key] += 1 }
138
+ end
139
+
140
+ def several?
141
+ found_count = 0
142
+
143
+ if block_given?
144
+ each { |*opt| found_count += 1 if yield(*opt) }
145
+ else
146
+ each { |opt| found_count += 1 if opt }
147
+ end
148
+
149
+ found_count > 1
150
+ end
151
+
152
+ def take_last(num)
153
+ collection_size = to_a.size
154
+ return self if num > collection_size
155
+
156
+ self[(collection_size - num)..-1]
157
+ end
158
+
159
+ def take_last_if
160
+ reverse_each.with_object([]) do |val, arr|
161
+ break arr unless yield(val)
162
+
163
+ arr.unshift(val)
164
+ end
165
+ end
166
+
167
+ end
@@ -0,0 +1,284 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Hash
4
+
5
+ def assert_valid_keys!(*valid_keys)
6
+ each_key do |key|
7
+ next if valid_keys.include?(key)
8
+
9
+ raise ArgumentError,
10
+ "Invalid key: #{key.inspect}." \
11
+ "Allowed keys are: #{valid_keys.map(&:inspect).join(', ')}"
12
+ end
13
+ end
14
+
15
+ def assert_all_valid_keys!(*valid_keys)
16
+ return assert_valid_keys!(*valid_keys) unless empty?
17
+
18
+ raise ArgumentError, 'An empty hash is not allowed'
19
+ end
20
+
21
+ def assert_valid_values!(*valid_values)
22
+ each_value do |value|
23
+ next if valid_values.include?(value)
24
+
25
+ raise ArgumentError,
26
+ "Invalid value: #{value.inspect}." \
27
+ "Allowed values are: #{valid_values.map(&:inspect).join(', ')}"
28
+ end
29
+ end
30
+
31
+ def assert_all_valid_values!(*valid_values)
32
+ return assert_valid_values!(*valid_values) unless empty?
33
+
34
+ raise ArgumentError, 'An empty hash is not allowed'
35
+ end
36
+
37
+ # rubocop:disable Style/GuardClause
38
+ def bury(*args)
39
+ if args.count < 2
40
+ raise ArgumentError, '2 or more arguments required'
41
+ elsif args.count == 2
42
+ self[args[0]] = args[1]
43
+ else
44
+ arg = args.shift
45
+ self[arg] = {} unless self[arg]
46
+ self[arg].bury(*args) unless args.empty?
47
+ end
48
+
49
+ self
50
+ end
51
+ # rubocop:enable Style/GuardClause
52
+
53
+ def collect_keys
54
+ collect { |key, _| yield(key) }
55
+ end
56
+
57
+ def collect_values
58
+ collect { |_, val| yield(val) }
59
+ end
60
+
61
+ def deep_merge(other_hash, &block)
62
+ dup.deep_merge!(other_hash, &block)
63
+ end
64
+
65
+ # rubocop:disable Metrics/MethodLength
66
+ def deep_merge!(other_hash, &block)
67
+ other_hash.each_pair do |current_key, other_value|
68
+ this_value = self[current_key]
69
+
70
+ self[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
71
+ this_value.deep_merge(other_value, yield(block))
72
+ elsif block_given? && key?(current_key)
73
+ yield(current_key, this_value, other_value)
74
+ else
75
+ other_value
76
+ end
77
+ end
78
+
79
+ self
80
+ end
81
+ # rubocop:enable Metrics/MethodLength
82
+
83
+ def demote(key)
84
+ dup.demote!(key)
85
+ end
86
+
87
+ def demote!(key)
88
+ return self unless key?(key)
89
+
90
+ self[key] = delete(key)
91
+ self
92
+ end
93
+
94
+ def denillify(value = 0)
95
+ dup.denillify!(value)
96
+ end
97
+
98
+ def denillify!(value = 0)
99
+ each { |key, val| self[key] = val.nil? ? value : val }
100
+ end
101
+
102
+ def except(*keys)
103
+ dup.except!(*keys)
104
+ end
105
+
106
+ def except!(*keys)
107
+ keys.each_with_object(self) { |key, _| delete(key) }
108
+ end
109
+
110
+ def extract!(*keys)
111
+ keys.each_with_object(self) { |key, hash| hash[key] = delete(key) if key?(key) }
112
+ end
113
+
114
+ def hmap(&block)
115
+ dup.hmap!(&block)
116
+ end
117
+
118
+ def hmap!
119
+ inject(self) { |hash, (key, val)| hash.merge(yield(key, val)) }
120
+ end
121
+
122
+ def nillify
123
+ dup.nillify!
124
+ end
125
+
126
+ def nillify!
127
+ each do |key, val|
128
+ self[key] = nil if !val.nil? && (val.try(:blank?) || val.try(:to_s).blank?)
129
+ end
130
+ end
131
+
132
+ def only_fill(*keys, placeholder: nil)
133
+ keys.each_with_object({}) { |key, hash| hash[key] = key?(key) ? self[key] : placeholder }
134
+ end
135
+
136
+ def only_fill!(*keys, placeholder: nil)
137
+ replace(only_fill(*keys, placeholder: placeholder))
138
+ end
139
+
140
+ def pair?(key, value)
141
+ self[key] == value
142
+ end
143
+
144
+ def promote(key)
145
+ dup.promote!(key)
146
+ end
147
+
148
+ def promote!(key)
149
+ return self unless key?(key)
150
+
151
+ { key => delete(key) }.merge(self)
152
+ end
153
+
154
+ def rename_keys(*keys)
155
+ dup.rename_keys!(*keys)
156
+ end
157
+
158
+ def rename_keys!(*keys)
159
+ keys = Hash[*keys]
160
+ keys.each_with_object(self) { |(key, val), hash| hash[val] = delete(key) if hash[key] }
161
+ end
162
+
163
+ def reverse_merge(other_hash)
164
+ other_hash.merge(self)
165
+ end
166
+
167
+ def reverse_merge!(other_hash)
168
+ other_hash.merge!(self)
169
+ end
170
+
171
+ def sample
172
+ key = sample_key
173
+ [key, fetch(key)]
174
+ end
175
+
176
+ def sample!
177
+ key, value = sample
178
+ delete(key)
179
+ [key, value]
180
+ end
181
+
182
+ def sample_key
183
+ hash_keys = keys
184
+ hash_keys.at(Random.rand(hash_keys.size - 1))
185
+ end
186
+
187
+ def sample_key!
188
+ key, = sample
189
+ delete(key)
190
+ key
191
+ end
192
+
193
+ def sample_value
194
+ fetch(sample_key)
195
+ end
196
+
197
+ def sample_value!
198
+ key, value = sample
199
+ delete(key)
200
+ value
201
+ end
202
+
203
+ def shuffle
204
+ Hash[to_a.sample(size)]
205
+ end
206
+
207
+ def shuffle!
208
+ replace(shuffle)
209
+ end
210
+
211
+ def slice!(*keys)
212
+ replace(slice(*keys))
213
+ end
214
+
215
+ alias only slice
216
+ alias only! slice!
217
+
218
+ def stringify_keys
219
+ each_with_object({}) { |(key, val), hash| hash[key.to_s] = val }
220
+ end
221
+
222
+ def stringify_keys!
223
+ replace(stringify_keys)
224
+ end
225
+
226
+ def strip
227
+ select { |_, val| !val.blank? }
228
+ end
229
+
230
+ def strip!
231
+ reject! { |_, val| val.blank? }
232
+ end
233
+
234
+ def symbolize_keys
235
+ each_with_object({}) do |(key, val), hash|
236
+ new_key = begin
237
+ key.to_s.to_sym
238
+ rescue StandardError
239
+ key
240
+ end
241
+
242
+ hash[new_key] = val
243
+ end
244
+ end
245
+
246
+ def symbolize_keys!
247
+ replace(symbolize_keys)
248
+ end
249
+
250
+ # rubocop:disable Metrics/MethodLength
251
+ def symbolize_and_underscore_keys
252
+ each_with_object({}) do |(key, val), hash|
253
+ new_key = begin
254
+ key.to_s
255
+ .gsub(/::/, '/')
256
+ .gsub(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
257
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
258
+ .tr(' -', '_')
259
+ .downcase
260
+ .to_sym
261
+ rescue StandardError
262
+ key
263
+ end
264
+
265
+ hash[new_key] = val
266
+ end
267
+ end
268
+ # rubocop:enable Metrics/MethodLength
269
+
270
+ def symbolize_and_underscore_keys!
271
+ replace(symbolize_and_underscore_keys)
272
+ end
273
+
274
+ def to_object
275
+ JSON.parse(to_json, object_class: OpenStruct)
276
+ end
277
+
278
+ alias to_o to_object
279
+
280
+ def vacant?(key)
281
+ self[key].blank?
282
+ end
283
+
284
+ end