kelredd-useful 0.1.25 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/README.rdoc +3 -2
  2. data/Rakefile +6 -7
  3. data/lib/useful/active_record_helpers/mysql_migration_helpers.rb +64 -65
  4. data/lib/useful/active_record_helpers.rb +1 -1
  5. data/lib/useful/cap_tasks/app_role_migrations.rb +41 -0
  6. data/lib/useful/cap_tasks/disable_migrate.rb +15 -0
  7. data/lib/useful/cap_tasks/git_query_revision_remote.rb +31 -0
  8. data/lib/useful/cap_tasks/passenger_deploy.rb +44 -0
  9. data/lib/useful/cap_tasks/rack_cache.rb +17 -0
  10. data/lib/useful/cap_tasks.rb +1 -3
  11. data/lib/useful/erb_helpers/common.rb +86 -0
  12. data/lib/useful/erb_helpers/forms.rb +118 -0
  13. data/lib/useful/erb_helpers/links.rb +156 -0
  14. data/lib/useful/erb_helpers/proper.rb +109 -0
  15. data/lib/useful/erb_helpers/tags.rb +64 -0
  16. data/lib/useful/erb_helpers.rb +3 -0
  17. data/lib/useful/rails_helpers/environment_tests.rb +59 -0
  18. data/lib/useful/rails_helpers/erb.rb +3 -0
  19. data/lib/useful/rails_helpers.rb +3 -0
  20. data/lib/useful/ruby_extensions/array.rb +33 -34
  21. data/lib/useful/ruby_extensions/date.rb +11 -11
  22. data/lib/useful/ruby_extensions/false_class.rb +16 -13
  23. data/lib/useful/ruby_extensions/fixnum.rb +50 -19
  24. data/lib/useful/ruby_extensions/hash.rb +157 -91
  25. data/lib/useful/ruby_extensions/nil_class.rb +26 -0
  26. data/lib/useful/ruby_extensions/numeric.rb +239 -229
  27. data/lib/useful/ruby_extensions/object.rb +126 -11
  28. data/lib/useful/ruby_extensions/string.rb +259 -33
  29. data/lib/useful/ruby_extensions/true_class.rb +16 -13
  30. data/lib/useful/ruby_extensions.rb +1 -1
  31. data/lib/useful/ruby_extensions_with_activesupport.rb +2 -0
  32. data/lib/useful/shoulda_macros/test_unit.rb +58 -0
  33. data/lib/useful/version.rb +2 -2
  34. data/lib/useful.rb +1 -1
  35. metadata +19 -38
  36. data/lib/useful/cap_tasks/cache.rb +0 -5
  37. data/lib/useful/cap_tasks/gemsconfig.rb +0 -14
  38. data/lib/useful/rails_extensions/environment_tests.rb +0 -60
  39. data/lib/useful/rails_extensions.rb +0 -3
  40. data/lib/useful/ruby_extensions_from_rails/date.rb +0 -244
  41. data/lib/useful/ruby_extensions_from_rails/duration.rb +0 -99
  42. data/lib/useful/ruby_extensions_from_rails/fixnum.rb +0 -32
  43. data/lib/useful/ruby_extensions_from_rails/hash.rb +0 -50
  44. data/lib/useful/ruby_extensions_from_rails/numeric.rb +0 -60
  45. data/lib/useful/ruby_extensions_from_rails/object.rb +0 -79
  46. data/lib/useful/ruby_extensions_from_rails/string.rb +0 -174
  47. data/lib/useful/ruby_extensions_from_rails/time.rb +0 -320
  48. data/lib/useful/ruby_extensions_from_rails.rb +0 -3
  49. data/lib/useful/sinatra_helpers/environment_tests.rb +0 -19
  50. data/lib/useful/sinatra_helpers/erb/error_pages.rb +0 -25
  51. data/lib/useful/sinatra_helpers/erb/forms.rb +0 -131
  52. data/lib/useful/sinatra_helpers/erb/helpers.rb +0 -45
  53. data/lib/useful/sinatra_helpers/erb/links.rb +0 -79
  54. data/lib/useful/sinatra_helpers/erb/partials.rb +0 -41
  55. data/lib/useful/sinatra_helpers/erb/tags.rb +0 -56
  56. data/lib/useful/sinatra_helpers/erb.rb +0 -3
  57. data/lib/useful/sinatra_helpers/mailer/base.rb +0 -89
  58. data/lib/useful/sinatra_helpers/mailer/exceptions.rb +0 -17
  59. data/lib/useful/sinatra_helpers/mailer/tls.rb +0 -73
  60. data/lib/useful/sinatra_helpers/mailer.rb +0 -3
  61. data/lib/useful/sinatra_helpers.rb +0 -3
