formtastic 2.0.0.rc5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,9 +7,8 @@ Formtastic is a Rails FormBuilder DSL (with some other goodies) to make it far e
7
7
 
8
8
  h2. Compatibility
9
9
 
10
- * Formtastic 1.x is compatible with both Rails 2 and 3, and is being maintained for bug fixes in the the "1.2-stable branch":https://github.com/justinfrench/formtastic/tree/1.2-stable.
11
- * Formtastic 2.0 will be Rails 3.x compatible only
12
- * If you're bundling Formtastic from edge/master, get ready for a bumpy ride. Try the "1.2-stable branch":https://github.com/justinfrench/formtastic/tree/1.2-stable.
10
+ * Formtastic 2.0 is Rails 3.x compatible only
11
+ * Formtastic 1.x is compatible with both Rails 2 and 3, and is being maintained for bug fixes in the the "1.2-stable branch":https://github.com/justinfrench/formtastic/tree/1.2-stable. View the README in that branch for installation instructions, etc.
13
12
  * Formtastic, much like Rails, is very ActiveRecord-centric. Many are successfully using other ActiveModel-like ORMs and objects (DataMapper, MongoMapper, Mongoid, Authlogic, Devise...) but we're not guaranteeing full compatibility at this stage. Patches are welcome!
14
13
 
15
14
 
@@ -51,7 +50,7 @@ One day, I finally had enough, so I opened up my text editor, and wrote a DSL fo
51
50
  I also wrote the accompanying HTML output I expected, favoring something very similar to the fieldsets, lists and other semantic elements Aaron Gustafson presented in "Learning to Love Forms":http://www.slideshare.net/AaronGustafson/learning-to-love-forms-web-directions-south-07, hacking together enough Ruby to prove it could be done.
52
51
 
53
52
 
54
- h2. It's better than _SomeOtherFormBuilder_ because...
53
+ h2. It's awesome because...
55
54
 
56
55
  * it can handle @belongs_to@ associations (like Post belongs_to :author), rendering a select or set of radio inputs with choices from the parent model.
57
56
  * it can handle @has_many@ and @has_and_belongs_to_many@ associations (like: Post has_many :tags), rendering a multi-select with choices from the child models.
@@ -66,22 +65,12 @@ h2. It's better than _SomeOtherFormBuilder_ because...
66
65
  * it has growing HTML5 support (new inputs like email/phone/search, new attributes like required/min/max/step/placeholder)
67
66
 
68
67
 
69
- h2. Why?
70
-
71
- * web apps = lots of forms.
72
- * forms are so friggin' boring to code.
73
- * semantically rich & accessible forms really are possible.
74
- * the "V" is way behind the "M" and "C" in Rails' MVC – it's the ugly sibling.
75
- * best practices and common patterns have to start somewhere.
76
- * i need a challenge.
77
-
78
-
79
68
  h2. Opinions
80
69
 
81
70
  * it should be easier to do things the right way than the wrong way.
82
71
  * sometimes _more mark-up_ is better.
83
72
  * elements and attribute hooks are _gold_ for stylesheet authors.
84
- * make the common things we do easy, yet still ensure uncommon things are still possible.
73
+ * make the common things we do easy, yet ensure uncommon things are still possible.
85
74
 
86
75
 
87
76
  h2. Documentation
@@ -94,16 +83,10 @@ h2. Installation
94
83
  Simply add Formtastic to your Gemfile and bundle it up:
95
84
 
96
85
  <pre>
97
- gem 'formtastic', '~> 1.2.3'
86
+ gem 'formtastic'
98
87
  </pre>
99
88
 
100
- If you want to try out our work towards Formtastic 2.0 (Rails 3.x only):
101
-
102
- <pre>
103
- gem 'formtastic', '2.0.0.rc1'
104
- </pre>
105
-
106
- Run the installation generator to copy a stylesheet (Rails 3.0.x only) and a configuration initializer into your application:
89
+ Run the installation generator:
107
90
 
108
91
  <pre>
109
92
  $ rails generate formtastic:install
