forme 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|