forme 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 06d7e50cfae657572071affb86ef307636c65345
4
- data.tar.gz: 5eef25b91f833f3a57caef3903d25886cb48f00d
3
+ metadata.gz: 037794e39f62d0052a5dd6a6832c41326d31b851
4
+ data.tar.gz: 1f3aa7418616002d1e2443ccea5313a874925851
5
5
  SHA512:
6
- metadata.gz: a19e5579fc8f0bfe11c5136f2ecc69db057a23f76d08bc01aad4680c1ebeb9fbd27476a04d60265efe5de1d1e5ab0b16dd615f8bc0081c7b733ef9f188e31581
7
- data.tar.gz: ba0fe6ba4e18fe182c0a93eb9b33f28e0d0f30729ec537f2a3b468d8b9db56a75d657aadb17b4c164a3128d901017d7460a7ce8ecd9bd8a923d5017bc1e4d051
6
+ metadata.gz: 55d5ebeb5602c3eaed73448d2973bfc12b97a3ffb5d39c4caee227c83cbca0142252c96d8c99c90a178071a9ca3302b99f62316180d2a2f36d2358ac8afeb7d9
7
+ data.tar.gz: 9bb5afa6c4192585b71bad482d7de6c138efc11b4e00310c9376f147884c1e6f2e399475504329502ca0281374f89ee20b3874e54649cb6dd3953dc197fdad94
data/CHANGELOG CHANGED
@@ -1,3 +1,21 @@
1
+ === 0.9.0 (2013-12-13)
2
+
3
+ * Support :input_defaults Form option for setting defaults for inputs by type (jeremyevans)
4
+
5
+ * Make html_usa serializer convert date/datetime inputs to text for better compatibility (jeremyevans)
6
+
7
+ * Format BigDecimal in standard notation instead of default scientific notation (jeremyevans)
8
+
9
+ * Make trtd wrapper always have labels on left side (jeremyevans)
10
+
11
+ * Make trtd wrapper always use 2 cells (jeremyevans)
12
+
13
+ * Use regular (not-multiple) select box for *_to_many associations for :multiple=>false option (jeremyevans)
14
+
15
+ * Associtions in the Sequel plugin now support a :dataset option to specify dataset to use for options (jeremyevans)
16
+
17
+ * The :name_method option used for associations in the Sequel plugin now allows for arbitrary callables (jeremyevans)
18
+
1
19
  === 0.8.0 (2013-10-30)
2
20
 
3
21
  * form calls without block or :inputs or :button options are now handled correctly in the Sinatra integration (jeremyevans)
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011-2012 Jeremy Evans
1
+ Copyright (c) 2011-2013 Jeremy Evans
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to
@@ -9,7 +9,11 @@ Forme is a HTML forms library for ruby with the following goals:
9
9
 
10
10
  = Demo Site
11
11
 
12
- A demo site is available at http://forme.heroku.com
12
+ A demo site is available at http://forme-demo.jeremyevans.net
13
+
14
+ = Documentation Site
15
+
16
+ RDoc Documentation is available at http://forme.jeremyevans.net
13
17
 
14
18
  = Source Code
15
19
 
data/Rakefile CHANGED
@@ -22,11 +22,17 @@ end
22
22
 
23
23
  ### RDoc
24
24
 
25
- RDOC_DEFAULT_OPTS = ["--quiet", "--line-numbers", "--inline-source", '--title', 'Forme']
25
+ RDOC_DEFAULT_OPTS = ["--line-numbers", "--inline-source", '--title', 'Forme']
26
+
27
+ begin
28
+ gem 'rdoc', '= 3.12.2'
29
+ gem 'hanna-nouveau'
30
+ RDOC_DEFAULT_OPTS.concat(['-f', 'hanna'])
31
+ rescue Gem::LoadError
32
+ end
26
33
 
27
34
  rdoc_task_class = begin
28
35
  require "rdoc/task"
29
- RDOC_DEFAULT_OPTS.concat(['-f', 'hanna'])
30
36
  RDoc::Task
31
37
  rescue LoadError
32
38
  require "rake/rdoctask"
@@ -1,4 +1,5 @@
1
1
  require 'date'
2
+ require 'bigdecimal'
2
3
  require 'forme/version'
3
4
 
4
5
  # Forme is designed to make creating HTML forms easier. Flexibility and