@@ -165,9 +148,9 @@ This renders a set of inputs (one for _most_ columns in the database table, and
165
148
  <% end %>
166
149
  </pre>
167
150
 
168
- This is a great way to get something up fast, but like scaffolding, it's not recommended for production.
151
+ This is a great way to get something up fast, but like scaffolding, it's *not recommended for production*. Don't be so lazy!
169
152
 
170
- You probably want to specify the order of the fields, skip some of the fields or even add in fields that Formtastic couldn't detect, you can pass in a list of field names to @inputs@ and list of button names to @buttons@:
153
+ To specify the order of the fields, skip some of the fields or even add in fields that Formtastic couldn't infer. You can pass in a list of field names to @inputs@ and list of button names to @buttons@:
171
154
 
172
155
  <pre>
173
156
  <%= semantic_form_for @user do |form| %>
@@ -176,7 +159,7 @@ You probably want to specify the order of the fields, skip some of the fields or
176
159
  <% end %>
177
160
  </pre>
178
161
 
179
- You probably want control over the input type Formtastic uses for each field, you can expand the @inputs@ and @buttons@ blocks. This specifies the @:section@ input should be a set of radio buttons (rather than the default select box), and that the @:created_at@ field should be a string (rather than the default datetime selects):
162
+ You probably want control over the input type Formtastic uses for each field. You can expand the @inputs@ and @buttons@ to block helper format and use the @:as@ option to specify an exact input type:
180
163
 
181
164
  <pre>
182
165
  <%= semantic_form_for @post do |form| %>
@@ -419,8 +402,6 @@ Formtastic supports localized *labels*, *hints*, *legends*, *actions* using the
419
402
  dummie: "Launch!"
420
403
  </pre>
421
404
 
422
- *Note:* We are using English here still, but you get the point.
423
-
424
405
  *3. ...and now you'll get:*
425
406
 
426
407
  <pre>
@@ -531,11 +512,6 @@ You can show errors on base (by default) and any other attribute just passing it
531
512
  </pre>
532
513
 
533
514
 
534
- h2. Configuration
535
-
536
- Run @rails generate formtastic:install@ to copy a commented out config file into @config/initializers/formtastic.rb@. You can "view the configuration file on GitHub":http://github.com/justinfrench/formtastic/blob/master/lib/generators/templates/formtastic.rb
537
-
538
-
539
515
  h2. Modified & Custom Inputs
540
516
 
541
517
  If you want to change the behaviour of an input, you can subclass it in your app. For example, to tweak @StringInput@, create a new file @app/inputs/string_input.rb@:
@@ -572,12 +548,12 @@ To create your own new types of inputs from scratch:
572
548
  end
573
549
  </pre>
574
550
 
575
- It was previously advised to subclass Formtastic::FormBuilder to add your own inputs. This is no longer advised, and may not work as expected.
551
+ It was previously recommended in Formtastic 1.x to subclass Formtastic::FormBuilder to add your own inputs. This is no longer recommended in Formtastic 2, and will not work as expected.
576
552
 
577
553
 
578
554
  h2. Security
579
555
 
580
- By default formtastic escapes html entities in both labels and hints unless a string is marked as html_safe. If you are using an older rails version which doesn't know html_safe, or you want to globally turn this feature off, you can set the following in your initializer:
556
+ By default Formtastic escapes html entities in both labels and hints unless a string is marked as html_safe. If you are using an older rails version which doesn't know html_safe, or you want to globally turn this feature off, you can set the following in your initializer:
581
557
 
582
558
  Formtastic::FormBuilder.escape_html_entities_in_hints_and_labels = false
583
559
 
@@ -238,9 +238,23 @@ module Formtastic
238
238
  options = args.extract_options!
239
239
  text = options.delete(:label) || args.shift
240
240
 
241
- if @object && (@object.respond_to?(:persisted?) || @object.respond_to?(:new_record?))
242
- key = @object.persisted? ? :update : :create
241
+ text = (localized_string(commit_button_i18n_key, text, :action, :model => commit_button_object_name) ||
242
+ Formtastic::I18n.t(commit_button_i18n_key, :model => commit_button_object_name)) unless text.is_a?(::String)
243
+
244
+ button_html = options.delete(:button_html) || {}
245
+ button_html.merge!(:class => [button_html[:class], commit_button_i18n_key].compact.join(' '))
243
246
 
247
+ wrapper_html = options.delete(:wrapper_html) || {}
248
+ wrapper_html[:class] = (commit_button_wrapper_html_class << wrapper_html[:class]).flatten.compact.join(' ')
249
+
250
+ accesskey = (options.delete(:accesskey) || default_commit_button_accesskey) unless button_html.has_key?(:accesskey)
251
+ button_html = button_html.merge(:accesskey => accesskey) if accesskey
252
+
253
+ template.content_tag(:li, Formtastic::Util.html_safe(submit(text, button_html)), wrapper_html)
254
+ end
255
+
256
+ def commit_button_object_name
257
+ if new_or_persisted_object?
244
258
  # Deal with some complications with ActiveRecord::Base.human_name and two name models (eg UserPost)
245
259
  # ActiveRecord::Base.human_name falls back to ActiveRecord::Base.name.humanize ("Userpost")
246
260
  # if there's no i18n, which is pretty crappy. In this circumstance we want to detect this
@@ -254,24 +268,30 @@ module Formtastic
254
268
  object_name = (object_human_name == crappy_human_name) ? decent_human_name : object_human_name
255
269
  end
256
270
  else
257
- key = :submit
258
271
  object_name = @object_name.to_s.send(label_str_method)
259
272
  end
273
+
274
+ object_name
275
+ end
276
+
277
+ def commit_button_i18n_key
278
+ if new_or_persisted_object?
279
+ key = @object.persisted? ? :update : :create
280
+ else
281
+ key = :submit
282
+ end
260
283
 
261
- text = (localized_string(key, text, :action, :model => object_name) ||
262
- Formtastic::I18n.t(key, :model => object_name)) unless text.is_a?(::String)
263
-
264
- button_html = options.delete(:button_html) || {}
265
- button_html.merge!(:class => [button_html[:class], key].compact.join(' '))
266
-
267
- wrapper_html_class = ['commit', 'button'] # TODO: Add class reflecting on form action.
268
- wrapper_html = options.delete(:wrapper_html) || {}
269
- wrapper_html[:class] = (wrapper_html_class << wrapper_html[:class]).flatten.compact.join(' ')
284
+ key
285
+ end
270
286
 
271
- accesskey = (options.delete(:accesskey) || default_commit_button_accesskey) unless button_html.has_key?(:accesskey)
272
- button_html = button_html.merge(:accesskey => accesskey) if accesskey
273
- template.content_tag(:li, Formtastic::Util.html_safe(submit(text, button_html)), wrapper_html)
287
+ def commit_button_wrapper_html_class
288
+ ['commit', 'button'] # TODO: Add class reflecting on form action.
289
+ end
290
+
291
+ def new_or_persisted_object?
292
+ @object && (@object.respond_to?(:persisted?) || @object.respond_to?(:new_record?))
274
293
  end
294
+
275
295
  end
276
296
  end
277
297
  end
@@ -2,18 +2,18 @@ module Formtastic
2
2
  module Inputs
3
3
  module Base
4
4
  module Collections
5
-
5
+
6
6
  def label_method
7
7
  label_and_value_method(raw_collection).first
8
8
  end
9
-
9
+
10
10
  def value_method
11
11
  label_and_value_method(raw_collection).last
12
12
  end
13
-
13
+
14
14
  def label_and_value_method(_collection, grouped=false)
15
15
  sample = _collection.first || _collection.last
16
-
16
+
17
17
  case sample
18
18
  when Array
19
19
  label, value = :first, :last
@@ -22,36 +22,36 @@ module Formtastic
22
22
  when String, NilClass
23
23
  label, value = :to_s, :to_s
24
24
  end
25
-
25
+
26
26
  # Order of preference: user supplied method, class defaults, auto-detect
27
27
  label = (grouped ? options[:grouped_label_method] : options[:member_label]) || label || builder.collection_label_methods.find { |m| sample.respond_to?(m) }
28
28
  value = (grouped ? options[:grouped_value_method] : options[:member_value]) || value || builder.collection_value_methods.find { |m| sample.respond_to?(m) }
29
-
29
+
30
30
  [label, value]
31
31
  end
32
-
32
+
33
33
  def raw_collection
34
34
  @raw_collection ||= (collection_from_options || collection_from_association || collection_for_boolean)
35
35
  end
36
-
36
+
37
37
  def collection
38
38
  # Return if we have a plain string
39
39
  return raw_collection if raw_collection.instance_of?(String) || raw_collection.instance_of?(ActiveSupport::SafeBuffer)
40
-
40
+
41
41
  # Return if we have an Array of strings, fixnums or arrays
42
42
  return raw_collection if (raw_collection.instance_of?(Array) || raw_collection.instance_of?(Range)) &&
43
43
  [Array, Fixnum, String, Symbol].include?(raw_collection.first.class) &&
44
44
  !(options.include?(:member_label) || options.include?(:member_value))
45
-
45
+
46
46
  raw_collection.map { |o| [send_or_call(label_method, o), send_or_call(value_method, o)] }
47
47
  end
48
-
48
+
49
49
  def collection_from_options
50
50
  items = options[:collection]
51
51
  items = items.to_a if items.is_a?(Hash)
52
52
  items
53
53
  end
54
-
54
+
55
55
  def collection_from_association
56
56
  if reflection
57
57
  raise PolymorphicInputWithoutCollectionError.new("A collection must be supplied for #{method} input. Collections cannot be guessed for polymorphic associations.") if reflection.options && reflection.options[:polymorphic] == true
@@ -59,42 +59,41 @@ module Formtastic
59
59
  find_options_from_options = options[:find_options] || {}
60
60
  conditions_from_options = find_options_from_options[:conditions] || {}
61
61
  conditions_from_reflection = reflection.options && reflection.options[:conditions] || {}
62
-
62
+ conditions_from_reflection = conditions_from_reflection.call if conditions_from_reflection.is_a?(Proc)
63
+
63
64
  if conditions_from_options.any?
64
- reflection.klass.where(
65
- conditions_from_reflection.merge(conditions_from_options)
66
- )
65
+ reflection.klass.scoped(:conditions => conditions_from_reflection).where(conditions_from_options)
67
66
  else
68
67
  find_options_from_options.merge!(:include => group_by) if self.respond_to?(:group_by) && group_by
69
- reflection.klass.where(conditions_from_reflection.merge(find_options_from_options))
68
+ reflection.klass.scoped(:conditions => conditions_from_reflection).where(find_options_from_options)
70
69
  end
71
70
  end
72
71
  end
73
-
72
+
74
73
  def collection_for_boolean
75
74
  true_text = options[:true] || Formtastic::I18n.t(:yes)
76
75
  false_text = options[:false] || Formtastic::I18n.t(:no)
77
-
76
+
78
77
  # TODO options[:value_as_class] = true unless options.key?(:value_as_class)
79
-
78
+
80
79
  [ [true_text, true], [false_text, false] ]
81
80
  end
82
-
81
+
83
82
  def send_or_call(duck, object)
84
83
  if duck.respond_to?(:call)
85
84
  duck.call(object)
86
- else
85
+ elsif object.respond_to? duck.to_sym
87
86
  object.send(duck)
88
87
  end
89
88
  end
90
-
89
+
91
90
  # Avoids an issue where `send_or_call` can be a String and duck can be something simple like
92
91
  # `:first`, which obviously String responds to.
93
92
  def send_or_call_or_object(duck, object)
94
93
  return object if object.is_a?(String) # TODO what about other classes etc?
95
94
  send_or_call(duck, object)
96
95
  end
97
-
96
+
98
97
  end
99
98
  end
100
99
  end
@@ -153,13 +153,7 @@ module Formtastic
153
153
 
154
154
  def selected_values
155
155
  if object.respond_to?(method)
156
- if options[:collection].is_a?(Array) and
157
- options[:collection].flatten.all? {|i| i.is_a?(String) or i.is_a?(Integer)}
158
-
159
- selected_items = options[:collection]
160
- else
161
- selected_items = [object.send(method)].compact.flatten
162
- end
156
+ selected_items = [object.send(method)].compact.flatten
163
157
 
164
158
  [*selected_items.map { |o| send_or_call_or_object(value_method, o) }].compact
165
159
  else
@@ -1,3 +1,3 @@
1
1
  module Formtastic
2
- VERSION = "2.0.0.rc5"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -0,0 +1,8 @@
1
+ = semantic_form_for @<%= singular_name %> do |f|
2
+ = f.inputs do
3
+ <% attributes.each do |attribute| -%>
4
+ = f.input :<%= attribute.name %>
5
+ <% end -%>
6
+
7
+ = f.buttons do
8
+ = f.commit_button
@@ -461,7 +461,7 @@ describe 'Formtastic::FormBuilder#commit_button' do
461
461
  concat(semantic_form_for(@new_post) do |builder|
462
462
  concat(builder.commit_button('text'))
463
463
  end)
464
- output_buffer.should have_tag("form li.commit")
464
+ output_buffer.should have_tag("form li.commit.button")
465
465
  end
466
466
  end
467
467
 
@@ -410,6 +410,10 @@ describe 'check_boxes input' do
410
410
  output_buffer.should have_tag("form li fieldset ol li label[@for='author_post_ids_#{post.last}']")
411
411
  end
412
412
  end
413
+
414
+ it "should not check any items" do
415
+ output_buffer.should have_tag('form li input[@checked]', :count => 0)
416
+ end
413
417
  end
414
418
 
415
419
  end
@@ -208,7 +208,7 @@ describe 'select input' do
208
208
  end
209
209
 
210
210
  it "should call author.find with association conditions" do
211
- ::Author.should_receive(:where).with(:active => true)
211
+ ::Author.should_receive(:scoped).with(:conditions => {:active => true})
212
212
 
213
213
  semantic_form_for(@new_post) do |builder|
214
214
  concat(builder.input(:author, :as => :select))
@@ -216,7 +216,8 @@ describe 'select input' do
216
216
  end
217
217
 
218
218
  it "should call author.find with association conditions and find_options conditions" do
219
- ::Author.should_receive(:where).with({:active => true, :publisher => true})
219
+ ::Author.should_receive(:scoped).with(:conditions => {:active => true})
220
+ ::Author.should_receive(:where).with({:publisher => true})
220
221
 
221
222
  semantic_form_for(@new_post) do |builder|
222
223
  concat(builder.input(:author, :as => :select, :find_options => {:conditions => {:publisher => true}}))
@@ -316,11 +317,11 @@ describe 'select input' do
316
317
  it 'should have a multi-select select' do
317
318
  output_buffer.should have_tag('form li select[@multiple="multiple"]')
318
319
  end
319
-
320
+
320
321
  it 'should append [] to the name attribute for multiple select' do
321
322
  output_buffer.should have_tag('form li select[@multiple="multiple"][@name="author[post_ids][]"]')
322
323
  end
323
-
324
+
324
325
  it 'should have a select option for each Post' do
325
326
  output_buffer.should have_tag('form li select option', :count => ::Post.all.size)
326
327
  ::Post.all.each do |post|
@@ -535,7 +536,7 @@ describe 'select input' do
535
536
 
536
537
  context "when required" do
537
538
  it "should add the required attribute to the select's html options" do
538
- with_config :use_required_attribute, true do
539
+ with_config :use_required_attribute, true do
539
540
  concat(semantic_form_for(@new_post) do |builder|
540
541
  concat(builder.input(:author, :as => :select, :required => true))
541
542
  end)
@@ -67,7 +67,7 @@ module FormtasticSpecHelper
67
67
  def active_model_inclusion_validator(attributes, options = {})
68
68
  active_model_validator(:inclusion, attributes, options)
69
69
  end
70
-
70
+
71
71
  def active_model_numericality_validator(attributes, options = {})
72
72
  active_model_validator(:numericality, attributes, options)
73
73
  end
@@ -93,7 +93,7 @@ module FormtasticSpecHelper
93
93
  def persisted?
94
94
  end
95
95
  end
96
-
96
+
97
97
  module ::Namespaced
98
98
  class Post
99
99
  extend ActiveModel::Naming if defined?(ActiveModel::Naming)
@@ -106,18 +106,18 @@ module FormtasticSpecHelper
106
106
  end
107
107
  end
108
108
  end
109
-
109
+
110
110
  class ::Author
111
111
  extend ActiveModel::Naming if defined?(ActiveModel::Naming)
112
112
  include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
113
113
 
114
114
  def to_label
115
115
  end
116
-
116
+
117
117
  def persisted?
118
118
  end
119
119
  end
120
-
120
+
121
121
  class ::HashBackedAuthor < Hash
122
122
  extend ActiveModel::Naming if defined?(ActiveModel::Naming)
123
123
  include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
@@ -126,34 +126,34 @@ module FormtasticSpecHelper
126
126
  'hash backed author'
127
127
  end
128
128
  end
129
-
129
+
130
130
  class ::Continent
131
131
  extend ActiveModel::Naming if defined?(ActiveModel::Naming)
132
132
  include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
133
133
  end
134
-
134
+
135
135
  class ::PostModel
136
136
  extend ActiveModel::Naming if defined?(ActiveModel::Naming)
137
137
  include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
138
138
  end
139
-
139
+
140
140
  def _routes
141
141
  url_helpers = mock('url_helpers')
142
142
  url_helpers.stub!(:hash_for_posts_path).and_return({})
143
143
  url_helpers.stub!(:hash_for_post_path).and_return({})
144
144
  url_helpers.stub!(:hash_for_post_models_path).and_return({})
145
145
  url_helpers.stub!(:hash_for_authors_path).and_return({})
146
-
147
- mock('_routes',
146
+
147
+ mock('_routes',
148
148
  :url_helpers => url_helpers,
149
149
  :url_for => "/mock/path"
150
150
  )
151
151
  end
152
-
152
+
153
153
  def controller
154
154
  mock('controller', :controller_path= => '', :params => {})
155
155
  end
156
-
156
+
157
157
  def default_url_options
158
158
  {}
159
159
  end
@@ -171,7 +171,7 @@ module FormtasticSpecHelper
171
171
  def author_path(*args); "/authors/1"; end
172
172
  def authors_path(*args); "/authors"; end
173
173
  def new_author_path(*args); "/authors/new"; end
174
-
174
+
175
175
  @fred = ::Author.new
176
176
  @fred.stub!(:class).and_return(::Author)
177
177
  @fred.stub!(:to_label).and_return('Fred Smith')
@@ -212,6 +212,7 @@ module FormtasticSpecHelper
212
212
  @james.stub!(:name).and_return('James')
213
213
 
214
214
 
215
+ ::Author.stub!(:scoped).and_return(::Author)
215
216
  ::Author.stub!(:find).and_return([@fred, @bob])
216
217
  ::Author.stub!(:all).and_return([@fred, @bob])
217
218
  ::Author.stub!(:where).and_return([@fred, @bob])
@@ -223,7 +224,7 @@ module FormtasticSpecHelper
223
224
  ::Author.stub!(:persisted?).and_return(nil)
224
225
 
225
226
  @hash_backed_author = HashBackedAuthor.new
226
-
227
+
227
228
  # Sometimes we need a mock @post object and some Authors for belongs_to
228
229
  @new_post = mock('post')
229
230
  @new_post.stub!(:class).and_return(::Post)
@@ -240,7 +241,7 @@ module FormtasticSpecHelper
240
241
  @new_post.stub!(:to_key).and_return(nil)
241
242
  @new_post.stub!(:to_model).and_return(@new_post)
242
243
  @new_post.stub!(:persisted?).and_return(nil)
243
-
244
+
244
245
  @freds_post = mock('post')
245
246
  @freds_post.stub!(:to_ary)
246
247
  @freds_post.stub!(:class).and_return(::Post)
@@ -258,6 +259,7 @@ module FormtasticSpecHelper
258
259
  @fred.stub!(:posts).and_return([@freds_post])
259
260
  @fred.stub!(:post_ids).and_return([@freds_post.id])
260
261
 
262
+ ::Post.stub!(:scoped).and_return(::Post)
261
263
  ::Post.stub!(:human_attribute_name).and_return { |column_name| column_name.humanize }
262
264
  ::Post.stub!(:human_name).and_return('Post')
263
265
  ::Post.stub!(:reflect_on_all_validations).and_return([])
@@ -291,7 +293,6 @@ module FormtasticSpecHelper
291
293
  ::Post.stub!(:persisted?).and_return(nil)
292
294
  ::Post.stub!(:to_ary)
293
295
 
294
-
295
296
  ::MongoPost.stub!(:human_attribute_name).and_return { |column_name| column_name.humanize }
296
297
  ::MongoPost.stub!(:human_name).and_return('MongoPost')
297
298
  ::MongoPost.stub!(:associations).and_return do |column_name|
@@ -306,14 +307,14 @@ module FormtasticSpecHelper
306
307
  ::MongoPost.stub!(:to_key).and_return(nil)
307
308
  ::MongoPost.stub!(:persisted?).and_return(nil)
308
309
  ::MongoPost.stub!(:to_ary)
309
- ::MongoPost.stub!(:model_name).and_return( mock(:model_name_mock, :singular => "post", :plural => "posts", :param_key => "post", :route_key => "posts") )
310
+ ::MongoPost.stub!(:model_name).and_return( mock(:model_name_mock, :singular => "post", :plural => "posts", :param_key => "post", :route_key => "posts") )
310
311
 
311
312
  @new_mm_post = mock('mm_post')
312
313
  @new_mm_post.stub!(:class).and_return(::MongoPost)
313
314
  @new_mm_post.stub!(:id).and_return(nil)
314
315
  @new_mm_post.stub!(:new_record?).and_return(true)
315
316
  @new_mm_post.stub!(:errors).and_return(mock('errors', :[] => nil))
316
- @new_mm_post.stub!(:title).and_return("Hello World")
317
+ @new_mm_post.stub!(:title).and_return("Hello World")
317
318
  @new_mm_post.stub!(:sub_posts).and_return([]) #TODO should be a mock with methods for adding sub posts
318
319
  @new_mm_post.stub!(:to_key).and_return(nil)
319
320
  @new_mm_post.stub!(:to_model).and_return(@new_mm_post)
@@ -384,11 +385,11 @@ module FormtasticSpecHelper
384
385
  def protect_against_forgery?
385
386
  false
386
387
  end
387
-
388
+
388
389
  def _helpers
389
390
  FakeHelpersModule
390
391
  end
391
-
392
+
392
393
  end
393
394
  end
394
395
 
metadata CHANGED
@@ -1,15 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: formtastic
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15424095
5
- prerelease: 6
4
+ hash: 15
5
+ prerelease:
6
6
  segments:
7
7
  - 2
8
8
  - 0
9
9
  - 0
10
- - rc
11
- - 5
12
- version: 2.0.0.rc5
10
+ version: 2.0.0
13
11
  platform: ruby
14
12
  authors:
15
13
  - Justin French
@@ -17,7 +15,8 @@ autorequire:
17
15
  bindir: bin
18
16
  cert_chain: []
19
17
 
20
- date: 2011-09-01 00:00:00 Z
18
+ date: 2011-09-23 00:00:00 +10:00
19
+ default_executable:
21
20
  dependencies:
22
21
  - !ruby/object:Gem::Dependency
23
22
  name: rails
@@ -226,6 +225,7 @@ files:
226
225
  - lib/generators/formtastic/install/install_generator.rb
227
226
  - lib/generators/templates/_form.html.erb
228
227
  - lib/generators/templates/_form.html.haml
228
+ - lib/generators/templates/_form.html.slim
229
229
  - lib/generators/templates/formtastic.rb
230
230
  - lib/locale/en.yml
231
231
  - lib/tasks/verify_rcov.rb
@@ -275,6 +275,7 @@ files:
275
275
  - spec/support/deferred_garbage_collection.rb
276
276
  - spec/support/deprecation.rb
277
277
  - spec/support/test_environment.rb
278
+ has_rdoc: true
278
279
  homepage: http://github.com/justinfrench/formtastic
279
280
  licenses: []
280
281
 
@@ -304,7 +305,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
304
305
  requirements: []
305
306
 
306
307
  rubyforge_project:
307
- rubygems_version: 1.8.7
308
+ rubygems_version: 1.4.2
308
309
  signing_key:
309
310
  specification_version: 3
310
311
  summary: A Rails form builder plugin/gem with semantically rich and accessible markup