@@ -0,0 +1,156 @@
1
+ require 'useful/erb_helpers/common'
2
+ require 'useful/erb_helpers/tags'
3
+ require 'useful/ruby_extensions/string' unless ::String.new.respond_to?('cgi_escape')
4
+ require 'useful/ruby_extensions/hash' unless ::Hash.new.respond_to?('to_http_query_str')
5
+
6
+ module Useful; end
7
+ module Useful::ErbHelpers; end
8
+
9
+ module Useful::ErbHelpers::Links
10
+
11
+ include Useful::ErbHelpers::Common
12
+
13
+ # helper to emulate action view's 'link_to'
14
+ # EX : link_to "http://google.com"
15
+ # => <a href="http://google.com">http://google.com</a>
16
+ # EX : link_to "google", "http://google.com"
17
+ # => <a href="http://google.com">google</a>
18
+ # EX : link_to "google", "http://google.com", :class => "awesome"
19
+ # => <a href="http://google.com" class="awesome">google</a>
20
+ # EX : link_to "http://google.com", :popup => true
21
+ # => <a href="http://google.com" onclick="javascript: window.open(this.href); return false;">http://google.com</a>
22
+ # EX : link_to "http://google.com", :popup => ['new_window_name', 'height=300,width=600']
23
+ # => <a href="http://google.com" onclick="javascript: window.open(this.href,'new_window_name','height=300,width=600'); return false;">http://google.com</a>
24
+ # EX : link_to "http://google.com", :confirm => "Are you sure?"
25
+ # => <a href="http://google.com" onclick="javascript: return confirm('Are you sure?');">http://google.com</a>
26
+ # EX : link_to "http://google.com", :confirm => "Are you sure?", :popup => true
27
+ # => <a href="http://google.com" onclick="javascript: if (confirm('Are you sure?')) { window.open(this.href); }; return false;">http://google.com</a>
28
+ def link_to(*args)
29
+ content, href, options = link_content_href_opts(args)
30
+ options.update :href => href
31
+ erb_helper_convert_options_to_javascript!(options)
32
+ tag(:a, options) { content }
33
+ end
34
+
35
+ # helper for generating a mailto:
36
+ # EX: mail_to "me@domain.com"
37
+ # # => <a href="mailto:me@domain.com">me@domain.com</a>
38
+ # EX: mail_to "me@domain.com", nil, :replace_at => "_at_", :replace_dot => "_dot_", :class => "email"
39
+ # # => <a href="mailto:me@domain.com" class="email">me_at_domain_dot_com</a>
40
+ # EX: mail_to "me@domain.com", nil, :replace_at => " [at]", :replace_dot => " [dot] ", :disabled => true
41
+ # # => me [at] domain [dot] com
42
+ # EX: mail_to "me@domain.com", "My email", :cc => "ccaddress@domain.com", :subject => "This is an example email"
43
+ # # => <a href="mailto:me@domain.com?cc=ccaddress@domain.com&subject=This%20is%20an%20example%20email">My email</a>
44
+ def mail_to(*args)
45
+ content, email, options = link_content_href_opts(args)
46
+ email_args = [:cc, :bcc, :subject, :body].inject({}) do |args, arg|
47
+ args[arg] = options.delete(arg) if options.has_key?(arg)
48
+ args
49
+ end
50
+ content.gsub!(/@/, options.delete(:replace_at)) if options.has_key?(:replace_at)
51
+ content.gsub!(/\./, options.delete(:replace_dot)) if options.has_key?(:replace_dot)
52
+ options.delete(:disabled) ? content : link_to(content, "mailto: #{email}#{email_args.to_http_query_str}", options)
53
+ end
54
+
55
+ def link_to_function(content, function, opts={})
56
+ opts ||= {}
57
+ opts[:href] ||= 'javascript: void(0);'
58
+ opts[:onclick] = "javascript: #{function}; return false;"
59
+ link_to content, opts[:href], opts
60
+ end
61
+
62
+ # helper to emulate 'image_tag'
63
+ # EX : image_tag 'logo.jpg'
64
+ # => <img src="/images/logo.jpg" />
65
+ # EX : image_tag '/better/logo.jpg'
66
+ # => <img src="/better/logo.jpg" />
67
+ def image_tag(source,options={})
68
+ options[:src] = ['/'].include?(source[0..0]) ? source : "/images/#{source}"
69
+ tag(:img, options)
70
+ end
71
+
72
+ # helper to emulate activesupport's 'stylesheet_link_tag'
73
+ # EX : stylesheet_link_tag 'default'
74
+ # => <link rel="stylesheet" type="text/css" media="all" href="/stylesheets/default.css">
75
+ # EX : stylesheet_link_tag 'default', :environment => 'development'
76
+ # => <link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/default.css?12345678">
77
+ # EX : stylesheet_link_tag 'default', :media => 'screen'
78
+ # => <link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/default.css">
79
+ # EX : stylesheet_link_tag 'default', 'test, :media => 'screen'
80
+ # => <link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/default.css">
81
+ # => <link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/test.css">
82
+ # EX : stylesheet_link_tag ['default', 'test], :media => 'screen'
83
+ # => <link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/default.css">
84
+ # => <link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/test.css">
85
+ # EX : stylesheet_link_tag 'default', '/other_sheets/other', '/other_sheets/another.css'
86
+ # => <link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/default.css">
87
+ # => <link rel="stylesheet" type="text/css" media="screen" href="/other_sheets/other.css">
88
+ # => <link rel="stylesheet" type="text/css" media="screen" href="/other_sheets/another.css">
89
+ def stylesheet_link_tag(*args)
90
+ srcs, options = handle_srcs_options(args)
91
+ options[:rel] ||= "stylesheet"
92
+ options[:type] ||= "text/css"
93
+ options[:media] ||= "all"
94
+ Array(srcs).collect do |src|
95
+ #TODO: write sinatra helper to auto set env with Sinatra::Application.environment.to_s
96
+ options[:href] = build_src_href(src, :default_path => "stylesheets", :extension => ".css", :environment => options.delete(:environment))
97
+ tag(:link, options)
98
+ end.join("\n")
99
+ end
100
+
101
+ # helper to emulate 'javascript_tag'
102
+ def javascript_tag(options={})
103
+ options[:type] ||= "text/javascript"
104
+ tag(:script, options) { yield }
105
+ end
106
+
107
+ # helper to emulate 'javascript_include_tag'
108
+ # EX : javascript_include_tag 'app'
109
+ # => <script src="/js/app.js" type="text/javascript" />
110
+ # EX : javascript_include_tag ['app', 'jquery']
111
+ # => <script src="/js/app.js" type="text/javascript" />
112
+ # => <script src="/js/jquery.js" type="text/javascript" />
113
+ def javascript_include_tag(*args)
114
+ srcs, options = handle_srcs_options(args)
115
+ options[:type] ||= "text/javascript"
116
+ Array(srcs).collect do |src|
117
+ #TODO: write sinatra helper to auto set env with Sinatra::Application.environment.to_s
118
+ options[:src] = build_src_href(src, :default_path => "javascripts", :extension => ".js", :environment => options.delete(:environment))
119
+ tag(:script, options) { '' }
120
+ end.join("\n")
121
+ end
122
+
123
+ def self.included(receiver)
124
+ receiver.send :include, Useful::ErbHelpers::Tags
125
+ end
126
+
127
+ private
128
+
129
+ def link_content_href_opts(args)
130
+ if args[1] && !args[1].kind_of?(::Hash)
131
+ [args[0], args[1], (args[2] || {})]
132
+ else
133
+ [args[0], args[0].dup, (args[1] || {})]
134
+ end
135
+ end
136
+
137
+ def handle_srcs_options(args)
138
+ the_args = args.flatten
139
+ if the_args.last && the_args.last.kind_of?(::Hash)
140
+ [the_args[0..-2], the_args.last]
141
+ else
142
+ [the_args, {}]
143
+ end
144
+ end
145
+
146
+ def build_src_href(src, options)
147
+ href = ""
148
+ src = src.to_s
149
+ href += ['/'].include?(src[0..0]) ? src : "/#{options[:default_path]}/#{src}"
150
+ href += options[:extension] unless src.include?(options[:extension])
151
+ href += "?#{Time.now.to_i}" if options[:environment].to_s == 'development'
152
+ href
153
+ end
154
+
155
+ end
156
+
@@ -0,0 +1,109 @@
1
+ # Note: these helpers are designed to be actionpack safe
2
+ # => these helpers are included in the useful/rails_extensions/erb
3
+ # => don't put any actionpack helpers in this module
4
+
5
+ require 'useful/erb_helpers/common'
6
+ require 'useful/erb_helpers/tags'
7
+ require 'useful/ruby_extensions/string' unless ::String.new.respond_to?('ends_with?')
8
+ unless ::Object.new.respond_to?('blank?') && ::Object.new.respond_to?('is_true?') && ::Object.new.respond_to?('returning')
9
+ require 'useful/ruby_extensions/object'
10
+ end
11
+
12
+ module Useful; end
13
+ module Useful::ErbHelpers; end
14
+
15
+ module Useful::ErbHelpers::Proper
16
+
17
+ include Useful::ErbHelpers::Common
18
+
19
+ # This one's a little different than the corresponding actionpack version:
20
+ # => ie. you don't pass an options string as the 2nd argument
21
+ # => you, instead, pass a block that should return the desired options string
22
+ # => ie, proper_select_tag('user') { '<option>test</option>' }
23
+ def proper_select_tag(name, options={}, &block)
24
+ html_name = (options[:multiple].is_true? && !name.to_s.ends_with?("[]")) ? "#{name}[]" : name
25
+ options[:multiple] = OPTIONS[:multiple] if options[:multiple] == true
26
+ options[:tag] = 'select'
27
+ @_out_buf ||= ''
28
+ @_out_buf << input_tag(nil, html_name, nil, options, &block)
29
+ end
30
+
31
+ # TODO: write tests
32
+ def proper_check_box_tag(*args)
33
+ name, value, checked, options = proper_check_radio_options('1', args)
34
+ options[:id] ||= erb_helper_common_safe_id(name.to_s)
35
+ options[:checked] = OPTIONS[:checked] if checked
36
+ label_text = options.delete(:label)
37
+ unchecked_value = options.delete(:unchecked_value)
38
+ unchecked_value = '0' if unchecked_value.nil?
39
+ disable_unchecked_value = options.delete(:disable_unchecked_value)
40
+ returning html = '' do
41
+ html << input_tag(:hidden, name, unchecked_value, :id => "#{options[:id]}_hidden") unless disable_unchecked_value.is_true?
42
+ html << input_tag(:checkbox, name, value, options)
43
+ html << tag(:label, :for => options[:id]) { label_text } unless label_text.blank?
44
+ end
45
+ end
46
+
47
+ # TODO: write tests
48
+ def proper_radio_button_tag(*args)
49
+ name, value, checked, options = proper_check_radio_options(nil, args)
50
+ options[:id] ||= erb_helper_common_safe_id(name.to_s)
51
+ options[:checked] = OPTIONS[:checked] if checked
52
+ label_text = options.delete(:label) || value.to_s.humanize
53
+ label_container_tag = options.delete(:tag) || :span
54
+ radio_button_str = input_tag(:radio, name, value, options)
55
+ returning html = '' do
56
+ html << if label_text.blank?
57
+ radio_button_str
58
+ else
59
+ tag(:label, :for => options[:id]) do
60
+ radio_button_str + tag(label_container_tag) { label_text }
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ def self.included(receiver)
67
+ receiver.send :include, Useful::ErbHelpers::Tags
68
+ end
69
+
70
+ private
71
+
72
+ def proper_check_radio_options(default_value, args)
73
+ # args should be passed to proper checkbox and radiobutton tags like this:
74
+ # => name, value, checked, options={}
75
+ # this allows user to pass only args they care about,
76
+ # and default the ones they don't care about
77
+ if case_arg_options_for_length(4, args)
78
+ # args: name, value, checked, options --OR-- name, value, checked
79
+ args[1] ||= default_value # default the value
80
+ args[2] ||= false # default whether checked
81
+ args[3] ||= {} # default the options
82
+ [args[0], args[1], args[2], args[3]]
83
+ elsif case_arg_options_for_length(3, args)
84
+ # args: name, value, options --OR-- name, value
85
+ args[1] ||= default_value # default the value
86
+ args[2] ||= {} # default the options
87
+ checked = (args[2].delete(:checked) || false) rescue false
88
+ [args[0], args[1], checked, args[2]]
89
+ elsif case_arg_options_for_length(2, args)
90
+ # args: name, options --OR-- name
91
+ args[1] ||= {} # default the options
92
+ value = (args[1].delete(:value) || default_value) rescue default_value
93
+ checked = (args[1].delete(:checked) || false) rescue false
94
+ [args[0], value, checked, args[1]]
95
+ elsif case_arg_options_for_length(1, args)
96
+ # args: name
97
+ # => default everything
98
+ [args[0], default_value, false, {}]
99
+ else
100
+ # this is invalid
101
+ raise ArgumentError, "please specify 1 to 4 arguments for name, value, checked, and options"
102
+ end
103
+ end
104
+
105
+ def case_arg_options_for_length(length, args)
106
+ args.length == length || (args.length == (length-1) && !(args[(length-2)].kind_of?(::Hash) || args[(length-2)].nil?))
107
+ end
108
+
109
+ end
@@ -0,0 +1,64 @@
1
+ # Note: these helpers are designed to be actionpack safe
2
+ # => these helpers are included in the useful/rails_extensions/erb
3
+ # => don't put any actionpack helpers in this module
4
+
5
+ require 'useful/erb_helpers/common'
6
+ require 'useful/ruby_extensions/object' unless ::Object.new.respond_to?('blank?')
7
+ require 'useful/ruby_extensions/hash' unless ::Hash.new.respond_to?('to_html_attrs')
8
+
9
+ module Useful; end
10
+ module Useful::ErbHelpers; end
11
+
12
+ module Useful::ErbHelpers::Tags
13
+
14
+ include Useful::ErbHelpers::Common
15
+
16
+ def clear_tag(options={})
17
+ options[:tag] ||= :div
18
+ options[:style] ||= ''
19
+ options[:style] = "clear:both;#{" #{options[:style]}" unless options[:style].blank?}"
20
+ tag(options.delete(:tag), options) { '' }
21
+ end
22
+
23
+ # helpers to escape text for html
24
+ if defined?(::Rack::Utils)
25
+ include ::Rack::Utils
26
+ alias_method(:h, :escape_html)
27
+ end
28
+ if defined?(:h)
29
+ # escape tag text content and format for text-like display
30
+ def h_text(text, opts={})
31
+ h(text.to_s).
32
+ gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
33
+ split("\n").collect do |line|
34
+ line.nil? ? '': line.sub(/(\s+)?\S*/) {|lead| lead.gsub(/\s/,'&nbsp;')}
35
+ end.join("\n"). # change any leading white spaces on a line to '&nbsp;'
36
+ gsub(/\n/,'\1<br />') # newlines -> br added
37
+ end
38
+ end
39
+
40
+ def input_tag(type, name, value=nil, options={}, &block)
41
+ options[:tag] ||= :input
42
+ options[:type] = type unless type.nil?
43
+ unless name.nil?
44
+ options[:name] = name
45
+ options[:id] ||= erb_helper_common_safe_id(name)
46
+ end
47
+ options[:value] = value unless value.nil?
48
+ options[:disabled] = OPTIONS[:disabled] if options[:disabled]
49
+ if block_given?
50
+ tag(options.delete(:tag), options) { erb_helper_common_capture(&block) }
51
+ else
52
+ tag(options.delete(:tag), options)
53
+ end
54
+ end
55
+
56
+ # emulator for rails' 'content_tag'
57
+ # EX : tag(:h1, :title => "shizam") { "shizam" }
58
+ # => <h1 title="shizam">shizam</h1>
59
+ def tag(name, options={})
60
+ "<#{name.to_s}#{" #{options.to_html_attrs}" unless options.empty?}#{block_given? ? ">#{yield}</#{name}" : " /"}>"
61
+ end
62
+
63
+ end
64
+
@@ -0,0 +1,3 @@
1
+ Dir[File.join(File.dirname(__FILE__), "erb_helpers" ,"*.rb")].each do |file|
2
+ require "useful/erb_helpers/#{File.basename(file, ".rb")}"
3
+ end
@@ -0,0 +1,59 @@
1
+ module Useful; end
2
+ module Useful::RailsExtensions; end
3
+
4
+ module Useful::RailsExtensions::EnvironmentTests
5
+
6
+ module ClassMethods
7
+
8
+ def production?
9
+ RAILS_ENV == 'production'
10
+ end
11
+
12
+ def development?
13
+ RAILS_ENV == 'development'
14
+ end
15
+
16
+ end
17
+
18
+ module InstanceMethods
19
+
20
+ def production?
21
+ self.class.production?
22
+ end
23
+
24
+ def development?
25
+ self.class.development?
26
+ end
27
+
28
+ end
29
+
30
+ def self.included(receiver)
31
+ receiver.extend ClassMethods
32
+ receiver.send :include, InstanceMethods
33
+ end
34
+
35
+ end
36
+
37
+ module ActiveRecord
38
+ class Base
39
+ include Useful::RailsExtensions::EnvironmentTests
40
+ end
41
+ class Observer
42
+ include Useful::RailsExtensions::EnvironmentTests
43
+ end
44
+ end
45
+ module ActionController
46
+ class Base
47
+ include Useful::RailsExtensions::EnvironmentTests
48
+ end
49
+ end
50
+ module ActionView
51
+ class Base
52
+ include Useful::RailsExtensions::EnvironmentTests
53
+ end
54
+ end
55
+ module ActionMailer
56
+ class Base
57
+ include Useful::RailsExtensions::EnvironmentTests
58
+ end
59
+ end
@@ -0,0 +1,3 @@
1
+ require "useful/erb_helpers/tags"
2
+ require "useful/erb_helpers/proper"
3
+ # TODO: do what you have to get them into action view / controller
@@ -0,0 +1,3 @@
1
+ Dir[File.join(File.dirname(__FILE__), "rails_helpers" ,"*.rb")].each do |file|
2
+ require "useful/rails_helpers/#{File.basename(file, ".rb")}"
3
+ end
@@ -1,43 +1,42 @@
1
- module Useful
2
- module RubyExtensions
3
- module Array
4
-
5
- module ClassMethods; end
6
- def self.included(klass)
7
- klass.extend(ClassMethods) if klass.kind_of?(Class)
8
- end
1
+ module Useful; end
2
+ module Useful::RubyExtensions; end
9
3
 