@@ -146,6 +147,7 @@ module Forme
146
147
  # :error_handler :: Sets the +error_handler+ for the form
147
148
  # :formatter :: Sets the +formatter+ for the form
148
149
  # :hidden_tags :: Sets the hidden tags to automatically add to this form.
150
+ # :input_defaults :: Sets the default options for each input type
149
151
  # :inputs_wrapper :: Sets the +inputs_wrapper+ for the form
150
152
  # :labeler :: Sets the +labeler+ for the form
151
153
  # :wrapper :: Sets the +wrapper+ for the form
@@ -168,6 +170,10 @@ module Forme
168
170
  # respond to +call+ or be a registered symbol.
169
171
  attr_reader :wrapper
170
172
 
173
+ # Set the default options for inputs by type. This should be a hash with
174
+ # input type string keys and values that are hashes of input options.
175
+ attr_reader :input_defaults
176
+
171
177
  # The +inputs_wrapper+ determines how calls to +inputs+ are wrapped. Must
172
178
  # respond to +call+ or be a registered symbol.
173
179
  attr_reader :inputs_wrapper
@@ -242,6 +248,7 @@ module Forme
242
248
  end
243
249
  config = CONFIGURATIONS[@opts[:config]||Forme.default_config]
244
250
  TRANSFORMER_TYPES.each{|k| instance_variable_set(:"@#{k}", transformer(k, @opts.fetch(k, config[k])))}
251
+ @input_defaults = @opts[:input_defaults] || {}
245
252
  @hidden_tags = @opts[:hidden_tags]
246
253
  @nesting = []
247
254
  end
@@ -525,7 +532,8 @@ module Forme
525
532
 
526
533
  # Set the +form+, +type+, and +opts+.
527
534
  def initialize(form, type, opts={})
528
- @form, @type, @opts = form, type, opts
535
+ @form, @type = form, type
536
+ @opts = (form.input_defaults[type.to_s] || {}).merge(opts)
529
537
  end
530
538
 
531
539
  # Replace the +opts+ by merging the given +hash+ into +opts+,
@@ -1051,7 +1059,17 @@ module Forme
1051
1059
  end
1052
1060
  Forme.register_transformer(:wrapper, :trtd) do |tag, input|
1053
1061
  a = Array(tag).flatten
1054
- input.tag(:tr, input.opts[:wrapper_attr], a.length == 1 ? input.tag(:td, {}, a) : [input.tag(:td, {}, [a.first]), input.tag(:td, {}, a[1..-1])])
1062
+ labels, other = a.partition{|e| e.is_a?(Tag) && e.type.to_s == 'label'}
1063
+ if labels.length == 1
1064
+ ltd = labels
1065
+ rtd = other
1066
+ elsif a.length == 1
1067
+ ltd = [a.first]
1068
+ rtd = a[1..-1]
1069
+ else
1070
+ ltd = a
1071
+ end
1072
+ input.tag(:tr, input.opts[:wrapper_attr], [input.tag(:td, {}, ltd), input.tag(:td, {}, rtd)])
1055
1073
  end
1056
1074
 
1057
1075
  # Default inputs_wrapper used by the library, uses a fieldset.
@@ -1150,7 +1168,7 @@ module Forme
1150
1168
  case tag
1151
1169
  when Tag
1152
1170
  if SELF_CLOSING.include?(tag.type)
1153
- "<#{tag.type}#{attr_html(tag)}/>"
1171
+ "<#{tag.type}#{attr_html(tag.attr)}/>"
1154
1172
  else
1155
1173
  "#{serialize_open(tag)}#{call(tag.children)}#{serialize_close(tag)}"
1156
1174
  end
@@ -1162,6 +1180,8 @@ module Forme
1162
1180
  format_time(tag)
1163
1181
  when Date
1164
1182
  format_date(tag)
1183
+ when BigDecimal
1184
+ tag.to_s('F')
1165
1185
  when Raw
1166
1186
  tag.to_s
1167
1187
  else
@@ -1171,7 +1191,7 @@ module Forme
1171
1191
 
1172
1192
  # Returns the opening part of the given tag.
1173
1193
  def serialize_open(tag)
1174
- "<#{tag.type}#{attr_html(tag)}>"
1194
+ "<#{tag.type}#{attr_html(tag.attr)}>"
1175
1195
  end
1176
1196
 
1177
1197
  # Returns the closing part of the given tag.
