flash_extensions 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 +17 -0
- data/.rspec +4 -0
- data/.travis.yml +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +408 -0
- data/Rakefile +6 -0
- data/flash_extensions.gemspec +25 -0
- data/lib/flash_extensions/extensions/array_extension.rb +15 -0
- data/lib/flash_extensions/extensions/hash_extension.rb +50 -0
- data/lib/flash_extensions/extensions/object_extension.rb +29 -0
- data/lib/flash_extensions/extensions/string_extension.rb +131 -0
- data/lib/flash_extensions/extensions/time_extension.rb +168 -0
- data/lib/flash_extensions/version.rb +3 -0
- data/lib/flash_extensions.rb +6 -0
- data/spec/lib/array_extension_spec.rb +27 -0
- data/spec/lib/hash_extension_spec.rb +42 -0
- data/spec/lib/object_extension_spec.rb +77 -0
- data/spec/lib/string_extension_spec.rb +236 -0
- data/spec/lib/time_extension_spec.rb +469 -0
- data/spec/spec_helper.rb +4 -0
- metadata +128 -0
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'flash_extensions/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "flash_extensions"
|
8
|
+
spec.version = FlashExtensions::VERSION
|
9
|
+
spec.authors = ["Juan Gomez"]
|
10
|
+
spec.email = ["j.gomez@drexed.com"]
|
11
|
+
spec.summary = %q{Commonly used object helpers}
|
12
|
+
spec.description = %q{Class extensions of of commonly used object helpers.}
|
13
|
+
spec.homepage = "https://github.com/drexed/flash_extensions"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
22
|
+
spec.add_development_dependency "coveralls"
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.0.0.beta"
|
25
|
+
end
|
@@ -0,0 +1,50 @@
|
|
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
|
+
self.replace(self.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
|
+
self.replace(self.symbolize_keys)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def rename_keys(*args)
|
34
|
+
keys = Hash[*args.flatten]
|
35
|
+
keys.each { |k, v| self[v] = self.delete(k) if self[k] }
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def symbolize_and_underscore_keys
|
40
|
+
inject({}) do |options, (key, value)|
|
41
|
+
options[(key.to_s.underscore.to_sym rescue key) || key] = value
|
42
|
+
options
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def symbolize_and_underscore_keys!
|
47
|
+
self.replace(self.symbolize_and_underscore_keys)
|
48
|
+
end
|
49
|
+
|
50
|
+
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
|
+
!self.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/).nil?
|
23
|
+
end
|
24
|
+
|
25
|
+
def palindrome?
|
26
|
+
self.to_s.reverse == self.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,131 @@
|
|
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
|
+
self.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
7
|
+
else
|
8
|
+
self.to_s[0].chr.downcase + camelize(self)[1..-1]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
unless method_defined?("ends_with?")
|
14
|
+
def ends_with?(suffix)
|
15
|
+
suffix = suffix.to_s
|
16
|
+
self[-suffix.length, suffix.length] == suffix
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
unless method_defined?("humanize")
|
21
|
+
def humanize(options = {})
|
22
|
+
self.underscore.
|
23
|
+
gsub(/_id$/, "").
|
24
|
+
tr('_', ' ').
|
25
|
+
gsub(/([a-z\d]*)/i) { |match| match.downcase }.
|
26
|
+
gsub(/^\w/) { |match| match.upcase } if options.fetch(:capitalize, true)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
unless method_defined?("titleize")
|
31
|
+
def titleize
|
32
|
+
self.underscore.
|
33
|
+
humanize.
|
34
|
+
gsub(/\b(?<!['’`])[a-z]/) { $&.capitalize }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
unless method_defined?("starts_with?")
|
39
|
+
def starts_with?(prefix)
|
40
|
+
prefix = prefix.to_s
|
41
|
+
self[0, prefix.length] == prefix
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
unless method_defined?("underscore")
|
46
|
+
def underscore
|
47
|
+
self.gsub(/::/, '/').
|
48
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
49
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
50
|
+
tr("-", "_").
|
51
|
+
downcase
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def domain(options={})
|
56
|
+
url = self.dup
|
57
|
+
url =~ (/^(?:\w+:\/\/)?([^\/?]+)(?:\/|\?|$)/) ? $1 : url
|
58
|
+
end
|
59
|
+
|
60
|
+
def downcase?
|
61
|
+
self.downcase == self
|
62
|
+
end
|
63
|
+
|
64
|
+
def ellipsize(options={})
|
65
|
+
length = options[:length] || 30
|
66
|
+
separator = options[:separator] || '...'
|
67
|
+
return self if self.size <= length
|
68
|
+
offset = options[:offset] || 4
|
69
|
+
self[0,offset] + separator + self[-offset,offset]
|
70
|
+
end
|
71
|
+
|
72
|
+
def gnix(string)
|
73
|
+
self.gsub(string, "")
|
74
|
+
end
|
75
|
+
|
76
|
+
def mixedcase?
|
77
|
+
!upcase? && !downcase?
|
78
|
+
end
|
79
|
+
|
80
|
+
def nix(string)
|
81
|
+
self.sub(string, "")
|
82
|
+
end
|
83
|
+
|
84
|
+
def pollute(delimiter="^--^--^")
|
85
|
+
self.split('').map{ |letter| "#{letter}#{delimiter}" }.join
|
86
|
+
end
|
87
|
+
|
88
|
+
def slugify
|
89
|
+
self.gsub(/[^\x00-\x7F]+/, ''). # Remove anything non-ASCII entirely (e.g. diacritics).
|
90
|
+
gsub(/[^\w_ \-]+/i, ''). # Remove unwanted chars.
|
91
|
+
gsub(/[ \-]+/i, '-'). # No more than one of the separator in a row.
|
92
|
+
gsub(/^\-|\-$/i, ''). # Remove leading/trailing separator.
|
93
|
+
downcase
|
94
|
+
end
|
95
|
+
|
96
|
+
def strip_tags
|
97
|
+
self.gsub(/<\/?[^>]*>/, "")
|
98
|
+
end
|
99
|
+
|
100
|
+
def strip_whitespace
|
101
|
+
self.gnix("\t").split(" ").remove_blanks.join(" ")
|
102
|
+
end
|
103
|
+
|
104
|
+
def truncate_preserving_words(options={})
|
105
|
+
separator = options[:separator] || '...'
|
106
|
+
max_words = options[:max_words] || nil
|
107
|
+
if max_words
|
108
|
+
words = self.split()
|
109
|
+
return self if words.size < max_words
|
110
|
+
words = words[0..(max_words-1)]
|
111
|
+
words << separator
|
112
|
+
words.join(" ")
|
113
|
+
else
|
114
|
+
max_chars = options[:max_chars] || 30
|
115
|
+
return self if self.size < max_chars
|
116
|
+
out = self[0..(max_chars-1)].split(" ")
|
117
|
+
out.pop
|
118
|
+
out << separator
|
119
|
+
out.join(" ")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def unpollute(delimiter="^--^--^")
|
124
|
+
self.gsub(delimiter, "")
|
125
|
+
end
|
126
|
+
|
127
|
+
def upcase?
|
128
|
+
self.upcase == self
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
@@ -0,0 +1,168 @@
|
|
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
|
+
self.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
|
+
weekday_name: "%A",
|
108
|
+
weekday_name_abbr: "%a",
|
109
|
+
yr: "%y",
|
110
|
+
year: "%Y",
|
111
|
+
|
112
|
+
## Time keys
|
113
|
+
hour: "%H",
|
114
|
+
hour_zero: "%H",
|
115
|
+
hour_blank: "%k",
|
116
|
+
hour_imperical: "%I",
|
117
|
+
hour_imperical_zero: "%I",
|
118
|
+
hour_imperical_blank: "%l",
|
119
|
+
ampm: "%P",
|
120
|
+
meridian: "%P",
|
121
|
+
minute: "%M",
|
122
|
+
second: "%S",
|
123
|
+
time_zone: "%z",
|
124
|
+
time_zone_offset: "%:z",
|
125
|
+
time_zone_offset_full: "%::z",
|
126
|
+
time_zone_name: "%Z",
|
127
|
+
|
128
|
+
## Datetime keys
|
129
|
+
date: "%B %-d, %Y",
|
130
|
+
date_abbr: "%b %-d, %Y",
|
131
|
+
date_iso: "%Y-%m-%d",
|
132
|
+
datetime: "%B %-d, %Y %H:%M",
|
133
|
+
datetime_abbr: "%b %-d, %Y %H:%M",
|
134
|
+
datetime_iso: "%Y-%m-%d %H:%M",
|
135
|
+
datetime_imperical: "%B %-d, %Y %I:%M %P",
|
136
|
+
datetime_imperical_abbr: "%b %-d, %Y %I:%M %P",
|
137
|
+
datetime_imperical_iso: "%Y-%m-%d %I:%M %P",
|
138
|
+
datetime_tzn: "%B %-d, %Y %H:%M %Z",
|
139
|
+
datetime_abbr_tzn: "%b %-d, %Y %H:%M %Z",
|
140
|
+
datetime_iso_tzn: "%Y-%m-%d %H:%M %z",
|
141
|
+
datetime_imperical_tzn: "%B %-d, %Y %I:%M %P %Z",
|
142
|
+
datetime_imperical_abbr_tzn: "%b %-d, %Y %I:%M %P %Z",
|
143
|
+
datetime_imperical_iso_tzn: "%Y-%m-%d %I:%M %P %z",
|
144
|
+
day: "%B %-d",
|
145
|
+
day_abbr: "%b %-d",
|
146
|
+
day_iso: "%m-%d",
|
147
|
+
daytime: "%B %-d %H:%M",
|
148
|
+
daytime_abbr: "%b %-d %H:%M",
|
149
|
+
daytime_iso: "%m-%d %H:%M",
|
150
|
+
daytime_imperical: "%B %-d %I:%M %P",
|
151
|
+
daytime_imperical_abbr: "%b %-d %I:%M %P",
|
152
|
+
daytime_imperical_iso: "%m-%d %I:%M %P",
|
153
|
+
time: "%H:%M",
|
154
|
+
time_zero: "%H:%M",
|
155
|
+
time_blank: "%k:%M",
|
156
|
+
time_tz: "%H:%M %z",
|
157
|
+
time_tzn: "%H:%M %Z",
|
158
|
+
time_imperical: "%I:%M %P",
|
159
|
+
time_imperical_zero: "%I:%M %P",
|
160
|
+
time_imperical_blank: "%l:%M %P",
|
161
|
+
time_imperical_tz: "%I:%M %P %z",
|
162
|
+
time_imperical_tzn: "%I:%M %P %Z"
|
163
|
+
}
|
164
|
+
|
165
|
+
self.strftime(format_units[key])
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
require 'flash_extensions/version'
|
2
|
+
require 'flash_extensions/extensions/array_extension'
|
3
|
+
require 'flash_extensions/extensions/hash_extension'
|
4
|
+
require 'flash_extensions/extensions/object_extension'
|
5
|
+
require 'flash_extensions/extensions/string_extension'
|
6
|
+
require 'flash_extensions/extensions/time_extension'
|