10
- module ClassMethods
4
+ module Useful::RubyExtensions::Array
5
+
6
+ module ClassMethods; end
7
+ def self.included(klass)
8
+ klass.extend(ClassMethods) if klass.kind_of?(Class)
9
+ end
11
10
 
12
- # adds the contents of a2 to a1, removing duplicates
13
- def merge(a1,a2)
14
- a2.each{|item| a1 << item unless a1.include?(item)}
15
- a1
16
- end
17
-
18
- end
11
+ module ClassMethods
19
12
 
20
- # returns a new array, containing the contents of an_a with the contents of this array, removing duplicates
21
- def merge(an_a)
22
- self.class.merge(self.clone, an_a)
23
- end
24
- # adds the contents of an_a to this array, removing duplicates (inline version of #merge)
25
- def merge!(an_a)
26
- self.class.merge(self, an_a)
27
- end
13
+ # adds the contents of a2 to a1, removing duplicates
14
+ def merge(a1,a2)
15
+ a2.each{|item| a1 << item unless a1.include?(item)}
16
+ a1
17
+ end
18
+
19
+ end
28
20
 
29
- # split into an array of sized-arrays
30
- def groups(size=1)
31
- return [] if size <= 0
32
- n,r = self.size.divmod(size)
33
- grps = (0..(n-1)).collect{|i| self[i*size,size]}
34
- r > 0 ? grps << self[-r,r] : grps
35
- end
36
- alias / groups
37
- alias chunks groups
21
+ # returns a new array, containing the contents of an_a with the contents of this array, removing duplicates
22
+ def merge(an_a)
23
+ self.class.merge(self.clone, an_a)
24
+ end
25
+ # adds the contents of an_a to this array, removing duplicates (inline version of #merge)
26
+ def merge!(an_a)
27
+ self.class.merge(self, an_a)
28
+ end
38
29
 
