lite-ruby 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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