@@ -1208,16 +1228,33 @@ module Forme
1208
1228
 
1209
1229
  # Transforms the +tag+'s attributes into an html string, sorting by the keys
1210
1230
  # and quoting and html escaping the values.
1211
- def attr_html(tag)
1212
- attr = tag.attr.to_a.reject{|k,v| v.nil?}
1231
+ def attr_html(attr)
1232
+ attr = attr.to_a.reject{|k,v| v.nil?}
1213
1233
  " #{attr.map{|k, v| "#{k}=\"#{attr_value(v)}\""}.sort.join(' ')}" unless attr.empty?
1214
1234
  end
1215
1235
  end
1216
1236
 
1217
1237
  # Overrides formatting of dates and times to use an American format without
1218
1238
  # timezones.
1219
- module Serializer::AmericanTime
1220
- Forme.register_transformer(:serializer, :html_usa, Serializer.new.extend(self))
1239
+ class Serializer::AmericanTime < Serializer
1240
+ Forme.register_transformer(:serializer, :html_usa, new)
1241
+
1242
+ def call(tag)
1243
+ case tag
1244
+ when Tag
1245
+ if tag.type.to_s == 'input' && %w'date datetime'.include?((tag.attr[:type] || tag.attr['type']).to_s)
1246
+ attr = tag.attr.dup
1247
+ attr.delete(:type)
1248
+ attr.delete('type')
1249
+ attr['type'] = 'text'
1250
+ "<#{tag.type}#{attr_html(attr)}/>"
1251
+ else
1252
+ super
1253
+ end
1254
+ else
1255
+ super
1256
+ end
1257
+ end
1221
1258
 
1222
1259
  private
1223
1260
 
@@ -1,6 +1,6 @@
1
1
  module Forme
2
2
  # Version constant, use <tt>Forme.version</tt> instead.
3
- VERSION = '0.8.0'.freeze
3
+ VERSION = '0.9.0'.freeze
4
4
 
5
5
  # Returns the version as a frozen string (e.g. '0.1.0')
6
6
  def self.version
@@ -145,7 +145,7 @@ module Sequel # :nodoc:
145
145
  # If the field is a column, use the column's type to determine
146
146
  # an appropriate field type. If the field is an association,
147
147
  # use either a regular or multiple select input (or multiple radios or
148
- # checkboxes if the related :type option is used). If it's not a
148
+ # checkboxes if the related :as option is used). If it's not a
149
149
  # column or association, but the object responds to +field+,
150
150
  # create a text input. Otherwise, raise an +Error+.
151
151
  def input
@@ -290,8 +290,8 @@ module Sequel # :nodoc:
290
290
 
291
291
  # Create a select input made up of options for all entries the object
292
292
  # could be associated to, with the one currently associated to being selected.
293
- # If the :type=>:radio option is used, use multiple radio buttons instead of
294
- # a select box. For :type=>:radio, you can also provide a :tag_wrapper option
293
+ # If the :as=>:radio option is used, use multiple radio buttons instead of
294
+ # a select box. For :as=>:radio, you can also provide a :tag_wrapper option
295
295
  # used to wrap the individual radio buttons.
296
296
  def association_many_to_one(ref)
297
297
  key = ref[:key]
@@ -319,8 +319,8 @@ module Sequel # :nodoc:
319
319
 
320
320
  # Create a multiple select input made up of options for all entries the object
321
321
  # could be associated to, with all of the ones currently associated to being selected.
322
- # If the :type=>:checkbox option is used, use multiple checkboxes instead of
323
- # a multiple select box. For :type=>:checkbox, you can also provide a :tag_wrapper option
322
+ # If the :as=>:checkbox option is used, use multiple checkboxes instead of
323
+ # a multiple select box. For :as=>:checkbox, you can also provide a :tag_wrapper option
324
324
  # used to wrap the individual checkboxes.
325
325
  def association_one_to_many(ref)
326
326
  key = ref[:key]
@@ -340,7 +340,7 @@ module Sequel # :nodoc:
340
340
  wrapper ? wrapper.call(cbs, _input(:checkbox, opts)) : cbs
341
341
  else
342
342
  opts[:id] = form.namespaced_id(field) unless opts.has_key?(:id)
343
- opts[:multiple] = true
343
+ opts[:multiple] = true unless opts.has_key?(:multiple)
344
344
  _input(:select, opts)