39
- end
30
+ # split into an array of sized-arrays
31
+ def groups(size=1)
32
+ return [] if size <= 0
33
+ n,r = self.size.divmod(size)
34
+ grps = (0..(n-1)).collect{|i| self[i*size,size]}
35
+ r > 0 ? grps << self[-r,r] : grps
40
36
  end
37
+ alias / groups
38
+ alias chunks groups
39
+
41
40
  end
42
41
 
43
42
  class Array
@@ -1,16 +1,16 @@
1
- module Useful
2
- module RubyExtensions
3
- module Date
4
-
5
- def week_days_until(end_date)
6
- week_days = (1..5)
7
- raise ::ArgumentError, "End date cannot be nil." if end_date.nil?
8
- raise ::ArgumentError, "End date cannot come before questioned date." if end_date < self
9
- (self..end_date).to_a.select{|date| week_days.include?(date.wday)}.length
10
- end
1
+ module Useful; end
2
+ module Useful::RubyExtensions; end
11
3
 
12
- end
4
+ module Useful::RubyExtensions::Date
5
+
6
+ WEEK_DAYS = (1..5)
7
+
8
+ def week_days_between(end_date)
9
+ raise ::ArgumentError, "End date cannot be nil." if end_date.nil?
10
+ raise ::ArgumentError, "End date cannot come before questioned date." if end_date < self
11
+ (self..end_date).to_a.select{|date| WEEK_DAYS.include?(date.wday)}.length
13
12
  end
