visionmedia-dm-forms 0.0.2 → 0.0.3
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.
- data/History.rdoc +4 -0
- data/Manifest +19 -16
- data/README.rdoc +4 -33
- data/Rakefile +6 -4
- data/Todo.rdoc +13 -15
- data/dm-forms.gemspec +7 -4
- data/examples/benchmarks.rb +26 -110
- data/examples/login.rb +20 -0
- data/lib/dm-forms.rb +5 -6
- data/lib/dm-forms/base.rb +115 -0
- data/lib/dm-forms/core_ext.rb +27 -22
- data/lib/dm-forms/helpers.rb +83 -0
- data/lib/dm-forms/mixins.rb +8 -0
- data/lib/dm-forms/mixins/descriptions.rb +18 -0
- data/lib/dm-forms/mixins/errors.rb +0 -0
- data/lib/dm-forms/mixins/labels.rb +16 -0
- data/lib/dm-forms/mixins/wrappers.rb +26 -0
- data/lib/dm-forms/tag.rb +67 -134
- data/lib/dm-forms/version.rb +1 -4
- data/spec/functional/helpers_spec.rb +186 -0
- data/spec/functional/mixins/descriptions_spec.rb +19 -0
- data/spec/functional/mixins/labels_spec.rb +19 -0
- data/spec/functional/mixins/wrappers_spec.rb +21 -0
- data/spec/functional/tag_spec.rb +33 -41
- data/spec/integration/datamapper_spec.rb +73 -45
- data/spec/spec_helper.rb +5 -7
- data/tasks/spec.rake +5 -0
- metadata +42 -22
- data/examples/datamapper.rb +0 -37
- data/examples/elements.rb +0 -31
- data/examples/haml.rb +0 -21
- data/examples/login.haml +0 -4
- data/lib/dm-forms/elements.rb +0 -210
- data/lib/dm-forms/model_elements.rb +0 -33
- data/spec/functional/core_ext_spec.rb +0 -56
- data/spec/functional/elements_spec.rb +0 -209
- data/spec/integration/haml_spec.rb +0 -29
@@ -1,33 +0,0 @@
|
|
1
|
-
|
2
|
-
module DataMapper
|
3
|
-
module Form
|
4
|
-
module ModelElements
|
5
|
-
|
6
|
-
include Elements
|
7
|
-
|
8
|
-
##
|
9
|
-
# Generates a form.
|
10
|
-
|
11
|
-
def form_for model, options = {}, &block
|
12
|
-
id = model.class.to_s.downcase
|
13
|
-
method = model.new_record? ? :post : :put
|
14
|
-
options = { :model => model, :method => method }.merge options
|
15
|
-
form id, options, &block
|
16
|
-
end
|
17
|
-
|
18
|
-
##
|
19
|
-
# Return markup for errors on +model+.
|
20
|
-
|
21
|
-
def errors_for model
|
22
|
-
if not model.all_valid?
|
23
|
-
s = %(<ul class="messages error">\n)
|
24
|
-
s << model.errors.collect { |error| "<li>#{error.first}</li>" }.join("\n")
|
25
|
-
s << "\n</ul>\n"
|
26
|
-
else
|
27
|
-
''
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
describe "core ext" do
|
4
|
-
|
5
|
-
#--
|
6
|
-
# Humanize
|
7
|
-
#++
|
8
|
-
|
9
|
-
describe "String#humanize" do
|
10
|
-
|
11
|
-
it "should humanize strings" do
|
12
|
-
'im_a_Lame_String.Yeah.with.7.words'.humanize.should == 'im a Lame String Yeah with 7 words'
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should humanize symbols" do
|
16
|
-
:some_Cool_symbol.humanize.should == 'some Cool symbol'
|
17
|
-
:login.humanize.should == 'login'
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should not mess with already human readable strings" do
|
21
|
-
'i am already VERY readable'.humanize.should == 'i am already VERY readable'
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
#--
|
27
|
-
# Indent
|
28
|
-
#++
|
29
|
-
|
30
|
-
describe "String#indent" do
|
31
|
-
|
32
|
-
it "should indent 2 spaces by default" do
|
33
|
-
'meow'.indent.should == ' meow'
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should indent variable tab lengths" do
|
37
|
-
'meow'.indent(2).should == ' meow'
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should indent multi-line strings" do
|
41
|
-
string = <<-EOF.deindent
|
42
|
-
foo
|
43
|
-
bar
|
44
|
-
EOF
|
45
|
-
string.indent.should == <<-EOF.deindent
|
46
|
-
foo
|
47
|
-
bar
|
48
|
-
EOF
|
49
|
-
string.indent(2).should == <<-EOF.deindent
|
50
|
-
foo
|
51
|
-
bar
|
52
|
-
EOF
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
end
|
@@ -1,209 +0,0 @@
|
|
1
|
-
|
2
|
-
include DataMapper::Form::Elements
|
3
|
-
|
4
|
-
describe DataMapper::Form::Elements do
|
5
|
-
|
6
|
-
#--
|
7
|
-
# Element aspecs
|
8
|
-
#++
|
9
|
-
|
10
|
-
describe "element aspecs" do
|
11
|
-
|
12
|
-
it "should allow descriptions" do
|
13
|
-
s = textarea :comments, :description => 'Please enter your comments.'
|
14
|
-
s.should == <<-HTML.deindent(8)
|
15
|
-
<textarea class="form-textarea form-comments" name="comments"></textarea>
|
16
|
-
<p class="description">Please enter your comments.</p>
|
17
|
-
HTML
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should allow prefixing of arbitrary markup" do
|
21
|
-
s = textarea :comments, :before => "<h1>Comments</h1>\n"
|
22
|
-
s.should == <<-HTML.deindent(8)
|
23
|
-
<h1>Comments</h1>
|
24
|
-
<textarea class="form-textarea form-comments" name="comments"></textarea>
|
25
|
-
HTML
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should allow arbitrary markup after" do
|
29
|
-
s = textarea :comments, :after => "\n<p>Custom markup</p>"
|
30
|
-
s.should == <<-HTML.deindent(8)
|
31
|
-
<textarea class="form-textarea form-comments" name="comments"></textarea>
|
32
|
-
<p>Custom markup</p>
|
33
|
-
HTML
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
#--
|
39
|
-
# Elements
|
40
|
-
#++
|
41
|
-
|
42
|
-
describe "elements" do
|
43
|
-
|
44
|
-
it "should create labels" do
|
45
|
-
s = label 'Email', :for => :email
|
46
|
-
s.should == %(<label for="email">Email:</label>\n)
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should create required labels" do
|
50
|
-
s = label 'Email', :for => :email, :required => true
|
51
|
-
s.should == %(<label for="email">Email:<em>*</em></label>\n)
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should create textfields" do
|
55
|
-
s = textfield :phone, :value => 'Enter phone number'
|
56
|
-
s.should == %(<input type="textfield" class="form-textfield form-phone" value="Enter phone number" name="phone" />\n)
|
57
|
-
end
|
58
|
-
|
59
|
-
it "should create submit buttons" do
|
60
|
-
s = submit :op, :value => 'Submit'
|
61
|
-
s.should == %(<input type="submit" class="form-submit form-op" value="Submit" name="op" />\n)
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should create buttons" do
|
65
|
-
s = button :op, :value => 'Edit'
|
66
|
-
s.should == %(<input type="button" class="form-button form-op" value="Edit" name="op" />\n)
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should create image buttons" do
|
70
|
-
s = button :op, :value => 'Edit', :src => 'path/to/image.png'
|
71
|
-
s.should == %(<input type="image" class="form-image form-op" value="Edit" name="op" src="path/to/image.png" />\n)
|
72
|
-
end
|
73
|
-
|
74
|
-
it "should create a checkbox" do
|
75
|
-
s = checkbox :agree_to_terms, :value => 'Agree to terms', :checked => true
|
76
|
-
s.should == %(<input type="checkbox" class="form-checkbox form-agree_to_terms" value="Agree to terms" name="agree_to_terms" checked="checked" />\n)
|
77
|
-
end
|
78
|
-
|
79
|
-
it "should create a file field" do
|
80
|
-
s = file :image
|
81
|
-
s.should == %(<input type="file" class="form-file form-image" name="image" />\n)
|
82
|
-
end
|
83
|
-
|
84
|
-
it "should create hidden fields" do
|
85
|
-
s = hidden :_method, :value => 'put'
|
86
|
-
s.should == %(<input type="hidden" value="put" name="_method" />\n)
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should create a radio button" do
|
90
|
-
s = radio :sex, :value => 'Male'
|
91
|
-
s.should == %(<input type="radio" class="form-radio form-sex" value="Male" name="sex" />\n)
|
92
|
-
end
|
93
|
-
|
94
|
-
it "should create textareas" do
|
95
|
-
s = textarea :comments, :value => 'Enter your comments here', :label => 'Comments'
|
96
|
-
s.should == <<-HTML.deindent(8)
|
97
|
-
<label for="comments">Comments:</label>
|
98
|
-
<textarea class="form-textarea form-comments" name="comments">Enter your comments here</textarea>
|
99
|
-
HTML
|
100
|
-
end
|
101
|
-
|
102
|
-
it "should create fieldsets" do
|
103
|
-
s = fieldset :details, :legend => 'Details', :value => 'WAHOO!'
|
104
|
-
s.should == <<-HTML.deindent(8)
|
105
|
-
<fieldset class="fieldset-details">
|
106
|
-
<legend>Details</legend>WAHOO!</fieldset>
|
107
|
-
HTML
|
108
|
-
end
|
109
|
-
|
110
|
-
it "should create fieldsets with element capturing block" do
|
111
|
-
s = fieldset :details, :id => 'details' do |f|
|
112
|
-
f.button :one
|
113
|
-
f.button :two
|
114
|
-
end
|
115
|
-
s.should == <<-HTML.deindent(8)
|
116
|
-
<fieldset class="fieldset-details" id="details">
|
117
|
-
<legend>Details</legend><input type="button" class="form-button form-one" name="one" />
|
118
|
-
<input type="button" class="form-button form-two" name="two" />
|
119
|
-
</fieldset>
|
120
|
-
HTML
|
121
|
-
end
|
122
|
-
|
123
|
-
it "should create fieldsets without legends, auto-generating them from the fieldset name" do
|
124
|
-
s = fieldset :some_legend, :value => 'WAHOO!'
|
125
|
-
s.should == <<-HTML.deindent(8)
|
126
|
-
<fieldset class="fieldset-some_legend">
|
127
|
-
<legend>Some legend</legend>WAHOO!</fieldset>
|
128
|
-
HTML
|
129
|
-
end
|
130
|
-
|
131
|
-
it "should create select fields" do
|
132
|
-
s = select :color, :options => { :red => 'Red', :green => 'Green', :blue => 'Blue' }
|
133
|
-
s.should == <<-HTML.deindent(8)
|
134
|
-
<select class="form-select form-color" name="color">
|
135
|
-
<option value="blue">Blue</option>
|
136
|
-
<option value="red">Red</option>
|
137
|
-
<option value="green">Green</option>
|
138
|
-
</select>
|
139
|
-
HTML
|
140
|
-
end
|
141
|
-
|
142
|
-
it "should create select fields with block" do
|
143
|
-
s = select :color do |s|
|
144
|
-
s.option :red, 'Red'
|
145
|
-
s.option :green, 'Green'
|
146
|
-
s.option :blue, 'Blue'
|
147
|
-
end
|
148
|
-
s.should == <<-HTML.deindent(8)
|
149
|
-
<select class="form-select form-color" name="color">
|
150
|
-
<option value="red">Red</option>
|
151
|
-
<option value="green">Green</option>
|
152
|
-
<option value="blue">Blue</option>
|
153
|
-
</select>
|
154
|
-
HTML
|
155
|
-
end
|
156
|
-
|
157
|
-
end
|
158
|
-
|
159
|
-
#--
|
160
|
-
# Form specifics
|
161
|
-
#++
|
162
|
-
|
163
|
-
describe "forms" do
|
164
|
-
|
165
|
-
it "should default method to post" do
|
166
|
-
s = form :register
|
167
|
-
s.should == %(<form method="post" id="form-register"></form>\n)
|
168
|
-
end
|
169
|
-
|
170
|
-
it "should allow custom methods" do
|
171
|
-
s = form :register, :method => :get
|
172
|
-
s.should == %(<form method="get" id="form-register"></form>\n)
|
173
|
-
end
|
174
|
-
|
175
|
-
it "should allow arbitrary inner html" do
|
176
|
-
s = form :register, :method => :get, :value => 'COOKIE!'
|
177
|
-
s.should == %(<form method="get" id="form-register">COOKIE!</form>\n)
|
178
|
-
end
|
179
|
-
|
180
|
-
it "should store arbitrary methods in _method" do
|
181
|
-
s = form :login, :method => :put do |f|
|
182
|
-
f.submit :op, :value => 'Submit'
|
183
|
-
end
|
184
|
-
s.should == <<-HTML.deindent(8)
|
185
|
-
<form method="post" id="form-login"><input type="hidden" value="put" name="_method" />
|
186
|
-
<input type="submit" class="form-submit form-op" value="Submit" name="op" />
|
187
|
-
</form>
|
188
|
-
HTML
|
189
|
-
end
|
190
|
-
|
191
|
-
it "should create with a block for inner html" do
|
192
|
-
s = form :login do |f|
|
193
|
-
f.textfield :name, :label => 'Username'
|
194
|
-
f.textfield :pass, :label => 'Password'
|
195
|
-
f.submit :op, :value => 'Login'
|
196
|
-
end
|
197
|
-
s.should == <<-HTML.deindent(8)
|
198
|
-
<form method="post" id="form-login"><label for="name">Username:</label>
|
199
|
-
<input type="textfield" class="form-textfield form-name" name="name" />
|
200
|
-
<label for="pass">Password:</label>
|
201
|
-
<input type="textfield" class="form-textfield form-pass" name="pass" />
|
202
|
-
<input type="submit" class="form-submit form-op" value="Login" name="op" />
|
203
|
-
</form>
|
204
|
-
HTML
|
205
|
-
end
|
206
|
-
|
207
|
-
end
|
208
|
-
|
209
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'rubygems'
|
3
|
-
require 'haml'
|
4
|
-
|
5
|
-
include DataMapper::Form::Elements
|
6
|
-
|
7
|
-
describe "Haml + dm-forms" do
|
8
|
-
|
9
|
-
it "should create pretty forms :D" do
|
10
|
-
engine = Haml::Engine.new <<-HAML.deindent
|
11
|
-
.comments
|
12
|
-
%h1 Comments
|
13
|
-
= textfield :name
|
14
|
-
= textfield :email
|
15
|
-
= textarea :comments
|
16
|
-
= submit :op, :value => 'Submit'
|
17
|
-
HAML
|
18
|
-
engine.render.should == <<-HTML.deindent
|
19
|
-
<div class='comments'>
|
20
|
-
<h1>Comments</h1>
|
21
|
-
<input type="textfield" class="form-textfield form-name" name="name" />
|
22
|
-
<input type="textfield" class="form-textfield form-email" name="email" />
|
23
|
-
<textarea class="form-textarea form-comments" name="comments"></textarea>
|
24
|
-
<input type="submit" class="form-submit form-op" value="Submit" name="op" />
|
25
|
-
</div>
|
26
|
-
HTML
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|