345
345
  end
346
346
  end
@@ -349,8 +349,25 @@ module Sequel # :nodoc:
349
349
  # Return an array of two element arrays representing the
350
350
  # select options that should be created.
351
351
  def association_select_options(ref)
352
- name_method = forme_name_method(ref)
353
- obj.send(:_apply_association_options, ref, ref.associated_class.dataset).unlimited.all.map{|a| [a.send(name_method), a.pk]}
352
+ case ds = opts[:dataset]
353
+ when nil
354
+ ds = association_select_options_dataset(ref)
355
+ when Proc, Method
356
+ ds = ds.call(association_select_options_dataset(ref))
357
+ end
358
+ rows = ds.all
359
+
360
+ case name_method = forme_name_method(ref)
361
+ when Symbol, String
362
+ rows.map{|a| [a.send(name_method), a.pk]}
363
+ else
364
+ rows.map{|a| [name_method.call(a), a.pk]}
365
+ end
366
+ end
367
+
368
+ # The dataset to use to retrieve the association select options
369
+ def association_select_options_dataset(ref)
370
+ obj.send(:_apply_association_options, ref, ref.associated_dataset).unlimited
354
371
  end
355
372
 
356
373
  # Delegate to the +form+.
@@ -359,7 +376,8 @@ module Sequel # :nodoc:
359
376
  end
360
377
 
361
378
  # If the column allows +NULL+ values, use a three-valued select
362
- # input. If not, use a simple checkbox.
379
+ # input. If not, use a simple checkbox. You can also use :as=>:select,
380
+ # as :as=>:radio, or :as=>:checkbox to specify a particular style.
363
381
  def input_boolean(sch)
364
382
  unless opts.has_key?(:as)
365
383
  opts[:as] = sch[:allow_null] ? :select : :checkbox
@@ -1,5 +1,4 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
- require 'date'
3
2
 
4
3
  describe "Forme plain forms" do
5
4
  def sel(opts, s)
@@ -306,6 +305,10 @@ describe "Forme plain forms" do
306
305
  @f.tag(:div, :foo=>Time.utc(2011, 6, 5, 4, 3, 2)).to_s.should =~ /<div foo="2011-06-05 04:03:02(GMT|UTC)"><\/div>/
307
306
  end
308
307
 
308
+ specify "should format bigdecimals in standard notation" do
309
+ @f.tag(:div, :foo=>BigDecimal.new('10000.010')).to_s.should == '<div foo="10000.01"></div>'
310
+ end
311
+
309
312
  specify "inputs should accept a :wrapper option to use a custom wrapper" do
310
313
  @f.input(:text, :wrapper=>:li).to_s.should == '<li><input type="text"/></li>'
311
314
  end
@@ -367,6 +370,12 @@ describe "Forme plain forms" do
367
370
  @f.inputs(:inputs_wrapper=>:ol){@f.input(:textarea)}.to_s.should == '<ol><textarea></textarea></ol>'
368
371
  end
369
372
 
373
+ specify "should support setting defaults for inputs at the form level" do
374
+ f = Forme::Form.new(:input_defaults=>{'text'=>{:size=>20}, 'textarea'=>{:cols=>80, :rows=>6}})
375
+ f.input(:text, :name=>"foo").to_s.should == '<input name="foo" size="20" type="text"/>'
376
+ f.input(:textarea, :name=>"foo").to_s.should == '<textarea cols="80" name="foo" rows="6"></textarea>'
377
+ end
378
+
370
379
  specify "invalid custom transformers should raise an Error" do
371
380
  proc{Forme::Form.new(:wrapper=>Object.new)}.should raise_error(Forme::Error)
372
381
  proc{@f.input(:textarea, :wrapper=>Object.new).to_s}.should raise_error(Forme::Error)
@@ -475,7 +484,7 @@ describe "Forme built-in custom" do
475
484
  end
476
485
 
477
486
  specify "wrapper: trtd wraps tag in an tr/td" do
478
- Forme::Form.new(:wrapper=>:trtd).input(:textarea, :id=>'foo').to_s.should == '<tr><td><textarea id="foo"></textarea></td></tr>'
487
+ Forme::Form.new(:wrapper=>:trtd).input(:textarea, :id=>'foo').to_s.should == '<tr><td><textarea id="foo"></textarea></td><td></td></tr>'
479
488
  end
