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,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Lite
|
4
|
+
module Ruby
|
5
|
+
module DateHelper
|
6
|
+
|
7
|
+
DATE_STAMPS ||= {
|
8
|
+
weekday: '%d',
|
9
|
+
weekday_blank: '%_d',
|
10
|
+
weekday_padded: '%d',
|
11
|
+
weekday_unpadded: '%-d',
|
12
|
+
weekday_name: '%A',
|
13
|
+
weekday_name_abbr: '%a',
|
14
|
+
month: '%m',
|
15
|
+
month_blank: '%_m',
|
16
|
+
month_padded: '%m',
|
17
|
+
month_unpadded: '%-m',
|
18
|
+
month_name: '%B',
|
19
|
+
month_name_abbr: '%b',
|
20
|
+
week_iso: '%V',
|
21
|
+
week_monday: '%W',
|
22
|
+
week_sunday: '%U',
|
23
|
+
year: '%Y',
|
24
|
+
yr: '%y',
|
25
|
+
year_abbr: '%y',
|
26
|
+
day: '%B %-d',
|
27
|
+
day_abbr: '%b %-d',
|
28
|
+
day_iso: '%m-%d',
|
29
|
+
month_year: '%m %Y',
|
30
|
+
month_blank_year: '%_m %Y',
|
31
|
+
month_padded_year: '%m %Y',
|
32
|
+
month_unpadded_year: '%-m %Y',
|
33
|
+
month_name_year: '%B %Y',
|
34
|
+
month_name_abbr_year: '%b %Y',
|
35
|
+
week_year_iso: '%V-%G',
|
36
|
+
year_day: '%Y-%m-%d',
|
37
|
+
year_month: '%Y-%m',
|
38
|
+
year_week: '%G-%V',
|
39
|
+
date: '%B %-d, %Y',
|
40
|
+
date_abbr: '%b %-d, %Y',
|
41
|
+
date_iso: '%Y-%m-%d'
|
42
|
+
}.freeze
|
43
|
+
DATE_UNITS ||= {
|
44
|
+
w: 'u',
|
45
|
+
weekday: 'u',
|
46
|
+
ww: 'w',
|
47
|
+
weekday_offset: 'w',
|
48
|
+
www: 'A',
|
49
|
+
weekday_name: 'A',
|
50
|
+
wwww: 'a',
|
51
|
+
weekday_name_abbr: 'a',
|
52
|
+
d: 'd',
|
53
|
+
day: 'd',
|
54
|
+
day_padded: 'd',
|
55
|
+
dd: '-d',
|
56
|
+
Day: '-d',
|
57
|
+
day_unpadded: '-d',
|
58
|
+
ddd: '_d',
|
59
|
+
DAY: '_d',
|
60
|
+
day_blank: '_d',
|
61
|
+
dddd: 'j',
|
62
|
+
day_of_the_year: 'j',
|
63
|
+
m: 'm',
|
64
|
+
month: 'm',
|
65
|
+
month_padded: 'm',
|
66
|
+
mm: '-m',
|
67
|
+
Month: '-m',
|
68
|
+
month_unpadded: '-m',
|
69
|
+
mmm: '_m',
|
70
|
+
MONTH: '_m',
|
71
|
+
month_blank: '_m',
|
72
|
+
mmmm: 'B',
|
73
|
+
month_name: 'B',
|
74
|
+
mmmmm: 'b',
|
75
|
+
month_name_abbr: 'b',
|
76
|
+
swe: 'U',
|
77
|
+
sunday_week: 'U',
|
78
|
+
mwe: 'W',
|
79
|
+
monday_week: 'W',
|
80
|
+
we: 'V',
|
81
|
+
week: 'V',
|
82
|
+
yy: 'y',
|
83
|
+
yr: 'y',
|
84
|
+
year: 'Y',
|
85
|
+
yyyy: 'Y'
|
86
|
+
}.freeze
|
87
|
+
|
88
|
+
def format(string = nil)
|
89
|
+
string ||= default_format
|
90
|
+
delimiters = string.scan(/\W+/)
|
91
|
+
formatters = string.scan(/[a-z0-9_]+/i)
|
92
|
+
string = formatters.map { |key| "%#{format_for(key.to_sym)}#{delimiters.shift}" }
|
93
|
+
strftime(string.join)
|
94
|
+
end
|
95
|
+
|
96
|
+
def stamp(key = nil)
|
97
|
+
key = stamp_for(key&.to_sym || default_stamp)
|
98
|
+
strftime(key)
|
99
|
+
end
|
100
|
+
|
101
|
+
alias to_format stamp
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Lite
|
4
|
+
module Ruby
|
5
|
+
module TimeHelper
|
6
|
+
|
7
|
+
TIME_STAMPS ||= {
|
8
|
+
hour: '%H',
|
9
|
+
hour_blank: '%k',
|
10
|
+
hour_padded: '%H',
|
11
|
+
hour_12: '%I',
|
12
|
+
hour_12_padded: '%I',
|
13
|
+
hour_12_blank: '%l',
|
14
|
+
minute: '%M',
|
15
|
+
second: '%S',
|
16
|
+
ampm: '%P',
|
17
|
+
meridian: '%p',
|
18
|
+
time_zone: '%z',
|
19
|
+
time_zone_offset: '%:z',
|
20
|
+
time_zone_offset_full: '%::z',
|
21
|
+
time_zone_name: '%Z',
|
22
|
+
time: '%H:%M',
|
23
|
+
time_blank: '%k:%M',
|
24
|
+
time_padded: '%H:%M',
|
25
|
+
time_tz: '%H:%M %z',
|
26
|
+
time_tzn: '%H:%M %Z',
|
27
|
+
time_12: '%I:%M %P',
|
28
|
+
time_12_padded: '%I:%M %P',
|
29
|
+
time_12_blank: '%l:%M %P',
|
30
|
+
time_12_tz: '%I:%M %P %z',
|
31
|
+
time_12_tzn: '%I:%M %P %Z',
|
32
|
+
daytime: '%B %-d %H:%M',
|
33
|
+
daytime_abbr: '%b %-d %H:%M',
|
34
|
+
daytime_iso: '%m-%d %H:%M',
|
35
|
+
daytime_12: '%B %-d %I:%M %P',
|
36
|
+
daytime_12_abbr: '%b %-d %I:%M %P',
|
37
|
+
daytime_12_iso: '%m-%d %I:%M %P',
|
38
|
+
datetime: '%B %-d, %Y %H:%M',
|
39
|
+
datetime_abbr: '%b %-d, %Y %H:%M',
|
40
|
+
datetime_iso: '%Y-%m-%d %H:%M',
|
41
|
+
datetime_12: '%B %-d, %Y %I:%M %P',
|
42
|
+
datetime_12_abbr: '%b %-d, %Y %I:%M %P',
|
43
|
+
datetime_12_iso: '%Y-%m-%d %I:%M %P',
|
44
|
+
datetime_tzn: '%B %-d, %Y %H:%M %Z',
|
45
|
+
datetime_abbr_tzn: '%b %-d, %Y %H:%M %Z',
|
46
|
+
datetime_iso_tzn: '%Y-%m-%d %H:%M %z',
|
47
|
+
datetime_12_tzn: '%B %-d, %Y %I:%M %P %Z',
|
48
|
+
datetime_12_abbr_tzn: '%b %-d, %Y %I:%M %P %Z',
|
49
|
+
datetime_12_iso_tzn: '%Y-%m-%d %I:%M %P %z'
|
50
|
+
}.freeze
|
51
|
+
TIME_UNITS = {
|
52
|
+
h: 'H',
|
53
|
+
hour: 'H',
|
54
|
+
hour_padded: 'H',
|
55
|
+
hh: 'k',
|
56
|
+
HOUR: 'k',
|
57
|
+
hour_blank: 'k',
|
58
|
+
hhh: 'I',
|
59
|
+
hour_12: 'I',
|
60
|
+
hour_12_padded: 'I',
|
61
|
+
hhhh: 'l',
|
62
|
+
HOUR_12: 'l',
|
63
|
+
hour_12_blank: 'l',
|
64
|
+
n: 'M',
|
65
|
+
minute: 'M',
|
66
|
+
s: 'S',
|
67
|
+
second: 'S',
|
68
|
+
ampm: 'P',
|
69
|
+
meridian: 'P',
|
70
|
+
AMPM: 'p',
|
71
|
+
MERIDIAN: 'p',
|
72
|
+
z: 'z',
|
73
|
+
time_zone: 'z',
|
74
|
+
zz: ':z',
|
75
|
+
time_zone_offset: ':z',
|
76
|
+
zzz: '::z',
|
77
|
+
time_zone_offset_full: '::z',
|
78
|
+
zzzz: 'Z',
|
79
|
+
time_zone_name: 'Z'
|
80
|
+
}.freeze
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Integer
|
4
|
+
|
5
|
+
ROMAN_NUMERALS ||= {
|
6
|
+
M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4,
|
7
|
+
I: 1
|
8
|
+
}.freeze
|
9
|
+
|
10
|
+
def factorial
|
11
|
+
return 1 if zero?
|
12
|
+
|
13
|
+
2.upto(self).inject(1) { |acc, i| acc * i }
|
14
|
+
end
|
15
|
+
|
16
|
+
def factors
|
17
|
+
limit = Math.sqrt(self).floor
|
18
|
+
|
19
|
+
(1..limit).each_with_object([]) do |i, array|
|
20
|
+
next unless (self % i).zero?
|
21
|
+
|
22
|
+
sq = (self / i)
|
23
|
+
array.push(i)
|
24
|
+
array.push(sq) if sq != i
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def of(&block)
|
29
|
+
Array.new(self, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
def roman_numeral
|
33
|
+
return '' if zero?
|
34
|
+
return "-#{(-self).roman_numeral}" if negative?
|
35
|
+
|
36
|
+
ROMAN_NUMERALS.each { |key, val| break "#{key}#{(self - val).roman_numeral}" if val <= self }
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_time
|
40
|
+
Time.at(self)
|
41
|
+
end
|
42
|
+
|
43
|
+
alias to_t to_time unless defined?(to_t)
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kernel
|
4
|
+
|
5
|
+
# rubocop:disable Lint/RescueException, Security/Eval
|
6
|
+
def safe_eval
|
7
|
+
eval(self)
|
8
|
+
rescue Exception
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def try_eval
|
13
|
+
val = /\[\d*,?\d*,?\d*\]/.match(to_s).to_s
|
14
|
+
return val if val.nil?
|
15
|
+
|
16
|
+
eval(val)
|
17
|
+
end
|
18
|
+
# rubocop:enable Lint/RescueException, Security/Eval
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def caller_name(depth = 0)
|
23
|
+
val = caller[depth][/`([^']*)'/, 1]
|
24
|
+
return val if depth.zero? || !val.include?('<top (required)>')
|
25
|
+
|
26
|
+
caller[depth - 1][/`([^']*)'/, 1]
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,210 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Numeric
|
4
|
+
|
5
|
+
def add(num)
|
6
|
+
self + num
|
7
|
+
end
|
8
|
+
|
9
|
+
# rubocop:disable Metrics/MethodLength
|
10
|
+
def clamp(minimum, maximum = nil)
|
11
|
+
if minimum.is_a?(Range)
|
12
|
+
maximum = minimum.max
|
13
|
+
minimum = minimum.min
|
14
|
+
end
|
15
|
+
|
16
|
+
if minimum > self
|
17
|
+
minimum
|
18
|
+
elsif maximum < self
|
19
|
+
maximum
|
20
|
+
else
|
21
|
+
self
|
22
|
+
end
|
23
|
+
end
|
24
|
+
# rubocop:enable Metrics/MethodLength
|
25
|
+
|
26
|
+
def decrement(amount = 1.0)
|
27
|
+
self - amount
|
28
|
+
end
|
29
|
+
|
30
|
+
def distance(num)
|
31
|
+
(self - num).abs
|
32
|
+
end
|
33
|
+
|
34
|
+
def divide(num)
|
35
|
+
return num if num.zero?
|
36
|
+
|
37
|
+
self / num
|
38
|
+
end
|
39
|
+
|
40
|
+
def equal_to?(num)
|
41
|
+
self == num
|
42
|
+
end
|
43
|
+
|
44
|
+
alias eq? equal_to?
|
45
|
+
|
46
|
+
def fraction
|
47
|
+
(self - truncate).abs
|
48
|
+
end
|
49
|
+
|
50
|
+
def fraction?
|
51
|
+
fraction != 0.0
|
52
|
+
end
|
53
|
+
|
54
|
+
def greater_than?(num)
|
55
|
+
num < self
|
56
|
+
end
|
57
|
+
|
58
|
+
alias gt? greater_than?
|
59
|
+
|
60
|
+
def greater_than_or_equal_to?(num)
|
61
|
+
num <= self
|
62
|
+
end
|
63
|
+
|
64
|
+
alias gteq? greater_than_or_equal_to?
|
65
|
+
|
66
|
+
def increment(amount = 1.0)
|
67
|
+
self + amount
|
68
|
+
end
|
69
|
+
|
70
|
+
def inside?(start, finish)
|
71
|
+
(start < self) && (finish > self)
|
72
|
+
end
|
73
|
+
|
74
|
+
def less_than?(num)
|
75
|
+
num > self
|
76
|
+
end
|
77
|
+
|
78
|
+
alias lt? less_than?
|
79
|
+
|
80
|
+
def less_than_or_equal_to?(num)
|
81
|
+
num >= self
|
82
|
+
end
|
83
|
+
|
84
|
+
alias lteq? less_than_or_equal_to?
|
85
|
+
|
86
|
+
def multiply(num)
|
87
|
+
self * num
|
88
|
+
end
|
89
|
+
|
90
|
+
def multiple_of?(number)
|
91
|
+
return zero? if number.zero?
|
92
|
+
|
93
|
+
modulo(number).zero?
|
94
|
+
end
|
95
|
+
|
96
|
+
def not_equal_to?(num)
|
97
|
+
self != num
|
98
|
+
end
|
99
|
+
|
100
|
+
alias not_eq? not_equal_to?
|
101
|
+
alias inequal_to? not_equal_to?
|
102
|
+
alias ineq? not_equal_to?
|
103
|
+
|
104
|
+
def ordinal
|
105
|
+
return 'th' if (11..13).cover?(abs % 100)
|
106
|
+
|
107
|
+
case abs % 10
|
108
|
+
when 1 then 'st'
|
109
|
+
when 2 then 'nd'
|
110
|
+
when 3 then 'rd'
|
111
|
+
else 'th'
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def ordinalize
|
116
|
+
"#{self}#{ordinal}"
|
117
|
+
end
|
118
|
+
|
119
|
+
def outside?(start, finish)
|
120
|
+
(start > self) || (finish < self)
|
121
|
+
end
|
122
|
+
|
123
|
+
def pad(options = {})
|
124
|
+
pad_number = options[:pad_number] || 0
|
125
|
+
precision = options[:precision] || 3
|
126
|
+
|
127
|
+
to_s.rjust(precision, pad_number.to_s)
|
128
|
+
end
|
129
|
+
|
130
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
131
|
+
# rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity
|
132
|
+
def pad_precision(options = {})
|
133
|
+
pad_number = options[:pad_number] || 0
|
134
|
+
precision = options[:precision] || 2
|
135
|
+
separator = options[:separator] || '.'
|
136
|
+
string = to_s
|
137
|
+
|
138
|
+
string << separator unless string.include?(separator)
|
139
|
+
ljust_count = string.split(separator).first.length
|
140
|
+
ljust_count += (string.count(separator) + precision) if precision.positive?
|
141
|
+
|
142
|
+
if ljust_count >= string.length
|
143
|
+
string.ljust(ljust_count, pad_number.to_s)
|
144
|
+
else
|
145
|
+
string[0..(ljust_count - 1)]
|
146
|
+
end
|
147
|
+
end
|
148
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
149
|
+
# rubocop:enable Metrics/MethodLength, Metrics/PerceivedComplexity
|
150
|
+
|
151
|
+
def percentage_of(number)
|
152
|
+
return 0 if zero? || number.zero?
|
153
|
+
|
154
|
+
(self / number.to_f) * 100.0
|
155
|
+
end
|
156
|
+
|
157
|
+
def power(num)
|
158
|
+
self**num
|
159
|
+
end
|
160
|
+
|
161
|
+
def root(num)
|
162
|
+
self**(1.0 / num)
|
163
|
+
end
|
164
|
+
|
165
|
+
def subtract(num)
|
166
|
+
self - num
|
167
|
+
end
|
168
|
+
|
169
|
+
def to_currency(options = {})
|
170
|
+
unit = options[:unit] || '$'
|
171
|
+
|
172
|
+
"#{unit}#{pad_precision(options.only(:precision))}"
|
173
|
+
end
|
174
|
+
|
175
|
+
def to_nearest_value(values = [])
|
176
|
+
return self if values.length.zero?
|
177
|
+
|
178
|
+
value = values.first
|
179
|
+
difference = (self - value).abs
|
180
|
+
|
181
|
+
values.each do |val|
|
182
|
+
next unless (self - val).abs < difference
|
183
|
+
|
184
|
+
difference = (self - val).abs
|
185
|
+
value = val
|
186
|
+
end
|
187
|
+
|
188
|
+
value
|
189
|
+
end
|
190
|
+
|
191
|
+
def to_percentage(options = {})
|
192
|
+
unit = options[:unit] || '%'
|
193
|
+
|
194
|
+
"#{pad_precision(options.only(:precision))}#{unit}"
|
195
|
+
end
|
196
|
+
|
197
|
+
def within?(number, epsilon = 0.01)
|
198
|
+
return number == self if epsilon.zero?
|
199
|
+
|
200
|
+
alpha = to_f
|
201
|
+
beta = number.to_f
|
202
|
+
|
203
|
+
if alpha.zero? || beta.zero?
|
204
|
+
(alpha - beta).abs < epsilon
|
205
|
+
else
|
206
|
+
(alpha / beta - 1).abs < epsilon
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|