forme 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +10 -0
- data/MIT-LICENSE +1 -1
- data/README.rdoc +45 -13
- data/Rakefile +8 -2
- data/lib/forme/bs3.rb +0 -4
- data/lib/forme/form.rb +3 -6
- data/lib/forme/input.rb +0 -6
- data/lib/forme/transformers/formatter.rb +11 -2
- data/lib/forme/transformers/inputs_wrapper.rb +6 -2
- data/lib/forme/transformers/wrapper.rb +0 -3
- data/lib/forme/version.rb +1 -1
- data/lib/sequel/plugins/forme.rb +9 -2
- data/spec/bs3_sequel_plugin_spec.rb +5 -5
- data/spec/bs3_spec.rb +21 -1
- data/spec/forme_spec.rb +28 -10
- data/spec/rails_integration_spec.rb +20 -9
- data/spec/sequel_helper.rb +4 -3
- data/spec/sequel_i18n_helper.rb +1 -1
- data/spec/sequel_plugin_spec.rb +54 -5
- data/spec/sequel_set_plugin_spec.rb +13 -13
- data/spec/spec_helper.rb +5 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 617e4bb020afdaf14cb5a13ec71c57bc0c33f173
|
4
|
+
data.tar.gz: 05ee61e281799560dd9c9eb84911a11bf9ca0c0c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90d0384542f59034b2428aeff330e0e9379b9c732877bbfa22d8be3be4cbeb89a24c635495ab638423ca2126dc7cea89ca07c74e4eea49193cd770fe521d67e5
|
7
|
+
data.tar.gz: 6aab3b04c4658e2c104f056104d5e2480580f51b1328e9540bc52b9c6ab0c9941b0bf7bfe5ddb9051b6d501e1bad7b8a6c5b115133caba05b689b28dbee1eb0c
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
=== 1.6.0 (2017-05-03)
|
2
|
+
|
3
|
+
* Use thead/tbody tags for table inputs_wrapper transformer and Sequel plugin subform :grid option (jeremyevans)
|
4
|
+
|
5
|
+
* Do not create a hidden input for checkboxes when using disabled/readonly formatters (jeremyevans)
|
6
|
+
|
7
|
+
* Add support for overriding forme_namespace on the Sequel::Model instance to change forme's namespacing (mwpastore, jeremyevans) (#17)
|
8
|
+
|
9
|
+
* Allow :label_attr for checkboxset and radioset to set attributes for individual labels in the set (jeremyevans)
|
10
|
+
|
1
11
|
=== 1.5.0 (2016-08-09)
|
2
12
|
|
3
13
|
* Add forme_set Sequel plugin, for handling the intake of submitted params based on form fields (jeremyevans)
|
data/MIT-LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -48,31 +48,50 @@ data is broken down to the following steps (called transformers):
|
|
48
48
|
+Serializer+ :: converts a <tt>Forme::Tag</tt> instance into an
|
49
49
|
html string.
|
50
50
|
|
51
|
-
Technically, only the +Serializer+ is necessary. The
|
52
|
-
and
|
51
|
+
Technically, only the +Serializer+ is necessary. The <tt>Forme::Form#input</tt>
|
52
|
+
and <tt>Forme::Form#tag</tt> methods return +Input+ and +Tag+ objects. These objects
|
53
53
|
both have +to_s+ defined to call the appropriate +Serializer+ with
|
54
54
|
themselves. The +Serializer+ calls the appropriate +Formatter+ if
|
55
55
|
it encounters an +Input+ instance, and attempts to serialize the
|
56
56
|
output of that (which is usually a +Tag+ instance). It is up to
|
57
|
-
the +Formatter+ to call the +Labeler
|
58
|
-
|
59
|
-
|
60
|
-
There is also an +InputsWrapper+ transformer, that is called by
|
61
|
-
<tt>Forme::Form#inputs</tt>. It's used to wrap up a group of
|
62
|
-
related options (in a fieldset by default).
|
57
|
+
the +Formatter+ to call the +Labeler+, +ErrorHandler+, +Helper+,
|
58
|
+
and/or +Wrapper+.
|
63
59
|
|
64
60
|
The <tt>Forme::Form</tt> object takes the 6 transformers as options (:formatter,
|
65
61
|
:labeler, :error_handler, :helper, :wrapper, :inputs_wrapper, and :serializer), all of which
|
66
62
|
should be objects responding to +call+ (so you can use +Proc+s) or be symbols
|
67
63
|
registered with the library using <tt>Forme.register_transformer</tt>:
|
68
64
|
|
69
|
-
Forme.register_transformer(:wrapper, :p)
|
65
|
+
Forme.register_transformer(:wrapper, :p) do |tag, input|
|
66
|
+
input.tag(:p, {}, tag)
|
67
|
+
end
|
68
|
+
|
69
|
+
Most transformers are called with two arguments, +tag+ and +input+. +tag+
|
70
|
+
is a <tt>Forme::Tag</tt> instance, and +input+ is a <tt>Forme::Input</tt>
|
71
|
+
instance. The +Formatter+ and +Serializer+ transformers are the two
|
72
|
+
exceptions, with +Formatter+ being called with just an +input+, and
|
73
|
+
+Serializer+ potentionally being called with any object. The +Serializer+
|
74
|
+
will in general recursively call itself with children of the argument
|
75
|
+
given.
|
76
|
+
|
77
|
+
There is also an +InputsWrapper+ transformer, that is called by
|
78
|
+
<tt>Forme::Form#inputs</tt>. It's used to wrap up a group of
|
79
|
+
related options (in a fieldset by default). It takes +form+
|
80
|
+
(<tt>Forme::Form</tt> instance) and +input_opts+ (+Hash+) arguments.
|
70
81
|
|
71
82
|
Most of the transformers can be overridden on a per instance basis by
|
72
|
-
passing the
|
83
|
+
passing the appropriate option to +input+ or +inputs+:
|
73
84
|
|
74
85
|
f.input(:name, :wrapper=>:p)
|
75
86
|
|
87
|
+
Existing transformers can be easily extended (ie, to set the class attribute),
|
88
|
+
by creating your own transformer and then calling the existing transformer.
|
89
|
+
|
90
|
+
Forme.register_transformer(:labeler, :explicit) do |tag, input|
|
91
|
+
input.opts[:label_attr] ||= { :class => 'label' }
|
92
|
+
Forme::Labeler::Explicit.new.call(tag, input)
|
93
|
+
end
|
94
|
+
|
76
95
|
= Installation
|
77
96
|
|
78
97
|
gem install forme
|
@@ -351,6 +370,17 @@ object in the enumerable, and includes the index in the namespace:
|
|
351
370
|
|
352
371
|
Forme ships with a Sequel plugin (use <tt>Sequel::Model.plugin :forme</tt> to enable), that makes
|
353
372
|
Sequel::Model instances support the +forme_config+ and +forme_input+ methods and return customized inputs.
|
373
|
+
An additional instance method, +forme_namespace+ can optionally be defined to customize how model classnames
|
374
|
+
are transformed into form classes and input IDs and names. This can be useful if your Sequel::Model classes
|
375
|
+
are nested under a parent namespace. It falls back to the behaviour of Sequel::Model#underscore.
|
376
|
+
|
377
|
+
module Admin
|
378
|
+
class Albums < Sequel::Model
|
379
|
+
def forme_namespace
|
380
|
+
self.class.name.underscore.tr('/', '_')
|
381
|
+
end
|
382
|
+
end
|
383
|
+
end
|
354
384
|
|
355
385
|
== Basics
|
356
386
|
|
@@ -494,6 +524,8 @@ subform options:
|
|
494
524
|
:inputs :: Automatically call +inputs+ with the given values. Using
|
495
525
|
this, it is not required to pass a block to the method,
|
496
526
|
though it will still work if you do.
|
527
|
+
:inputs_opts :: When using the :grid option, this allows you to specify options
|
528
|
+
to pass to the table InputsWrapper.
|
497
529
|
:legend :: Overrides the default :legend used (which is based on the
|
498
530
|
association name). You can also use a proc as the value,
|
499
531
|
which will called with each associated object (and the position
|
@@ -505,8 +537,8 @@ subform options:
|
|
505
537
|
be created via the :inputs option. If you are not providing
|
506
538
|
an :inputs option or are using a block with additional inputs,
|
507
539
|
you should specify this option.
|
508
|
-
:
|
509
|
-
|
540
|
+
:skip_primary_key :: Skip adding a hidden primary key field for existing
|
541
|
+
objects.
|
510
542
|
|
511
543
|
== Handling form submissions
|
512
544
|
|
@@ -603,7 +635,7 @@ storing Forme::Form objects and later using them on forms, it is fairly simple t
|
|
603
635
|
Forme::Forme object creation to a method, that you can call both in the initial display
|
604
636
|
and when processing the input:
|
605
637
|
|
606
|
-
def
|
638
|
+
def album_form(album)
|
607
639
|
Forme.form(album, :action=>'/foo') do |f|
|
608
640
|
f.input :name
|
609
641
|
f.input :copies_sold
|
data/Rakefile
CHANGED
@@ -55,9 +55,15 @@ end
|
|
55
55
|
task :default => :spec
|
56
56
|
|
57
57
|
desc "Run specs with coverage"
|
58
|
-
task :
|
58
|
+
task :spec_cov do
|
59
59
|
ENV['COVERAGE'] = '1'
|
60
|
-
|
60
|
+
sh "#{FileUtils::RUBY} spec/all.rb"
|
61
|
+
end
|
62
|
+
|
63
|
+
desc "Run specs with -w, some warnings filtered"
|
64
|
+
task :spec_w do
|
65
|
+
ENV['WARNING'] = '1'
|
66
|
+
sh "#{FileUtils::RUBY} -w spec/all.rb"
|
61
67
|
end
|
62
68
|
|
63
69
|
### Other
|
data/lib/forme/bs3.rb
CHANGED
data/lib/forme/form.rb
CHANGED
@@ -16,10 +16,6 @@ module Forme
|
|
16
16
|
# The hidden tags to automatically add to the form.
|
17
17
|
attr_reader :hidden_tags
|
18
18
|
|
19
|
-
# The namespaces if any for the receiver's inputs. This can be used to
|
20
|
-
# automatically setup namespaced class and id attributes.
|
21
|
-
attr_accessor :namespaces
|
22
|
-
|
23
19
|
# The +serializer+ determines how +Tag+ objects are transformed into strings.
|
24
20
|
# Must respond to +call+ or be a registered symbol.
|
25
21
|
attr_reader :serializer
|
@@ -238,7 +234,7 @@ module Forme
|
|
238
234
|
# Create a +Tag+ associated to the receiver with the given arguments and block,
|
239
235
|
# doing no other processing.
|
240
236
|
def _tag(*a, &block)
|
241
|
-
|
237
|
+
Tag.new(self, *a, &block)
|
242
238
|
end
|
243
239
|
|
244
240
|
# The object associated with this form, if any. If the +Form+ has an associated
|
@@ -248,7 +244,8 @@ module Forme
|
|
248
244
|
@opts[:obj]
|
249
245
|
end
|
250
246
|
|
251
|
-
# The
|
247
|
+
# The namespaces if any for the receiver's inputs. This can be used to
|
248
|
+
# automatically setup namespaced class and id attributes.
|
252
249
|
def namespaces
|
253
250
|
@opts[:namespace]
|
254
251
|
end
|
data/lib/forme/input.rb
CHANGED
@@ -24,12 +24,6 @@ module Forme
|
|
24
24
|
@form_opts = form.opts
|
25
25
|
end
|
26
26
|
|
27
|
-
# Replace the +opts+ by merging the given +hash+ into +opts+,
|
28
|
-
# without modifying +opts+.
|
29
|
-
def merge_opts(hash)
|
30
|
-
@opts = @opts.merge(hash)
|
31
|
-
end
|
32
|
-
|
33
27
|
# Create a new +Tag+ instance with the given arguments and block
|
34
28
|
# related to the receiver's +form+.
|
35
29
|
def tag(*a, &block)
|
@@ -234,7 +234,9 @@ module Forme
|
|
234
234
|
|
235
235
|
tags = process_select_optgroups(:_format_set_optgroup) do |label, value, sel, attrs|
|
236
236
|
value ||= label
|
237
|
-
|
237
|
+
label_attr = {:class=>:option}
|
238
|
+
label_attr.merge!(@opts[:label_attr]) if @opts[:label_attr]
|
239
|
+
r_opts = attrs.merge(tag_attrs).merge(:label=>label||value, :label_attr=>label_attr, :wrapper=>tag_wrapper)
|
238
240
|
r_opts[:value] ||= value if value
|
239
241
|
r_opts[:checked] ||= :checked if sel
|
240
242
|
r_opts[:formatter] = @opts[:formatter] if @opts[:formatter]
|
@@ -476,6 +478,12 @@ module Forme
|
|
476
478
|
|
477
479
|
private
|
478
480
|
|
481
|
+
# Disabled checkbox inputs, without a hidden input.
|
482
|
+
def format_checkbox
|
483
|
+
@opts[:no_hidden] = true unless @opts.has_key?(:no_hidden)
|
484
|
+
super
|
485
|
+
end
|
486
|
+
|
479
487
|
# Unless the :disabled option is specifically set
|
480
488
|
# to +false+, set the :disabled attribute on the
|
481
489
|
# resulting tag.
|
@@ -498,9 +506,10 @@ module Forme
|
|
498
506
|
|
499
507
|
private
|
500
508
|
|
501
|
-
# Disabled checkbox inputs.
|
509
|
+
# Disabled checkbox inputs, without a hidden input.
|
502
510
|
def format_checkbox
|
503
511
|
@attr[:disabled] = :disabled
|
512
|
+
@opts[:no_hidden] = true unless @opts.has_key?(:no_hidden)
|
504
513
|
super
|
505
514
|
end
|
506
515
|
|
@@ -87,10 +87,14 @@ module Forme
|
|
87
87
|
end
|
88
88
|
|
89
89
|
if (labels = opts[:labels]) && !labels.empty?
|
90
|
-
form.
|
90
|
+
form.tag(:thead) do
|
91
|
+
form.emit(form.tag(:tr, {}, labels.map{|l| form._tag(:th, {}, l)}))
|
92
|
+
end
|
91
93
|
end
|
92
94
|
|
93
|
-
|
95
|
+
form.tag(:tbody) do
|
96
|
+
yield
|
97
|
+
end
|
94
98
|
end
|
95
99
|
end
|
96
100
|
end
|
data/lib/forme/version.rb
CHANGED
data/lib/sequel/plugins/forme.rb
CHANGED
@@ -22,7 +22,7 @@ module Sequel # :nodoc:
|
|
22
22
|
# overridden with the :method attribute.
|
23
23
|
def form(attr={}, &block)
|
24
24
|
attr = {:method=>:post}.merge(attr)
|
25
|
-
attr[:class] = ::Forme.merge_classes(attr[:class], "forme", obj.
|
25
|
+
attr[:class] = ::Forme.merge_classes(attr[:class], "forme", obj.forme_namespace)
|
26
26
|
super(attr, &block)
|
27
27
|
end
|
28
28
|
|
@@ -44,6 +44,8 @@ module Sequel # :nodoc:
|
|
44
44
|
# :inputs :: Automatically call +inputs+ with the given values. Using
|
45
45
|
# this, it is not required to pass a block to the method,
|
46
46
|
# though it will still work if you do.
|
47
|
+
# :inputs_opts :: When using the :grid option, this allows you to specify options
|
48
|
+
# to pass to the table InputsWrapper.
|
47
49
|
# :legend :: Overrides the default :legend used (which is based on the
|
48
50
|
# association name). You can also use a proc as the value,
|
49
51
|
# which will called with each associated object (and the position
|
@@ -461,7 +463,7 @@ module Sequel # :nodoc:
|
|
461
463
|
# Configure the +form+ with support for <tt>Sequel::Model</tt>
|
462
464
|
# specific code, such as support for nested attributes.
|
463
465
|
def forme_config(form)
|
464
|
-
form.namespaces <<
|
466
|
+
form.namespaces << forme_namespace
|
465
467
|
end
|
466
468
|
|
467
469
|
# Return subclass of base form that includes the necessary Sequel form methods.
|
@@ -479,6 +481,11 @@ module Sequel # :nodoc:
|
|
479
481
|
def forme_input(form, field, opts)
|
480
482
|
SequelInput.new(self, form, field, opts).input
|
481
483
|
end
|
484
|
+
|
485
|
+
# Use the underscored model name as the default namespace.
|
486
|
+
def forme_namespace
|
487
|
+
model.send(:underscore, model.name)
|
488
|
+
end
|
482
489
|
end
|
483
490
|
end
|
484
491
|
end
|
@@ -424,23 +424,23 @@ describe "Forme Sequel::Model BS3 forms" do
|
|
424
424
|
end
|
425
425
|
|
426
426
|
it "should have #subform :grid option create a grid" do
|
427
|
-
Forme.form(@ab, {},{:config=>:bs3}){|f| f.subform(:artist, :inputs=>[:name], :grid=>true)}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Artist</caption><tr><th>Name</th></tr><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input class="form-control" id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></table></form>'
|
427
|
+
Forme.form(@ab, {},{:config=>:bs3}){|f| f.subform(:artist, :inputs=>[:name], :grid=>true)}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Artist</caption><thead><tr><th>Name</th></tr></thead><tbody><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input class="form-control" id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></tbody></table></form>'
|
428
428
|
end
|
429
429
|
|
430
430
|
it "should have #subform :grid option respect :inputs_opts option to pass options to inputs" do
|
431
|
-
Forme.form(@ab, {},{:config=>:bs3}){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :inputs_opts=>{:attr=>{:class=>'foo'}})}.to_s.must_equal '<form class="forme album" method="post"><table class="foo"><caption>Artist</caption><tr><th>Name</th></tr><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input class="form-control" id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></table></form>'
|
431
|
+
Forme.form(@ab, {},{:config=>:bs3}){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :inputs_opts=>{:attr=>{:class=>'foo'}})}.to_s.must_equal '<form class="forme album" method="post"><table class="foo"><caption>Artist</caption><thead><tr><th>Name</th></tr></thead><tbody><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input class="form-control" id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></tbody></table></form>'
|
432
432
|
end
|
433
433
|
|
434
434
|
it "should have #subform :grid option handle :legend and :labels options" do
|
435
|
-
Forme.form(@ab, {},{:config=>:bs3}){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :legend=>'Foo', :labels=>%w'Bar')}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Foo</caption><tr><th>Bar</th></tr><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input class="form-control" id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></table></form>'
|
435
|
+
Forme.form(@ab, {},{:config=>:bs3}){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :legend=>'Foo', :labels=>%w'Bar')}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Foo</caption><thead><tr><th>Bar</th></tr></thead><tbody><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input class="form-control" id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></tbody></table></form>'
|
436
436
|
end
|
437
437
|
|
438
438
|
it "should have #subform :grid option handle :legend and :labels nil values" do
|
439
|
-
Forme.form(@ab, {},{:config=>:bs3}){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :legend=>nil, :labels=>nil)}.to_s.must_equal '<form class="forme album" method="post"><table><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input class="form-control" id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></table></form>'
|
439
|
+
Forme.form(@ab, {},{:config=>:bs3}){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :legend=>nil, :labels=>nil)}.to_s.must_equal '<form class="forme album" method="post"><table><tbody><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input class="form-control" id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></tbody></table></form>'
|
440
440
|
end
|
441
441
|
|
442
442
|
it "should have #subform :grid option handle :skip_primary_key option" do
|
443
|
-
Forme.form(@ab, {},{:config=>:bs3}){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :skip_primary_key=>true)}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Artist</caption><tr><th>Name</th></tr><tr><td class="string"><input class="form-control" id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></table></form>'
|
443
|
+
Forme.form(@ab, {},{:config=>:bs3}){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :skip_primary_key=>true)}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Artist</caption><thead><tr><th>Name</th></tr></thead><tbody><tr><td class="string"><input class="form-control" id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></tbody></table></form>'
|
444
444
|
end
|
445
445
|
|
446
446
|
end
|
data/spec/bs3_spec.rb
CHANGED
@@ -217,6 +217,10 @@ describe "Forme Bootstrap3 (BS3) forms" do
|
|
217
217
|
@f.input(:checkbox, :name=>"foo", :hidden_value=>"no").to_s.must_equal '<div class="checkbox"><input name="foo" type="hidden" value="no"/><input name="foo" type="checkbox"/></div>'
|
218
218
|
end
|
219
219
|
|
220
|
+
it "should create hidden input" do
|
221
|
+
@f.input(:hidden).to_s.must_equal '<input type="hidden"/>'
|
222
|
+
end
|
223
|
+
|
220
224
|
it "should handle :checked option" do
|
221
225
|
@f.input(:checkbox, :checked=>true).to_s.must_equal '<div class="checkbox"><input checked="checked" type="checkbox"/></div>'
|
222
226
|
@f.input(:checkbox, :checked=>false).to_s.must_equal '<div class="checkbox"><input type="checkbox"/></div>'
|
@@ -375,6 +379,10 @@ describe "Forme Bootstrap3 (BS3) forms" do
|
|
375
379
|
@f.input(:radioset, :optgroups=>[['d', [[:a, 1], [:b, 2]]], ['e', [[:c, 3]]]], :selected=>2).to_s.must_equal '<div class="radioset"><fieldset><legend>d</legend><div class="radio"><label class="option"><input type="radio" value="1"/> a</label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="2"/> b</label></div></fieldset><fieldset><legend>e</legend><div class="radio"><label class="option"><input type="radio" value="3"/> c</label></div></fieldset></div>'
|
376
380
|
end
|
377
381
|
|
382
|
+
it "should create set of radio buttons with set label" do
|
383
|
+
@f.input(:radioset, :options=>[1, 2, 3], :selected=>2, :label=>'foo').to_s.must_equal '<div class="radioset"><label>foo</label><div class="radio"><label class="option"><input type="radio" value="1"/> 1</label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="2"/> 2</label></div><div class="radio"><label class="option"><input type="radio" value="3"/> 3</label></div></div>'
|
384
|
+
end
|
385
|
+
|
378
386
|
it "should create set of checkbox buttons" do
|
379
387
|
@f.input(:checkboxset, :options=>[1, 2, 3], :selected=>2).to_s.must_equal '<div class="checkboxset"><div class="checkbox"><label class="option"><input type="checkbox" value="1"/> 1</label></div><div class="checkbox"><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="3"/> 3</label></div></div>'
|
380
388
|
@f.input(:checkboxset, :options=>[1, 2, 3], :value=>2).to_s.must_equal '<div class="checkboxset"><div class="checkbox"><label class="option"><input type="checkbox" value="1"/> 1</label></div><div class="checkbox"><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="3"/> 3</label></div></div>'
|
@@ -500,6 +508,10 @@ describe "Forme Bootstrap3 (BS3) forms" do
|
|
500
508
|
@f.button.to_s.must_equal '<input class="btn btn-default" type="submit"/>'
|
501
509
|
end
|
502
510
|
|
511
|
+
it "#button should return a submit tag without label" do
|
512
|
+
@f.button(:label=>'foo').to_s.must_equal '<input class="btn btn-default" type="submit"/>'
|
513
|
+
end
|
514
|
+
|
503
515
|
it "#button should accept an options hash" do
|
504
516
|
@f.button(:name=>'foo', :value=>'bar').to_s.must_equal '<input class="btn btn-default" name="foo" type="submit" value="bar"/>'
|
505
517
|
end
|
@@ -588,7 +600,7 @@ describe "Forme Bootstrap3 (BS3) forms" do
|
|
588
600
|
it "should format dates, times, and datetimes in ISO format" do
|
589
601
|
@f.tag(:div, :foo=>Date.new(2011, 6, 5)).to_s.must_equal '<div foo="2011-06-05"></div>'
|
590
602
|
@f.tag(:div, :foo=>DateTime.new(2011, 6, 5, 4, 3, 2)).to_s.must_equal '<div foo="2011-06-05T04:03:02.000000"></div>'
|
591
|
-
@f.tag(:div, :foo=>Time.utc(2011, 6, 5, 4, 3, 2)).to_s.
|
603
|
+
@f.tag(:div, :foo=>Time.utc(2011, 6, 5, 4, 3, 2)).to_s.must_equal '<div foo="2011-06-05T04:03:02.000000"></div>'
|
592
604
|
end
|
593
605
|
|
594
606
|
it "should format bigdecimals in standard notation" do
|
@@ -621,6 +633,13 @@ describe "Forme Bootstrap3 (BS3) forms" do
|
|
621
633
|
@f.input(:text, :formatter=>:bs3_readonly, :value=>'1', :label=>'Foo').to_s.must_equal '<div class="form-group"><label>Foo</label> <input class="form-control" readonly="readonly" type="text" value="1"/></div>'
|
622
634
|
end
|
623
635
|
|
636
|
+
it "bs3_readonly formatter should disable checkbox, radio, select, and textarea inputs" do
|
637
|
+
@f.input(:checkbox, :formatter=>:bs3_readonly).to_s.must_equal '<div class="checkbox"><input disabled="disabled" type="checkbox"/></div>'
|
638
|
+
@f.input(:radio, :formatter=>:bs3_readonly).to_s.must_equal '<div class="radio"><input disabled="disabled" type="radio"/></div>'
|
639
|
+
@f.input(:select, :formatter=>:bs3_readonly).to_s.must_equal '<div class="form-group"><select class="form-control" disabled="disabled"></select></div>'
|
640
|
+
@f.input(:textarea, :formatter=>:bs3_readonly).to_s.must_equal '<div class="form-group"><textarea class="form-control" readonly="readonly"></textarea></div>'
|
641
|
+
end
|
642
|
+
|
624
643
|
it "inputs should accept a :labeler option to use a custom labeler" do
|
625
644
|
@f.input(:textarea, :labeler=>:explicit, :label=>'bar', :id=>:foo).to_s.must_equal '<div class="form-group"><label class="label-before" for="foo">bar</label><textarea class="form-control" id="foo"></textarea></div>'
|
626
645
|
end
|
@@ -648,6 +667,7 @@ describe "Forme Bootstrap3 (BS3) forms" do
|
|
648
667
|
it "#inputs should accept a :inputs_wrapper option to use a custom inputs_wrapper" do
|
649
668
|
@f.inputs([:textarea], :inputs_wrapper=>:ol).to_s.must_equal '<ol><div class="form-group"><textarea class="form-control"></textarea></div></ol>'
|
650
669
|
@f.inputs([:textarea], :inputs_wrapper=>:bs3_table, :wrapper=>:trtd).to_s.must_equal '<table class="table table-bordered"><tr><td><textarea class="form-control"></textarea></td><td></td></tr></table>'
|
670
|
+
@f.inputs([:textarea], :inputs_wrapper=>:bs3_table, :wrapper=>:trtd, :legend=>'Foo', :labels=>['bar']).to_s.must_equal '<table class="table table-bordered"><caption>Foo</caption><tr><th>bar</th></tr><tr><td><textarea class="form-control"></textarea></td><td></td></tr></table>'
|
651
671
|
end
|
652
672
|
|
653
673
|
it "inputs should accept a :wrapper=>nil option to not use a wrapper" do
|
data/spec/forme_spec.rb
CHANGED
@@ -10,7 +10,7 @@ describe "Forme plain forms" do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it "Forme.version should return version string" do
|
13
|
-
Forme.version.must_match
|
13
|
+
Forme.version.must_match(/\A\d+\.\d+\.\d+\z/)
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should create a simple input tags" do
|
@@ -216,6 +216,16 @@ describe "Forme plain forms" do
|
|
216
216
|
@f.input(:checkbox, :name=>"foo").to_s.must_equal '<input name="foo" type="hidden" value="0"/><input name="foo" type="checkbox"/>'
|
217
217
|
end
|
218
218
|
|
219
|
+
it "should not create hidden input with value 0 for readonly or disabled checkboxes" do
|
220
|
+
@f.input(:checkbox, :name=>"foo", :formatter=>:disabled).to_s.must_equal '<input disabled="disabled" name="foo" type="checkbox"/>'
|
221
|
+
@f.input(:checkbox, :name=>"foo", :formatter=>:readonly).to_s.must_equal '<input disabled="disabled" name="foo" type="checkbox"/>'
|
222
|
+
end
|
223
|
+
|
224
|
+
it "should create hidden input with value 0 for readonly or disabled checkboxes if no_hidden is explicitly given and not true" do
|
225
|
+
@f.input(:checkbox, :name=>"foo", :formatter=>:disabled, :no_hidden=>false).to_s.must_equal '<input name="foo" type="hidden" value="0"/><input disabled="disabled" name="foo" type="checkbox"/>'
|
226
|
+
@f.input(:checkbox, :name=>"foo", :formatter=>:readonly, :no_hidden=>false).to_s.must_equal '<input name="foo" type="hidden" value="0"/><input disabled="disabled" name="foo" type="checkbox"/>'
|
227
|
+
end
|
228
|
+
|
219
229
|
it "should not create hidden input with value 0 for each checkbox with a name if :no_hidden option is used" do
|
220
230
|
@f.input(:checkbox, :name=>"foo", :no_hidden=>true).to_s.must_equal '<input name="foo" type="checkbox"/>'
|
221
231
|
end
|
@@ -390,6 +400,10 @@ describe "Forme plain forms" do
|
|
390
400
|
@f.input(:radioset, :optgroups=>[['d', [[:a, 1], [:b, 2]]], ['e', [[:c, 3]]]], :selected=>2).to_s.must_equal '<fieldset><legend>d</legend><label class="option"><input type="radio" value="1"/> a</label><label class="option"><input checked="checked" type="radio" value="2"/> b</label></fieldset><fieldset><legend>e</legend><label class="option"><input type="radio" value="3"/> c</label></fieldset>'
|
391
401
|
end
|
392
402
|
|
403
|
+
it "should create set of radio buttons with label attributes" do
|
404
|
+
@f.input(:radioset, :options=>[1, 2, 3], :selected=>2, :label_attr=>{:foo=>:bar}).to_s.must_equal '<label class="option" foo="bar"><input type="radio" value="1"/> 1</label><label class="option" foo="bar"><input checked="checked" type="radio" value="2"/> 2</label><label class="option" foo="bar"><input type="radio" value="3"/> 3</label>'
|
405
|
+
end
|
406
|
+
|
393
407
|
it "should create set of checkbox buttons" do
|
394
408
|
@f.input(:checkboxset, :options=>[1, 2, 3], :selected=>2).to_s.must_equal '<label class="option"><input type="checkbox" value="1"/> 1</label><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label><label class="option"><input type="checkbox" value="3"/> 3</label>'
|
395
409
|
@f.input(:checkboxset, :options=>[1, 2, 3], :value=>2).to_s.must_equal '<label class="option"><input type="checkbox" value="1"/> 1</label><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label><label class="option"><input type="checkbox" value="3"/> 3</label>'
|
@@ -436,6 +450,10 @@ describe "Forme plain forms" do
|
|
436
450
|
@f.input(:checkboxset, :optgroups=>[['d', [[:a, 1], [:b, 2]]], ['e', [[:c, 3]]]], :selected=>2).to_s.must_equal '<fieldset><legend>d</legend><label class="option"><input type="checkbox" value="1"/> a</label><label class="option"><input checked="checked" type="checkbox" value="2"/> b</label></fieldset><fieldset><legend>e</legend><label class="option"><input type="checkbox" value="3"/> c</label></fieldset>'
|
437
451
|
end
|
438
452
|
|
453
|
+
it "should create set of checkbox buttons with label attributes" do
|
454
|
+
@f.input(:checkboxset, :options=>[1, 2, 3], :selected=>2, :label_attr=>{:foo=>:bar}).to_s.must_equal '<label class="option" foo="bar"><input type="checkbox" value="1"/> 1</label><label class="option" foo="bar"><input checked="checked" type="checkbox" value="2"/> 2</label><label class="option" foo="bar"><input type="checkbox" value="3"/> 3</label>'
|
455
|
+
end
|
456
|
+
|
439
457
|
it "should raise an Error for empty checkbox sets" do
|
440
458
|
@f.input(:checkboxset, :options=>[], :error=>'foo', :value=>2).to_s.must_equal '<span class="error_message">foo</span>'
|
441
459
|
end
|
@@ -606,7 +624,7 @@ describe "Forme plain forms" do
|
|
606
624
|
it "should format dates, times, and datetimes in ISO format" do
|
607
625
|
@f.tag(:div, :foo=>Date.new(2011, 6, 5)).to_s.must_equal '<div foo="2011-06-05"></div>'
|
608
626
|
@f.tag(:div, :foo=>DateTime.new(2011, 6, 5, 4, 3, 2)).to_s.must_equal '<div foo="2011-06-05T04:03:02.000000"></div>'
|
609
|
-
@f.tag(:div, :foo=>Time.utc(2011, 6, 5, 4, 3, 2)).to_s.
|
627
|
+
@f.tag(:div, :foo=>Time.utc(2011, 6, 5, 4, 3, 2)).to_s.must_equal '<div foo="2011-06-05T04:03:02.000000"></div>'
|
610
628
|
end
|
611
629
|
|
612
630
|
it "should format bigdecimals in standard notation" do
|
@@ -854,9 +872,9 @@ describe "Forme built-in custom" do
|
|
854
872
|
end
|
855
873
|
|
856
874
|
it "wrapper: table should use a trtd wrapper and table inputs_wrapper" do
|
857
|
-
Forme::Form.new(:wrapper=>:table).inputs([:textarea]).to_s.must_equal '<table><tr><td><textarea></textarea></td><td></td></tr></table>'
|
875
|
+
Forme::Form.new(:wrapper=>:table).inputs([:textarea]).to_s.must_equal '<table><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
858
876
|
f = Forme::Form.new
|
859
|
-
f.with_opts(:wrapper=>:table){f.inputs([:textarea])}.to_s.must_equal '<table><tr><td><textarea></textarea></td><td></td></tr></table>'
|
877
|
+
f.with_opts(:wrapper=>:table){f.inputs([:textarea])}.to_s.must_equal '<table><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
860
878
|
end
|
861
879
|
|
862
880
|
it "wrapper: ol should use an li wrapper and ol inputs_wrapper" do
|
@@ -902,24 +920,24 @@ describe "Forme built-in custom" do
|
|
902
920
|
end
|
903
921
|
|
904
922
|
it "inputs_wrapper: table wraps tags in an table" do
|
905
|
-
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea]).to_s.must_equal '<table><tr><td><textarea></textarea></td><td></td></tr></table>'
|
906
|
-
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea], :attr=>{:foo=>1}).to_s.must_equal '<table foo="1"><tr><td><textarea></textarea></td><td></td></tr></table>'
|
923
|
+
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea]).to_s.must_equal '<table><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
924
|
+
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea], :attr=>{:foo=>1}).to_s.must_equal '<table foo="1"><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
907
925
|
end
|
908
926
|
|
909
927
|
it "inputs_wrapper: table accepts a :legend option" do
|
910
|
-
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea], :legend=>'Inputs').to_s.must_equal '<table><caption>Inputs</caption><tr><td><textarea></textarea></td><td></td></tr></table>'
|
928
|
+
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea], :legend=>'Inputs').to_s.must_equal '<table><caption>Inputs</caption><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
911
929
|
end
|
912
930
|
|
913
931
|
it "inputs_wrapper: table accepts a :legend_attr option" do
|
914
|
-
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea], :legend=>'Inputs', :legend_attr=>{:class=>'foo'}).to_s.must_equal '<table><caption class="foo">Inputs</caption><tr><td><textarea></textarea></td><td></td></tr></table>'
|
932
|
+
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea], :legend=>'Inputs', :legend_attr=>{:class=>'foo'}).to_s.must_equal '<table><caption class="foo">Inputs</caption><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
915
933
|
end
|
916
934
|
|
917
935
|
it "inputs_wrapper: table accepts a :labels option" do
|
918
|
-
Forme::Form.new(:inputs_wrapper=>:table).inputs(:labels=>%w'A B C').to_s.must_equal '<table><tr><th>A</th><th>B</th><th>C</th></tr></table>'
|
936
|
+
Forme::Form.new(:inputs_wrapper=>:table).inputs(:labels=>%w'A B C').to_s.must_equal '<table><thead><tr><th>A</th><th>B</th><th>C</th></tr></thead><tbody></tbody></table>'
|
919
937
|
end
|
920
938
|
|
921
939
|
it "inputs_wrapper: table doesn't add empty header row for :labels=>[]" do
|
922
|
-
Forme::Form.new(:inputs_wrapper=>:table).inputs(:labels=>[]).to_s.must_equal '<table></table>'
|
940
|
+
Forme::Form.new(:inputs_wrapper=>:table).inputs(:labels=>[]).to_s.must_equal '<table><tbody></tbody></table>'
|
923
941
|
end
|
924
942
|
|
925
943
|
it "serializer: html_usa formats dates and datetimes in American format without timezones" do
|
@@ -7,14 +7,23 @@ require 'action_controller/railtie'
|
|
7
7
|
rescue LoadError
|
8
8
|
warn "unable to load rails, skipping rails spec"
|
9
9
|
else
|
10
|
+
begin
|
11
|
+
require 'active_pack/gem_version'
|
12
|
+
rescue LoadError
|
13
|
+
end
|
10
14
|
require 'forme/rails'
|
11
15
|
|
12
16
|
class FormeRails < Rails::Application
|
13
|
-
|
17
|
+
routes.append do
|
18
|
+
%w'index inputs_block inputs_block_wrapper nest nest_sep nest_inputs nest_seq hash legend combined noblock noblock_post safe_buffer'.each do |action|
|
19
|
+
get action, :controller=>'forme', :action=>action
|
20
|
+
end
|
21
|
+
end
|
14
22
|
config.active_support.deprecation = :stderr
|
15
23
|
config.middleware.delete(ActionDispatch::ShowExceptions)
|
16
|
-
config.middleware.delete(
|
17
|
-
config.secret_key_base = 'foo'
|
24
|
+
config.middleware.delete(Rack::Lock)
|
25
|
+
config.secret_key_base = 'foo'*15
|
26
|
+
config.secret_token = 'secret token'*15
|
18
27
|
config.eager_load = true
|
19
28
|
initialize!
|
20
29
|
end
|
@@ -217,8 +226,14 @@ describe "Forme Rails integration" do
|
|
217
226
|
sin_get('/nest_inputs').must_equal "0 <form action=\"/baz\"> 1 <p>FBB</p> 2 n1 <fieldset class=\"inputs\"> n2 <input id=\"first\" name=\"first\" type=\"text\" value=\"foo\"/> <input id=\"last\" name=\"last\" type=\"text\" value=\"bar\"/> n3 </fieldset> n4 <fieldset class=\"inputs\"><legend>Foo</legend><input id=\"first\" name=\"first\" type=\"text\" value=\"foo\"/><input id=\"last\" name=\"last\" type=\"text\" value=\"bar\"/></fieldset> n5 3 </form>4"
|
218
227
|
end
|
219
228
|
|
220
|
-
|
221
|
-
|
229
|
+
unless defined?(JRUBY_VERSION) && JRUBY_VERSION =~ /\A9\.0/ && defined?(ActionPack::VERSION::STRING) && ActionPack::VERSION::STRING >= '5.1'
|
230
|
+
it "#form should correctly handle situation Sequel integration with subforms where multiple templates are used with same form object" do
|
231
|
+
sin_get('/nest_seq').sub(%r{<input name=\"authenticity_token\" type=\"hidden\" value=\"([^\"]+)\"/>}, "<input name=\"authenticity_token\" type=\"hidden\" value=\"csrf\"/>").must_equal "0 <form action=\"/baz\" class=\"forme album\" method=\"post\"><input name=\"authenticity_token\" type=\"hidden\" value=\"csrf\"/> 1 <input id=\"album_artist_attributes_id\" name=\"album[artist_attributes][id]\" type=\"hidden\" value=\"2\"/><fieldset class=\"inputs\"><legend>Foo</legend><label>Name: <input id=\"album_artist_attributes_name\" name=\"album[artist_attributes][name]\" type=\"text\" value=\"A\"/></label></fieldset> 2 n1 <input id=\"album_artist_attributes_id\" name=\"album[artist_attributes][id]\" type=\"hidden\" value=\"2\"/><fieldset class=\"inputs\"><legend>Artist</legend> n2 <label>Name2: <input id=\"album_artist_attributes_name2\" name=\"album[artist_attributes][name2]\" type=\"text\" value=\"A2\"/></label> n3 </fieldset> n4 <input id=\"album_artist_attributes_id\" name=\"album[artist_attributes][id]\" type=\"hidden\" value=\"2\"/><fieldset class=\"inputs\"><legend>Bar</legend><label>Name3: <input id=\"album_artist_attributes_name3\" name=\"album[artist_attributes][name3]\" type=\"text\" value=\"A3\"/></label></fieldset> n5 3 </form>4"
|
232
|
+
end
|
233
|
+
|
234
|
+
it "#form should work without a block with hidden tags" do
|
235
|
+
sin_get('/noblock_post').sub(%r{<input name=\"authenticity_token\" type=\"hidden\" value=\"([^\"]+)\"/>}, "<input name=\"authenticity_token\" type=\"hidden\" value=\"csrf\"/>").must_equal '<form method="post"><input name="authenticity_token" type="hidden" value="csrf"/><input type="submit" value="xyz"/></form>'
|
236
|
+
end
|
222
237
|
end
|
223
238
|
|
224
239
|
it "#form should accept two hashes instead of requiring obj as first argument" do
|
@@ -237,10 +252,6 @@ describe "Forme Rails integration" do
|
|
237
252
|
sin_get('/noblock').must_equal '<form action="/baz"><fieldset class="inputs"><legend>123</legend><input id="first" name="first" type="text" value="foo"/></fieldset><input type="submit" value="xyz"/></form>'
|
238
253
|
end
|
239
254
|
|
240
|
-
it "#form should work without a block with hidden tags" do
|
241
|
-
sin_get('/noblock_post').sub(%r{<input name=\"authenticity_token\" type=\"hidden\" value=\"([^\"]+)\"/>}, "<input name=\"authenticity_token\" type=\"hidden\" value=\"csrf\"/>").must_equal '<form method="post"><input name="authenticity_token" type="hidden" value="csrf"/><input type="submit" value="xyz"/></form>'
|
242
|
-
end
|
243
|
-
|
244
255
|
it "#form should handle Rails SafeBuffers" do
|
245
256
|
sin_get('/safe_buffer').must_equal '<form action="/baz"><fieldset class="inputs"><legend><b>foo</b></legend><input id="first" name="first" type="text" value="foo"/></fieldset><input type="submit" value="xyz"/></form>'
|
246
257
|
end
|
data/spec/sequel_helper.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'sequel
|
2
|
+
require 'sequel'
|
3
3
|
|
4
4
|
db_url = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' ? 'jdbc:sqlite::memory:' : 'sqlite:/'
|
5
|
-
DB = Sequel.connect(db_url)
|
5
|
+
DB = Sequel.connect(db_url, :identifier_mangling=>false)
|
6
|
+
DB.extension(:freeze_datasets)
|
6
7
|
Sequel.default_timezone = :utc
|
7
8
|
DB.create_table(:artists) do
|
8
9
|
primary_key :id
|
@@ -46,7 +47,7 @@ c = DB[:albums].insert(:name=>'c', :artist_id=>d, :gold=>true, :platinum=>true)
|
|
46
47
|
DB[:tracks].insert(:name=>'o', :album_id=>c)
|
47
48
|
s = DB[:tags].insert(:name=>'s')
|
48
49
|
t = DB[:tags].insert(:name=>'t')
|
49
|
-
|
50
|
+
DB[:tags].insert(:name=>'u')
|
50
51
|
[[b, s], [b, t], [c, t]].each{|k, v| DB[:albums_tags].insert(k, v)}
|
51
52
|
|
52
53
|
Sequel::Model.plugin :forme
|
data/spec/sequel_i18n_helper.rb
CHANGED
@@ -21,7 +21,7 @@ DB.create_table(:clients) do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
a = DB[:firms].insert(:name=>'a')
|
24
|
-
|
24
|
+
DB[:invoices].insert(:name=>'b', :firm_id=>a, :summary=>'a brief summary')
|
25
25
|
DB[:clients].insert(:name=>'a great client', :firm_id=>a)
|
26
26
|
|
27
27
|
class Firm < Sequel::Model
|
data/spec/sequel_plugin_spec.rb
CHANGED
@@ -426,23 +426,23 @@ describe "Forme Sequel::Model forms" do
|
|
426
426
|
end
|
427
427
|
|
428
428
|
it "should have #subform :grid option create a grid" do
|
429
|
-
Forme.form(@ab){|f| f.subform(:artist, :inputs=>[:name], :grid=>true)}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Artist</caption><tr><th>Name</th></tr><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></table></form>'
|
429
|
+
Forme.form(@ab){|f| f.subform(:artist, :inputs=>[:name], :grid=>true)}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Artist</caption><thead><tr><th>Name</th></tr></thead><tbody><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></tbody></table></form>'
|
430
430
|
end
|
431
431
|
|
432
432
|
it "should have #subform :grid option respect :inputs_opts option to pass options to inputs" do
|
433
|
-
Forme.form(@ab){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :inputs_opts=>{:attr=>{:class=>'foo'}})}.to_s.must_equal '<form class="forme album" method="post"><table class="foo"><caption>Artist</caption><tr><th>Name</th></tr><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></table></form>'
|
433
|
+
Forme.form(@ab){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :inputs_opts=>{:attr=>{:class=>'foo'}})}.to_s.must_equal '<form class="forme album" method="post"><table class="foo"><caption>Artist</caption><thead><tr><th>Name</th></tr></thead><tbody><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></tbody></table></form>'
|
434
434
|
end
|
435
435
|
|
436
436
|
it "should have #subform :grid option handle :legend and :labels options" do
|
437
|
-
Forme.form(@ab){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :legend=>'Foo', :labels=>%w'Bar')}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Foo</caption><tr><th>Bar</th></tr><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></table></form>'
|
437
|
+
Forme.form(@ab){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :legend=>'Foo', :labels=>%w'Bar')}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Foo</caption><thead><tr><th>Bar</th></tr></thead><tbody><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></tbody></table></form>'
|
438
438
|
end
|
439
439
|
|
440
440
|
it "should have #subform :grid option handle :legend and :labels nil values" do
|
441
|
-
Forme.form(@ab){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :legend=>nil, :labels=>nil)}.to_s.must_equal '<form class="forme album" method="post"><table><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></table></form>'
|
441
|
+
Forme.form(@ab){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :legend=>nil, :labels=>nil)}.to_s.must_equal '<form class="forme album" method="post"><table><tbody><input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="1"/><tr><td class="string"><input id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></tbody></table></form>'
|
442
442
|
end
|
443
443
|
|
444
444
|
it "should have #subform :grid option handle :skip_primary_key option" do
|
445
|
-
Forme.form(@ab){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :skip_primary_key=>true)}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Artist</caption><tr><th>Name</th></tr><tr><td class="string"><input id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></table></form>'
|
445
|
+
Forme.form(@ab){|f| f.subform(:artist, :inputs=>[:name], :grid=>true, :skip_primary_key=>true)}.to_s.must_equal '<form class="forme album" method="post"><table><caption>Artist</caption><thead><tr><th>Name</th></tr></thead><tbody><tr><td class="string"><input id="album_artist_attributes_name" name="album[artist_attributes][name]" type="text" value="a"/></td></tr></tbody></table></form>'
|
446
446
|
end
|
447
447
|
|
448
448
|
end
|
@@ -525,3 +525,52 @@ describe "Forme Sequel::Model validation parsing" do
|
|
525
525
|
|
526
526
|
end
|
527
527
|
|
528
|
+
describe "Forme Sequel::Model default namespacing" do
|
529
|
+
before do
|
530
|
+
module Foo
|
531
|
+
class Album < ::Album
|
532
|
+
end
|
533
|
+
end
|
534
|
+
|
535
|
+
@ab = Foo::Album[1]
|
536
|
+
@b = Forme::Form.new(@ab)
|
537
|
+
end
|
538
|
+
after do
|
539
|
+
Object.send(:remove_const, :Foo)
|
540
|
+
end
|
541
|
+
|
542
|
+
it "namespaces the form class" do
|
543
|
+
@b.form.to_s.must_equal '<form class="forme foo/album" method="post"></form>'
|
544
|
+
end
|
545
|
+
|
546
|
+
it "namespaces the input id and name" do
|
547
|
+
@b.input(:name).to_s.must_equal '<label>Name: <input id="foo/album_name" name="foo/album[name]" type="text" value="b"/></label>'
|
548
|
+
end
|
549
|
+
end
|
550
|
+
|
551
|
+
describe "Forme Sequel::Model custom namespacing" do
|
552
|
+
before do
|
553
|
+
module Bar
|
554
|
+
class Album < ::Album
|
555
|
+
def forme_namespace
|
556
|
+
'bar_album'
|
557
|
+
end
|
558
|
+
end
|
559
|
+
end
|
560
|
+
|
561
|
+
@ab = Bar::Album[1]
|
562
|
+
@b = Forme::Form.new(@ab)
|
563
|
+
end
|
564
|
+
after do
|
565
|
+
Object.send(:remove_const, :Bar)
|
566
|
+
end
|
567
|
+
|
568
|
+
it "namespaces the form class" do
|
569
|
+
@b.form.to_s.must_equal '<form class="forme bar_album" method="post"></form>'
|
570
|
+
end
|
571
|
+
|
572
|
+
it "namespaces the form input and name" do
|
573
|
+
@b.input(:name).to_s.must_equal '<label>Name: <input id="bar_album_name" name="bar_album[name]" type="text" value="b"/></label>'
|
574
|
+
end
|
575
|
+
|
576
|
+
end
|
@@ -9,15 +9,15 @@ describe "Sequel forme_set plugin" do
|
|
9
9
|
|
10
10
|
it "#forme_set should only set values in the form" do
|
11
11
|
@ab.forme_set(:name=>'Foo')
|
12
|
-
@ab.name.
|
12
|
+
@ab.name.must_be_nil
|
13
13
|
|
14
14
|
@f.input(:name)
|
15
15
|
@ab.forme_set(:name=>'Foo')
|
16
16
|
@ab.name.must_equal 'Foo'
|
17
17
|
|
18
18
|
@ab.forme_set('copies_sold'=>'1')
|
19
|
-
@ab.name.
|
20
|
-
@ab.copies_sold.
|
19
|
+
@ab.name.must_be_nil
|
20
|
+
@ab.copies_sold.must_be_nil
|
21
21
|
|
22
22
|
@f.input(:copies_sold)
|
23
23
|
@ab.forme_set('name'=>'Bar', 'copies_sold'=>'1')
|
@@ -30,7 +30,7 @@ describe "Sequel forme_set plugin" do
|
|
30
30
|
@f.input(:name, opts)
|
31
31
|
|
32
32
|
@ab.forme_set(:name=>'Foo')
|
33
|
-
@ab.name.
|
33
|
+
@ab.name.must_be_nil
|
34
34
|
|
35
35
|
@ab.forme_set('foo'=>'Foo')
|
36
36
|
@ab.name.must_equal 'Foo'
|
@@ -41,19 +41,19 @@ describe "Sequel forme_set plugin" do
|
|
41
41
|
it "#forme_set should ignore values where key is explicitly set to nil" do
|
42
42
|
@f.input(:name, :key=>nil)
|
43
43
|
@ab.forme_set(:name=>'Foo')
|
44
|
-
@ab.name.
|
44
|
+
@ab.name.must_be_nil
|
45
45
|
@ab.forme_set(nil=>'Foo')
|
46
|
-
@ab.name.
|
46
|
+
@ab.name.must_be_nil
|
47
47
|
end
|
48
48
|
|
49
49
|
it "#forme_set should skip inputs with disabled/readonly formatter" do
|
50
50
|
@f.input(:name, :formatter=>:disabled)
|
51
51
|
@ab.forme_set(:name=>'Foo')
|
52
|
-
@ab.name.
|
52
|
+
@ab.name.must_be_nil
|
53
53
|
|
54
54
|
@f.input(:name, :formatter=>:readonly)
|
55
55
|
@ab.forme_set(:name=>'Foo')
|
56
|
-
@ab.name.
|
56
|
+
@ab.name.must_be_nil
|
57
57
|
|
58
58
|
@f.input(:name, :formatter=>:default)
|
59
59
|
@ab.forme_set(:name=>'Foo')
|
@@ -64,12 +64,12 @@ describe "Sequel forme_set plugin" do
|
|
64
64
|
@f = Forme::Form.new(@ab, :formatter=>:disabled)
|
65
65
|
@f.input(:name)
|
66
66
|
@ab.forme_set(:name=>'Foo')
|
67
|
-
@ab.name.
|
67
|
+
@ab.name.must_be_nil
|
68
68
|
|
69
69
|
@f = Forme::Form.new(@ab, :formatter=>:readonly)
|
70
70
|
@f.input(:name)
|
71
71
|
@ab.forme_set(:name=>'Foo')
|
72
|
-
@ab.name.
|
72
|
+
@ab.name.must_be_nil
|
73
73
|
|
74
74
|
@f.input(:name, :formatter=>:default)
|
75
75
|
@ab.forme_set(:name=>'Foo')
|
@@ -78,14 +78,14 @@ describe "Sequel forme_set plugin" do
|
|
78
78
|
|
79
79
|
it "#forme_set should handle setting values for associated objects" do
|
80
80
|
@ab.forme_set(:artist_id=>1)
|
81
|
-
@ab.artist_id.
|
81
|
+
@ab.artist_id.must_be_nil
|
82
82
|
|
83
83
|
@f.input(:artist)
|
84
84
|
@ab.forme_set(:artist_id=>'1')
|
85
85
|
@ab.artist_id.must_equal 1
|
86
86
|
|
87
87
|
@ab.forme_set('tag_pks'=>%w'1 2')
|
88
|
-
@ab.artist_id.
|
88
|
+
@ab.artist_id.must_be_nil
|
89
89
|
@ab.tag_pks.must_equal []
|
90
90
|
|
91
91
|
@f.input(:tags)
|
@@ -120,7 +120,7 @@ describe "Sequel forme_set plugin" do
|
|
120
120
|
@ab.forme_set('artist_id'=>'1', 'tag_pks'=>['2'])
|
121
121
|
@ab.valid?.must_equal false
|
122
122
|
@ab.errors[:artist_id].must_equal ['invalid value submitted']
|
123
|
-
@ab.errors[:tag_pks].
|
123
|
+
@ab.errors[:tag_pks].must_be_nil
|
124
124
|
|
125
125
|
@ab.forme_validations.clear
|
126
126
|
@ab.forme_set('artist_id'=>'2', 'tag_pks'=>['2'])
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
$:.unshift(File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'lib'))
|
2
2
|
|
3
|
+
if ENV['WARNING']
|
4
|
+
require 'warning'
|
5
|
+
Warning.ignore(:missing_ivar)
|
6
|
+
end
|
7
|
+
|
3
8
|
if ENV['COVERAGE']
|
4
9
|
require File.join(File.dirname(File.expand_path(__FILE__)), "forme_coverage")
|
5
10
|
SimpleCov.forme_coverage
|
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: 1.
|
4
|
+
version: 1.6.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:
|
11
|
+
date: 2017-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -219,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
219
219
|
version: '0'
|
220
220
|
requirements: []
|
221
221
|
rubyforge_project:
|
222
|
-
rubygems_version: 2.
|
222
|
+
rubygems_version: 2.6.11
|
223
223
|
signing_key:
|
224
224
|
specification_version: 4
|
225
225
|
summary: HTML forms library
|