480
489
 
481
490
  specify "wrapper: trtd supports multiple tags in separate tds" do
@@ -486,6 +495,10 @@ describe "Forme built-in custom" do
486
495
  Forme::Form.new(:wrapper=>:trtd, :labeler=>:explicit).input(:textarea, :id=>'foo', :label=>'Foo', :error=>'Bar').to_s.should == '<tr><td><label for="foo">Foo</label></td><td><textarea class="error" id="foo"></textarea><span class="error_message">Bar</span></td></tr>'
487
496
  end
488
497
 
498
+ specify "wrapper: trtd should handle inputs with label after" do
499
+ Forme::Form.new(:wrapper=>:trtd, :labeler=>:explicit).input(:checkbox, :id=>'foo', :name=>'foo', :label=>'Foo').to_s.should == '<tr><td><label for="foo">Foo</label></td><td><input id="foo_hidden" name="foo" type="hidden" value="0"/><input id="foo" name="foo" type="checkbox"/></td></tr>'
500
+ end
501
+
489
502
  specify "inputs_wrapper: ol wraps tags in an ol" do
490
503
  Forme::Form.new(:inputs_wrapper=>:ol, :wrapper=>:li).inputs([:textarea]).to_s.should == '<ol><li><textarea></textarea></li></ol>'
491
504
  end
@@ -503,7 +516,7 @@ describe "Forme built-in custom" do
503
516
  end
504
517
 
505
518
  specify "inputs_wrapper: table wraps tags in an table" do
506
- Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea]).to_s.should == '<table><tr><td><textarea></textarea></td></tr></table>'
519
+ Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea]).to_s.should == '<table><tr><td><textarea></textarea></td><td></td></tr></table>'
507
520
  end
508
521
 
509
522
  specify "serializer: html_usa formats dates and datetimes in American format without timezones" do
@@ -512,6 +525,11 @@ describe "Forme built-in custom" do
512
525
  Forme::Form.new(:serializer=>:html_usa).tag(:div, :foo=>Time.utc(2011, 6, 5, 4, 3, 2)).to_s.should == '<div foo="06/05/2011 04:03:02AM"></div>'
513
526
  end
514
527
 
528
+ specify "serializer: html_usa should convert date and datetime inputs into text inputs" do
529
+ Forme::Form.new(:serializer=>:html_usa).input(:date, :value=>Date.new(2011, 6, 5)).to_s.should == '<input type="text" value="06/05/2011"/>'
530
+ Forme::Form.new(:serializer=>:html_usa).input(:datetime, :value=>DateTime.new(2011, 6, 5, 16, 3, 2)).to_s.should == '<input type="text" value="06/05/2011 04:03:02PM"/>'
531
+ end
532
+
515
533
  specify "serializer: text uses plain text output instead of html" do
516
534
  Forme::Form.new(:serializer=>:text).input(:textarea, :label=>"Foo", :value=>"Bar").to_s.should == "Foo: Bar\n\n"
517
535
  Forme::Form.new(:serializer=>:text).input(:text, :label=>"Foo", :value=>"Bar").to_s.should == "Foo: Bar\n\n"
@@ -171,6 +171,21 @@ describe "Forme Sequel::Model forms" do
171
171
  @c.input(:artist, :name_method=>:idname).to_s.should == '<label>Artist: <select id="album_artist_id" name="album[artist_id]"><option value=""></option><option value="1">1a</option><option selected="selected" value="2">2d</option></select></label>'
172
172
  end
173
173
 
