mack_ruby_core_extensions 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. data/README +3 -0
  2. data/doc/classes/Array.html +465 -0
  3. data/doc/classes/Class.html +181 -0
  4. data/doc/classes/Dir.html +190 -0
  5. data/doc/classes/Float.html +148 -0
  6. data/doc/classes/Hash.html +232 -0
  7. data/doc/classes/Kernel.html +182 -0
  8. data/doc/classes/Mack.html +111 -0
  9. data/doc/classes/Mack/Utils.html +111 -0
  10. data/doc/classes/Mack/Utils/Inflector.html +422 -0
  11. data/doc/classes/Math.html +188 -0
  12. data/doc/classes/MethodNotImplemented.html +155 -0
  13. data/doc/classes/Module.html +203 -0
  14. data/doc/classes/NilClass.html +151 -0
  15. data/doc/classes/Object.html +315 -0
  16. data/doc/classes/String.html +890 -0
  17. data/doc/classes/Symbol.html +148 -0
  18. data/doc/created.rid +1 -0
  19. data/doc/files/README.html +111 -0
  20. data/doc/files/lib/extensions/array_rb.html +101 -0
  21. data/doc/files/lib/extensions/class_rb.html +101 -0
  22. data/doc/files/lib/extensions/dir_rb.html +101 -0
  23. data/doc/files/lib/extensions/float_rb.html +101 -0
  24. data/doc/files/lib/extensions/hash_rb.html +101 -0
  25. data/doc/files/lib/extensions/kernel_rb.html +109 -0
  26. data/doc/files/lib/extensions/logger_rb.html +101 -0
  27. data/doc/files/lib/extensions/math_rb.html +101 -0
  28. data/doc/files/lib/extensions/method_not_implemented_rb.html +108 -0
  29. data/doc/files/lib/extensions/module_rb.html +101 -0
  30. data/doc/files/lib/extensions/nil_rb.html +101 -0
  31. data/doc/files/lib/extensions/object_rb.html +101 -0
  32. data/doc/files/lib/extensions/string_rb.html +108 -0
  33. data/doc/files/lib/extensions/symbol_rb.html +101 -0
  34. data/doc/files/lib/mack_ruby_core_extensions_rb.html +101 -0
  35. data/doc/files/lib/utils/inflections_rb.html +101 -0
  36. data/doc/files/lib/utils/inflector_rb.html +108 -0
  37. data/doc/fr_class_index.html +42 -0
  38. data/doc/fr_file_index.html +44 -0
  39. data/doc/fr_method_index.html +92 -0
  40. data/doc/index.html +24 -0
  41. data/doc/rdoc-style.css +208 -0
  42. data/lib/extensions/array.rb +101 -0
  43. data/lib/extensions/class.rb +19 -0
  44. data/lib/extensions/dir.rb +25 -0
  45. data/lib/extensions/float.rb +5 -0
  46. data/lib/extensions/hash.rb +47 -0
  47. data/lib/extensions/kernel.rb +30 -0
  48. data/lib/extensions/logger.rb +0 -0
  49. data/lib/extensions/math.rb +15 -0
  50. data/lib/extensions/method_not_implemented.rb +12 -0
  51. data/lib/extensions/module.rb +29 -0
  52. data/lib/extensions/nil.rb +8 -0
  53. data/lib/extensions/object.rb +103 -0
  54. data/lib/extensions/string.rb +261 -0
  55. data/lib/extensions/symbol.rb +7 -0
  56. data/lib/mack_ruby_core_extensions.rb +7 -0
  57. data/lib/utils/inflections.rb +62 -0
  58. data/lib/utils/inflector.rb +129 -0
  59. data/test/extensions/array_test.rb +15 -0
  60. data/test/extensions/class_test.rb +28 -0
  61. data/test/extensions/dir_test.rb +15 -0
  62. data/test/extensions/float_test.rb +15 -0
  63. data/test/extensions/hash_test.rb +34 -0
  64. data/test/extensions/kernel_test.rb +15 -0
  65. data/test/extensions/logger_test.rb +15 -0
  66. data/test/extensions/math_test.rb +15 -0
  67. data/test/extensions/method_not_implemented_test.rb +15 -0
  68. data/test/extensions/module_test.rb +57 -0
  69. data/test/extensions/nil_test.rb +15 -0
  70. data/test/extensions/object_test.rb +15 -0
  71. data/test/extensions/string_test.rb +104 -0
  72. data/test/extensions/symbol_test.rb +15 -0
  73. data/test/test_helper.rb +6 -0
  74. data/test/utils/inflection_test.rb +32 -0
  75. metadata +133 -0
