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.
- checksums.yaml +7 -0
- data/.fasterer.yml +19 -0
- data/.gitignore +11 -0
- data/.rspec +4 -0
- data/.rubocop.yml +32 -0
- data/.travis.yml +24 -0
- data/CHANGELOG.md +11 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +119 -0
- data/LICENSE.txt +21 -0
- data/README.md +96 -0
- data/Rakefile +8 -0
- data/_config.yml +1 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/docs/ARRAY.md +284 -0
- data/docs/DATE.md +78 -0
- data/docs/ENUMERABLE.md +174 -0
- data/docs/HASH.md +282 -0
- data/docs/INTEGER.md +43 -0
- data/docs/KERNEL.md +31 -0
- data/docs/NUMERIC.md +302 -0
- data/docs/OBJECT.md +322 -0
- data/docs/RANGE.md +55 -0
- data/docs/STRING.md +463 -0
- data/docs/TIME.md +86 -0
- data/lib/generators/lite/ruby/install_generator.rb +17 -0
- data/lib/generators/lite/ruby/templates/install.rb +15 -0
- data/lib/lite/ruby.rb +16 -0
- data/lib/lite/ruby/array.rb +290 -0
- data/lib/lite/ruby/configuration.rb +42 -0
- data/lib/lite/ruby/date.rb +27 -0
- data/lib/lite/ruby/enumerable.rb +167 -0
- data/lib/lite/ruby/hash.rb +284 -0
- data/lib/lite/ruby/helpers/date_helper.rb +105 -0
- data/lib/lite/ruby/helpers/time_helper.rb +84 -0
- data/lib/lite/ruby/integer.rb +45 -0
- data/lib/lite/ruby/kernel.rb +29 -0
- data/lib/lite/ruby/numeric.rb +210 -0
- data/lib/lite/ruby/object.rb +182 -0
- data/lib/lite/ruby/range.rb +32 -0
- data/lib/lite/ruby/string.rb +412 -0
- data/lib/lite/ruby/time.rb +26 -0
- data/lib/lite/ruby/version.rb +9 -0
- data/lite-ruby.gemspec +48 -0
- metadata +200 -0
@@ -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
|