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 CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Padrino
1
+ Copyright (c) 2010 Padrino
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
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) 2009 Padrino. See LICENSE for details.
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", ">= 0.1.1"
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.5.0
1
+ 0.6.1
@@ -1,4 +1,6 @@
1
1
  require 'padrino-core/support_lite'
2
+ require 'cgi'
3
+
2
4
  Dir[File.dirname(__FILE__) + '/padrino-helpers/**/*.rb'].each {|file| require file }
3
5
 
4
6
  # Load our locales
@@ -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
- # stylesheet_tag('style', :media => 'screen')
80
- def stylesheet_tag(source, options={})
81
- options = options.dup.reverse_merge!(:href => stylesheet_path(source), :media => 'screen', :rel => 'stylesheet', :type => 'text/css')
82
- tag(:link, options)
83
- end
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
- # Returns the javascript_path appending the default javascripts path if necessary
92
- def javascript_path(source)
93
- return source if source =~ /^http/
94
- source.gsub!(/\.js$/, '')
95
- source_name = source; source_name << ".js" unless source =~ /\.js\w{2,4}$/
96
- result_path = source_name if source =~ %r{^/} # absolute path
97
- result_path ||= uri_root_path("javascripts", source_name)
98
- stamp = File.exist?(result_path) ? File.mtime(result_path) : Time.now.to_i
99
- "#{result_path}?#{stamp}"
100
- end
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
- # Returns the stylesheet_path appending the default stylesheets path if necessary
103
- def stylesheet_path(source)
104
- return source if source =~ /^http/
105
- source.gsub!(/\.css$/, '')
106
- source_name = source; source_name << ".css" unless source =~ /\.css$/
107
- result_path = source_name if source =~ %r{^/} # absolute path
108
- result_path ||= uri_root_path("stylesheets", source_name)
109
- stamp = File.exist?(result_path) ? File.mtime(result_path) : Time.now.to_i
110
- "#{result_path}?#{stamp}"
111
- end
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
- # Returns the uri root of the application, defaulting to '/'
114
- # @example uri_root('javascripts')
115
- def uri_root_path(*paths)
116
- root_uri = self.class.uri_root if self.class.respond_to?(:uri_root)
117
- File.join(root_uri || '/', *paths)
118
- end
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.to_s.titleize}: ")
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
- # Returns the known field types for a formbuilder
91
- def self.field_types
92
- [:hidden_field, :text_field, :text_area, :password_field, :file_field, :radio_button, :check_box, :select]
93
- end
94
-
95
- # Returns the object's models name
96
- # => user_assignment
97
- def object_name
98
- object.is_a?(Symbol) ? object : object.class.to_s.underscore.gsub('/', '-')
99
- end
100
-
101
- # Returns true if the value matches the value in the field
102
- # field_has_value?(:gender, 'male')
103
- def values_matches_field?(field, value)
104
- value.present? && (field_value(field).to_s == value.to_s || field_value(field).to_s == 'true')
105
- end
106
-
107
- # Returns the value for the object's field
108
- # field_value(:username) => "Joey"
109
- def field_value(field)
110
- @object && @object.respond_to?(field) ? @object.send(field) : ""
111
- end
112
-
113
- # Returns the name for the given field
114
- # field_name(:username) => "user[username]"
115
- def field_name(field)
116
- "#{object_name}[#{field}]"
117
- end
118
-
119
- # Returns the id for the given field
120
- # field_id(:username) => "user_username"
121
- # field_id(:gender, :male) => "user_gender_male"
122
- def field_id(field, value=nil)
123
- value.blank? ? "#{object_name}_#{field}" : "#{object_name}_#{field}_#{value}"
124
- end
125
-
126
- # explicit_object is either a symbol or a record
127
- # Returns a new record of the type specified in the object
128
- def build_object(object_or_symbol)
129
- object_or_symbol.is_a?(Symbol) ? object_class(object_or_symbol).new : object_or_symbol
130
- end
131
-
132
- # Returns the class type for the given object
133
- def object_class(explicit_object)
134
- explicit_object.is_a?(Symbol) ? explicit_object.to_s.classify.constantize : explicit_object.class
135
- end
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 object
44
- # error_messages_for @user
45
- def error_messages_for(record, options={})
46
- return "" if record.blank? or record.errors.none?
47
- options.reverse_merge!(:header_message => "The #{record.class.to_s.downcase} could not be saved!")
48
- error_messages = record.errors.full_messages
49
- error_items = error_messages.collect { |er| content_tag(:li, er) }.join("\n")
50
- error_html = content_tag(:p, options.delete(:header_message))
51
- error_html << content_tag(:ul, error_items, :class => 'errors-list')
52
- content_tag(:div, error_html, :class => 'field-errors')
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
- # Returns an array of option items for a select field based on the given collection
157
- # fields is an array containing the fields to display from each item in the collection
158
- def options_from_collection(collection, fields)
159
- return '' if collection.blank?
160
- collection.collect { |item| [ item.send(fields.first), item.send(fields.last) ] }
161
- end
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
- # returns the hidden method field for 'put' and 'delete' forms
173
- # Only 'get' and 'post' are allowed within browsers;
174
- # 'put' and 'delete' are just specified using hidden fields with form action still 'put'.
175
- # hidden_form_method_field('delete') => <input name="_method" value="delete" />
176
- def hidden_form_method_field(desired_method)
177
- return '' if (desired_method.to_s =~ /get|post/)
178
- original_method = desired_method.to_s.dup
179
- desired_method.replace('post')
180
- hidden_field_tag(:_method, :value => original_method)
181
- end
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
- # Returns the FormBuilder class to use based on all available setting sources
184
- # If explicitly defined, returns that, otherwise returns defaults
185
- # configured_form_builder_class(nil) => StandardFormBuilder
186
- def configured_form_builder_class(explicit_builder=nil)
187
- default_builder = self.respond_to?(:options) && self.options.default_builder
188
- configured_builder = explicit_builder || default_builder || 'StandardFormBuilder'
189
- configured_builder = "Padrino::Helpers::FormBuilder::#{configured_builder}".constantize if configured_builder.is_a?(String)
190
- configured_builder
191
- end
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 js_escape_html(html_content)
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
- "\"#{escaped_string}\""
177
+ escaped_string
178
178
  end