@@ -0,0 +1,19 @@
1
+ class Class
2
+
3
+ def self.new_instance_of(klass_name)
4
+ mod = Module
5
+ mod = mod.const_get(klass_name)
6
+ mod.new
7
+ end
8
+
9
+ def class_is_a?(klass_name)
10
+ self.ancestors.each do |an|
11
+ if an == klass_name
12
+ return true
13
+ end
14
+ end
15
+ return false
16
+ end
17
+
18
+ end
19
+
@@ -0,0 +1,25 @@
1
+ class Dir
2
+
3
+
4
+ #creates multiple directories
5
+ def self.make_dirs(path)
6
+ dir_names = path.split('/')
7
+ new_path=""
8
+ dir_names.each do |x|
9
+ new_path = new_path << x << '/'
10
+ if !File.directory?(new_path)
11
+ Dir.mkdir(new_path)
12
+ end
13
+ end
14
+ end
15
+
16
+
17
+ #if a directory exists, it deletes everything in it, otherwise it creates the directory
18
+ def self.prep_dir(path)
19
+ if File.directory?(path)
20
+ Dir.foreach(path) {|x| File.delete(path + x) unless File.directory?(path + x)}
21
+ else
22
+ Dir.make_dirs(path)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ class Float
2
+ def prec(x)
3
+ sprintf("%01.#{x}f", self).to_f
4
+ end
5
+ end
@@ -0,0 +1,47 @@
1
+ class Hash
2
+
3
+ def join(pair_string, join_string)
4
+ a = []
5
+ self.each_pair do |k, v|
6
+ a << sprintf(pair_string, k, v)
7
+ end
8
+ a.join(join_string)
9
+ end
10
+
11
+ # Deletes the key(s) passed in from the hash.
12
+ def -(ars)
13
+ [ars].flatten.each {|a| self.delete(a)}
14
+ self
15
+ end
16
+
17
+ # Converts a hash to query string parameters.
18
+ # An optional boolean escapes the values if true, which is the default.
19
+ def to_params(escape = true)
20
+ params = ''
21
+ stack = []
22
+
23
+ each do |k, v|
24
+ if v.is_a?(Hash)
25
+ stack << [k,v]
26
+ else
27
+ v = Rack::Utils.escape(v) if escape
28
+ params << "#{k}=#{v}&"
29
+ end
30
+ end
31
+
32
+ stack.each do |parent, hash|
33
+ hash.each do |k, v|
34
+ if v.is_a?(Hash)
35
+ stack << ["#{parent}[#{k}]", v]
36
+ else
37
+ v = Rack::Utils.escape(v) if escape
38
+ params << "#{parent}[#{k}]=#{v}&"
39
+ end
40
+ end
41
+ end
42
+
43
+ params.chop! # trailing &
44
+ params
45
+ end
46
+
47
+ end
@@ -0,0 +1,30 @@
1
+ require 'pp'
2
+ require 'stringio'
3
+
4
+ module Kernel
5
+
6
+ def self.pp_to_s(object)
7
+ pp_out = StringIO.new
8
+ PP.pp(object,pp_out)
9
+ return pp_out.string
10
+ end
11
+
12
+ def retryable(options = {}, &block)
13
+ opts = { :tries => 1, :on => Exception }.merge(options)
14
+
15
+ retries = opts[:tries]
16
+ retry_exceptions = [opts[:on]].flatten
17
+
18
+ x = %{
19
+ begin
20
+ return yield
21
+ rescue #{retry_exceptions.join(", ")} => e
22
+ retries -= 1
23
+ retry if retries > 0
24
+ end
25
+ }
26
+
27
+ eval(x, &block)
28
+ end
29
+
30
+ end
File without changes
@@ -0,0 +1,15 @@
1
+ module Math
2
+
3
+ def self.log2(x)
4
+ self.log(x)/self.log(2.0)
5
+ end
6
+
7
+ def self.min(a, b)
8
+ a < b ? a : b
9
+ end
10
+
11
+ def self.max(a, b)
12
+ a > b ? a : b
13
+ end
14
+
15
+ end
@@ -0,0 +1,12 @@
1
+ =begin rdoc
2
+ This exception is thrown if there is a method that has not been implemented that needs to be.
3
+ =end
4
+ class MethodNotImplemented < Exception
5
+
6
+ def initialize(meth, msg = nil)
7
+ mess = "#{meth} has not been implemented!\nPlease implement this method!\nIf you do not understand what this method is supposed to do, please consult the RDoc for more information."
8
+ mess += "\n#{msg}" unless msg.nil?
9
+ super(mess)
10
+ end
11
+
12
+ end
@@ -0,0 +1,29 @@
1
+ class Module
2
+
3
+ # Bulk converts the security level of methods in this Module from one level to another.
4
+ def convert_security_of_methods(old_level = :public, new_level = :protected)
5
+ eval("#{old_level}_instance_methods").each{ |meth| self.send(new_level, meth) }
6
+ self
7
+ end
8
+
9
+ # Includes this module into an Object, and changes all public methods to protected.
10
+ #
11
+ # Examples:
12
+ # module MyCoolUtils
13
+ # def some_meth
14
+ # "hi"
15
+ # end
16
+ # self.include_safely_into(FooController)
17
+ # end
18
+ # or:
19
+ # MyCoolUtils.include_safely_into(FooController, SomeOtherClass)
20
+ def include_safely_into(*args)
21
+ [args].flatten.each do |a|
22
+ if a.is_a?(String) || a.is_a?(Symbol)
23
+ a = a.to_s.constantize
24
+ end
25
+ a.send(:include, self.convert_security_of_methods)
26
+ end
27
+ end
28
+
29
+ end
@@ -0,0 +1,8 @@
1
+ class NilClass
2
+
3
+ # Will always allow true since nil's are well, nils.
4
+ def blank?
5
+ true
6
+ end
7
+
8
+ end
@@ -0,0 +1,103 @@
1
+ class Object
2
+
3
+ # This method gets called when a parameter is passed into a named route.
4
+ # This can be overridden in an Object to provlde custom handling of parameters.
5
+ def to_param
6
+ self.to_s
7
+ end
8
+
9
+ def running_time(message = "", logger = nil)
10
+ s_time = Time.now
11
+ s = "---Starting at #{s_time}---"
12
+ puts s
13
+ logger.info s unless logger.nil?
14
+ yield if block_given?
15
+ e_time = Time.now
16
+ e = "---Ending at #{e_time}---"
17
+ puts e
18
+ logger.info e unless logger.nil?
19
+ secs = e_time - s_time
20
+ if secs < 60
21
+ x = "Running time #{secs} seconds."
22
+ else
23
+ x = "Running time roughly #{secs/60} minutes [#{secs} seconds]"
24
+ end
25
+ x += " [MESSAGE]: #{message}" unless message.blank?
26
+ puts x
27
+ logger.info x unless logger.nil?
28
+ end
29
+
30
+ def send_with_chain(methods, *args)
31
+ obj = self
32
+ methods = [methods] unless methods.is_a?(Array)
33
+ methods.each {|m| obj = obj.send(m, *args)}
34
+ obj
35
+ end
36
+
37
+ =begin
38
+ ivar_cache allows you to cache the results of the block into an instance variable in a class,
39
+ and then will serve up that instance variable the next time you call that method again.
40
+
41
+ old way:
42
+ def show_page_link
43
+ unless @show_page_link # check if instance variable exists
44
+ # if the instance variable doesn't exist let's do some work and assign it to the instance variable.
45
+ @show_page_link = link_to("show", some_url(:id => self.id, :foo => bar, etc... => etc))
46
+ end
47
+ @show_page_link # now return the instance variable
48
+ end
49
+
50
+ new way:
51
+ def show_page_link
52
+ ivar_cache do
53
+ link_to("show", some_url(:id => self.id, :foo => bar, etc... => etc))
54
+ end
55
+ end
56
+
57
+ this does everything the old way did, but it is much cleaner, and a lot less code!
58
+ in case you're wondering it caches the result, by default, to an instance variable named after the method,
59
+ so in our above example the instance variable would be name, @show_page_link. this can be overridden like such:
60
+
61
+ def show_page_link
62
+ ivar_cache("foo_var") do
63
+ link_to("show", some_url(:id => self.id, :foo => bar, etc... => etc))
64
+ end
65
+ end
66
+
67
+ now it will cache it to @foo_var
68
+ =end
69
+ def ivar_cache(var_name = nil, &block)
70
+ if var_name.nil?
71
+ call = caller[0]
72
+ var_name = call[(call.index('`')+1)...call.index("'")]
73
+ end
74
+ var = instance_variable_get("@#{var_name}")
75
+ unless var
76
+ return instance_variable_set("@#{var_name}", yield) if block_given?
77
+ end
78
+ instance_variable_get("@#{var_name}")
79
+ end
80
+
81
+ def ivar_cache_clear(var_name = nil, &block)
82
+ if var_name.nil?
83
+ call = caller[0]
84
+ var_name = call[(call.index('`')+1)...call.index("'")]
85
+ end
86
+ remove_instance_variable("@#{var_name}") rescue
87
+ yield if block_given?
88
+ end
89
+
90
+ def namespaces
91
+ ivar_cache("object_namespaces") do
92
+ nss = []
93
+ full_name = self.class.name.to_s
94
+ ns = full_name.split("::")
95
+ ns.each do |n|
96
+ nss << n
97
+ end
98
+ nss.pop
99
+ nss
100
+ end
101
+ end
102
+
103
+ end
@@ -0,0 +1,261 @@
1
+ require 'digest'
2
+ class String
3
+
4
+ # Camel cases the string.
5
+ #
6
+ # Examples:
7
+ # "user".camelcase # => User
8
+ # "my_blog".camelcase # => MyBlog
9
+ # "my/blog".camelcase # => My::Blog
10
+ def camelcase
11
+ self.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
12
+ end
13
+
14
+ # Returns a constant of the string.
15
+ #
16
+ # Examples:
17
+ # "User".constantize # => User
18
+ # "HomeController".constantize # => HomeController
19
+ # "Mack::Configuration" # => Mack::Configuration
20
+ def constantize
21
+ Module.instance_eval("::#{self}")
22
+ end
23
+
24
+ # If the string is empty, this will return true.
25
+ def blank?
26
+ self == ""
27
+ end
28
+
29
+ # Maps to Mack::Utils::Inflector.instance.pluralize
30
+ def plural
31
+ Mack::Utils::Inflector.instance.pluralize(self)
32
+ end
33
+
34
+ # Maps to Mack::Utils::Inflector.instance.singularize
35
+ def singular
36
+ Mack::Utils::Inflector.instance.singularize(self)
37
+ end
38
+
39
+ def linkify(enabled = true, options = {}, &block)
40
+ text = self.dup
41
+ m = text.match(/\"([^"]+)\"\:([^:]+\:\S+)/)
42
+ until m.nil?
43
+ y = m.to_s
44
+ t = m[1]
45
+ url = m[2]
46
+
47
+ # The code below handles punctuation or p tags being mistakenly added to the url when the link is at the end of a sentence or body
48
+ url_punct_match = /\W*[&nbsp;]*[\<\/p\>]*$/.match(url)
49
+ punct = ''
50
+ if url_punct_match && url_punct_match[0] != ""
51
+ url.chomp!(url_punct_match[0])
52
+ punct = url_punct_match[0] unless url_punct_match == "="
53
+ end
54
+
55
+ if block_given?
56
+ if enabled
57
+ ret = yield t, url, options
58
+ text.gsub!(y, ret)
59
+ else
60
+ text.gsub!(y, t.to_s)
61
+ end
62
+ else
63
+ if enabled
64
+ text.gsub!(y, "<a href=\"#{url}\" #{options.join("%s=\"%s\"", " ")}>#{t}</a>#{punct}")# punct places punctuation back into proper place
65
+ else
66
+ text.gsub!(y, t.to_s)
67
+ end
68
+ end
69
+ m = text.match(/\"([^"]+)\"\:([^:]+\:\S+)/)
70
+ end
71
+ return text
72
+ end
73
+
74
+ def methodize
75
+ x = self
76
+
77
+ # if we get down to a nil or an empty string raise an exception!
78
+ raise NameError.new("#{self} cannot be converted to a valid method name!") if x.nil? || x == ''
79
+
80
+ # get rid of the big stuff in the front/back
81
+ x.strip!
82
+
83
+ # if we get down to a nil or an empty string raise an exception!
84
+ raise NameError.new("#{self} cannot be converted to a valid method name!") if x.nil? || x == ''
85
+
86
+ x = x.underscore
87
+
88
+ # get rid of spaces and make the _
89
+ x.gsub!(' ', '_')
90
+ # get rid of everything that isn't 'safe' a-z, 0-9, ?, !, =, _
91
+ x.gsub!(/([^ a-zA-Z0-9\_\?\!\=]+)/n, '_')
92
+
93
+ # if we get down to a nil or an empty string raise an exception!
94
+ raise NameError.new("#{self} cannot be converted to a valid method name!") if x.nil? || x == ''
95
+
96
+ # condense multiple 'safe' non a-z chars to just one.
97
+ # ie. ___ becomes _ !!!! becomes ! etc...
98
+ [' ', '_', '?', '!', "="].each do |c|
99
+ x.squeeze!(c)
100
+ end
101
+
102
+ # if we get down to a nil or an empty string raise an exception!
103
+ raise NameError.new("#{self} cannot be converted to a valid method name!") if x.nil? || x == ''
104
+
105
+ #down case the whole thing
106
+ x.downcase!
107
+
108
+ # get rid of any characters at the beginning that aren't a-z
109
+ while !x.match(/^[a-z]/)
110
+ x.slice!(0)
111
+
112
+ # if we get down to a nil or an empty string raise an exception!
113
+ raise NameError.new("#{self} cannot be converted to a valid method name!") if x.nil? || x == ''
114
+ end
115
+
116
+ # let's trim this bad boy down a bit now that we've cleaned it up, somewhat.
117
+ # we should do this before cleaning up the end character, because it's possible to end up with a
118
+ # bad char at the end if you trim too late.
119
+ x = x[0..100] if x.length > 100
120
+
121
+ # get rid of any characters at the end that aren't safe
122
+ while !x.match(/[a-z0-9\?\!\=]$/)
123
+ x.slice!(x.length - 1)
124
+ # if we get down to a nil or an empty string raise an exception!
125
+ raise NameError.new("#{self} cannot be converted to a valid method name!") if x.nil? || x == ''
126
+ end
127
+
128
+ # if we get down to a nil or an empty string raise an exception!
129
+ raise NameError.new("#{self} cannot be converted to a valid method name!") if x.nil? || x == ''
130
+
131
+ # let's get rid of characters that don't belong in the 'middle' of the method.
132
+ orig_middle = x[1..(x.length - 2)]
133
+ n_middle = orig_middle.dup
134
+
135
+ ['?', '!', "="].each do |c|
136
+ n_middle.gsub!(c, "_")
137
+ end
138
+
139
+ # the previous gsub can leave us with multiple underscores that need cleaning up.
140
+ n_middle.squeeze!("_")
141
+
142
+ x.gsub!(orig_middle, n_middle)
143
+ x.gsub!("_=", "=")
144
+ x
145
+ end
146
+
147
+ def underscore
148
+ camel_cased_word = self.dup
149
+ camel_cased_word.to_s.gsub(/::/, '/').
150
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
151
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
152
+ tr("-", "_").
153
+ downcase
154
+ end
155
+
156
+ def starts_with?(x)
157
+ self.match(/^#{x}/) ? true : false
158
+ end
159
+
160
+ def ends_with?(x)
161
+ self.match(/#{x}$/) ? true : false
162
+ end
163
+
164
+ # Returns "is" or "are" based on the number, i.e. "i=6; There #{isare(i)} #{i} topics here."
165
+ def self.pluralize_word(num, vals = ["is", "are"])
166
+ return vals[0] if num.to_i==1
167
+ return vals[1]
168
+ end
169
+
170
+ def remove(val)
171
+ gsub(val, '')
172
+ end
173
+
174
+ def remove!(val)
175
+ gsub!(val, '')
176
+ end
177
+
178
+ # makes long strings of unbroken characters wrap inside elements (hopefully! tested in Safari, Firefox, and IE for Windows)
179
+ # For documentation about this kind of workaround to this browser compatibility problem please see the following URL's:
180
+ # http://www.quirksmode.org/oddsandends/wbr.html
181
+ # http://krijnhoetmer.nl/stuff/css/word-wrap-break-word/
182
+ # note: if the txt has spaces, this will only try to break up runs of non-space characters longer than "every" characters
183
+ def breakify(every = 30)
184
+ every = 1 if every < 1
185
+ text = self
186
+ textile_regex = /\"([^\"]+)\":([^:]*:[\/\/]{0,1}[^ ]*)/
187
+ long_regex = /\S{#{every},}/
188
+ brokentxt = text.gsub(long_regex) do |longword|
189
+ if longword =~ textile_regex #if the longword is a textile link...ignore and recheck for the link text only
190
+ textile_link = textile_regex.match(longword)[0]
191
+ link_text = textile_regex.match(longword)[1]
192
+ longword = link_text
193
+ if longword =~ long_regex #link text is long...allow break
194
+ textile_link.scan(/.{1,#{every}}/).join("<wbr/>")
195
+ else
196
+ textile_link #the url is what triggered the match...so leave it alone
197
+ end
198
+ else
199
+ longword.scan(/.{1,#{every}}/).join("<wbr/>") #no textile link matched
200
+ end
201
+ end
202
+ #text = %Q[<span style='word-wrap:break-word;wbr:after{content:"\\00200B"}'>#{brokentxt}</span>]
203
+ #brokentxt.gsub("<wbr/>", "<br />")
204
+ brokentxt.gsub("<wbr/>", " ")
205
+ end
206
+
207
+ def breakify!(every = 30)
208
+ self.replace(self.breakify(every))
209
+ end
210
+
211
+ def hexdigest
212
+ Digest::SHA1.hexdigest(self.downcase)
213
+ end
214
+
215
+ def hexdigest!
216
+ self.replace(self.hexdigest)
217
+ end
218
+
219
+ def self.randomize(length = 10)
220
+ chars = ("A".."H").to_a + ("J".."N").to_a + ("P".."T").to_a + ("W".."Z").to_a + ("3".."9").to_a
221
+ newpass = ""
222
+ 1.upto(length) { |i| newpass << chars[rand(chars.size-1)] }
223
+ return newpass.upcase
224
+ end
225
+
226
+ def truncate(length = 30, truncate_string = "...")
227
+ if self.nil? then return end
228
+ l = length - truncate_string.length
229
+ if $KCODE == "NONE"
230
+ self.length > length ? self[0...l] + truncate_string : self
231
+ else
232
+ chars = self.split(//)
233
+ chars.length > length ? chars[0...l].join + truncate_string : self
234
+ end
235
+ end
236
+
237
+ def truncate!(length = 30, truncate_string = "...")
238
+ self.replace(self.truncate(length, truncate_string))
239
+ end
240
+
241
+ def capitalize_all_words
242
+ self.gsub(/\b\w/) {|s| s.upcase}
243
+ end
244
+
245
+ def capitalize_all_words!
246
+ self.replace(self.capitalize_all_words)
247
+ end
248
+
249
+ # keep adding on to this whenever it becomes apparent that unsafe strings
250
+ # could get passed through into the database
251
+ def sql_safe_str
252
+ if !self.nil?
253
+ self.gsub(/[\']/, "\'\'")
254
+ end
255
+ end
256
+
257
+ def sql_safe_str!
258
+ self.replace(self.sql_safe_str)
259
+ end
260
+
261
+ end