flash_extensions 0.0.1 → 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 +4 -4
- data/.travis.yml +2 -3
- data/README.md +204 -83
- data/flash_extensions.gemspec +3 -3
- data/lib/flash_extensions.rb +2 -0
- data/lib/flash_extensions/extensions/array_extension.rb +5 -5
- data/lib/flash_extensions/extensions/enumerable_extension.rb +91 -0
- data/lib/flash_extensions/extensions/hash_extension.rb +24 -8
- data/lib/flash_extensions/extensions/numeric_extension.rb +17 -0
- data/lib/flash_extensions/extensions/object_extension.rb +6 -6
- data/lib/flash_extensions/extensions/string_extension.rb +81 -29
- data/lib/flash_extensions/extensions/time_extension.rb +2 -2
- data/lib/flash_extensions/version.rb +1 -1
- data/spec/lib/array_extension_spec.rb +4 -4
- data/spec/lib/enumerable_extension_spec.rb +116 -0
- data/spec/lib/hash_extension_spec.rb +52 -0
- data/spec/lib/numeric_extension_spec.rb +35 -0
- data/spec/lib/object_extension_spec.rb +2 -0
- data/spec/lib/string_extension_spec.rb +104 -1
- data/spec/lib/time_extension_spec.rb +2 -0
- metadata +12 -6
data/flash_extensions.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Juan Gomez"]
|
10
10
|
spec.email = ["j.gomez@drexed.com"]
|
11
11
|
spec.summary = %q{Commonly used object helpers}
|
12
|
-
spec.description = %q{Class extensions of
|
12
|
+
spec.description = %q{Class extensions of commonly used object helpers.}
|
13
13
|
spec.homepage = "https://github.com/drexed/flash_extensions"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -21,5 +21,5 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.5"
|
22
22
|
spec.add_development_dependency "coveralls"
|
23
23
|
spec.add_development_dependency "rake"
|
24
|
-
spec.add_development_dependency "rspec", "~> 3.0.0
|
25
|
-
end
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.0.0"
|
25
|
+
end
|
data/lib/flash_extensions.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'flash_extensions/version'
|
2
2
|
require 'flash_extensions/extensions/array_extension'
|
3
|
+
require 'flash_extensions/extensions/enumerable_extension'
|
3
4
|
require 'flash_extensions/extensions/hash_extension'
|
5
|
+
require 'flash_extensions/extensions/numeric_extension'
|
4
6
|
require 'flash_extensions/extensions/object_extension'
|
5
7
|
require 'flash_extensions/extensions/string_extension'
|
6
8
|
require 'flash_extensions/extensions/time_extension'
|
@@ -1,15 +1,15 @@
|
|
1
1
|
class Array
|
2
2
|
|
3
3
|
def remove_blanks
|
4
|
-
|
4
|
+
reject { |e| e.blank? }
|
5
5
|
end
|
6
6
|
|
7
|
-
def
|
8
|
-
self[1
|
7
|
+
def remove_first
|
8
|
+
self[1..-1]
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
self[0
|
11
|
+
def remove_last
|
12
|
+
self[0...-1]
|
13
13
|
end
|
14
14
|
|
15
15
|
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module Enumerable
|
2
|
+
|
3
|
+
unless method_defined?(:sum)
|
4
|
+
def sum(identity=0)
|
5
|
+
inject { |s, e| s + e } || identity
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def average(identity=0)
|
10
|
+
collection_size = to_a.size
|
11
|
+
collection_size > 0 ? inject(&:+) / collection_size.to_f : identity
|
12
|
+
end
|
13
|
+
|
14
|
+
def drop_last(n)
|
15
|
+
array = to_a
|
16
|
+
|
17
|
+
return array if n > array.size
|
18
|
+
array[0...(array.size - n)]
|
19
|
+
end
|
20
|
+
|
21
|
+
def drop_last_while
|
22
|
+
return to_enum(:drop_last_while) unless block_given?
|
23
|
+
|
24
|
+
result = []
|
25
|
+
dropping = true
|
26
|
+
reverse_each do |obj|
|
27
|
+
result.unshift(obj) unless dropping &&= yield(obj)
|
28
|
+
end
|
29
|
+
result
|
30
|
+
end
|
31
|
+
|
32
|
+
def exactly?(n)
|
33
|
+
found_count = 0
|
34
|
+
|
35
|
+
if block_given?
|
36
|
+
each do |*o|
|
37
|
+
if yield(*o)
|
38
|
+
found_count += 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
else
|
42
|
+
each do |o|
|
43
|
+
if o
|
44
|
+
found_count += 1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
(found_count > n) ? false : n == found_count
|
50
|
+
end
|
51
|
+
|
52
|
+
def frequencies
|
53
|
+
each_with_object(Hash.new(0)) { |e, a| a[e] += 1 }
|
54
|
+
end
|
55
|
+
|
56
|
+
def several?
|
57
|
+
found_count = 0
|
58
|
+
|
59
|
+
if block_given?
|
60
|
+
each do |*o|
|
61
|
+
if yield(*o)
|
62
|
+
found_count += 1
|
63
|
+
end
|
64
|
+
end
|
65
|
+
else
|
66
|
+
each do |o|
|
67
|
+
if o
|
68
|
+
found_count += 1
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
(found_count > 1) ? true : false
|
74
|
+
end
|
75
|
+
|
76
|
+
def take_last(n)
|
77
|
+
array = to_a
|
78
|
+
|
79
|
+
return array if n > array.size
|
80
|
+
array[(array.size - n)..-1]
|
81
|
+
end
|
82
|
+
|
83
|
+
def take_last_while
|
84
|
+
return to_enum(:take_last_while) unless block_given?
|
85
|
+
|
86
|
+
result = []
|
87
|
+
reverse_each { |e| yield(e) ? result.unshift(e) : break }
|
88
|
+
result
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class Hash
|
2
2
|
|
3
|
-
unless method_defined?(
|
3
|
+
unless method_defined?(:stringify_keys)
|
4
4
|
def stringify_keys
|
5
5
|
inject({}) do |options, (key, value)|
|
6
6
|
options[key.to_s] = value
|
@@ -9,13 +9,13 @@ class Hash
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
unless method_defined?(
|
12
|
+
unless method_defined?(:stringify_keys!)
|
13
13
|
def stringify_keys!
|
14
|
-
|
14
|
+
replace(stringify_keys)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
unless method_defined?(
|
18
|
+
unless method_defined?(:symbolize_keys)
|
19
19
|
def symbolize_keys
|
20
20
|
inject({}) do |options, (key, value)|
|
21
21
|
options[(key.to_sym rescue key) || key] = value
|
@@ -24,18 +24,34 @@ class Hash
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
unless method_defined?(
|
27
|
+
unless method_defined?(:symbolize_keys!)
|
28
28
|
def symbolize_keys!
|
29
|
-
|
29
|
+
replace(symbolize_keys)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
def except(*args)
|
34
|
+
hash = dup
|
35
|
+
args.each {|k| hash.delete(k) }
|
36
|
+
hash
|
37
|
+
end
|
38
|
+
|
39
|
+
def only(*args)
|
40
|
+
hash = {}
|
41
|
+
args.each {|k| hash[k] = self[k] if self.has_key?(k) }
|
42
|
+
hash
|
43
|
+
end
|
44
|
+
|
33
45
|
def rename_keys(*args)
|
34
46
|
keys = Hash[*args.flatten]
|
35
|
-
keys.each { |k, v| self[v] =
|
47
|
+
keys.each { |k, v| self[v] = delete(k) if self[k] }
|
36
48
|
self
|
37
49
|
end
|
38
50
|
|
51
|
+
def rename_keys!(*args)
|
52
|
+
replace(rename_keys(*args))
|
53
|
+
end
|
54
|
+
|
39
55
|
def symbolize_and_underscore_keys
|
40
56
|
inject({}) do |options, (key, value)|
|
41
57
|
options[(key.to_s.underscore.to_sym rescue key) || key] = value
|
@@ -44,7 +60,7 @@ class Hash
|
|
44
60
|
end
|
45
61
|
|
46
62
|
def symbolize_and_underscore_keys!
|
47
|
-
|
63
|
+
replace(symbolize_and_underscore_keys)
|
48
64
|
end
|
49
65
|
|
50
66
|
end
|
@@ -1,29 +1,29 @@
|
|
1
1
|
class Object
|
2
2
|
|
3
|
-
unless method_defined?(
|
3
|
+
unless method_defined?(:blank?)
|
4
4
|
def blank?
|
5
5
|
respond_to?(:empty?) ? !!empty? : !self
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
|
-
unless method_defined?(
|
9
|
+
unless method_defined?(:present?)
|
10
10
|
def present?
|
11
11
|
!blank?
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
unless method_defined?(
|
15
|
+
unless method_defined?(:try)
|
16
16
|
def try(method)
|
17
|
-
send
|
17
|
+
send(method) if respond_to?(method)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
def numeric?
|
22
|
-
!
|
22
|
+
!to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/).nil?
|
23
23
|
end
|
24
24
|
|
25
25
|
def palindrome?
|
26
|
-
|
26
|
+
to_s.reverse == to_s
|
27
27
|
end
|
28
28
|
|
29
29
|
end
|
@@ -1,25 +1,31 @@
|
|
1
1
|
class String
|
2
2
|
|
3
|
-
unless method_defined?(
|
3
|
+
unless method_defined?(:camelize)
|
4
4
|
def camelize(first_letter_in_uppercase = true)
|
5
5
|
if first_letter_in_uppercase != :lower
|
6
|
-
|
6
|
+
to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
7
7
|
else
|
8
|
-
|
8
|
+
to_s[0].chr.downcase + camelize(self)[1..-1]
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
unless method_defined?(
|
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?)
|
14
20
|
def ends_with?(suffix)
|
15
21
|
suffix = suffix.to_s
|
16
22
|
self[-suffix.length, suffix.length] == suffix
|
17
23
|
end
|
18
24
|
end
|
19
25
|
|
20
|
-
unless method_defined?(
|
26
|
+
unless method_defined?(:humanize)
|
21
27
|
def humanize(options = {})
|
22
|
-
|
28
|
+
underscore.
|
23
29
|
gsub(/_id$/, "").
|
24
30
|
tr('_', ' ').
|
25
31
|
gsub(/([a-z\d]*)/i) { |match| match.downcase }.
|
@@ -27,24 +33,36 @@ class String
|
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
30
|
-
unless method_defined?(
|
36
|
+
unless method_defined?(:humanize!)
|
37
|
+
def humanize!(options = {})
|
38
|
+
replace(humanize)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
unless method_defined?(:titleize)
|
31
43
|
def titleize
|
32
|
-
|
44
|
+
underscore.
|
33
45
|
humanize.
|
34
46
|
gsub(/\b(?<!['’`])[a-z]/) { $&.capitalize }
|
35
47
|
end
|
36
48
|
end
|
37
49
|
|
38
|
-
unless method_defined?(
|
50
|
+
unless method_defined?(:titleize!)
|
51
|
+
def titleize!
|
52
|
+
replace(titleize)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
unless method_defined?(:starts_with?)
|
39
57
|
def starts_with?(prefix)
|
40
58
|
prefix = prefix.to_s
|
41
59
|
self[0, prefix.length] == prefix
|
42
60
|
end
|
43
61
|
end
|
44
62
|
|
45
|
-
unless method_defined?(
|
63
|
+
unless method_defined?(:underscore)
|
46
64
|
def underscore
|
47
|
-
|
65
|
+
gsub(/::/, '/').
|
48
66
|
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
49
67
|
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
50
68
|
tr("-", "_").
|
@@ -52,25 +70,35 @@ class String
|
|
52
70
|
end
|
53
71
|
end
|
54
72
|
|
73
|
+
unless method_defined?(:underscore!)
|
74
|
+
def underscore!
|
75
|
+
replace(underscore)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
55
79
|
def domain(options={})
|
56
|
-
url =
|
80
|
+
url = dup
|
57
81
|
url =~ (/^(?:\w+:\/\/)?([^\/?]+)(?:\/|\?|$)/) ? $1 : url
|
58
82
|
end
|
59
83
|
|
60
84
|
def downcase?
|
61
|
-
|
85
|
+
downcase == self
|
62
86
|
end
|
63
87
|
|
64
88
|
def ellipsize(options={})
|
65
|
-
length
|
89
|
+
length = options[:length] || 30
|
66
90
|
separator = options[:separator] || '...'
|
67
|
-
return self if
|
68
|
-
offset
|
91
|
+
return self if size <= length
|
92
|
+
offset = options[:offset] || 4
|
69
93
|
self[0,offset] + separator + self[-offset,offset]
|
70
94
|
end
|
71
95
|
|
72
96
|
def gnix(string)
|
73
|
-
|
97
|
+
gsub(string, "")
|
98
|
+
end
|
99
|
+
|
100
|
+
def gnix!(string)
|
101
|
+
gsub!(string, "")
|
74
102
|
end
|
75
103
|
|
76
104
|
def mixedcase?
|
@@ -78,41 +106,65 @@ class String
|
|
78
106
|
end
|
79
107
|
|
80
108
|
def nix(string)
|
81
|
-
|
109
|
+
sub(string, "")
|
110
|
+
end
|
111
|
+
|
112
|
+
def nix!(string)
|
113
|
+
sub!(string, "")
|
82
114
|
end
|
83
115
|
|
84
116
|
def pollute(delimiter="^--^--^")
|
85
|
-
|
117
|
+
split('').map{ |letter| "#{letter}#{delimiter}" }.join
|
86
118
|
end
|
87
119
|
|
88
120
|
def slugify
|
89
|
-
|
90
|
-
gsub(/[^\w_ \-]+/i, '').
|
91
|
-
gsub(/[ \-]+/i, '-').
|
92
|
-
gsub(/^\-|\-$/i, '').
|
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.
|
93
125
|
downcase
|
94
126
|
end
|
95
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
|
+
|
96
140
|
def strip_tags
|
97
|
-
|
141
|
+
gsub(/<\/?[^>]*>/, "")
|
142
|
+
end
|
143
|
+
|
144
|
+
def strip_tags!
|
145
|
+
replace(strip_tags)
|
98
146
|
end
|
99
147
|
|
100
148
|
def strip_whitespace
|
101
|
-
|
149
|
+
gnix("\t").split(" ").remove_blanks.join(" ")
|
150
|
+
end
|
151
|
+
|
152
|
+
def strip_whitespace!
|
153
|
+
replace(strip_whitespace)
|
102
154
|
end
|
103
155
|
|
104
156
|
def truncate_preserving_words(options={})
|
105
157
|
separator = options[:separator] || '...'
|
106
158
|
max_words = options[:max_words] || nil
|
107
159
|
if max_words
|
108
|
-
words =
|
160
|
+
words = split
|
109
161
|
return self if words.size < max_words
|
110
162
|
words = words[0..(max_words-1)]
|
111
163
|
words << separator
|
112
164
|
words.join(" ")
|
113
165
|
else
|
114
166
|
max_chars = options[:max_chars] || 30
|
115
|
-
return self if
|
167
|
+
return self if size < max_chars
|
116
168
|
out = self[0..(max_chars-1)].split(" ")
|
117
169
|
out.pop
|
118
170
|
out << separator
|
@@ -121,11 +173,11 @@ class String
|
|
121
173
|
end
|
122
174
|
|
123
175
|
def unpollute(delimiter="^--^--^")
|
124
|
-
|
176
|
+
gsub(delimiter, "")
|
125
177
|
end
|
126
178
|
|
127
179
|
def upcase?
|
128
|
-
|
180
|
+
upcase == self
|
129
181
|
end
|
130
182
|
|
131
183
|
end
|