179
179
 
180
- alias escape_javascript js_escape_html
181
- alias escape_for_javascript js_escape_html
180
+ def js_escape_html(html_content)
181
+ "\"#{escape_javascript(html_content)}\""
182
+ end
182
183
 
183
184
  end
184
185
  end
@@ -102,7 +102,7 @@ en:
102
102
  minute: "Minute"
103
103
  second: "Seconds"
104
104
 
105
- activemodel:
105
+ models:
106
106
  errors:
107
107
  template:
108
108
  header:
@@ -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
- # Retrieves content_blocks stored by content_for or within yield_content
58
- # content_blocks[:name] => ['...', '...']
59
- def content_blocks
60
- @content_blocks ||= Hash.new {|h,k| h[k] = [] }
61
- end
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
- # Concats directly to an erb template
70
- # erb_concat("Direct to buffer")
71
- def erb_concat(text)
72
- @_out_buf << text if has_erb_buffer?
73
- end
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
- # Returns true if an erb buffer is detected
76
- # has_erb_buffer? => true
77
- def has_erb_buffer?
78
- !@_out_buf.nil?
79
- end
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
- # Used to determine if a block is called from ERB.
82
- # NOTE: This doesn't actually work yet because the variable __in_erb_template
83
- # hasn't been defined in ERB. We need to find a way to fix this.
84
- def block_is_erb?(block)
85
- has_erb_buffer? || block && eval('defined? __in_erb_template', block)
86
- end
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
- # Used to direct the buffer for the erb capture
89
- def erb_with_output_buffer(buf = '') #:nodoc:
90
- @_out_buf, old_buffer = buf, @_out_buf
91
- yield
92
- @_out_buf
93
- ensure
94
- @_out_buf = old_buffer
95
- end
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
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{padrino-helpers}
8
- s.version = "0.5.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-06}
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>, [">= 0.1.1"])
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>, [">= 0.1.1"])
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>, [">= 0.1.1"])
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"])
@@ -1,5 +1,4 @@
1
1
  <% form_tag '/simple', :class => 'simple-form' do %>
2
- <%= error_messages_for(nil) %>
3
2
  <%= hidden_field_tag :session_id, :value => "__secret__" %>
4
3
  <% field_set_tag do %>
5
4
  <%= label_tag :username %>
@@ -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 }
@@ -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"], :none? => false)
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(:none? => true), :class => 'User')
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 p', :content => "Demo form cannot be saved") { actual_html }
134
- assert_has_tag('div.field-errors ul.errors-list li', :content => "1") { actual_html }
135
- assert_has_tag('div.field-errors ul.errors-list li', :content => "2") { actual_html }
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 p', :content => "custom MarkupUser cannot be saved!"
141
- assert_have_selector '#demo div.field-errors ul.errors-list li', :content => "This is a fake error"
142
- assert_have_selector '#demo2 div.field-errors p', :content => "custom MarkupUser cannot be saved!"
143
- assert_have_selector '#demo2 div.field-errors ul.errors-list li', :content => "This is a fake error"
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 p', :content => "custom MarkupUser cannot be saved!"
149
- assert_have_selector '#demo div.field-errors ul.errors-list li', :content => "This is a fake error"
150
- assert_have_selector '#demo2 div.field-errors p', :content => "custom MarkupUser cannot be saved!"
151
- assert_have_selector '#demo2 div.field-errors ul.errors-list li', :content => "This is a fake error"
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 Me: "
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 Me: "
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
@@ -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"], :none? => false), :blank? => false)
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 p', :content => "The user could not be saved") { actual_html }
83
- assert_has_tag('div.field-errors ul.errors-list') { actual_html }
84
- assert_has_tag('div.field-errors ul.errors-list li', :count => 2) { actual_html }
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 p', :content => "There are problems with saving user!"
92
- assert_have_selector 'form.advanced-form .field-errors ul.errors-list'
93
- assert_have_selector 'form.advanced-form .field-errors ul.errors-list li', :count => 3
94
- assert_have_selector 'form.advanced-form .field-errors ul.errors-list li', :content => "This is a second fake error"
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 p', :content => "There are problems with saving user!"
102
- assert_have_selector 'form.advanced-form .field-errors ul.errors-list'
103
- assert_have_selector 'form.advanced-form .field-errors ul.errors-list li', :count => 3
104
- assert_have_selector 'form.advanced-form .field-errors ul.errors-list li', :content => "This is a second fake error"
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.5.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-06 00:00:00 -08:00
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.1.1
36
+ version: 0.6.1
37
37
  version:
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: haml