useful_utilities 5.4.5 → 5.4.6
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 +4 -4
- data/lib/useful_utilities/api.rb +10 -1
- data/lib/useful_utilities/ar.rb +67 -4
- data/lib/useful_utilities/centos_version.rb +1 -0
- data/lib/useful_utilities/hash.rb +1 -0
- data/lib/useful_utilities/i18n.rb +3 -0
- data/lib/useful_utilities/numeric.rb +21 -1
- data/lib/useful_utilities/redhat_release.rb +1 -0
- data/lib/useful_utilities/size/bit.rb +33 -8
- data/lib/useful_utilities/size/byte.rb +28 -6
- data/lib/useful_utilities/size/cdn_speed.rb +12 -3
- data/lib/useful_utilities/size/frequency.rb +16 -3
- data/lib/useful_utilities/size/percentage.rb +5 -0
- data/lib/useful_utilities/size/standard/binary.rb +22 -1
- data/lib/useful_utilities/size/standard/decimal.rb +1 -1
- data/lib/useful_utilities/time.rb +63 -9
- data/lib/useful_utilities/version.rb +1 -1
- data/lib/useful_utilities/yaml.rb +1 -1
- metadata +2 -3
- data/README.md +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79bd418ad8787d74738d6fd2b99030e6c698ee1c
|
4
|
+
data.tar.gz: 1f227b9d219366903e323a70b043bf951eb12f6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f09b24ef2b0714e6d53638984f206f04a89335fbdc37df399ae65ee66307b2094684629c0ded231edbd46947a705fcd4a0d3931ee9071a5943e1931c29069905
|
7
|
+
data.tar.gz: 490c74b2afb5ac686e72f145739a29e8af0a5fc6dce80fb38985a3e4880cb8b5b65bcffa3def2626e1be001ed190ab44550b09a7aff3a3ae72a7c2ef378b94d2
|
data/lib/useful_utilities/api.rb
CHANGED
@@ -2,16 +2,25 @@ require 'socket'
|
|
2
2
|
require 'timeout'
|
3
3
|
|
4
4
|
module UsefulUtilities
|
5
|
+
# API utilities
|
5
6
|
module Api
|
6
7
|
extend self
|
7
8
|
|
9
|
+
# @note Exceptions to handle
|
10
|
+
# @see #port_open?
|
8
11
|
RESCUE_PORT_OPEN_EXCEPTIONS = [Errno::ENETUNREACH, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, SocketError, Timeout::Error].freeze
|
9
12
|
|
13
|
+
# @param value [Numeric]
|
14
|
+
# @return [FalseClass/Numeric] false if value is infinity or value if not
|
10
15
|
def convert_limit(value)
|
11
16
|
value == Float::INFINITY ? false : value
|
12
17
|
end
|
13
18
|
|
14
|
-
#
|
19
|
+
# @param ip [String]
|
20
|
+
# @param port [Integer]
|
21
|
+
# @option sleep_time [Integer] :sleep_time (1)
|
22
|
+
# @option max_attempts [Integer] :max_attempts (3)
|
23
|
+
# @return [Boolean] check if a port is open or not on a remote host
|
15
24
|
def port_open?(ip, port, sleep_time: 1, max_attempts: 3)
|
16
25
|
try_to(max_attempts: max_attempts, sleep_time: sleep_time, rescue_what: RESCUE_PORT_OPEN_EXCEPTIONS) do
|
17
26
|
Timeout::timeout(sleep_time) do
|
data/lib/useful_utilities/ar.rb
CHANGED
@@ -2,8 +2,14 @@ require 'active_record'
|
|
2
2
|
require 'active_support/all'
|
3
3
|
|
4
4
|
module UsefulUtilities
|
5
|
+
# ActiveRecord utilities
|
5
6
|
module AR
|
7
|
+
|
8
|
+
# Includable AR extension
|
9
|
+
# To use it include this module to your model
|
6
10
|
module Methods
|
11
|
+
# @param association_class [Class]
|
12
|
+
# @return [String] foreign key
|
7
13
|
def foreign_key(association_class)
|
8
14
|
reflections.values.find do |reflection|
|
9
15
|
reflection.class_name == association_class.name
|
@@ -18,6 +24,8 @@ module UsefulUtilities
|
|
18
24
|
TYPE_SUFFIX = '%s_type'
|
19
25
|
ID_SUFFIX = '%s_id'
|
20
26
|
|
27
|
+
# @param value
|
28
|
+
# @return [Integer] value as Integer
|
21
29
|
def value_to_integer(value)
|
22
30
|
return 0 if value.nil?
|
23
31
|
return 0 if value == false
|
@@ -26,27 +34,41 @@ module UsefulUtilities
|
|
26
34
|
ActiveRecord::Type::Integer.new.type_cast_from_database(value)
|
27
35
|
end
|
28
36
|
|
37
|
+
# @param value
|
38
|
+
# @return [BigDecimal] value as BigDecimal
|
29
39
|
def value_to_decimal(value)
|
30
40
|
return BigDecimal.new(0) if value.nil?
|
31
41
|
|
32
42
|
ActiveRecord::Type::Decimal.new.type_cast_from_database(value)
|
33
43
|
end
|
34
44
|
|
45
|
+
# @param value
|
46
|
+
# @return [Boolean] value as boolean
|
35
47
|
def value_to_boolean(value)
|
36
48
|
return false if value.nil?
|
37
49
|
|
38
50
|
ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
|
39
51
|
end
|
40
52
|
|
53
|
+
# @param value
|
54
|
+
# @return [Float] value as float
|
55
|
+
# @example
|
56
|
+
# UsefulUtilities::AR.boolean_to_float(false) #=> 0.0
|
57
|
+
# UsefulUtilities::AR.boolean_to_float(true) #=> 1.0
|
41
58
|
def boolean_to_float(value)
|
42
59
|
value ? 1.0 : 0.0
|
43
60
|
end
|
44
61
|
|
62
|
+
# @param record
|
63
|
+
# Validates record and associations
|
45
64
|
def deep_validation(record)
|
46
65
|
record.valid?
|
47
66
|
nested_associations_validation(record)
|
48
67
|
end
|
49
68
|
|
69
|
+
# @param record
|
70
|
+
# @param nested [Boolean]
|
71
|
+
# Validates nested associations of a record
|
50
72
|
def nested_associations_validation(record, nested = false)
|
51
73
|
record.class.reflections.each do |name, reflection|
|
52
74
|
next unless NESTED_ASSOCIATIONS.include?(reflection.macro)
|
@@ -63,12 +85,19 @@ module UsefulUtilities
|
|
63
85
|
end
|
64
86
|
end
|
65
87
|
|
88
|
+
# @param scope [ActiveRecord::Relation]
|
89
|
+
# @param key [Symbol]
|
90
|
+
# @param value value to search
|
91
|
+
# @return [ActiveRecord::Relation]
|
66
92
|
def by_polymorphic(scope, key, value)
|
67
93
|
type = to_polymorphic_type(value)
|
68
94
|
type_column, id_column = TYPE_SUFFIX % key, ID_SUFFIX % key
|
69
95
|
scope.where(type_column => type, id_column => value)
|
70
96
|
end
|
71
97
|
|
98
|
+
# @param value
|
99
|
+
# @return value if value does not respond to base_class
|
100
|
+
# @return [Class] base class
|
72
101
|
def to_polymorphic_type(value)
|
73
102
|
klass =
|
74
103
|
if value.is_a?(Class) || value.nil? then value
|
@@ -79,23 +108,37 @@ module UsefulUtilities
|
|
79
108
|
klass.respond_to?(:base_class) ? klass.base_class : klass
|
80
109
|
end
|
81
110
|
|
111
|
+
# @param klass [Class]
|
112
|
+
# @param columns list of columns
|
113
|
+
# @return [String] qualified columns splitted by comma
|
82
114
|
def [](klass, *columns)
|
83
115
|
columns.map { |column| "#{ klass.table_name }.#{ column }" }.join(', ')
|
84
116
|
end
|
85
117
|
|
118
|
+
# @param klass [Class]
|
119
|
+
# @param column [String/Symbol]
|
120
|
+
# @return [String] ASC statement for ORDER BY
|
86
121
|
def asc(klass, column)
|
87
122
|
"#{ self[klass, column] } ASC"
|
88
123
|
end
|
89
124
|
|
125
|
+
# @param klass [Class]
|
126
|
+
# @param column [String/Symbol]
|
127
|
+
# @return [String] DESC statement for ORDER BY
|
90
128
|
def desc(klass, column)
|
91
129
|
"#{ self[klass, column] } DESC"
|
92
130
|
end
|
93
131
|
|
132
|
+
# @param scope [ActiveRecord::Relation]
|
133
|
+
# @param _value class or column
|
134
|
+
# @return [ActiveRecord::Relation]
|
94
135
|
def older_than(scope, _value)
|
95
136
|
value = _value.is_a?(ActiveRecord::Base) ? _value.id : _value
|
96
137
|
value.present? ? scope.where("#{ self[scope, :id] } < ?", value) : scope
|
97
138
|
end
|
98
139
|
|
140
|
+
# @param args list of columns
|
141
|
+
# @return COALESCE statement
|
99
142
|
def null_to_zero(*args)
|
100
143
|
sql_column =
|
101
144
|
case args.size
|
@@ -108,14 +151,21 @@ module UsefulUtilities
|
|
108
151
|
"COALESCE(#{ sql_column }, 0)"
|
109
152
|
end
|
110
153
|
|
154
|
+
# @param value
|
155
|
+
# @return CEILING statement
|
111
156
|
def ceil(value)
|
112
157
|
"CEILING(#{value})"
|
113
158
|
end
|
114
159
|
|
160
|
+
# @param args
|
161
|
+
# @param result alias
|
162
|
+
# @return SUM statement
|
115
163
|
def sql_sum(*args, result)
|
116
164
|
"SUM(#{ null_to_zero(*args) }) AS #{ result }"
|
117
165
|
end
|
118
166
|
|
167
|
+
# @param scope [ActiveRecord::Relation]
|
168
|
+
# @param all_columns list of columns
|
119
169
|
# Can be used for not NULL columns only
|
120
170
|
# sum_by_columns(Virtual, :column_1, :column2, column3: :column3_alias...)
|
121
171
|
def sum_by_columns(scope, *all_columns)
|
@@ -123,16 +173,29 @@ module UsefulUtilities
|
|
123
173
|
columns_with_aliases = columns.extract_options!
|
124
174
|
|
125
175
|
sql_query =
|
126
|
-
columns.reduce(columns_with_aliases)
|
127
|
-
|
176
|
+
columns.reduce(columns_with_aliases) do |res, column|
|
177
|
+
res.merge!(column => column)
|
178
|
+
end.
|
179
|
+
map do |column, column_alias|
|
180
|
+
"COALESCE(SUM(#{ column }), 0) AS #{ column_alias }"
|
181
|
+
end.
|
182
|
+
join(', ')
|
128
183
|
|
129
184
|
scope.select(sql_query).first
|
130
185
|
end
|
131
186
|
|
132
|
-
|
133
|
-
|
187
|
+
# @param klass [Class]
|
188
|
+
# @param column [String/Symbol]
|
189
|
+
# @param result [String/Symbol] alias
|
190
|
+
# @return [String] count statement
|
191
|
+
def count(klass, column, result)
|
192
|
+
"COUNT(#{ self[klass, column] }) AS #{ result }"
|
134
193
|
end
|
135
194
|
|
195
|
+
# @param owner
|
196
|
+
# @param self_class [Class]
|
197
|
+
# @param dependent_class [Class]
|
198
|
+
# Deletes dependent records
|
136
199
|
def delete_dependents(owner, self_class, dependent_class)
|
137
200
|
dependent_fk = dependent_class.foreign_key(self_class)
|
138
201
|
self_fk = self_class.foreign_key(owner.class)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module UsefulUtilities
|
2
|
+
# Numeric utilities
|
2
3
|
module Numeric
|
3
4
|
extend self
|
4
5
|
|
@@ -7,21 +8,33 @@ module UsefulUtilities
|
|
7
8
|
MILLION = 1_000_000
|
8
9
|
BILLION = 1_000_000_000
|
9
10
|
|
11
|
+
# @param value [Numeric]
|
12
|
+
# @return [Numeric]
|
13
|
+
# @example
|
14
|
+
# UsefulUtilities::Numeric.positive_or_zero(1) #=> 1
|
15
|
+
# UsefulUtilities::Numeric.positive_or_zero(-1) #=> 0
|
10
16
|
def positive_or_zero(value)
|
11
17
|
(value > ZERO) ? value : ZERO
|
12
18
|
end
|
13
19
|
|
20
|
+
# @param value [Numeric]
|
21
|
+
# @return [Numeric] value if value can not be coerced to integer
|
14
22
|
def float_or_integer(value)
|
15
23
|
value == value.to_i ? value.to_i : value
|
16
24
|
end
|
17
25
|
|
26
|
+
# @param value [Numeric]
|
27
|
+
# @option scale [Integer] :scale (nil)
|
28
|
+
# @return [BigDecimal] value as BigDecimale rounded to scale
|
18
29
|
def to_decimal(value, scale: nil)
|
19
30
|
result = value.to_f.to_d
|
20
31
|
|
21
32
|
scale ? result.round(scale) : result
|
22
33
|
end
|
23
34
|
|
24
|
-
# @
|
35
|
+
# @param value [Numeric]
|
36
|
+
# @param unit [Symbol]
|
37
|
+
# @return [Numeric] value converted to kilo
|
25
38
|
def to_kilo(value, unit)
|
26
39
|
if unit == :M then value * THOUSAND
|
27
40
|
elsif unit == :G then value * MILLION
|
@@ -29,6 +42,9 @@ module UsefulUtilities
|
|
29
42
|
end
|
30
43
|
end
|
31
44
|
|
45
|
+
# @param value [Numeric]
|
46
|
+
# @param unit [Symbol]
|
47
|
+
# @return [Numeric] value converted to giga
|
32
48
|
def to_giga(value, unit)
|
33
49
|
if unit == :k then value.fdiv(MILLION)
|
34
50
|
elsif unit == :M then value.fdiv(THOUSAND)
|
@@ -36,6 +52,10 @@ module UsefulUtilities
|
|
36
52
|
end
|
37
53
|
end
|
38
54
|
|
55
|
+
|
56
|
+
# @param value [Numeric]
|
57
|
+
# @param unit [Symbol]
|
58
|
+
# @return [Numeric] value converted to number
|
39
59
|
def to_number(value, unit)
|
40
60
|
if unit == :M then value * MILLION
|
41
61
|
elsif unit == :G then value * BILLION
|
@@ -2,35 +2,57 @@ require_relative 'standard/decimal'
|
|
2
2
|
|
3
3
|
module UsefulUtilities
|
4
4
|
module Size
|
5
|
+
# Possible units:
|
6
|
+
# :bit - bits
|
7
|
+
# :kbit - kilobits
|
8
|
+
# :Mbit - megabits
|
9
|
+
# :Gbit - gigabits
|
10
|
+
# :Tbit - terabits
|
11
|
+
# Used SI standard http://en.wikipedia.org/wiki/Binary_prefix
|
12
|
+
# Decimal
|
13
|
+
# 1 K = 1000
|
5
14
|
module Bit
|
6
|
-
# @note: used SI standard http://en.wikipedia.org/wiki/Binary_prefix
|
7
|
-
# Decimal
|
8
|
-
# 1 K = 1000
|
9
15
|
include UsefulUtilities::Size::Standard::Decimal
|
10
16
|
|
17
|
+
# @param size [Numeric]
|
18
|
+
# @param unit [Symbol]
|
19
|
+
# @return [Numeric] size in terabits
|
11
20
|
def to_terabits(size, unit)
|
12
21
|
to_tera(size, bit_prefix(unit))
|
13
22
|
end
|
14
23
|
|
24
|
+
# @param size [Numeric]
|
25
|
+
# @param unit [Symbol]
|
26
|
+
# @return [Numeric] size in gigabits
|
15
27
|
def to_gigabits(size, unit)
|
16
28
|
to_giga(size, bit_prefix(unit))
|
17
29
|
end
|
18
30
|
|
31
|
+
# @param size [Numeric]
|
32
|
+
# @param unit [Symbol]
|
33
|
+
# @return [Numeric] size in megabits
|
19
34
|
def to_megabits(size, unit)
|
20
35
|
to_mega(size, bit_prefix(unit))
|
21
36
|
end
|
22
37
|
|
38
|
+
# @param size [Numeric]
|
39
|
+
# @param unit [Symbol]
|
40
|
+
# @return [Numeric] size in kilobits
|
23
41
|
def to_kilobits(size, unit)
|
24
42
|
to_kilo(size, bit_prefix(unit))
|
25
43
|
end
|
26
44
|
|
45
|
+
# @param size [Numeric]
|
46
|
+
# @param unit [Symbol]
|
47
|
+
# @return [Numeric] size in bits
|
27
48
|
def to_bits(size, unit)
|
28
49
|
to_decimal_bi(size, bit_prefix(unit))
|
29
50
|
end
|
30
51
|
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
52
|
+
# @param size [Numeric]
|
53
|
+
# @param unit [Symbol]
|
54
|
+
# @param rounder [Integer]
|
55
|
+
# @return [Numeric] humanized size in provided unit
|
34
56
|
def bits_to_human_size(size, unit, rounder = 3)
|
35
57
|
case unit
|
36
58
|
when :bit then size.round(rounder)
|
@@ -42,8 +64,9 @@ module UsefulUtilities
|
|
42
64
|
end
|
43
65
|
end
|
44
66
|
|
45
|
-
#
|
46
|
-
#
|
67
|
+
# @param value [Integer]
|
68
|
+
# @return [Symbol] suitable unit
|
69
|
+
# @raise [ArgumentError] if value is not integer or less than zero
|
47
70
|
def suitable_unit_for_bits(value)
|
48
71
|
return not_integer!(value) unless value.is_a?(Integer)
|
49
72
|
return not_positive_integer!(value) unless value > -1
|
@@ -56,6 +79,8 @@ module UsefulUtilities
|
|
56
79
|
end
|
57
80
|
end
|
58
81
|
|
82
|
+
# @param value_in_bits [Integer] value in bits
|
83
|
+
# @return [String] human readable value
|
59
84
|
def bits_per_sec_to_human_readable(value_in_bits)
|
60
85
|
unit = suitable_unit_for_bits(value_in_bits)
|
61
86
|
value = bits_to_human_size(value_in_bits, unit.to_sym)
|
@@ -2,26 +2,44 @@ require_relative 'standard/binary'
|
|
2
2
|
|
3
3
|
module UsefulUtilities
|
4
4
|
module Size
|
5
|
+
# Possible units:
|
6
|
+
# :B - bytes
|
7
|
+
# :KB - kilobytes
|
8
|
+
# :MB - megabytes
|
9
|
+
# :GB - gigabytes
|
10
|
+
# :TB - terabytes
|
11
|
+
# Used ISO standard http://en.wikipedia.org/wiki/Binary_prefix
|
12
|
+
# Binary
|
13
|
+
# 1 K = 1024
|
5
14
|
module Byte
|
6
|
-
# @note: used ISO standard http://en.wikipedia.org/wiki/Binary_prefix
|
7
|
-
# Binary
|
8
|
-
# 1 K = 1024
|
9
15
|
include UsefulUtilities::Size::Standard::Binary
|
10
16
|
|
11
17
|
HALF_OF_SECTOR = 0.5
|
12
18
|
|
19
|
+
# @param size [Numeric]
|
20
|
+
# @param unit [Symbol]
|
21
|
+
# @return [Numeric] size in terabytes
|
13
22
|
def to_terabytes(size, unit)
|
14
23
|
to_tebi(size, byte_prefix(unit))
|
15
24
|
end
|
16
25
|
|
26
|
+
# @param size [Numeric]
|
27
|
+
# @param unit [Symbol]
|
28
|
+
# @return [Numeric] size in gigabytes
|
17
29
|
def to_gigabytes(size, unit)
|
18
30
|
to_gibi(size, byte_prefix(unit))
|
19
31
|
end
|
20
32
|
|
33
|
+
# @param size [Numeric]
|
34
|
+
# @param unit [Symbol]
|
35
|
+
# @return [Numeric] size in megabytes
|
21
36
|
def to_megabytes(size, unit)
|
22
37
|
to_mebi(size, byte_prefix(unit))
|
23
38
|
end
|
24
39
|
|
40
|
+
# @param size [Numeric]
|
41
|
+
# @param unit [Symbol]
|
42
|
+
# @return [Numeric] size in kilobytes
|
25
43
|
def to_kilobytes(size, unit)
|
26
44
|
if unit == :sector
|
27
45
|
return (size * HALF_OF_SECTOR).round # http://en.wikipedia.org/wiki/Disk_sector
|
@@ -30,13 +48,17 @@ module UsefulUtilities
|
|
30
48
|
to_kibi(size, byte_prefix(unit))
|
31
49
|
end
|
32
50
|
|
51
|
+
# @param size [Numeric]
|
52
|
+
# @param unit [Symbol]
|
53
|
+
# @return [Numeric] size in bytes
|
33
54
|
def to_bytes(size, unit)
|
34
55
|
to_binary_bi(size, byte_prefix(unit))
|
35
56
|
end
|
36
57
|
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
58
|
+
# @param size [Numeric]
|
59
|
+
# @param unit [Symbol]
|
60
|
+
# @param rounder [Integer]
|
61
|
+
# @return [Numeric] humanized size in provided unit
|
40
62
|
def bytes_to_human_size(size, unit, rounder = 3)
|
41
63
|
case unit
|
42
64
|
when :B then size.round(rounder)
|
@@ -2,12 +2,21 @@ require_relative 'standard/decimal'
|
|
2
2
|
|
3
3
|
module UsefulUtilities
|
4
4
|
module Size
|
5
|
+
# Possible units:
|
6
|
+
# :bit - bits
|
7
|
+
# :kbit - kilobits
|
8
|
+
# :Mbit - megabits
|
9
|
+
# :Gbit - gigabits
|
10
|
+
# :Tbit - terabits
|
11
|
+
# Used SI standard http://en.wikipedia.org/wiki/Binary_prefix
|
12
|
+
# Decimal
|
13
|
+
# 1 K = 1000
|
5
14
|
module CdnSpeed
|
6
|
-
# @note: used SI standard http://en.wikipedia.org/wiki/Binary_prefix
|
7
|
-
# Decimal
|
8
|
-
# 1 K = 1000
|
9
15
|
include UsefulUtilities::Size::Standard::Decimal
|
10
16
|
|
17
|
+
# @param speed [Numeric]
|
18
|
+
# @param unit [Symbol]
|
19
|
+
# @return [Numeric] size in CDN gigabits per second
|
11
20
|
def to_cdn_gbps(speed, unit)
|
12
21
|
to_giga(speed, bit_prefix(unit))/8
|
13
22
|
end
|
@@ -2,16 +2,29 @@ require_relative 'standard/decimal'
|
|
2
2
|
|
3
3
|
module UsefulUtilities
|
4
4
|
module Size
|
5
|
+
# Frequency utilities
|
6
|
+
# Possible units:
|
7
|
+
# :Hz - hertz
|
8
|
+
# :KHz - kilohertz
|
9
|
+
# :MHz - megahertz
|
10
|
+
# :GHz - gigahertz
|
11
|
+
# :THz - terahertz
|
12
|
+
# Used SI standard http://en.wikipedia.org/wiki/Binary_prefix
|
13
|
+
# Decimal
|
14
|
+
# 1 K = 1000
|
5
15
|
module Frequency
|
6
|
-
# @note: used SI standard http://en.wikipedia.org/wiki/Binary_prefix
|
7
|
-
# Decimal
|
8
|
-
# 1 K = 1000
|
9
16
|
include UsefulUtilities::Size::Standard::Decimal
|
10
17
|
|
18
|
+
# @param size [Numeric]
|
19
|
+
# @param unit [Symbol]
|
20
|
+
# @return [Numeric] size in megahertz
|
11
21
|
def to_megahertz(size, unit)
|
12
22
|
to_mega(size, frequency_prefix(unit))
|
13
23
|
end
|
14
24
|
|
25
|
+
# @param size [Numeric]
|
26
|
+
# @param unit [Symbol]
|
27
|
+
# @return [Numeric] size in gigahertz
|
15
28
|
def to_gigahertz(size, unit)
|
16
29
|
to_giga(size, frequency_prefix(unit))
|
17
30
|
end
|
@@ -1,12 +1,17 @@
|
|
1
1
|
module UsefulUtilities
|
2
2
|
module Size
|
3
|
+
# Percentage utilities
|
3
4
|
module Percentage
|
4
5
|
HUNDRED = 100
|
5
6
|
|
7
|
+
# @param fraction [Numeric]
|
8
|
+
# @return [Numeric] fraction converted to percentage
|
6
9
|
def fraction_to_percentage(fraction)
|
7
10
|
fraction * HUNDRED
|
8
11
|
end
|
9
12
|
|
13
|
+
# @param percentage [Numeric]
|
14
|
+
# @return [Float] percentage converted to fraction
|
10
15
|
def percentage_to_fraction(percentage)
|
11
16
|
percentage.fdiv(HUNDRED)
|
12
17
|
end
|
@@ -1,14 +1,23 @@
|
|
1
1
|
module UsefulUtilities
|
2
2
|
module Size
|
3
3
|
module Standard
|
4
|
+
# Possible prefixes:
|
5
|
+
# :B - bytes
|
6
|
+
# :KiB - kibibytes
|
7
|
+
# :MiB - mebibytes
|
8
|
+
# :GiB - gibibytes
|
9
|
+
# :TiB - tebibytes
|
10
|
+
# Used ISO standard http://en.wikipedia.org/wiki/Binary_prefix
|
4
11
|
module Binary
|
5
|
-
# @note: used ISO standard http://en.wikipedia.org/wiki/Binary_prefix
|
6
12
|
|
7
13
|
KIBI = 1024 # KiB
|
8
14
|
MEBI = KIBI ** 2 # MiB
|
9
15
|
GIBI = KIBI ** 3 # GiB
|
10
16
|
TEBI = KIBI ** 4 # TiB
|
11
17
|
|
18
|
+
# @param val [Numeric]
|
19
|
+
# @param prefix [Symbol]
|
20
|
+
# @return [Numeric] val in tebibytes
|
12
21
|
def to_tebi(val, prefix)
|
13
22
|
case prefix
|
14
23
|
when :B then val.fdiv(TEBI)
|
@@ -20,6 +29,9 @@ module UsefulUtilities
|
|
20
29
|
end
|
21
30
|
end
|
22
31
|
|
32
|
+
# @param val [Numeric]
|
33
|
+
# @param prefix [Symbol]
|
34
|
+
# @return [Numeric] val in gibibytes
|
23
35
|
def to_gibi(val, prefix)
|
24
36
|
case prefix
|
25
37
|
when :B then val.fdiv(GIBI)
|
@@ -31,6 +43,9 @@ module UsefulUtilities
|
|
31
43
|
end
|
32
44
|
end
|
33
45
|
|
46
|
+
# @param val [Numeric]
|
47
|
+
# @param prefix [Symbol]
|
48
|
+
# @return [Numeric] val in mebibytes
|
34
49
|
def to_mebi(val, prefix)
|
35
50
|
case prefix
|
36
51
|
when :B then val.fdiv(MEBI)
|
@@ -42,6 +57,9 @@ module UsefulUtilities
|
|
42
57
|
end
|
43
58
|
end
|
44
59
|
|
60
|
+
# @param val [Numeric]
|
61
|
+
# @param prefix [Symbol]
|
62
|
+
# @return [Numeric] val in kibibytes
|
45
63
|
def to_kibi(val, prefix)
|
46
64
|
case prefix
|
47
65
|
when :B then val.fdiv(KIBI)
|
@@ -53,6 +71,9 @@ module UsefulUtilities
|
|
53
71
|
end
|
54
72
|
end
|
55
73
|
|
74
|
+
# @param val [Numeric]
|
75
|
+
# @param prefix [Symbol]
|
76
|
+
# @return [Numeric] val in bytes
|
56
77
|
def to_binary_bi(val, prefix)
|
57
78
|
case prefix
|
58
79
|
when :B then val
|
@@ -1,40 +1,66 @@
|
|
1
1
|
require 'active_support/all'
|
2
2
|
|
3
3
|
module UsefulUtilities
|
4
|
+
# Utilities for time
|
5
|
+
|
6
|
+
# @author OnApp Ltd.
|
4
7
|
module Time
|
5
8
|
extend self
|
6
9
|
|
7
10
|
SECONDS_IN_HOUR = 3_600
|
8
11
|
MILLISECONDS_IN_SECOND = 1_000
|
9
12
|
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
+
# @param time [Time]
|
14
|
+
# @return [DateTime] time in UTC
|
15
|
+
# @example
|
16
|
+
# time #=> 2013-12-19 14:01:22 +0200
|
17
|
+
#
|
18
|
+
# UsefulUtilities::Time.assume_utc(time) #=> 2013-12-19 14:01:22 UTC
|
13
19
|
def assume_utc(time)
|
14
20
|
time.to_datetime.change(offset: 0)
|
15
21
|
end
|
16
22
|
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
23
|
+
# @param time [Time]
|
24
|
+
# @return [Time] time rounded to hours
|
25
|
+
# @example
|
26
|
+
# time #=> 2014-01-04 14:29:59
|
27
|
+
#
|
28
|
+
# UsefulUtilities::Time.round_to_hours(time) #=> 2014-01-04 14:00:00
|
20
29
|
def round_to_hours(time)
|
21
30
|
(time.min < 30) ? time.beginning_of_hour : time.end_of_hour
|
22
31
|
end
|
23
32
|
|
33
|
+
# @param time [Time]
|
34
|
+
# @return [Time] beginning of the next hour
|
35
|
+
# @example
|
36
|
+
# time #=> 2018-03-07 15:51:58 +0200
|
37
|
+
# UsefulUtilities::Time.beginning_of_next_hour(time) #=> 2018-03-07 16:00:00 +0200
|
24
38
|
def beginning_of_next_hour(time)
|
25
39
|
time.beginning_of_hour.in(1.hour)
|
26
40
|
end
|
27
41
|
|
42
|
+
# @param time [Time]
|
43
|
+
# @return [Time] beginning of the next day
|
44
|
+
# @example
|
45
|
+
# time #=> 2018-03-07 15:51:58 +0200
|
46
|
+
# UsefulUtilities::Time.beginning_of_next_day(time) #=> 2018-03-08 00:00:00 +0200
|
28
47
|
def beginning_of_next_day(time)
|
29
48
|
time.beginning_of_day.in(1.day)
|
30
49
|
end
|
31
50
|
|
51
|
+
# @param time [Time]
|
52
|
+
# @return [Time] beginning of the next month
|
53
|
+
# @example
|
54
|
+
# time #=> 2018-03-07 15:51:58 +0200
|
55
|
+
# UsefulUtilities::Time.beginning_of_next_month(time) #=> 2018-04-01 00:00:00 +0300
|
32
56
|
def beginning_of_next_month(time)
|
33
57
|
time.beginning_of_month.in(1.month)
|
34
58
|
end
|
35
59
|
|
36
|
-
#
|
37
|
-
#
|
60
|
+
# @param from [Time]
|
61
|
+
# @param till [Time]
|
62
|
+
# Yields local time of the beginning of each hour
|
63
|
+
# between from & till
|
38
64
|
def each_hour_from(from, till = ::Time.now)
|
39
65
|
cursor = from.dup.utc.beginning_of_hour
|
40
66
|
end_time = till.dup.utc.beginning_of_hour
|
@@ -46,6 +72,10 @@ module UsefulUtilities
|
|
46
72
|
end
|
47
73
|
end
|
48
74
|
|
75
|
+
# @param from [Time]
|
76
|
+
# @param till [Time]
|
77
|
+
# Yields local time of the beginning of each day
|
78
|
+
# between from & till
|
49
79
|
def each_day_from(from, till = ::Time.now)
|
50
80
|
cursor = from.beginning_of_day
|
51
81
|
end_time = till.beginning_of_day
|
@@ -57,9 +87,19 @@ module UsefulUtilities
|
|
57
87
|
end
|
58
88
|
end
|
59
89
|
|
90
|
+
# @param time_string [String] string to parse from
|
91
|
+
# @param time_zone [String] timezone
|
92
|
+
# @return [DateTime] parsed time in UTC
|
93
|
+
#
|
60
94
|
# Parse and convert Time to the given time zone. If time zone is
|
61
95
|
# not given, Time is assumed to be given in UTC. Returns result in
|
62
96
|
# UTC
|
97
|
+
#
|
98
|
+
# @example
|
99
|
+
# time_string #=> "2018-03-07 15:51:58 +0200"
|
100
|
+
# time_zone #=> "EET"
|
101
|
+
#
|
102
|
+
# UsefulUtilities::Time.to_utc(time_string, time_zone) #=> Wed, 07 Mar 2018 13:51:58 +0000
|
63
103
|
def to_utc(time_string, time_zone)
|
64
104
|
time = ::DateTime.parse(time_string) # Wed, 22 Aug 2012 13:34:18 +0000
|
65
105
|
rescue
|
@@ -74,15 +114,29 @@ module UsefulUtilities
|
|
74
114
|
end
|
75
115
|
end
|
76
116
|
|
117
|
+
# @param time [Time]
|
118
|
+
# @return [Integer] time in milliseconds
|
119
|
+
# @example
|
120
|
+
# time #=> 2018-03-07 15:51:58 +0200
|
121
|
+
# UsefulUtilities::Time.to_milliseconds(time) #=> 1520430718000
|
77
122
|
def to_milliseconds(time)
|
78
123
|
time.to_time.to_i * MILLISECONDS_IN_SECOND
|
79
124
|
end
|
80
125
|
|
81
|
-
#
|
126
|
+
# @param end_time [Time] end time
|
127
|
+
# @param start_time [Time] start time
|
128
|
+
# @return [Integer] difference in hours
|
129
|
+
# @example
|
130
|
+
# end_time #=> 2018-03-07 14:51:58 +0200
|
131
|
+
# start_time #=> 2018-03-07 15:51:58 +0200
|
132
|
+
#
|
133
|
+
# UsefulUtilities::Time.diff_in_hours(end_time, start_time) #=> 1
|
82
134
|
def diff_in_hours(end_time, start_time)
|
83
135
|
((end_time.to_i - start_time.to_i) / SECONDS_IN_HOUR).abs
|
84
136
|
end
|
85
137
|
|
138
|
+
# @param date [Date]
|
139
|
+
# @return [Boolean] checks if date is valid
|
86
140
|
def valid_date?(date)
|
87
141
|
return true if date.acts_like?(:date)
|
88
142
|
return false if date.blank?
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: useful_utilities
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.4.
|
4
|
+
version: 5.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OnApp Ltd.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -101,7 +101,6 @@ executables: []
|
|
101
101
|
extensions: []
|
102
102
|
extra_rdoc_files: []
|
103
103
|
files:
|
104
|
-
- README.md
|
105
104
|
- Rakefile
|
106
105
|
- lib/useful_utilities.rb
|
107
106
|
- lib/useful_utilities/api.rb
|
data/README.md
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
## UsefulUtilities
|
2
|
-
|
3
|
-
A collection of useful utilities
|
4
|
-
|
5
|
-
This package include next tools with new namespaces:
|
6
|
-
|
7
|
-
Api Utilities => UsefulUtilities::Api
|
8
|
-
AR Utilities => UsefulUtilities::AR
|
9
|
-
Hash Utilities => UsefulUtilities::Hash
|
10
|
-
Size Utilities => UsefulUtilities::Size
|
11
|
-
Numeric Utilities => UsefulUtilities::Numeric
|
12
|
-
Time Utilities => UsefulUtilities::Time
|
13
|
-
YAML Utilities => UsefulUtilities::YAML
|
14
|
-
I18n Utilities => UsefulUtilities::I18n
|