13
+
14
14
  end
15
15
 
16
16
  class Date
@@ -1,18 +1,21 @@
1
- module Useful
2
- module RubyExtensions
3
- module FalseClass
4
-
5
- def to_affirmative
6
- "No"
7
- end
8
- alias :to_casual_s :to_affirmative
1
+ module Useful; end
2
+ module Useful::RubyExtensions; end
9
3
 
10
- def to_i
11
- 0
12
- end
13
-
14
- end
4
+ module Useful::RubyExtensions::FalseClass
5
+
6
+ def to_affirmative(abbreviate=false)
7
+ abbreviate ? "N" : "No"
15
8
  end
9
+ alias :to_casual_s :to_affirmative
10
+
11
+ def to_i
12
+ 0
13
+ end
14
+
15
+ def to_boolean
16
+ false
17
+ end
18
+
16
19
  end
17
20
 
18
21
  class FalseClass
@@ -1,28 +1,59 @@
1
- module Useful
2
- module RubyExtensions
3
- module Fixnum
4
-
5
- # returns a string reprensentation of the number padded with pad_num to a specified length
6
- def pad(length = 3, pad_num = 0)
7
- self.to_s.rjust(length,pad_num.to_s) rescue self.to_s
8
- end
1
+ module Useful; end
2
+ module Useful::RubyExtensions; end
3
+
4
+ module Useful::RubyExtensions::Fixnum
5
+
6
+ # returns a string reprensentation of the number padded with pad_num to a specified length
7
+ def pad(length = 3, pad_num = 0)
8
+ self.to_s.rjust(length,pad_num.to_s) rescue self.to_s
9
+ end
9
10
 
