forme 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +8 -0
- data/README.rdoc +19 -18
- data/lib/forme.rb +28 -5
- data/lib/forme/erb.rb +4 -7
- data/lib/forme/version.rb +1 -1
- data/spec/erb_helper.rb +8 -0
- data/spec/forme_spec.rb +13 -1
- data/spec/rails_integration_spec.rb +8 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 315de851244fa7fd0ccb18fb0d57aa53204fff22
|
4
|
+
data.tar.gz: c880954089f9c59174abdf75eed937a2fddde4a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d598b9cb754eb1973685c6b830451a78b3fbf18e0477373a8021966d0f5b210756fdab2f1209ed5b83cf481f530f8e02995776a829555266233bc008842a163f
|
7
|
+
data.tar.gz: a321b164bc8a347573c12cdd1b4bd1e786c45e82c06de27d3219256b8523acdab4e80153dbd4bf7bc82cf6929714987d1002eb5ff27ab043d717ef0c37908814
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
=== 1.1.0 (2014-09-07)
|
2
|
+
|
3
|
+
* Make form without a block in the ERB integration still use hidden tags if method is post (jeremyevans)
|
4
|
+
|
5
|
+
* Add Forme::RawString class, Forme.raw, and Form#raw for creating raw strings, so you don't need to use extend(Forme::Raw) (jeremyevans)
|
6
|
+
|
7
|
+
* Allow using nil as explicit transformer value when creating a Form, to disable default transformer (jeremyevans)
|
8
|
+
|
1
9
|
=== 1.0.0 (2014-07-30)
|
2
10
|
|
3
11
|
* Add roda plugin for forme (jeremyevans)
|
data/README.rdoc
CHANGED
@@ -34,17 +34,17 @@ For example, these both compile by default to the same select tag:
|
|
34
34
|
The processing of high level <tt>Forme::Input</tt>s into raw html
|
35
35
|
data is broken down to the following steps (called transformers):
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
37
|
+
+Formatter+ :: converts a <tt>Forme::Input</tt> instance into a
|
38
|
+
<tt>Forme::Tag</tt> instance (or array of them).
|
39
|
+
+ErrorHandler+ :: If the <tt>Forme::Input</tt> instance has a error,
|
40
|
+
takes the formatted tag and marks it as having the error.
|
41
|
+
+Labeler+ :: If the <tt>Forme::Input</tt> instance has a label,
|
42
|
+
takes the formatted output and labels it.
|
43
|
+
+Wrapper+ :: Takes the output of the formatter, labeler, and
|
44
|
+
error_handler transformers, and wraps it in another tag (or just
|
45
|
+
returns it unmodified).
|
46
|
+
+Serializer+ :: converts a <tt>Forme::Tag</tt> instance into an
|
47
|
+
html string.
|
48
48
|
|
49
49
|
Technically, only the +Serializer+ is necessary. The +input+
|
50
50
|
and +tag+ methods return +Input+ and +Tag+ objects. These objects
|
@@ -245,7 +245,7 @@ and the second argument if given should be a hash of tag attributes. This allows
|
|
245
245
|
inputs inside tags:
|
246
246
|
|
247
247
|
Forme.form do |f|
|
248
|
-
f.tag(:span, :class
|
248
|
+
f.tag(:span, :class=>"foo") do
|
249
249
|
f.input(:text)
|
250
250
|
end
|
251
251
|
end
|
@@ -503,11 +503,12 @@ subform options:
|
|
503
503
|
an :inputs option or are using a block with additional inputs,
|
504
504
|
you should specify this option.
|
505
505
|
|
506
|
-
=
|
506
|
+
= ERB Support
|
507
507
|
|
508
|
-
Forme ships with a
|
509
|
-
<tt>
|
510
|
-
following API in your
|
508
|
+
Forme ships with a ERB extension that you can get by <tt>require "forme/erb"</tt> and using
|
509
|
+
<tt>including Forme::ERB::Helper</tt>. This is tested to support ERB templates in both the
|
510
|
+
Sinatra and Roda web frameworks. It allows you to use the following API in your erb
|
511
|
+
templates:
|
511
512
|
|
512
513
|
<% form(@obj, :action=>'/foo') do |f| %>
|
513
514
|
<%= f.input(:field) %>
|
@@ -516,8 +517,8 @@ following API in your Sinatra ERB forms:
|
|
516
517
|
<% end %>
|
517
518
|
<% end %>
|
518
519
|
|
519
|
-
|
520
|
-
|
520
|
+
In order to this to work transparently, the ERB outvar needs to be <tt>@_out_buf</tt>. If that
|
521
|
+
is not the case, use the :output option to +form+ to specify the outvar.
|
521
522
|
|
522
523
|
= Rails Support
|
523
524
|
|
data/lib/forme.rb
CHANGED
@@ -77,6 +77,12 @@ module Forme
|
|
77
77
|
classes.compact.join(' ')
|
78
78
|
end
|
79
79
|
|
80
|
+
# Create a RawString using the given string, which will disable automatic
|
81
|
+
# escaping for that string.
|
82
|
+
def self.raw(s)
|
83
|
+
RawString.new(s)
|
84
|
+
end
|
85
|
+
|
80
86
|
# If there is a related transformer, call it with the given +args+ and +block+.
|
81
87
|
# Otherwise, attempt to return the initial input without modifying it.
|
82
88
|
def self.transform(type, trans_name, default_opts, *args, &block)
|
@@ -217,7 +223,9 @@ module Forme
|
|
217
223
|
when Symbol
|
218
224
|
@opts[t] = Forme.transformer(t, @opts[t], @opts)
|
219
225
|
when nil
|
220
|
-
@opts
|
226
|
+
unless @opts.has_key?(t)
|
227
|
+
@opts[t] = Forme.transformer(t, config, @opts)
|
228
|
+
end
|
221
229
|
end
|
222
230
|
end
|
223
231
|
|
@@ -291,8 +299,8 @@ module Forme
|
|
291
299
|
# You can use array arguments if you want inputs to be created with specific
|
292
300
|
# options:
|
293
301
|
#
|
294
|
-
# inputs([:field1, :field2])
|
295
|
-
# inputs([[:field1, {:name=>'foo'}], :field2])
|
302
|
+
# f.inputs([:field1, :field2])
|
303
|
+
# f.inputs([[:field1, {:name=>'foo'}], :field2])
|
296
304
|
#
|
297
305
|
# The given +opts+ are passed to the +inputs_wrapper+, and the default
|
298
306
|
# +inputs_wrapper+ supports a <tt>:legend</tt> option that is used to
|
@@ -306,11 +314,15 @@ module Forme
|
|
306
314
|
#
|
307
315
|
# This can also be called with a single hash argument to just use an options hash:
|
308
316
|
#
|
309
|
-
# inputs(:legend=>'Foo')
|
317
|
+
# f.inputs(:legend=>'Foo') do
|
318
|
+
# # ...
|
319
|
+
# end
|
310
320
|
#
|
311
321
|
# or even without any arguments:
|
312
322
|
#
|
313
|
-
# inputs
|
323
|
+
# f.inputs do
|
324
|
+
# # ...
|
325
|
+
# end
|
314
326
|
def inputs(inputs=[], opts={}, &block)
|
315
327
|
_inputs(inputs, opts, &block)
|
316
328
|
end
|
@@ -413,6 +425,11 @@ module Forme
|
|
413
425
|
end
|
414
426
|
end
|
415
427
|
|
428
|
+
# Return a new string that will not be html escaped by the default serializer.
|
429
|
+
def raw(s)
|
430
|
+
Forme.raw(s)
|
431
|
+
end
|
432
|
+
|
416
433
|
# Marks the string as containing already escaped output. Returns string given
|
417
434
|
# by default, but subclasses for specific web frameworks can handle automatic
|
418
435
|
# html escaping by overriding this.
|
@@ -611,6 +628,12 @@ module Forme
|
|
611
628
|
module Raw
|
612
629
|
end
|
613
630
|
|
631
|
+
# A String subclass that includes Raw, which will cause the default
|
632
|
+
# serializer to no longer html escape the string.
|
633
|
+
class RawString < ::String
|
634
|
+
include Raw
|
635
|
+
end
|
636
|
+
|
614
637
|
# The default formatter used by the library. Any custom formatters should
|
615
638
|
# probably inherit from this formatter unless they have very special needs.
|
616
639
|
#
|
data/lib/forme/erb.rb
CHANGED
@@ -91,13 +91,10 @@ module Forme
|
|
91
91
|
# Create a +Form+ object tied to the current output buffer,
|
92
92
|
# using the standard ERB hidden tags.
|
93
93
|
def form(obj=nil, attr={}, opts={}, &block)
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
else
|
99
|
-
Form.form(obj, attr, opts)
|
100
|
-
end
|
94
|
+
h = {:hidden_tags=>Forme::ERB::HIDDEN_TAGS, :env=>env}
|
95
|
+
h[:output] = @_out_buf if block
|
96
|
+
(obj.is_a?(Hash) ? attr = attr.merge(h) : opts = opts.merge(h))
|
97
|
+
Form.form(obj, attr, opts, &block)
|
101
98
|
end
|
102
99
|
end
|
103
100
|
end
|
data/lib/forme/version.rb
CHANGED
data/spec/erb_helper.rb
CHANGED
@@ -119,6 +119,10 @@ END
|
|
119
119
|
erb "<%= form([:foo, :bar], {:action=>'/baz'}, :inputs=>[:first], :button=>'xyz', :legend=>'123') %>"
|
120
120
|
end
|
121
121
|
|
122
|
+
r.get 'noblock_post' do
|
123
|
+
erb "<%= form({:method=>:post}, :button=>'xyz') %>"
|
124
|
+
end
|
125
|
+
|
122
126
|
r.get 'noblock_empty' do
|
123
127
|
erb "<%= form(:action=>'/baz') %>"
|
124
128
|
end
|
@@ -171,6 +175,10 @@ shared_examples_for "erb integration" do
|
|
171
175
|
sin_get('/noblock').should == '<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>'
|
172
176
|
end
|
173
177
|
|
178
|
+
specify "#form should work without a block and still have hidden tags emitted" do
|
179
|
+
sin_get('/noblock_post').sub(%r{<input name=\"_csrf\" type=\"hidden\" value=\"([^\"]+)\"/>}, "<input name=\"_csrf\" type=\"hidden\" value=\"csrf\"/>").should == '<form method="post"><input name="_csrf" type="hidden" value="csrf"/><input type="submit" value="xyz"/></form>'
|
180
|
+
end
|
181
|
+
|
174
182
|
specify "#form with an empty form should work" do
|
175
183
|
sin_get('/noblock_empty').should == '<form action="/baz"></form>'
|
176
184
|
end
|
data/spec/forme_spec.rb
CHANGED
@@ -515,10 +515,18 @@ describe "Forme plain forms" do
|
|
515
515
|
@f.tag(:div, {}, ['<p></p>']).to_s.should == '<div><p></p></div>'
|
516
516
|
end
|
517
517
|
|
518
|
-
specify "should not escape raw tag content" do
|
518
|
+
specify "should not escape raw tag content using Forme::Raw" do
|
519
519
|
@f.tag(:div, {}, ['<p></p>'.extend(Forme::Raw)]).to_s.should == '<div><p></p></div>'
|
520
520
|
end
|
521
521
|
|
522
|
+
specify "should not escape raw tag content using Forme.raw" do
|
523
|
+
@f.tag(:div, {}, [Forme.raw('<p></p>')]).to_s.should == '<div><p></p></div>'
|
524
|
+
end
|
525
|
+
|
526
|
+
specify "should not escape raw tag content using Form#raw" do
|
527
|
+
@f.tag(:div, {}, [@f.raw('<p></p>')]).to_s.should == '<div><p></p></div>'
|
528
|
+
end
|
529
|
+
|
522
530
|
specify "should escape tag content in attribute values" do
|
523
531
|
@f.tag(:div, :foo=>'<p></p>').to_s.should == '<div foo="<p></p>"></div>'
|
524
532
|
end
|
@@ -671,6 +679,10 @@ describe "Forme custom" do
|
|
671
679
|
specify "inputs_wrappers can be specified as a proc" do
|
672
680
|
Forme::Form.new(:inputs_wrapper=>proc{|f, opts, &block| f.tag(:div, &block)}).inputs([:textarea]).to_s.should == '<div><textarea></textarea></div>'
|
673
681
|
end
|
682
|
+
|
683
|
+
specify "can use nil as value to disable default transformer" do
|
684
|
+
Forme::Form.new(:labeler=>nil).input(:textarea, :label=>'foo').to_s.should == '<textarea></textarea>'
|
685
|
+
end
|
674
686
|
end
|
675
687
|
|
676
688
|
describe "Forme built-in custom" do
|
@@ -172,6 +172,10 @@ END
|
|
172
172
|
render :inline => "<%= forme([:foo, :bar], {:action=>'/baz'}, :inputs=>[:first], :button=>'xyz', :legend=>'123') %>"
|
173
173
|
end
|
174
174
|
|
175
|
+
def noblock_post
|
176
|
+
render :inline => "<%= forme({:method=>'post'}, :button=>'xyz') %>"
|
177
|
+
end
|
178
|
+
|
175
179
|
def safe_buffer
|
176
180
|
render :inline => "<%= forme([:foo, :bar], {:action=>'/baz'}, :inputs=>[:first], :button=>'xyz', :legend=>'<b>foo</b>'.html_safe) %>"
|
177
181
|
end
|
@@ -233,6 +237,10 @@ describe "Forme Rails integration" do
|
|
233
237
|
sin_get('/noblock').should == '<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>'
|
234
238
|
end
|
235
239
|
|
240
|
+
specify "#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\"/>").should == '<form method="post"><input name="authenticity_token" type="hidden" value="csrf"/><input type="submit" value="xyz"/></form>'
|
242
|
+
end
|
243
|
+
|
236
244
|
specify "#form should handle Rails SafeBuffers" do
|
237
245
|
sin_get('/safe_buffer').should == '<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>'
|
238
246
|
end
|
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.1.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: 2014-
|
11
|
+
date: 2014-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
Forme is a forms library with the following goals:
|