nobiru 0.0.1
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/.coveralls.yml +1 -0
- data/.gitignore +14 -0
- data/.rspec +4 -0
- data/.travis.yml +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +646 -0
- data/Rakefile +1 -0
- data/lib/nobiru/extensions/array_extension.rb +15 -0
- data/lib/nobiru/extensions/enumerable_extension.rb +141 -0
- data/lib/nobiru/extensions/hash_extension.rb +70 -0
- data/lib/nobiru/extensions/numeric_extension.rb +102 -0
- data/lib/nobiru/extensions/object_extension.rb +29 -0
- data/lib/nobiru/extensions/string_extension.rb +183 -0
- data/lib/nobiru/extensions/time_extension.rb +166 -0
- data/lib/nobiru/version.rb +3 -0
- data/lib/nobiru.rb +8 -0
- data/nobiru.gemspec +25 -0
- data/spec/lib/array_extension_spec.rb +27 -0
- data/spec/lib/enumerable_extension_spec.rb +219 -0
- data/spec/lib/hash_extension_spec.rb +80 -0
- data/spec/lib/numeric_extension_spec.rb +171 -0
- data/spec/lib/object_extension_spec.rb +79 -0
- data/spec/lib/string_extension_spec.rb +271 -0
- data/spec/lib/time_extension_spec.rb +471 -0
- data/spec/spec_helper.rb +4 -0
- metadata +134 -0
@@ -0,0 +1,141 @@
|
|
1
|
+
module Enumerable
|
2
|
+
|
3
|
+
unless method_defined?(:sum)
|
4
|
+
def sum(identity=0)
|
5
|
+
inject(:+) || identity
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def drop_last(n)
|
10
|
+
array = to_a
|
11
|
+
|
12
|
+
return array if n > array.size
|
13
|
+
array[0...(array.size - n)]
|
14
|
+
end
|
15
|
+
|
16
|
+
def drop_last_while
|
17
|
+
return to_enum(:drop_last_while) unless block_given?
|
18
|
+
|
19
|
+
result = []
|
20
|
+
dropping = true
|
21
|
+
reverse_each do |value|
|
22
|
+
result.unshift(value) unless dropping &&= yield(value)
|
23
|
+
end
|
24
|
+
result
|
25
|
+
end
|
26
|
+
|
27
|
+
def exactly?(n)
|
28
|
+
found_count = 0
|
29
|
+
|
30
|
+
if block_given?
|
31
|
+
each do |*o|
|
32
|
+
found_count += 1 if yield(*o)
|
33
|
+
end
|
34
|
+
else
|
35
|
+
each do |o|
|
36
|
+
found_count += 1 if o
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
(found_count > n) ? false : n == found_count
|
41
|
+
end
|
42
|
+
|
43
|
+
def frequencies
|
44
|
+
each_with_object(Hash.new(0)) { |e, a| a[e] += 1 }
|
45
|
+
end
|
46
|
+
|
47
|
+
def max(identity=0)
|
48
|
+
size > 0 ? sort.last : identity
|
49
|
+
end
|
50
|
+
|
51
|
+
def min(identity=0)
|
52
|
+
size > 0 ? sort.first : identity
|
53
|
+
end
|
54
|
+
|
55
|
+
def mean(identity=0)
|
56
|
+
collection_size = size
|
57
|
+
collection_size > 0 ? inject(:+) / collection_size.to_f : identity
|
58
|
+
end
|
59
|
+
|
60
|
+
def median(identity=0)
|
61
|
+
collection_size = size
|
62
|
+
collection_sorted = sort
|
63
|
+
|
64
|
+
if collection_size > 0
|
65
|
+
if collection_size % 2 == 0
|
66
|
+
(collection_sorted[(collection_size / 2) -1] + collection_sorted[collection_size / 2]) / 2.0
|
67
|
+
else
|
68
|
+
collection_sorted[collection_size / 2]
|
69
|
+
end
|
70
|
+
else
|
71
|
+
identity
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def mode(identity=0)
|
76
|
+
if size > 0
|
77
|
+
frequency_distribution = inject(Hash.new(0)) { |h, v| h[v] += 1; h }
|
78
|
+
frequency_top_2 = frequency_distribution.sort { |a, b| b[1] <=> a[1] }.take(2)
|
79
|
+
|
80
|
+
if frequency_top_2.length == 1
|
81
|
+
frequency_top_2.first.first
|
82
|
+
elsif frequency_top_2.first.last == frequency_top_2.last.last
|
83
|
+
nil
|
84
|
+
else
|
85
|
+
frequency_top_2.first.first
|
86
|
+
end
|
87
|
+
else
|
88
|
+
identity
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def range(identity=0)
|
93
|
+
collection_sorted = sort
|
94
|
+
size > 0 ? collection_sorted.last - collection_sorted.first : identity
|
95
|
+
end
|
96
|
+
|
97
|
+
def several?
|
98
|
+
found_count = 0
|
99
|
+
|
100
|
+
if block_given?
|
101
|
+
each do |*o|
|
102
|
+
found_count += 1 if yield(*o)
|
103
|
+
end
|
104
|
+
else
|
105
|
+
each do |o|
|
106
|
+
found_count += 1 if o
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
(found_count > 1) ? true : false
|
111
|
+
end
|
112
|
+
|
113
|
+
def standard_deviation
|
114
|
+
return 0 if length < 2
|
115
|
+
Math.sqrt(variance)
|
116
|
+
end
|
117
|
+
|
118
|
+
def take_last(n)
|
119
|
+
array = to_a
|
120
|
+
|
121
|
+
return array if n > array.size
|
122
|
+
array[(array.size - n)..-1]
|
123
|
+
end
|
124
|
+
|
125
|
+
def take_last_while
|
126
|
+
return to_enum(:take_last_while) unless block_given?
|
127
|
+
|
128
|
+
result = []
|
129
|
+
reverse_each { |e| yield(e) ? result.unshift(e) : break }
|
130
|
+
result
|
131
|
+
end
|
132
|
+
|
133
|
+
def variance
|
134
|
+
collection_length = length
|
135
|
+
|
136
|
+
return 0 if collection_length <= 1
|
137
|
+
sum = inject(0) { |accumulator, value| accumulator + (value - mean) ** 2 }
|
138
|
+
sum / (collection_length.to_f - 1)
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
class Hash
|
2
|
+
|
3
|
+
unless method_defined?(:stringify_keys)
|
4
|
+
def stringify_keys
|
5
|
+
inject({}) do |options, (key, value)|
|
6
|
+
options[key.to_s] = value
|
7
|
+
options
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
unless method_defined?(:stringify_keys!)
|
13
|
+
def stringify_keys!
|
14
|
+
replace(stringify_keys)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
unless method_defined?(:symbolize_keys)
|
19
|
+
def symbolize_keys
|
20
|
+
inject({}) do |options, (key, value)|
|
21
|
+
options[(key.to_sym rescue key) || key] = value
|
22
|
+
options
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
unless method_defined?(:symbolize_keys!)
|
28
|
+
def symbolize_keys!
|
29
|
+
replace(symbolize_keys)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
unless method_defined?(:except)
|
34
|
+
def except(*args)
|
35
|
+
hash = dup
|
36
|
+
args.each {|k| hash.delete(k) }
|
37
|
+
hash
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
unless method_defined?(:only)
|
42
|
+
def only(*args)
|
43
|
+
hash = {}
|
44
|
+
args.each {|k| hash[k] = self[k] if self.has_key?(k) }
|
45
|
+
hash
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def rename_keys(*args)
|
50
|
+
keys = Hash[*args.flatten]
|
51
|
+
keys.each { |k, v| self[v] = delete(k) if self[k] }
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
def rename_keys!(*args)
|
56
|
+
replace(rename_keys(*args))
|
57
|
+
end
|
58
|
+
|
59
|
+
def symbolize_and_underscore_keys
|
60
|
+
inject({}) do |options, (key, value)|
|
61
|
+
options[(key.to_s.underscore.to_sym rescue key) || key] = value
|
62
|
+
options
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def symbolize_and_underscore_keys!
|
67
|
+
replace(symbolize_and_underscore_keys)
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
class Numeric
|
2
|
+
|
3
|
+
unless method_defined?(:multiple_of?)
|
4
|
+
def multiple_of?(number)
|
5
|
+
number != 0 ? modulo(number).zero? : zero?
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def negative?
|
10
|
+
self < 0
|
11
|
+
end
|
12
|
+
|
13
|
+
def positive?
|
14
|
+
self > 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_byte(from=:b, to=:kb)
|
18
|
+
scalers = { b: 1, kb: 1024 ** 1, mb: 1024 ** 2, gb: 1024 ** 3, tb: 1024 ** 4, pb: 1024 ** 5, eb: 1024 ** 6 }
|
19
|
+
|
20
|
+
to_f * scalers[from] / scalers[to]
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_length(from=:mm, to=:in)
|
24
|
+
imperical_scalers = {
|
25
|
+
mm: 25.4, cm: 2.54, m: 0.0254, km: 0.0000254,
|
26
|
+
in: 1, ft: 12, yd: 36, mi: 63360, nm: 72913.4
|
27
|
+
}
|
28
|
+
metric_scalers = {
|
29
|
+
mm: 1, cm: 10, m: 1000, km: 1000000,
|
30
|
+
in: 0.039370078740157, ft: 0.0032808398950131, yd: 0.0010936132983377, mi: 0.00000062137119223733, nm: 0.00000053995680345572
|
31
|
+
}
|
32
|
+
|
33
|
+
case to
|
34
|
+
when from
|
35
|
+
self
|
36
|
+
when :mm, :cm, :m, :km
|
37
|
+
if [:in, :ft, :yd, :mi, :nm].include?(from)
|
38
|
+
to_f * imperical_scalers[from] * imperical_scalers[to]
|
39
|
+
else
|
40
|
+
to_f * metric_scalers[from] / metric_scalers[to]
|
41
|
+
end
|
42
|
+
when :in, :ft, :yd, :mi, :nm
|
43
|
+
if [:mm, :cm, :m, :km].include?(from)
|
44
|
+
to_f * metric_scalers[from] * metric_scalers[to]
|
45
|
+
else
|
46
|
+
to_f * imperical_scalers[from] / imperical_scalers[to]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_temperature(from=:c, to=:f)
|
52
|
+
case to
|
53
|
+
when from
|
54
|
+
self
|
55
|
+
when :c, :celsius
|
56
|
+
(to_f - 32) * 5 / 9
|
57
|
+
when :f, :fahrenheit
|
58
|
+
(to_f * 9 / 5) + 32
|
59
|
+
when :k, :kelvin
|
60
|
+
if [:c, :celsius].include?(from)
|
61
|
+
to_f + 273.15
|
62
|
+
else
|
63
|
+
((to_f - 32) * 5 / 9) + 273.15
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_time_unit(from=:sec, to=:min)
|
69
|
+
scalers = { sec: 1, min: 60 ** 1, hr: 60 ** 2, day: (60 ** 2) * 24, yr: (60 ** 2) * 24 * 365 }
|
70
|
+
|
71
|
+
to_f * scalers[from] / scalers[to]
|
72
|
+
end
|
73
|
+
|
74
|
+
def to_weight(from=:g, to=:oz)
|
75
|
+
imperical_scalers = {
|
76
|
+
mg: 28349.523125, cg: 2834.9523125, g: 28.349523125, kg: 0.028349523125, mt: 0.000028349523125,
|
77
|
+
oz: 1, lb: 16, tn: 32000
|
78
|
+
}
|
79
|
+
metric_scalers = {
|
80
|
+
mg: 1, cg: 10, g: 1000, kg: 1000000, mt: 1000000000,
|
81
|
+
oz: 0.00003527396194958, lb: 0.0000022046226218488, tn: 0.0000000011023113109244
|
82
|
+
}
|
83
|
+
|
84
|
+
case to
|
85
|
+
when from
|
86
|
+
self
|
87
|
+
when :mg, :cg, :g, :kg, :mt
|
88
|
+
if [:oz, :lb, :tn].include?(from)
|
89
|
+
to_f * imperical_scalers[from] * imperical_scalers[to]
|
90
|
+
else
|
91
|
+
to_f * metric_scalers[from] / metric_scalers[to]
|
92
|
+
end
|
93
|
+
when :oz, :lb, :tn
|
94
|
+
if [:mg, :cg, :g, :kg, :mt].include?(from)
|
95
|
+
to_f * metric_scalers[from] * metric_scalers[to]
|
96
|
+
else
|
97
|
+
to_f * imperical_scalers[from] / imperical_scalers[to]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Object
|
2
|
+
|
3
|
+
unless method_defined?(:blank?)
|
4
|
+
def blank?
|
5
|
+
respond_to?(:empty?) ? !!empty? : !self
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
unless method_defined?(:present?)
|
10
|
+
def present?
|
11
|
+
!blank?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
unless method_defined?(:try)
|
16
|
+
def try(method)
|
17
|
+
send(method) if respond_to?(method)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def numeric?
|
22
|
+
!to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/).nil?
|
23
|
+
end
|
24
|
+
|
25
|
+
def palindrome?
|
26
|
+
to_s == to_s.reverse
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
class String
|
2
|
+
|
3
|
+
unless method_defined?(:camelize)
|
4
|
+
def camelize(first_letter_in_uppercase = true)
|
5
|
+
if first_letter_in_uppercase != :lower
|
6
|
+
to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
7
|
+
else
|
8
|
+
to_s[0].chr.downcase + camelize(self)[1..-1]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
unless method_defined?(:camelize!)
|
14
|
+
def camelize!(first_letter_in_uppercase = true)
|
15
|
+
replace(camelize(first_letter_in_uppercase))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
unless method_defined?(:ends_with?)
|
20
|
+
def ends_with?(suffix)
|
21
|
+
suffix = suffix.to_s
|
22
|
+
self[-suffix.length, suffix.length] == suffix
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
unless method_defined?(:humanize)
|
27
|
+
def humanize(options = {})
|
28
|
+
underscore.
|
29
|
+
gsub(/_id$/, "").
|
30
|
+
tr('_', ' ').
|
31
|
+
gsub(/([a-z\d]*)/i) { |match| match.downcase }.
|
32
|
+
gsub(/^\w/) { |match| match.upcase } if options.fetch(:capitalize, true)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
unless method_defined?(:humanize!)
|
37
|
+
def humanize!(options = {})
|
38
|
+
replace(humanize)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
unless method_defined?(:titleize)
|
43
|
+
def titleize
|
44
|
+
underscore.
|
45
|
+
humanize.
|
46
|
+
gsub(/\b(?<!['’`])[a-z]/) { $&.capitalize }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
unless method_defined?(:titleize!)
|
51
|
+
def titleize!
|
52
|
+
replace(titleize)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
unless method_defined?(:starts_with?)
|
57
|
+
def starts_with?(prefix)
|
58
|
+
prefix = prefix.to_s
|
59
|
+
self[0, prefix.length] == prefix
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
unless method_defined?(:underscore)
|
64
|
+
def underscore
|
65
|
+
gsub(/::/, '/').
|
66
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
67
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
68
|
+
tr("-", "_").
|
69
|
+
downcase
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
unless method_defined?(:underscore!)
|
74
|
+
def underscore!
|
75
|
+
replace(underscore)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def domain(options={})
|
80
|
+
url = dup
|
81
|
+
url =~ (/^(?:\w+:\/\/)?([^\/?]+)(?:\/|\?|$)/) ? $1 : url
|
82
|
+
end
|
83
|
+
|
84
|
+
def downcase?
|
85
|
+
downcase == self
|
86
|
+
end
|
87
|
+
|
88
|
+
def ellipsize(options={})
|
89
|
+
length = options[:length] || 30
|
90
|
+
separator = options[:separator] || '...'
|
91
|
+
return self if size <= length
|
92
|
+
offset = options[:offset] || 4
|
93
|
+
self[0,offset] + separator + self[-offset,offset]
|
94
|
+
end
|
95
|
+
|
96
|
+
def gnix(string)
|
97
|
+
gsub(string, "")
|
98
|
+
end
|
99
|
+
|
100
|
+
def gnix!(string)
|
101
|
+
gsub!(string, "")
|
102
|
+
end
|
103
|
+
|
104
|
+
def mixedcase?
|
105
|
+
!upcase? && !downcase?
|
106
|
+
end
|
107
|
+
|
108
|
+
def nix(string)
|
109
|
+
sub(string, "")
|
110
|
+
end
|
111
|
+
|
112
|
+
def nix!(string)
|
113
|
+
sub!(string, "")
|
114
|
+
end
|
115
|
+
|
116
|
+
def pollute(delimiter="^--^--^")
|
117
|
+
split('').map{ |letter| "#{letter}#{delimiter}" }.join
|
118
|
+
end
|
119
|
+
|
120
|
+
def slugify
|
121
|
+
gsub(/[^\x00-\x7F]+/, ''). # Remove anything non-ASCII entirely (e.g. diacritics).
|
122
|
+
gsub(/[^\w_ \-]+/i, ''). # Remove unwanted chars.
|
123
|
+
gsub(/[ \-]+/i, '-'). # No more than one of the separator in a row.
|
124
|
+
gsub(/^\-|\-$/i, ''). # Remove leading/trailing separator.
|
125
|
+
downcase
|
126
|
+
end
|
127
|
+
|
128
|
+
def slugify!
|
129
|
+
replace(slugify)
|
130
|
+
end
|
131
|
+
|
132
|
+
def squish
|
133
|
+
strip.gsub(/\s+/, ' ')
|
134
|
+
end
|
135
|
+
|
136
|
+
def squish!
|
137
|
+
replace(squish)
|
138
|
+
end
|
139
|
+
|
140
|
+
def strip_tags
|
141
|
+
gsub(/<\/?[^>]*>/, "")
|
142
|
+
end
|
143
|
+
|
144
|
+
def strip_tags!
|
145
|
+
replace(strip_tags)
|
146
|
+
end
|
147
|
+
|
148
|
+
def strip_whitespace
|
149
|
+
gnix("\t").split(" ").remove_blanks.join(" ")
|
150
|
+
end
|
151
|
+
|
152
|
+
def strip_whitespace!
|
153
|
+
replace(strip_whitespace)
|
154
|
+
end
|
155
|
+
|
156
|
+
def truncate_preserving_words(options={})
|
157
|
+
separator = options[:separator] || '...'
|
158
|
+
max_words = options[:max_words] || nil
|
159
|
+
if max_words
|
160
|
+
words = split
|
161
|
+
return self if words.size < max_words
|
162
|
+
words = words[0..(max_words-1)]
|
163
|
+
words << separator
|
164
|
+
words.join(" ")
|
165
|
+
else
|
166
|
+
max_chars = options[:max_chars] || 30
|
167
|
+
return self if size < max_chars
|
168
|
+
out = self[0..(max_chars-1)].split(" ")
|
169
|
+
out.pop
|
170
|
+
out << separator
|
171
|
+
out.join(" ")
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def unpollute(delimiter="^--^--^")
|
176
|
+
gsub(delimiter, "")
|
177
|
+
end
|
178
|
+
|
179
|
+
def upcase?
|
180
|
+
upcase == self
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
class Time
|
2
|
+
|
3
|
+
def format(string="yyyy-m-d h:n z")
|
4
|
+
delimiters = string.scan /\W+/
|
5
|
+
formatters = string.scan /[a-z0-9_]+/i
|
6
|
+
|
7
|
+
format_units = {
|
8
|
+
## Date keys
|
9
|
+
"d" => "d",
|
10
|
+
"day" => "d",
|
11
|
+
"day_zero" => "d",
|
12
|
+
"dd" => "-d",
|
13
|
+
"Day" => "-d",
|
14
|
+
"day_unpadded" => "-d",
|
15
|
+
"ddd" => "_d",
|
16
|
+
"DAY" => "_d",
|
17
|
+
"day_blank" => "_d",
|
18
|
+
"dddd" => "j",
|
19
|
+
"day_of_the_year" => "j",
|
20
|
+
"m" => "m",
|
21
|
+
"month" => "m",
|
22
|
+
"month_zero" => "m",
|
23
|
+
"mm" => "-m",
|
24
|
+
"Month" => "-m",
|
25
|
+
"month_unpadded" => "-m",
|
26
|
+
"mmm" => "_m",
|
27
|
+
"MONTH" => "_m",
|
28
|
+
"month_blank" => "_m",
|
29
|
+
"mmmm" => "B",
|
30
|
+
"month_name" => "B",
|
31
|
+
"mmmmm" => "b",
|
32
|
+
"month_name_abbr" => "b",
|
33
|
+
"w" => "u",
|
34
|
+
"weekday" => "u",
|
35
|
+
"ww" => "w",
|
36
|
+
"weekday_offset" => "w",
|
37
|
+
"www" => "A",
|
38
|
+
"weekday_name" => "A",
|
39
|
+
"wwww" => "a",
|
40
|
+
"weekday_name_abbr" => "a",
|
41
|
+
"wwwww" => "W",
|
42
|
+
"week" => "W",
|
43
|
+
"wwwwww" => "U",
|
44
|
+
"week_offset" => "U",
|
45
|
+
"yy" => "y",
|
46
|
+
"yr" => "y",
|
47
|
+
"yyyy" => "Y",
|
48
|
+
"year" => "Y",
|
49
|
+
|
50
|
+
## Time keys
|
51
|
+
"h" => "H",
|
52
|
+
"hour" => "H",
|
53
|
+
"hour_zero" => "H",
|
54
|
+
"hh" => "k",
|
55
|
+
"HOUR" => "k",
|
56
|
+
"hour_blank" => "k",
|
57
|
+
"hhh" => "I",
|
58
|
+
"hour_imperical" => "I",
|
59
|
+
"hour_imperical_zero" => "I",
|
60
|
+
"hhhh" => "l",
|
61
|
+
"HOUR_IMPERICAL" => "l",
|
62
|
+
"hour_imperical_blank" => "l",
|
63
|
+
"ampm" => "P",
|
64
|
+
"meridian" => "P",
|
65
|
+
"AMPM" => "p",
|
66
|
+
"MERIDIAN" => "p",
|
67
|
+
"n" => "M",
|
68
|
+
"minute" => "M",
|
69
|
+
"s" => "S",
|
70
|
+
"second" => "S",
|
71
|
+
"z" => "z",
|
72
|
+
"time_zone" => "z",
|
73
|
+
"zz" => ":z",
|
74
|
+
"time_zone_offset" => ":z",
|
75
|
+
"zzz" => "::z",
|
76
|
+
"time_zone_offset_full" => "::z",
|
77
|
+
"zzzz" => "Z",
|
78
|
+
"time_zone_name" => "Z"
|
79
|
+
}
|
80
|
+
|
81
|
+
strftime(
|
82
|
+
if string.empty? || string.nil?
|
83
|
+
"%Y-%m-%d %H:%M %z"
|
84
|
+
else
|
85
|
+
formatters.map do |f|
|
86
|
+
"%#{format_units[f]}#{delimiters.shift || ''}"
|
87
|
+
end.join
|
88
|
+
end
|
89
|
+
)
|
90
|
+
end
|
91
|
+
|
92
|
+
def to_format(key=:datetime_iso_tzn)
|
93
|
+
format_units = {
|
94
|
+
## Date keys
|
95
|
+
month: "%m",
|
96
|
+
month_zero: "%m",
|
97
|
+
month_unpadded: "%-m",
|
98
|
+
month_blank: "%_m",
|
99
|
+
month_name: "%B",
|
100
|
+
month_name_abbr: "%b",
|
101
|
+
weekday: "%d",
|
102
|
+
weekday_zero: "%d",
|
103
|
+
weekday_unpadded: "%-d",
|
104
|
+
weekday_blank: "%_d",
|
105
|
+
weekday_name: "%A",
|
106
|
+
weekday_name_abbr: "%a",
|
107
|
+
yr: "%y",
|
108
|
+
year: "%Y",
|
109
|
+
|
110
|
+
## Time keys
|
111
|
+
hour: "%H",
|
112
|
+
hour_zero: "%H",
|
113
|
+
hour_blank: "%k",
|
114
|
+
hour_imperical: "%I",
|
115
|
+
hour_imperical_zero: "%I",
|
116
|
+
hour_imperical_blank: "%l",
|
117
|
+
ampm: "%P",
|
118
|
+
meridian: "%P",
|
119
|
+
minute: "%M",
|
120
|
+
second: "%S",
|
121
|
+
time_zone: "%z",
|
122
|
+
time_zone_offset: "%:z",
|
123
|
+
time_zone_offset_full: "%::z",
|
124
|
+
time_zone_name: "%Z",
|
125
|
+
|
126
|
+
## Datetime keys
|
127
|
+
date: "%B %-d, %Y",
|
128
|
+
date_abbr: "%b %-d, %Y",
|
129
|
+
date_iso: "%Y-%m-%d",
|
130
|
+
datetime: "%B %-d, %Y %H:%M",
|
131
|
+
datetime_abbr: "%b %-d, %Y %H:%M",
|
132
|
+
datetime_iso: "%Y-%m-%d %H:%M",
|
133
|
+
datetime_imperical: "%B %-d, %Y %I:%M %P",
|
134
|
+
datetime_imperical_abbr: "%b %-d, %Y %I:%M %P",
|
135
|
+
datetime_imperical_iso: "%Y-%m-%d %I:%M %P",
|
136
|
+
datetime_tzn: "%B %-d, %Y %H:%M %Z",
|
137
|
+
datetime_abbr_tzn: "%b %-d, %Y %H:%M %Z",
|
138
|
+
datetime_iso_tzn: "%Y-%m-%d %H:%M %z",
|
139
|
+
datetime_imperical_tzn: "%B %-d, %Y %I:%M %P %Z",
|
140
|
+
datetime_imperical_abbr_tzn: "%b %-d, %Y %I:%M %P %Z",
|
141
|
+
datetime_imperical_iso_tzn: "%Y-%m-%d %I:%M %P %z",
|
142
|
+
day: "%B %-d",
|
143
|
+
day_abbr: "%b %-d",
|
144
|
+
day_iso: "%m-%d",
|
145
|
+
daytime: "%B %-d %H:%M",
|
146
|
+
daytime_abbr: "%b %-d %H:%M",
|
147
|
+
daytime_iso: "%m-%d %H:%M",
|
148
|
+
daytime_imperical: "%B %-d %I:%M %P",
|
149
|
+
daytime_imperical_abbr: "%b %-d %I:%M %P",
|
150
|
+
daytime_imperical_iso: "%m-%d %I:%M %P",
|
151
|
+
time: "%H:%M",
|
152
|
+
time_zero: "%H:%M",
|
153
|
+
time_blank: "%k:%M",
|
154
|
+
time_tz: "%H:%M %z",
|
155
|
+
time_tzn: "%H:%M %Z",
|
156
|
+
time_imperical: "%I:%M %P",
|
157
|
+
time_imperical_zero: "%I:%M %P",
|
158
|
+
time_imperical_blank: "%l:%M %P",
|
159
|
+
time_imperical_tz: "%I:%M %P %z",
|
160
|
+
time_imperical_tzn: "%I:%M %P %Z"
|
161
|
+
}
|
162
|
+
|
163
|
+
strftime(format_units[key])
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
data/lib/nobiru.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'nobiru/version'
|
2
|
+
require 'nobiru/extensions/array_extension'
|
3
|
+
require 'nobiru/extensions/enumerable_extension'
|
4
|
+
require 'nobiru/extensions/hash_extension'
|
5
|
+
require 'nobiru/extensions/numeric_extension'
|
6
|
+
require 'nobiru/extensions/object_extension'
|
7
|
+
require 'nobiru/extensions/string_extension'
|
8
|
+
require 'nobiru/extensions/time_extension'
|