kelredd-useful 0.1.25 → 0.2.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.
- data/README.rdoc +3 -2
- data/Rakefile +6 -7
- data/lib/useful/active_record_helpers/mysql_migration_helpers.rb +64 -65
- data/lib/useful/active_record_helpers.rb +1 -1
- data/lib/useful/cap_tasks/app_role_migrations.rb +41 -0
- data/lib/useful/cap_tasks/disable_migrate.rb +15 -0
- data/lib/useful/cap_tasks/git_query_revision_remote.rb +31 -0
- data/lib/useful/cap_tasks/passenger_deploy.rb +44 -0
- data/lib/useful/cap_tasks/rack_cache.rb +17 -0
- data/lib/useful/cap_tasks.rb +1 -3
- data/lib/useful/erb_helpers/common.rb +86 -0
- data/lib/useful/erb_helpers/forms.rb +118 -0
- data/lib/useful/erb_helpers/links.rb +156 -0
- data/lib/useful/erb_helpers/proper.rb +109 -0
- data/lib/useful/erb_helpers/tags.rb +64 -0
- data/lib/useful/erb_helpers.rb +3 -0
- data/lib/useful/rails_helpers/environment_tests.rb +59 -0
- data/lib/useful/rails_helpers/erb.rb +3 -0
- data/lib/useful/rails_helpers.rb +3 -0
- data/lib/useful/ruby_extensions/array.rb +33 -34
- data/lib/useful/ruby_extensions/date.rb +11 -11
- data/lib/useful/ruby_extensions/false_class.rb +16 -13
- data/lib/useful/ruby_extensions/fixnum.rb +50 -19
- data/lib/useful/ruby_extensions/hash.rb +157 -91
- data/lib/useful/ruby_extensions/nil_class.rb +26 -0
- data/lib/useful/ruby_extensions/numeric.rb +239 -229
- data/lib/useful/ruby_extensions/object.rb +126 -11
- data/lib/useful/ruby_extensions/string.rb +259 -33
- data/lib/useful/ruby_extensions/true_class.rb +16 -13
- data/lib/useful/ruby_extensions.rb +1 -1
- data/lib/useful/ruby_extensions_with_activesupport.rb +2 -0
- data/lib/useful/shoulda_macros/test_unit.rb +58 -0
- data/lib/useful/version.rb +2 -2
- data/lib/useful.rb +1 -1
- metadata +19 -38
- data/lib/useful/cap_tasks/cache.rb +0 -5
- data/lib/useful/cap_tasks/gemsconfig.rb +0 -14
- data/lib/useful/rails_extensions/environment_tests.rb +0 -60
- data/lib/useful/rails_extensions.rb +0 -3
- data/lib/useful/ruby_extensions_from_rails/date.rb +0 -244
- data/lib/useful/ruby_extensions_from_rails/duration.rb +0 -99
- data/lib/useful/ruby_extensions_from_rails/fixnum.rb +0 -32
- data/lib/useful/ruby_extensions_from_rails/hash.rb +0 -50
- data/lib/useful/ruby_extensions_from_rails/numeric.rb +0 -60
- data/lib/useful/ruby_extensions_from_rails/object.rb +0 -79
- data/lib/useful/ruby_extensions_from_rails/string.rb +0 -174
- data/lib/useful/ruby_extensions_from_rails/time.rb +0 -320
- data/lib/useful/ruby_extensions_from_rails.rb +0 -3
- data/lib/useful/sinatra_helpers/environment_tests.rb +0 -19
- data/lib/useful/sinatra_helpers/erb/error_pages.rb +0 -25
- data/lib/useful/sinatra_helpers/erb/forms.rb +0 -131
- data/lib/useful/sinatra_helpers/erb/helpers.rb +0 -45
- data/lib/useful/sinatra_helpers/erb/links.rb +0 -79
- data/lib/useful/sinatra_helpers/erb/partials.rb +0 -41
- data/lib/useful/sinatra_helpers/erb/tags.rb +0 -56
- data/lib/useful/sinatra_helpers/erb.rb +0 -3
- data/lib/useful/sinatra_helpers/mailer/base.rb +0 -89
- data/lib/useful/sinatra_helpers/mailer/exceptions.rb +0 -17
- data/lib/useful/sinatra_helpers/mailer/tls.rb +0 -73
- data/lib/useful/sinatra_helpers/mailer.rb +0 -3
- data/lib/useful/sinatra_helpers.rb +0 -3
data/README.rdoc
CHANGED
@@ -3,7 +3,8 @@
|
|
3
3
|
== Description
|
4
4
|
|
5
5
|
A collection of useful helpers for various ruby things. Includes
|
6
|
-
|
6
|
+
ruby extensions that play nice with activesupport, helpers for
|
7
|
+
sinatra/rails/activerecord/erb, etc...
|
7
8
|
|
8
9
|
You probably never want them all, all the time, but just require in
|
9
10
|
the pieces you are interested in.
|
@@ -20,8 +21,8 @@ the pieces you are interested in.
|
|
20
21
|
== Usage
|
21
22
|
|
22
23
|
require 'rubygems'
|
24
|
+
require 'useful/ruby_extensions'
|
23
25
|
require 'useful/sinatra_helpers'
|
24
|
-
require 'useful/mysql_helpers'
|
25
26
|
|
26
27
|
== License
|
27
28
|
|
data/Rakefile
CHANGED
@@ -20,19 +20,12 @@ spec = Gem::Specification.new do |s|
|
|
20
20
|
# s.executables = ['useful']
|
21
21
|
|
22
22
|
s.add_dependency('json')
|
23
|
-
s.add_dependency('tmail')
|
24
23
|
end
|
25
24
|
|
26
25
|
Rake::GemPackageTask.new(spec) do |pkg|
|
27
26
|
pkg.gem_spec = spec
|
28
27
|
end
|
29
28
|
|
30
|
-
Rake::TestTask.new do |t|
|
31
|
-
t.libs << 'test'
|
32
|
-
t.test_files = FileList["test/**/*_test.rb"]
|
33
|
-
t.verbose = true
|
34
|
-
end
|
35
|
-
|
36
29
|
desc 'Generate the gemspec to serve this Gem from Github'
|
37
30
|
task :gemspec do
|
38
31
|
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
@@ -40,6 +33,12 @@ task :gemspec do
|
|
40
33
|
puts "Created gemspec: #{file}"
|
41
34
|
end
|
42
35
|
|
36
|
+
Rake::TestTask.new do |t|
|
37
|
+
t.libs << 'test'
|
38
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
39
|
+
t.verbose = true
|
40
|
+
end
|
41
|
+
|
43
42
|
require 'cucumber'
|
44
43
|
require 'cucumber/rake/task'
|
45
44
|
|
@@ -1,82 +1,81 @@
|
|
1
|
-
module Useful
|
2
|
-
|
3
|
-
module MysqlMigrationHelpers
|
4
|
-
|
5
|
-
module ClassMethods
|
1
|
+
module Useful; end
|
2
|
+
module Useful::ActiveRecordHelpers; end
|
6
3
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
execute %{alter table #{from_table}
|
11
|
-
add constraint #{constraint_name}
|
12
|
-
foreign key (#{from_column})
|
13
|
-
references #{to_table}(#{opts[:destination_key]})}
|
14
|
-
end
|
4
|
+
module Useful::ActiveRecordHelpers::MysqlMigrationHelpers
|
5
|
+
|
6
|
+
module ClassMethods
|
15
7
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
8
|
+
def foreign_key(from_table, from_column, to_table, opts={})
|
9
|
+
opts[:destination_key] = 'id' unless opts[:destination_key]
|
10
|
+
constraint_name = "fk_#{from_table}_#{from_column}"
|
11
|
+
execute %{alter table #{from_table}
|
12
|
+
add constraint #{constraint_name}
|
13
|
+
foreign key (#{from_column})
|
14
|
+
references #{to_table}(#{opts[:destination_key]})}
|
15
|
+
end
|
22
16
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
17
|
+
def drop_foreign_key(from_table, *from_columns)
|
18
|
+
from_columns.each { |from_column|
|
19
|
+
constraint_name = "fk_#{from_table}_#{from_column}"
|
20
|
+
execute %{alter table #{from_table} drop FOREIGN KEY #{constraint_name}}
|
21
|
+
}
|
22
|
+
end
|
27
23
|
|
28
|
-
|
29
|
-
|
30
|
-
|
24
|
+
def remove_column_with_fk(table, column)
|
25
|
+
drop_foreign_key(table, column)
|
26
|
+
remove_column(table, column)
|
27
|
+
end
|
31
28
|
|
32
|
-
|
33
|
-
|
34
|
-
|
29
|
+
def safe_drop_table(table_name)
|
30
|
+
execute "drop table if exists #{table_name}"
|
31
|
+
end
|
35
32
|
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
def unique_constraint(table_name, columns)
|
34
|
+
execute %{ALTER TABLE #{table_name} ADD CONSTRAINT uniq_#{columns.join('_')} UNIQUE KEY (#{columns.join(", ")})}
|
35
|
+
end
|
39
36
|
|
40
|
-
|
41
|
-
|
42
|
-
|
37
|
+
def set_auto_increment(table, number)
|
38
|
+
execute %{ALTER TABLE #{table} AUTO_INCREMENT = #{number}}
|
39
|
+
end
|
43
40
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
#{sql_query_definition}
|
48
|
-
}
|
49
|
-
end
|
41
|
+
def clear_table(table_to_clear)
|
42
|
+
execute %{delete from #{table_to_clear}}
|
43
|
+
end
|
50
44
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
45
|
+
def create_view(view_name,sql_query_definition)
|
46
|
+
execute %{
|
47
|
+
CREATE SQL SECURITY INVOKER VIEW #{view_name.to_s} AS
|
48
|
+
#{sql_query_definition}
|
49
|
+
}
|
50
|
+
end
|
56
51
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
52
|
+
def drop_view(view_name)
|
53
|
+
execute %{
|
54
|
+
DROP VIEW #{view_name}
|
55
|
+
}
|
56
|
+
end
|
63
57
|
|
64
|
-
|
65
|
-
|
66
|
-
|
58
|
+
def alter_view(view_name,sql_query_definition)
|
59
|
+
execute %{
|
60
|
+
ALTER SQL SECURITY INVOKER VIEW #{view_name.to_s} AS
|
61
|
+
#{sql_query_definition}
|
62
|
+
}
|
63
|
+
end
|
67
64
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.included(receiver)
|
74
|
-
receiver.extend ClassMethods
|
75
|
-
receiver.send :include, InstanceMethods
|
76
|
-
end
|
65
|
+
def raise_err(msg = '')
|
66
|
+
raise ActiveRecord::IrreversibleMigration, msg
|
67
|
+
end
|
77
68
|
|
78
|
-
end
|
79
69
|
end
|
70
|
+
|
71
|
+
module InstanceMethods
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.included(receiver)
|
75
|
+
receiver.extend ClassMethods
|
76
|
+
receiver.send :include, InstanceMethods
|
77
|
+
end
|
78
|
+
|
80
79
|
end
|
81
80
|
|
82
81
|
module ActiveRecord
|
@@ -0,0 +1,41 @@
|
|
1
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
2
|
+
abort "useful/cap_tasks requires Capistrano 2"
|
3
|
+
end
|
4
|
+
|
5
|
+
Capistrano::Configuration.instance.load do
|
6
|
+
|
7
|
+
namespace :deploy do
|
8
|
+
|
9
|
+
# These tasks override the default cap migration tasks
|
10
|
+
# => allows for running your migrations on the primary app server only
|
11
|
+
|
12
|
+
desc "_: (#{application}) Bring down site, deploy with migrations on primary app server only, bring site back up."
|
13
|
+
task :migrations, :roles => :app, :only => { :primary => true } do
|
14
|
+
stop
|
15
|
+
update
|
16
|
+
migrate
|
17
|
+
start
|
18
|
+
end
|
19
|
+
|
20
|
+
# Copied from http://github.com/jamis/capistrano/blob/df0935c4c135207582da343aacdd4cf080fcfed0/lib/capistrano/recipes/deploy.rb
|
21
|
+
# => changed :roles => :db to :roles => :app so that migrations will run on the primary app server only
|
22
|
+
# => also added , :pty => false as an argument on the run command
|
23
|
+
desc "_: (#{application}) port of default cap task to only run on primary app server"
|
24
|
+
task :migrate, :roles => :app, :only => { :primary => true } do
|
25
|
+
rake = fetch(:rake, "rake")
|
26
|
+
rails_env = fetch(:rails_env, "production")
|
27
|
+
migrate_env = fetch(:migrate_env, "")
|
28
|
+
migrate_target = fetch(:migrate_target, :latest)
|
29
|
+
|
30
|
+
directory = case migrate_target.to_sym
|
31
|
+
when :current then current_path
|
32
|
+
when :latest then current_release
|
33
|
+
else raise ArgumentError, "unknown migration target #{migrate_target.inspect}"
|
34
|
+
end
|
35
|
+
|
36
|
+
run "cd #{directory}; #{rake} RAILS_ENV=#{rails_env} #{migrate_env} db:migrate", :pty => false
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
2
|
+
abort "useful/cap_tasks requires Capistrano 2"
|
3
|
+
end
|
4
|
+
|
5
|
+
Capistrano::Configuration.instance.load do
|
6
|
+
|
7
|
+
namespace :deploy do
|
8
|
+
|
9
|
+
desc "_: (#{application}) no migrating needed, this one does nothing..."
|
10
|
+
task :migrate, :roles => :app, :only => { :primary => true } do
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
2
|
+
abort "useful/cap_tasks requires Capistrano 2"
|
3
|
+
end
|
4
|
+
|
5
|
+
Capistrano::Configuration.instance.load do
|
6
|
+
|
7
|
+
namespace :deploy do
|
8
|
+
|
9
|
+
task :before_update_code, :except => { :no_release => true } do
|
10
|
+
|
11
|
+
# Set the branch name to current git HEAD if this stage is configured that way
|
12
|
+
set :branch, run_locally("git symbolic-ref HEAD 2>/dev/null").split('/').last.strip if branch == :current_git_branch
|
13
|
+
|
14
|
+
# hack to remotely lookup the revision sending the config'd scm_password
|
15
|
+
# => prevents having to enter it locally
|
16
|
+
set :real_revision, source.local.query_revision(revision) { |cmd|
|
17
|
+
with_env("LC_ALL", "C") {
|
18
|
+
result = nil
|
19
|
+
run cmd do |ch, stream, out|
|
20
|
+
ch.send_data(scm_password)
|
21
|
+
ch.send_data("\n")
|
22
|
+
result = out
|
23
|
+
end
|
24
|
+
result
|
25
|
+
}
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
2
|
+
abort "useful/cap_tasks requires Capistrano 2"
|
3
|
+
end
|
4
|
+
|
5
|
+
Capistrano::Configuration.instance.load do
|
6
|
+
|
7
|
+
namespace :deploy do
|
8
|
+
|
9
|
+
task :after_deploy, :except => { :no_release => true } do
|
10
|
+
web.enable
|
11
|
+
cleanup
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "_: (#{application}) Start app from cold state."
|
15
|
+
task :start, :roles => :app, :except => { :no_release => true } do
|
16
|
+
restart
|
17
|
+
web.enable
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "_: (#{application}) Stop app and put in cold state."
|
21
|
+
task :stop, :roles => :app, :except => { :no_release => true } do
|
22
|
+
web.disable
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "_: (#{application}) Restart app from hot state."
|
26
|
+
task :restart, :roles => :app, :except => { :no_release => true } do
|
27
|
+
run "touch #{current_path}/tmp/restart.txt"
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
namespace :web do
|
33
|
+
desc "_: (#{application}) Enable app and remove down page."
|
34
|
+
task :enable, :roles => :app, :except => { :no_release => true } do
|
35
|
+
run "rm #{current_path}/public/#{down_html}.html"
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "_: (#{application}) Put up down page and disable app"
|
39
|
+
task :disable, :roles => :app, :except => { :no_release => true } do
|
40
|
+
run "cp #{shared_path}/#{down_html}.html #{current_path}/public/#{down_html}.html"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
2
|
+
abort "useful/cap_tasks requires Capistrano 2"
|
3
|
+
end
|
4
|
+
|
5
|
+
Capistrano::Configuration.instance.load do
|
6
|
+
|
7
|
+
namespace :cache do
|
8
|
+
|
9
|
+
desc "Clear the Rack cache"
|
10
|
+
task :xrack, :roles => :app, :except => { :no_release => true } do
|
11
|
+
run "rm -rf #{shared_path}/cache-rack/body/*"
|
12
|
+
run "rm -rf #{shared_path}/cache-rack/meta/*"
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/lib/useful/cap_tasks.rb
CHANGED
@@ -0,0 +1,86 @@
|
|
1
|
+
# Note: these helpers are designed to be namespaced and 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
|
+
module Useful; end
|
6
|
+
module Useful::ErbHelpers; end
|
7
|
+
|
8
|
+
module Useful::ErbHelpers::Common
|
9
|
+
|
10
|
+
OPTIONS = {
|
11
|
+
:disabled => 'disabled',
|
12
|
+
:checked => 'checked',
|
13
|
+
:multiple => 'multiple',
|
14
|
+
:multipart => 'multipart/form-data',
|
15
|
+
:default_submit_value => "Save changes"
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
def erb_helper_clear_output_buffer
|
19
|
+
@_out_buf = ""
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
def erb_helper_common_safe_id(id)
|
25
|
+
id.gsub(/\[\]/, '').gsub(/\[/, '_').gsub(/\]/, '').gsub(/\W/,'')
|
26
|
+
end
|
27
|
+
|
28
|
+
def erb_helper_common_capture(*args, &block)
|
29
|
+
erb_helper_common_with_output_buffer { block.call(*args) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def erb_helper_common_with_output_buffer(buf = '') #:nodoc:
|
33
|
+
@_out_buf, old_buffer = buf, @_out_buf
|
34
|
+
result = yield
|
35
|
+
@_out_but.blank? ? result : @_out_buf
|
36
|
+
ensure
|
37
|
+
@_out_buf = old_buffer
|
38
|
+
end
|
39
|
+
|
40
|
+
def erb_helper_convert_options_to_javascript!(options)
|
41
|
+
confirm, popup = options.delete(:confirm), options.delete(:popup)
|
42
|
+
if confirm || popup
|
43
|
+
options[:onclick] = case
|
44
|
+
when confirm && popup
|
45
|
+
"javascript: if (#{erb_helper_confirm_javascript(confirm)}) { #{erb_helper_popup_javascript(popup)} }; return false;"
|
46
|
+
when confirm
|
47
|
+
"javascript: return #{erb_helper_confirm_javascript(confirm)};"
|
48
|
+
when popup
|
49
|
+
"javascript: #{erb_helper_popup_javascript(popup)} return false;"
|
50
|
+
else
|
51
|
+
"javascript: return false;" # should never case to this b/c of if statement
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def erb_helper_confirm_javascript(confirm)
|
57
|
+
"confirm('#{escape_javascript(confirm)}')"
|
58
|
+
end
|
59
|
+
|
60
|
+
def erb_helper_popup_javascript(popup)
|
61
|
+
popup.kind_of?(::Array) ? "window.open(this.href,'#{popup.first}','#{popup.last}');" : "window.open(this.href);"
|
62
|
+
end
|
63
|
+
|
64
|
+
def erb_helper_disable_with_javascript(disable_with)
|
65
|
+
"javascript: this.disabled=true; this.value='#{escape_javascript(disable_with)}'; this.form.submit();"
|
66
|
+
end
|
67
|
+
|
68
|
+
JS_ESCAPE_MAP = {
|
69
|
+
'\\' => '\\\\',
|
70
|
+
'</' => '<\/',
|
71
|
+
"\r\n" => '\n',
|
72
|
+
"\n" => '\n',
|
73
|
+
"\r" => '\n',
|
74
|
+
'"' => '\\"',
|
75
|
+
"'" => "\\'"
|
76
|
+
}.freeze
|
77
|
+
# Escape carrier returns and single and double quotes for JavaScript segments.
|
78
|
+
def escape_javascript(javascript)
|
79
|
+
if javascript
|
80
|
+
javascript.gsub(/(\\|<\/|\r\n|[\n\r"'])/) { JS_ESCAPE_MAP[$1] }
|
81
|
+
else
|
82
|
+
''
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# Note: these helpers are NOT actionpack safe
|
2
|
+
# => these helpers should NOT be included in the useful/rails_extensions/erb
|
3
|
+
# => these helpers are designed to emulate their corresponding actionpack helpers
|
4
|
+
|
5
|
+
require 'useful/erb_helpers/common'
|
6
|
+
require 'useful/erb_helpers/tags'
|
7
|
+
require 'useful/ruby_extensions/string' unless ::String.new.respond_to?('humanize') && ::String.new.respond_to?('ends_with?')
|
8
|
+
require 'useful/ruby_extensions/object' unless ::Object.new.respond_to?('true?')
|
9
|
+
|
10
|
+
module Useful; end
|
11
|
+
module Useful::ErbHelpers; end
|
12
|
+
|
13
|
+
module Useful::ErbHelpers::Forms
|
14
|
+
|
15
|
+
include Useful::ErbHelpers::Common
|
16
|
+
|
17
|
+
def form_tag(url, options={}, &block)
|
18
|
+
options[:method] = 'post' unless ['get','post','put','delete'].include?(options[:method])
|
19
|
+
options.update :action => url
|
20
|
+
if multipart = options.delete(:multipart)
|
21
|
+
options[:enctype] = OPTIONS[:multipart]
|
22
|
+
end
|
23
|
+
if block_given?
|
24
|
+
@_out_buf ||= ''
|
25
|
+
@_out_buf << tag(:form, options) { erb_helper_common_capture(&block) }
|
26
|
+
else
|
27
|
+
tag(:form, options)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def field_set_tag(legend=nil, options={}, &block)
|
32
|
+
legend_html = legend.nil? ? '' : tag(:legend) { legend.to_s }
|
33
|
+
if block_given?
|
34
|
+
@_out_buf ||= ''
|
35
|
+
@_out_buf << tag(:fieldset, options) { legend_html + erb_helper_common_capture(&block) }
|
36
|
+
else
|
37
|
+
tag(:fieldset, options) { legend_html }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def label_tag(name, value=nil, options={})
|
42
|
+
value ||= name.to_s.gsub(/\[/, '_').gsub(/\]/, '').humanize
|
43
|
+
options[:for] ||= erb_helper_common_safe_id(name)
|
44
|
+
tag(:label, options) { value }
|
45
|
+
end
|
46
|
+
|
47
|
+
def hidden_field_tag(name, value=nil, options={})
|
48
|
+
input_tag('hidden', name, value, options)
|
49
|
+
end
|
50
|
+
|
51
|
+
def text_field_tag(name, value=nil, options={})
|
52
|
+
input_tag('text', name, value, options)
|
53
|
+
end
|
54
|
+
|
55
|
+
def password_field_tag(name="password", value=nil, options={})
|
56
|
+
input_tag('password', name, value, options)
|
57
|
+
end
|
58
|
+
|
59
|
+
def file_field_tag(name, options={})
|
60
|
+
input_tag('file', name, nil, options)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Special options:
|
64
|
+
# => :disable_with - string
|
65
|
+
# => will add js onclick event to first disable submit, setting text to value, and then submitting form
|
66
|
+
# => :confirm - string
|
67
|
+
# => will add js confirm confirmation before submitting
|
68
|
+
def submit_tag(value=OPTIONS[:default_submit_value], options={})
|
69
|
+
options[:onclick] = erb_helper_disable_with_javascript(options.delete(:disabled_with)) if options.has_key?(:disabled_with)
|
70
|
+
if options.has_key?(:confirm)
|
71
|
+
options[:onclick] ||= 'return true;'
|
72
|
+
options[:onclick] = "if (!#{erb_helper_confirm_javascript(options.delete(:confirm))}) return false; #{options[:onclick]}"
|
73
|
+
end
|
74
|
+
input_tag('submit', 'commit', value, options)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Special options:
|
78
|
+
# => :confirm - string
|
79
|
+
# => will add js confirm confirmation before submitting
|
80
|
+
def image_submit_tag(source, options={})
|
81
|
+
options[:src] = ['/'].include?(source[0..0]) ? source : "/images/#{source}"
|
82
|
+
options[:alt] ||= OPTIONS[:default_submit_value]
|
83
|
+
if options.has_key?(:confirm)
|
84
|
+
options[:onclick] ||= 'return true;'
|
85
|
+
options[:onclick] = "if (!#{erb_helper_confirm_javascript(options.delete(:confirm))}) return false; #{options[:onclick]}"
|
86
|
+
end
|
87
|
+
input_tag('image', nil, nil, options)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Special options:
|
91
|
+
# => :size - A string specifying the dimensions (columns by rows) of the textarea (e.g., "25x10").
|
92
|
+
# => :rows - Specify the number of rows in the textarea
|
93
|
+
# => :cols - Specify the number of columns in the textarea
|
94
|
+
# => :escape - By default, the contents of the text input are HTML escaped. If you need unescaped contents, set this to false.
|
95
|
+
def text_area_tag(name, content=nil, options={})
|
96
|
+
options[:tag] = 'textarea'
|
97
|
+
if size = options.delete(:size)
|
98
|
+
options[:cols], options[:rows] = size.split("x") if size.respond_to?(:split)
|
99
|
+
end
|
100
|
+
unless options.has_key?(:escape) && options.delete(:escape).false?
|
101
|
+
content = escape_html(content)
|
102
|
+
end
|
103
|
+
input_tag(nil, name, nil, options) { content || '' }
|
104
|
+
end
|
105
|
+
|
106
|
+
# Note: purposely left out:
|
107
|
+
# => select_tag
|
108
|
+
# => check_box_tag
|
109
|
+
# => radio_button_tag
|
110
|
+
# Not going to reinvent the inferior actionpack versions here.
|
111
|
+
# => prefer, instead, the corresponding 'proper' versions
|
112
|
+
# => see useful/erb_helpers/proper.rb (which is included in useful/rails_extensions/erb)
|
113
|
+
|
114
|
+
def self.included(receiver)
|
115
|
+
receiver.send :include, Useful::ErbHelpers::Tags
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|