10
- # return the value in values that is nearest to the number
11
- def to_nearest_value(values = [])
12
- return self if values.length == 0
13
- value = values.first.to_i rescue self
14
- diff = (self-value).abs
15
- values.each do |val|
16
- if (self-val.to_i).abs < diff
17
- diff = (self-val.to_i).abs
18
- value = val.to_i
11
+ # return the value in values that is nearest to the number
12
+ def to_nearest_value(values = [])
13
+ return self if values.length == 0
14
+ value = values.first.to_i rescue self
15
+ diff = (self-value).abs
16
+ values.each do |val|
17
+ if (self-val.to_i).abs < diff
18
+ diff = (self-val.to_i).abs
19
+ value = val.to_i
20
+ end
21
+ end
22
+ value
23
+ end
24
+
25
+ module FromActivesupport
26
+ # All methods here will yield to their Activesupport versions, if defined
27
+
28
+ # Turns a number into an ordinal string used to denote the position in an
29
+ # ordered sequence such as 1st, 2nd, 3rd, 4th.
30
+ #
31
+ # Examples:
32
+ # 1.ordinalize # => "1st"
33
+ # 2.ordinalize # => "2nd"
34
+ # 1003.ordinalize # => "1003rd"
35
+ # 1004.ordinalize # => "1004th"
36
+ unless 1.respond_to?('ordinalize')
37
+ def ordinalize
38
+ if (11..13).include?(self.to_i % 100)
39
+ "#{self}th"
40
+ else
41
+ case self.to_i % 10
42
+ when 1; "#{self}st"
43
+ when 2; "#{self}nd"
44
+ when 3; "#{self}rd"
45
+ else "#{self}th"
19
46
  end
20
47
  end
21
- value
22
48
  end
23
-
24
49
  end
50
+
51
+ end
52
+
53
+ def self.included(receiver)
54
+ receiver.send :include, FromActivesupport
25
55
  end
56
+
26
57
  end
27
58
 
28
59
  class Fixnum