174
+ specify "should support :name_method option being a callable object" do
175
+ @b.input(:artist, :name_method=>lambda{|obj| obj.idname * 2}).to_s.should == '<label>Artist: <select id="album_artist_id" name="album[artist_id]"><option value=""></option><option selected="selected" value="1">1a1a</option><option value="2">2d2d</option></select></label>'
176
+ @c.input(:artist, :name_method=>lambda{|obj| obj.idname * 2}).to_s.should == '<label>Artist: <select id="album_artist_id" name="album[artist_id]"><option value=""></option><option value="1">1a1a</option><option selected="selected" value="2">2d2d</option></select></label>'
177
+ end
178
+
179
+ specify "should support :dataset option providing dataset to search" do
180
+ @b.input(:artist, :dataset=>Artist.reverse_order(:name)).to_s.should == '<label>Artist: <select id="album_artist_id" name="album[artist_id]"><option value=""></option><option value="2">d</option><option selected="selected" value="1">a</option></select></label>'
181
+ @c.input(:artist, :dataset=>Artist.reverse_order(:name)).to_s.should == '<label>Artist: <select id="album_artist_id" name="album[artist_id]"><option value=""></option><option selected="selected" value="2">d</option><option value="1">a</option></select></label>'
182
+ end
183
+
184
+ specify "should support :dataset option being a callback proc returning modified dataset to search" do
185
+ @b.input(:artist, :dataset=>proc{|ds| ds.reverse_order(:name)}).to_s.should == '<label>Artist: <select id="album_artist_id" name="album[artist_id]"><option value=""></option><option value="2">d</option><option selected="selected" value="1">a</option></select></label>'
186
+ @c.input(:artist, :dataset=>proc{|ds| ds.reverse_order(:name)}).to_s.should == '<label>Artist: <select id="album_artist_id" name="album[artist_id]"><option value=""></option><option selected="selected" value="2">d</option><option value="1">a</option></select></label>'
187
+ end
188
+
174
189
  specify "should try a list of methods to get a suitable one for select box naming" do
175
190
  al = Class.new(Album){def self.name() 'Album' end}
176
191
  ar = Class.new(Artist)
@@ -209,6 +224,11 @@ describe "Forme Sequel::Model forms" do
209
224
  @c.input(:tags).to_s.should == '<label>Tags: <select id="album_tag_pks" multiple="multiple" name="album[tag_pks][]"><option value="1">s</option><option selected="selected" value="2">t</option><option value="3">u</option></select></label>'
210
225
  end
211
226
 
227
+ specify "should use a regular select box for *_to_many associations if multiple if false" do
228
+ @b.input(:tracks, :multiple=>false).to_s.should == '<label>Tracks: <select id="album_track_pks" name="album[track_pks][]"><option value="1">m</option><option value="2">n</option><option value="3">o</option></select></label>'
229
+ @c.input(:tags, :multiple=>false).to_s.should == '<label>Tags: <select id="album_tag_pks" name="album[tag_pks][]"><option value="1">s</option><option value="2">t</option><option value="3">u</option></select></label>'
230
+ end
231
+
212
232
  specify "should use multiple checkboxes for one_to_many associations if :as=>:checkbox" do
213
233
  @b.input(:tracks, :as=>:checkbox).to_s.should == '<span class="label">Tracks</span><label class="option"><input checked="checked" id="album_track_pks_1" name="album[track_pks][]" type="checkbox" value="1"/> m</label><label class="option"><input checked="checked" id="album_track_pks_2" name="album[track_pks][]" type="checkbox" value="2"/> n</label><label class="option"><input id="album_track_pks_3" name="album[track_pks][]" type="checkbox" value="3"/> o</label>'
214
234
  @c.input(:tracks, :as=>:checkbox).to_s.should == '<span class="label">Tracks</span><label class="option"><input id="album_track_pks_1" name="album[track_pks][]" type="checkbox" value="1"/> m</label><label class="option"><input id="album_track_pks_2" name="album[track_pks][]" type="checkbox" value="2"/> n</label><label class="option"><input checked="checked" id="album_track_pks_3" name="album[track_pks][]" type="checkbox" value="3"/> o</label>'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-30 00:00:00.000000000 Z
11
+ date: 2013-12-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  Forme is a forms library with the following goals:
@@ -30,15 +30,15 @@ files:
30
30
  - README.rdoc
31
31
  - Rakefile
32
32
  - spec/forme_spec.rb
33
- - spec/spec_helper.rb
33
+ - spec/rails_integration_spec.rb
34
+ - spec/sequel_helper.rb
34
35
  - spec/sequel_plugin_spec.rb
35
36
  - spec/sinatra_integration_spec.rb
36
- - spec/sequel_helper.rb
37
- - spec/rails_integration_spec.rb
37
+ - spec/spec_helper.rb
38
38
  - lib/forme.rb
39
- - lib/forme/version.rb
40
- - lib/forme/sinatra.rb
41
39
  - lib/forme/rails.rb
40
+ - lib/forme/sinatra.rb
41
+ - lib/forme/version.rb
42
42
  - lib/sequel/plugins/forme.rb
43
43
  homepage: http://gihub.com/jeremyevans/forme
44
44
  licenses: []