padrino-helpers 0.5.0 → 0.6.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.
- data/LICENSE +1 -1
- data/README.rdoc +2 -2
- data/Rakefile +3 -1
- data/VERSION +1 -1
- data/lib/padrino-helpers.rb +2 -0
- data/lib/padrino-helpers/asset_tag_helpers.rb +40 -39
- data/lib/padrino-helpers/form_builder/abstract_form_builder.rb +63 -53
- data/lib/padrino-helpers/form_helpers.rb +74 -43
- data/lib/padrino-helpers/format_helpers.rb +5 -4
- data/lib/padrino-helpers/locale/en.yml +1 -1
- data/lib/padrino-helpers/output_helpers.rb +34 -35
- data/padrino-helpers.gemspec +5 -5
- data/test/fixtures/markup_app/views/form_tag.erb +0 -1
- data/test/test_asset_tag_helpers.rb +4 -0
- data/test/test_form_builder.rb +15 -15
- data/test/test_form_helpers.rb +15 -12
- metadata +4 -4
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -189,7 +189,7 @@ The list of defined helpers in the 'form helpers' category:
|
|
189
189
|
* Constructs a field_set to group fields with given options
|
190
190
|
* <tt>field_set_tag(:class => 'office-set') { }</tt>
|
191
191
|
* <tt>field_set_tag("Office", :class => 'office-set') { }</tt>
|
192
|
-
* <tt>error_messages_for(record, options={})</tt>
|
192
|
+
* <tt>error_messages_for(:record, options={})</tt>
|
193
193
|
* Constructs list html for the errors for a given object
|
194
194
|
* <tt>error_messages_for @user</tt>
|
195
195
|
* <tt>label_tag(name, options={}, &block)</tt>
|
@@ -485,4 +485,4 @@ See the wiki article for additional information: <...WIKI...>
|
|
485
485
|
|
486
486
|
== Copyright
|
487
487
|
|
488
|
-
Copyright (c)
|
488
|
+
Copyright (c) 2010 Padrino. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
3
|
|
4
|
+
GEM_VERSION = File.read(File.dirname(__FILE__) + '/VERSION')
|
5
|
+
|
4
6
|
begin
|
5
7
|
require 'jeweler'
|
6
8
|
Jeweler::Tasks.new do |gem|
|
@@ -11,7 +13,7 @@ begin
|
|
11
13
|
gem.homepage = "http://github.com/padrino/padrino-framework/tree/master/padrino-helpers"
|
12
14
|
gem.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
|
13
15
|
gem.add_runtime_dependency "sinatra", ">= 0.9.2"
|
14
|
-
gem.add_runtime_dependency "padrino-core", "
|
16
|
+
gem.add_runtime_dependency "padrino-core", "= #{GEM_VERSION}"
|
15
17
|
gem.add_development_dependency "haml", ">= 2.2.1"
|
16
18
|
gem.add_development_dependency "shoulda", ">= 0"
|
17
19
|
gem.add_development_dependency "mocha", ">= 0.9.7"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.1
|
data/lib/padrino-helpers.rb
CHANGED
@@ -17,15 +17,17 @@ module Padrino
|
|
17
17
|
# parameters: name, url='javascript:void(0)', options={}, &block
|
18
18
|
def link_to(*args, &block)
|
19
19
|
options = args.extract_options!
|
20
|
+
anchor = options[:anchor] ? "##{CGI.escape options.delete(:anchor).to_s}" : ""
|
21
|
+
options["data-remote"] = "true" if options.delete(:remote)
|
20
22
|
if block_given?
|
21
23
|
url = args[0] || 'javascript:void(0);'
|
22
|
-
options.reverse_merge!(:href => url)
|
24
|
+
options.reverse_merge!(:href => url + anchor)
|
23
25
|
link_content = capture_html(&block)
|
24
26
|
result_link = content_tag(:a, link_content, options)
|
25
27
|
block_is_template?(block) ? concat_content(result_link) : result_link
|
26
28
|
else
|
27
29
|
name, url = args[0], (args[1] || 'javascript:void(0);')
|
28
|
-
options.reverse_merge!(:href => url)
|
30
|
+
options.reverse_merge!(:href => url + anchor)
|
29
31
|
content_tag(:a, name, options)
|
30
32
|
end
|
31
33
|
end
|
@@ -75,47 +77,46 @@ module Padrino
|
|
75
77
|
end
|
76
78
|
|
77
79
|
protected
|
80
|
+
# stylesheet_tag('style', :media => 'screen')
|
81
|
+
def stylesheet_tag(source, options={})
|
82
|
+
options = options.dup.reverse_merge!(:href => stylesheet_path(source), :media => 'screen', :rel => 'stylesheet', :type => 'text/css')
|
83
|
+
tag(:link, options)
|
84
|
+
end
|
78
85
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
# javascript_tag 'application', :src => '/javascripts/base/application.js'
|
86
|
-
def javascript_tag(source, options={})
|
87
|
-
options = options.dup.reverse_merge!(:src => javascript_path(source), :type => 'text/javascript', :content => "")
|
88
|
-
tag(:script, options)
|
89
|
-
end
|
86
|
+
# javascript_tag 'application', :src => '/javascripts/base/application.js'
|
87
|
+
def javascript_tag(source, options={})
|
88
|
+
options = options.dup.reverse_merge!(:src => javascript_path(source), :type => 'text/javascript', :content => "")
|
89
|
+
tag(:script, options)
|
90
|
+
end
|
90
91
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
92
|
+
# Returns the javascript_path appending the default javascripts path if necessary
|
93
|
+
def javascript_path(source)
|
94
|
+
return source if source =~ /^http/
|
95
|
+
source = source.to_s.gsub(/\.js$/, '')
|
96
|
+
source_name = source; source_name << ".js" unless source =~ /\.js/
|
97
|
+
result_path = source_name if source =~ %r{^/} # absolute path
|
98
|
+
result_path ||= uri_root_path("javascripts", source_name)
|
99
|
+
stamp = File.exist?(result_path) ? File.mtime(result_path) : Time.now.to_i
|
100
|
+
"#{result_path}?#{stamp}"
|
101
|
+
end
|
101
102
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
103
|
+
# Returns the stylesheet_path appending the default stylesheets path if necessary
|
104
|
+
def stylesheet_path(source)
|
105
|
+
return source if source =~ /^http/
|
106
|
+
source = source.to_s.gsub(/\.css$/, '')
|
107
|
+
source_name = source; source_name << ".css" unless source =~ /\.css/
|
108
|
+
result_path = source_name if source =~ %r{^/} # absolute path
|
109
|
+
result_path ||= uri_root_path("stylesheets", source_name)
|
110
|
+
stamp = File.exist?(result_path) ? File.mtime(result_path) : Time.now.to_i
|
111
|
+
"#{result_path}?#{stamp}"
|
112
|
+
end
|
112
113
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
114
|
+
# Returns the uri root of the application, defaulting to '/'
|
115
|
+
# @example uri_root('javascripts')
|
116
|
+
def uri_root_path(*paths)
|
117
|
+
root_uri = self.class.uri_root if self.class.respond_to?(:uri_root)
|
118
|
+
File.join(root_uri || '/', *paths)
|
119
|
+
end
|
119
120
|
end
|
120
121
|
end
|
121
122
|
end
|
@@ -18,7 +18,7 @@ module Padrino
|
|
18
18
|
|
19
19
|
# f.label :username, :caption => "Nickname"
|
20
20
|
def label(field, options={})
|
21
|
-
options.reverse_merge!(:caption => "#{field
|
21
|
+
options.reverse_merge!(:caption => "#{field_human_name(field)}: ")
|
22
22
|
@template.label_tag(field_id(field), options)
|
23
23
|
end
|
24
24
|
|
@@ -30,26 +30,26 @@ module Padrino
|
|
30
30
|
|
31
31
|
# f.text_field :username, :value => "(blank)", :id => 'username'
|
32
32
|
def text_field(field, options={})
|
33
|
-
options.reverse_merge!(:value => field_value(field), :id => field_id(field))
|
33
|
+
options.reverse_merge!(:value => field_value(field), :id => field_id(field), :class => field_error(field, options))
|
34
34
|
@template.text_field_tag field_name(field), options
|
35
35
|
end
|
36
36
|
|
37
37
|
# f.text_area :summary, :value => "(enter summary)", :id => 'summary'
|
38
38
|
def text_area(field, options={})
|
39
|
-
options.reverse_merge!(:value => field_value(field), :id => field_id(field))
|
39
|
+
options.reverse_merge!(:value => field_value(field), :id => field_id(field), :class => field_error(field, options))
|
40
40
|
@template.text_area_tag field_name(field), options
|
41
41
|
end
|
42
42
|
|
43
43
|
# f.password_field :password, :id => 'password'
|
44
44
|
def password_field(field, options={})
|
45
|
-
options.reverse_merge!(:value => field_value(field), :id => field_id(field))
|
45
|
+
options.reverse_merge!(:value => field_value(field), :id => field_id(field), :class => field_error(field, options))
|
46
46
|
@template.password_field_tag field_name(field), options
|
47
47
|
end
|
48
48
|
|
49
49
|
# f.select :color, :options => ['red', 'green'], :include_blank => true
|
50
50
|
# f.select :color, :collection => @colors, :fields => [:name, :id]
|
51
51
|
def select(field, options={})
|
52
|
-
options.reverse_merge!(:id => field_id(field), :selected => field_value(field))
|
52
|
+
options.reverse_merge!(:id => field_id(field), :selected => field_value(field), :class => field_error(field, options))
|
53
53
|
@template.select_tag field_name(field), options
|
54
54
|
end
|
55
55
|
|
@@ -71,7 +71,7 @@ module Padrino
|
|
71
71
|
|
72
72
|
# f.file_field :photo, :class => 'avatar'
|
73
73
|
def file_field(field, options={})
|
74
|
-
options.reverse_merge!(:id => field_id(field))
|
74
|
+
options.reverse_merge!(:id => field_id(field), :class => field_error(field, options))
|
75
75
|
@template.file_field_tag field_name(field), options
|
76
76
|
end
|
77
77
|
|
@@ -86,53 +86,63 @@ module Padrino
|
|
86
86
|
end
|
87
87
|
|
88
88
|
protected
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
89
|
+
# Returns the known field types for a formbuilder
|
90
|
+
def self.field_types
|
91
|
+
[:hidden_field, :text_field, :text_area, :password_field, :file_field, :radio_button, :check_box, :select]
|
92
|
+
end
|
93
|
+
|
94
|
+
# Returns the object's models name
|
95
|
+
# => user_assignment
|
96
|
+
def object_name
|
97
|
+
object.is_a?(Symbol) ? object : object.class.to_s.underscore.gsub('/', '-')
|
98
|
+
end
|
99
|
+
|
100
|
+
# Returns true if the value matches the value in the field
|
101
|
+
# field_has_value?(:gender, 'male')
|
102
|
+
def values_matches_field?(field, value)
|
103
|
+
value.present? && (field_value(field).to_s == value.to_s || field_value(field).to_s == 'true')
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns the value for the object's field
|
107
|
+
# field_value(:username) => "Joey"
|
108
|
+
def field_value(field)
|
109
|
+
@object && @object.respond_to?(field) ? @object.send(field) : ""
|
110
|
+
end
|
111
|
+
|
112
|
+
def field_error(field, options)
|
113
|
+
if @object && @object.respond_to?(:errors) && @object.errors.respond_to?(:on) && @object.errors.on(field)
|
114
|
+
options[:class] = ["x-form-text", "x-form-invalid", options[:class]].compact.join(" ")
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Returns the name for the given field
|
119
|
+
# field_name(:username) => "user[username]"
|
120
|
+
def field_name(field)
|
121
|
+
"#{object_name}[#{field}]"
|
122
|
+
end
|
123
|
+
|
124
|
+
# Returns the human name of the field. Look that use builtin I18n.
|
125
|
+
def field_human_name(field)
|
126
|
+
I18n.translate("#{object_name}.#{field}", :count => 1, :default => field.to_s.humanize, :scope => [:model, :attributes])
|
127
|
+
end
|
128
|
+
|
129
|
+
# Returns the id for the given field
|
130
|
+
# field_id(:username) => "user_username"
|
131
|
+
# field_id(:gender, :male) => "user_gender_male"
|
132
|
+
def field_id(field, value=nil)
|
133
|
+
value.blank? ? "#{object_name}_#{field}" : "#{object_name}_#{field}_#{value}"
|
134
|
+
end
|
135
|
+
|
136
|
+
# explicit_object is either a symbol or a record
|
137
|
+
# Returns a new record of the type specified in the object
|
138
|
+
def build_object(object_or_symbol)
|
139
|
+
object_or_symbol.is_a?(Symbol) ? object_class(object_or_symbol).new : object_or_symbol
|
140
|
+
end
|
141
|
+
|
142
|
+
# Returns the class type for the given object
|
143
|
+
def object_class(explicit_object)
|
144
|
+
explicit_object.is_a?(Symbol) ? explicit_object.to_s.classify.constantize : explicit_object.class
|
145
|
+
end
|
136
146
|
end
|
137
147
|
end
|
138
148
|
end
|
@@ -25,6 +25,7 @@ module Padrino
|
|
25
25
|
def form_tag(url, options={}, &block)
|
26
26
|
options.reverse_merge!(:method => 'post', :action => url)
|
27
27
|
options[:enctype] = "multipart/form-data" if options.delete(:multipart)
|
28
|
+
options["data-remote"] = "true" if options.delete(:remote)
|
28
29
|
inner_form_html = hidden_form_method_field(options[:method]) + capture_html(&block)
|
29
30
|
concat_content content_tag('form', inner_form_html, options)
|
30
31
|
end
|
@@ -40,16 +41,47 @@ module Padrino
|
|
40
41
|
concat_content content_tag('fieldset', field_set_content, options)
|
41
42
|
end
|
42
43
|
|
43
|
-
# Constructs list html for the errors for a given
|
44
|
-
# error_messages_for
|
45
|
-
def error_messages_for(
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
44
|
+
# Constructs list html for the errors for a given symbol
|
45
|
+
# error_messages_for :user
|
46
|
+
def error_messages_for(*params)
|
47
|
+
options = params.extract_options!.symbolize_keys
|
48
|
+
objects = params.collect {|object_name| object_name.is_a?(Symbol) ? instance_variable_get("@#{object_name}") : object_name }.compact
|
49
|
+
count = objects.inject(0) {|sum, object| sum + object.errors.count }
|
50
|
+
|
51
|
+
unless count.zero?
|
52
|
+
html = {}
|
53
|
+
[:id, :class].each do |key|
|
54
|
+
if options.include?(key)
|
55
|
+
value = options[key]
|
56
|
+
html[key] = value unless value.blank?
|
57
|
+
else
|
58
|
+
html[key] = 'field-errors'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
options[:object_name] ||= params.first.class
|
63
|
+
|
64
|
+
I18n.with_options :locale => options[:locale], :scope => [:models, :errors, :template] do |locale|
|
65
|
+
header_message = if options.include?(:header_message)
|
66
|
+
options[:header_message]
|
67
|
+
else
|
68
|
+
object_name = options[:object_name].to_s.gsub('_', ' ')
|
69
|
+
object_name = I18n.t(object_name, :default => object_name, :scope => :models, :count => 1)
|
70
|
+
locale.t :header, :count => count, :model => object_name
|
71
|
+
end
|
72
|
+
message = options.include?(:message) ? options[:message] : locale.t(:body)
|
73
|
+
error_messages = objects.map {|object| object.errors.full_messages.map {|msg| content_tag(:li, msg) } }.join
|
74
|
+
|
75
|
+
contents = ''
|
76
|
+
contents << content_tag(options[:header_tag] || :h2, header_message) unless header_message.blank?
|
77
|
+
contents << content_tag(:p, message) unless message.blank?
|
78
|
+
contents << content_tag(:ul, error_messages)
|
79
|
+
|
80
|
+
content_tag(:div, contents, html)
|
81
|
+
end
|
82
|
+
else
|
83
|
+
''
|
84
|
+
end
|
53
85
|
end
|
54
86
|
|
55
87
|
# Constructs a label tag from the given options
|
@@ -152,43 +184,42 @@ module Padrino
|
|
152
184
|
end
|
153
185
|
|
154
186
|
protected
|
187
|
+
# Returns an array of option items for a select field based on the given collection
|
188
|
+
# fields is an array containing the fields to display from each item in the collection
|
189
|
+
def options_from_collection(collection, fields)
|
190
|
+
return '' if collection.blank?
|
191
|
+
collection.collect { |item| [ item.send(fields.first), item.send(fields.last) ] }
|
192
|
+
end
|
155
193
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
# Returns the options tags for a select based on the given option items
|
164
|
-
def options_for_select(option_items, selected_value=nil)
|
165
|
-
return '' if option_items.blank?
|
166
|
-
option_items.collect do |caption, value|
|
167
|
-
value ||= caption
|
168
|
-
content_tag(:option, caption, :value => value, :selected => selected_value.to_s =~ /#{value}|#{caption}/)
|
194
|
+
# Returns the options tags for a select based on the given option items
|
195
|
+
def options_for_select(option_items, selected_value=nil)
|
196
|
+
return '' if option_items.blank?
|
197
|
+
option_items.collect do |caption, value|
|
198
|
+
value ||= caption
|
199
|
+
content_tag(:option, caption, :value => value, :selected => selected_value.to_s =~ /#{value}|#{caption}/)
|
200
|
+
end
|
169
201
|
end
|
170
|
-
end
|
171
202
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
203
|
+
# returns the hidden method field for 'put' and 'delete' forms
|
204
|
+
# Only 'get' and 'post' are allowed within browsers;
|
205
|
+
# 'put' and 'delete' are just specified using hidden fields with form action still 'put'.
|
206
|
+
# hidden_form_method_field('delete') => <input name="_method" value="delete" />
|
207
|
+
def hidden_form_method_field(desired_method)
|
208
|
+
return '' if (desired_method.to_s =~ /get|post/)
|
209
|
+
original_method = desired_method.to_s.dup
|
210
|
+
desired_method.to_s.replace('post')
|
211
|
+
hidden_field_tag(:_method, :value => original_method)
|
212
|
+
end
|
182
213
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
214
|
+
# Returns the FormBuilder class to use based on all available setting sources
|
215
|
+
# If explicitly defined, returns that, otherwise returns defaults
|
216
|
+
# configured_form_builder_class(nil) => StandardFormBuilder
|
217
|
+
def configured_form_builder_class(explicit_builder=nil)
|
218
|
+
default_builder = self.respond_to?(:options) && self.options.default_builder
|
219
|
+
configured_builder = explicit_builder || default_builder || 'StandardFormBuilder'
|
220
|
+
configured_builder = "Padrino::Helpers::FormBuilder::#{configured_builder}".constantize if configured_builder.is_a?(String)
|
221
|
+
configured_builder
|
222
|
+
end
|
192
223
|
end
|
193
224
|
end
|
194
225
|
end
|
@@ -169,16 +169,17 @@ module Padrino
|
|
169
169
|
|
170
170
|
# Used in xxxx.js.erb files to escape html so that it can be passed to javascript from Padrino
|
171
171
|
# js_escape_html("<h1>Hey</h1>")
|
172
|
-
def
|
172
|
+
def escape_javascript(html_content)
|
173
173
|
return '' unless html_content
|
174
174
|
javascript_mapping = { '\\' => '\\\\', '</' => '<\/', "\r\n" => '\n', "\n" => '\n' }
|
175
175
|
javascript_mapping.merge("\r" => '\n', '"' => '\\"', "'" => "\\'")
|
176
176
|
escaped_string = html_content.gsub(/(\\|<\/|\r\n|[\n\r"'])/) { javascript_mapping[$1] }
|
177
|
-
|
177
|
+
escaped_string
|
178
178
|
end
|
179
179
|
|
180
|
-
|
181
|
-
|
180
|
+
def js_escape_html(html_content)
|
181
|
+
"\"#{escape_javascript(html_content)}\""
|
182
|
+
end
|
182
183
|
|
183
184
|
end
|
184
185
|
end
|
@@ -53,46 +53,45 @@ module Padrino
|
|
53
53
|
end
|
54
54
|
|
55
55
|
protected
|
56
|
+
# Retrieves content_blocks stored by content_for or within yield_content
|
57
|
+
# content_blocks[:name] => ['...', '...']
|
58
|
+
def content_blocks
|
59
|
+
@content_blocks ||= Hash.new {|h,k| h[k] = [] }
|
60
|
+
end
|
56
61
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
# Used to capture the html from a block of erb code
|
64
|
-
# capture_erb(&block) => '...html...'
|
65
|
-
def capture_erb(*args, &block)
|
66
|
-
erb_with_output_buffer { block_given? && block.call(*args) }
|
67
|
-
end
|
62
|
+
# Used to capture the html from a block of erb code
|
63
|
+
# capture_erb(&block) => '...html...'
|
64
|
+
def capture_erb(*args, &block)
|
65
|
+
erb_with_output_buffer { block_given? && block.call(*args) }
|
66
|
+
end
|
68
67
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
68
|
+
# Concats directly to an erb template
|
69
|
+
# erb_concat("Direct to buffer")
|
70
|
+
def erb_concat(text)
|
71
|
+
@_out_buf << text if has_erb_buffer?
|
72
|
+
end
|
74
73
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
74
|
+
# Returns true if an erb buffer is detected
|
75
|
+
# has_erb_buffer? => true
|
76
|
+
def has_erb_buffer?
|
77
|
+
!@_out_buf.nil?
|
78
|
+
end
|
80
79
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
80
|
+
# Used to determine if a block is called from ERB.
|
81
|
+
# NOTE: This doesn't actually work yet because the variable __in_erb_template
|
82
|
+
# hasn't been defined in ERB. We need to find a way to fix this.
|
83
|
+
def block_is_erb?(block)
|
84
|
+
has_erb_buffer? || block && eval('defined? __in_erb_template', block)
|
85
|
+
end
|
87
86
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
87
|
+
# Used to direct the buffer for the erb capture
|
88
|
+
def erb_with_output_buffer(buf = '') #:nodoc:
|
89
|
+
@_out_buf, old_buffer = buf, @_out_buf
|
90
|
+
yield
|
91
|
+
@_out_buf
|
92
|
+
ensure
|
93
|
+
@_out_buf = old_buffer
|
94
|
+
end
|
96
95
|
end
|
97
96
|
end
|
98
97
|
end
|
data/padrino-helpers.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{padrino-helpers}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.6.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
|
12
|
-
s.date = %q{2010-01-
|
12
|
+
s.date = %q{2010-01-14}
|
13
13
|
s.description = %q{Tag helpers, asset helpers, form helpers, form builders and many more helpers for padrino}
|
14
14
|
s.email = %q{nesquena@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -80,7 +80,7 @@ Gem::Specification.new do |s|
|
|
80
80
|
|
81
81
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
82
82
|
s.add_runtime_dependency(%q<sinatra>, [">= 0.9.2"])
|
83
|
-
s.add_runtime_dependency(%q<padrino-core>, ["
|
83
|
+
s.add_runtime_dependency(%q<padrino-core>, ["= 0.6.1"])
|
84
84
|
s.add_development_dependency(%q<haml>, [">= 2.2.1"])
|
85
85
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
86
86
|
s.add_development_dependency(%q<mocha>, [">= 0.9.7"])
|
@@ -88,7 +88,7 @@ Gem::Specification.new do |s|
|
|
88
88
|
s.add_development_dependency(%q<webrat>, [">= 0.5.1"])
|
89
89
|
else
|
90
90
|
s.add_dependency(%q<sinatra>, [">= 0.9.2"])
|
91
|
-
s.add_dependency(%q<padrino-core>, ["
|
91
|
+
s.add_dependency(%q<padrino-core>, ["= 0.6.1"])
|
92
92
|
s.add_dependency(%q<haml>, [">= 2.2.1"])
|
93
93
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
94
94
|
s.add_dependency(%q<mocha>, [">= 0.9.7"])
|
@@ -97,7 +97,7 @@ Gem::Specification.new do |s|
|
|
97
97
|
end
|
98
98
|
else
|
99
99
|
s.add_dependency(%q<sinatra>, [">= 0.9.2"])
|
100
|
-
s.add_dependency(%q<padrino-core>, ["
|
100
|
+
s.add_dependency(%q<padrino-core>, ["= 0.6.1"])
|
101
101
|
s.add_dependency(%q<haml>, [">= 2.2.1"])
|
102
102
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
103
103
|
s.add_dependency(%q<mocha>, [">= 0.9.7"])
|
@@ -30,6 +30,10 @@ class TestAssetTagHelpers < Test::Unit::TestCase
|
|
30
30
|
actual_html = link_to('Sign up', '/register', :class => 'first', :id => 'linky')
|
31
31
|
assert_has_tag('a#linky.first', :content => "Sign up", :href => '/register') { actual_html }
|
32
32
|
end
|
33
|
+
should "display link element with anchor attribute" do
|
34
|
+
actual_html = link_to("Anchor", "/anchor", :anchor => :foo)
|
35
|
+
assert_has_tag('a', :content => "Anchor", :href => '/anchor#foo') { actual_html }
|
36
|
+
end
|
33
37
|
should "display link element with void url and options" do
|
34
38
|
actual_link = link_to('Sign up', :class => "test")
|
35
39
|
assert_has_tag('a', :content => "Sign up", :href => 'javascript:void(0);', :class => 'test') { actual_link }
|
data/test/test_form_builder.rb
CHANGED
@@ -9,11 +9,11 @@ class TestFormBuilder < Test::Unit::TestCase
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def setup
|
12
|
-
error_stub = stub(:full_messages => ["1", "2"], :
|
12
|
+
error_stub = stub(:full_messages => ["1", "2"], :count => 2)
|
13
13
|
role_types = [stub(:name => 'Admin', :id => 1), stub(:name => 'Moderate', :id => 2), stub(:name => 'Limited', :id => 3)]
|
14
14
|
@user = stub(:errors => error_stub, :class => 'User', :first_name => "Joe", :session_id => 54)
|
15
15
|
@user.stubs(:role_types => role_types, :role => "1")
|
16
|
-
@user_none = stub(:errors => stub(:
|
16
|
+
@user_none = stub(:errors => stub(:count => 0), :class => 'User')
|
17
17
|
end
|
18
18
|
|
19
19
|
def standard_builder(object=@user)
|
@@ -130,25 +130,25 @@ class TestFormBuilder < Test::Unit::TestCase
|
|
130
130
|
|
131
131
|
should "display correct form html with valid record" do
|
132
132
|
actual_html = standard_builder.error_messages(:header_message => "Demo form cannot be saved")
|
133
|
-
assert_has_tag('div.field-errors
|
134
|
-
assert_has_tag('div.field-errors ul
|
135
|
-
assert_has_tag('div.field-errors ul
|
133
|
+
assert_has_tag('div.field-errors h2', :content => "Demo form cannot be saved") { actual_html }
|
134
|
+
assert_has_tag('div.field-errors ul li', :content => "1") { actual_html }
|
135
|
+
assert_has_tag('div.field-errors ul li', :content => "2") { actual_html }
|
136
136
|
end
|
137
137
|
|
138
138
|
should "display correct form in haml" do
|
139
139
|
visit '/haml/form_for'
|
140
|
-
assert_have_selector '#demo div.field-errors
|
141
|
-
assert_have_selector '#demo div.field-errors ul
|
142
|
-
assert_have_selector '#demo2 div.field-errors
|
143
|
-
assert_have_selector '#demo2 div.field-errors ul
|
140
|
+
assert_have_selector '#demo div.field-errors h2', :content => "custom MarkupUser cannot be saved!"
|
141
|
+
assert_have_selector '#demo div.field-errors ul li', :content => "This is a fake error"
|
142
|
+
assert_have_selector '#demo2 div.field-errors h2', :content => "custom MarkupUser cannot be saved!"
|
143
|
+
assert_have_selector '#demo2 div.field-errors ul li', :content => "This is a fake error"
|
144
144
|
end
|
145
145
|
|
146
146
|
should "display correct form in erb" do
|
147
147
|
visit '/erb/form_for'
|
148
|
-
assert_have_selector '#demo div.field-errors
|
149
|
-
assert_have_selector '#demo div.field-errors ul
|
150
|
-
assert_have_selector '#demo2 div.field-errors
|
151
|
-
assert_have_selector '#demo2 div.field-errors ul
|
148
|
+
assert_have_selector '#demo div.field-errors h2', :content => "custom MarkupUser cannot be saved!"
|
149
|
+
assert_have_selector '#demo div.field-errors ul li', :content => "This is a fake error"
|
150
|
+
assert_have_selector '#demo2 div.field-errors h2', :content => "custom MarkupUser cannot be saved!"
|
151
|
+
assert_have_selector '#demo2 div.field-errors ul li', :content => "This is a fake error"
|
152
152
|
end
|
153
153
|
end
|
154
154
|
|
@@ -551,13 +551,13 @@ class TestFormBuilder < Test::Unit::TestCase
|
|
551
551
|
|
552
552
|
should "display correct check box block in haml" do
|
553
553
|
visit '/haml/form_for'
|
554
|
-
assert_have_selector '#demo2 p label', :for => 'markup_user_remember_me', :content => "Remember
|
554
|
+
assert_have_selector '#demo2 p label', :for => 'markup_user_remember_me', :content => "Remember me: "
|
555
555
|
assert_have_selector '#demo2 p input.checker', :type => 'checkbox', :name => 'markup_user[remember_me]'
|
556
556
|
end
|
557
557
|
|
558
558
|
should "display correct check box block in erb" do
|
559
559
|
visit '/erb/form_for'
|
560
|
-
assert_have_selector '#demo2 p label', :for => 'markup_user_remember_me', :content => "Remember
|
560
|
+
assert_have_selector '#demo2 p label', :for => 'markup_user_remember_me', :content => "Remember me: "
|
561
561
|
assert_have_selector '#demo2 p input.checker', :type => 'checkbox', :name => 'markup_user[remember_me]'
|
562
562
|
end
|
563
563
|
end
|
data/test/test_form_helpers.rb
CHANGED
@@ -76,32 +76,35 @@ class TestFormHelpers < Test::Unit::TestCase
|
|
76
76
|
|
77
77
|
context 'for #error_messages_for method' do
|
78
78
|
should "display correct error messages list in ruby" do
|
79
|
-
user = stub(:class => "User", :errors => stub(:full_messages => ["1", "2"], :
|
79
|
+
user = stub(:class => "User", :errors => stub(:full_messages => ["1", "2"], :count => 2), :blank? => false)
|
80
80
|
actual_html = error_messages_for(user)
|
81
81
|
assert_has_tag('div.field-errors') { actual_html }
|
82
|
-
assert_has_tag('div.field-errors
|
83
|
-
assert_has_tag('div.field-errors
|
84
|
-
assert_has_tag('div.field-errors ul
|
82
|
+
assert_has_tag('div.field-errors h2', :content => "2 errors prohibited this User from being saved") { actual_html }
|
83
|
+
assert_has_tag('div.field-errors p', :content => "There were problems with the following fields:") { actual_html }
|
84
|
+
assert_has_tag('div.field-errors ul') { actual_html }
|
85
|
+
assert_has_tag('div.field-errors ul li', :count => 2) { actual_html }
|
85
86
|
end
|
86
87
|
|
87
88
|
should "display correct error messages list in erb" do
|
88
89
|
visit '/erb/form_tag'
|
89
90
|
assert_have_no_selector 'form.simple-form .field-errors'
|
90
91
|
assert_have_selector 'form.advanced-form .field-errors'
|
91
|
-
assert_have_selector 'form.advanced-form .field-errors
|
92
|
-
assert_have_selector 'form.advanced-form .field-errors
|
93
|
-
assert_have_selector 'form.advanced-form .field-errors ul
|
94
|
-
assert_have_selector 'form.advanced-form .field-errors ul
|
92
|
+
assert_have_selector 'form.advanced-form .field-errors h2', :content => "There are problems with saving user!"
|
93
|
+
assert_have_selector 'form.advanced-form .field-errors p', :content => "There were problems with the following fields:"
|
94
|
+
assert_have_selector 'form.advanced-form .field-errors ul'
|
95
|
+
assert_have_selector 'form.advanced-form .field-errors ul li', :count => 3
|
96
|
+
assert_have_selector 'form.advanced-form .field-errors ul li', :content => "This is a second fake error"
|
95
97
|
end
|
96
98
|
|
97
99
|
should "display correct error messages list in haml" do
|
98
100
|
visit '/haml/form_tag'
|
99
101
|
assert_have_no_selector 'form.simple-form .field-errors'
|
100
102
|
assert_have_selector 'form.advanced-form .field-errors'
|
101
|
-
assert_have_selector 'form.advanced-form .field-errors
|
102
|
-
assert_have_selector 'form.advanced-form .field-errors
|
103
|
-
assert_have_selector 'form.advanced-form .field-errors ul
|
104
|
-
assert_have_selector 'form.advanced-form .field-errors ul
|
103
|
+
assert_have_selector 'form.advanced-form .field-errors h2', :content => "There are problems with saving user!"
|
104
|
+
assert_have_selector 'form.advanced-form .field-errors p', :content => "There were problems with the following fields:"
|
105
|
+
assert_have_selector 'form.advanced-form .field-errors ul'
|
106
|
+
assert_have_selector 'form.advanced-form .field-errors ul li', :count => 3
|
107
|
+
assert_have_selector 'form.advanced-form .field-errors ul li', :content => "This is a second fake error"
|
105
108
|
end
|
106
109
|
end
|
107
110
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: padrino-helpers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Padrino Team
|
@@ -12,7 +12,7 @@ autorequire:
|
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
14
|
|
15
|
-
date: 2010-01-
|
15
|
+
date: 2010-01-14 00:00:00 +01:00
|
16
16
|
default_executable:
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
@@ -31,9 +31,9 @@ dependencies:
|
|
31
31
|
version_requirement:
|
32
32
|
version_requirements: !ruby/object:Gem::Requirement
|
33
33
|
requirements:
|
34
|
-
- - "
|
34
|
+
- - "="
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version: 0.
|
36
|
+
version: 0.6.1
|
37
37
|
version:
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: haml
|