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
data/spec/spec_helper.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
|
2
|
+
require 'rubygems'
|
2
3
|
require 'dm-forms'
|
3
4
|
require 'rspec_hpricot_matchers'
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
gsub /^ {0,#{spaces}}/, ''
|
9
|
-
end
|
10
|
-
end
|
5
|
+
|
6
|
+
Spec::Runner.configure do |config|
|
7
|
+
config.include RspecHpricotMatchers
|
8
|
+
end
|
data/tasks/spec.rake
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: visionmedia-dm-forms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TJ Holowaychuk
|
@@ -9,11 +9,22 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-03-23 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: dm-core
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: visionmedia-rext
|
27
|
+
type: :runtime
|
17
28
|
version_requirement:
|
18
29
|
version_requirements: !ruby/object:Gem::Requirement
|
19
30
|
requirements:
|
@@ -23,6 +34,7 @@ dependencies:
|
|
23
34
|
version:
|
24
35
|
- !ruby/object:Gem::Dependency
|
25
36
|
name: rspec_hpricot_matchers
|
37
|
+
type: :development
|
26
38
|
version_requirement:
|
27
39
|
version_requirements: !ruby/object:Gem::Requirement
|
28
40
|
requirements:
|
@@ -37,45 +49,53 @@ executables: []
|
|
37
49
|
extensions: []
|
38
50
|
|
39
51
|
extra_rdoc_files:
|
40
|
-
-
|
41
|
-
- lib/dm-forms.rb
|
52
|
+
- lib/dm-forms/base.rb
|
42
53
|
- lib/dm-forms/core_ext.rb
|
43
|
-
- lib/dm-forms/
|
44
|
-
- lib/dm-forms/
|
54
|
+
- lib/dm-forms/helpers.rb
|
55
|
+
- lib/dm-forms/mixins/descriptions.rb
|
56
|
+
- lib/dm-forms/mixins/errors.rb
|
57
|
+
- lib/dm-forms/mixins/labels.rb
|
58
|
+
- lib/dm-forms/mixins/wrappers.rb
|
59
|
+
- lib/dm-forms/mixins.rb
|
45
60
|
- lib/dm-forms/tag.rb
|
46
61
|
- lib/dm-forms/version.rb
|
62
|
+
- lib/dm-forms.rb
|
63
|
+
- README.rdoc
|
47
64
|
- tasks/benchmarks.rake
|
48
65
|
- tasks/docs.rake
|
49
66
|
- tasks/gemspec.rake
|
50
67
|
- tasks/spec.rake
|
51
68
|
files:
|
52
|
-
-
|
53
|
-
- Manifest
|
54
|
-
- README.rdoc
|
55
|
-
- Rakefile
|
56
|
-
- Todo.rdoc
|
69
|
+
- dm-forms.gemspec
|
57
70
|
- examples/benchmarks.rb
|
58
|
-
- examples/
|
59
|
-
-
|
60
|
-
-
|
61
|
-
- examples/login.haml
|
62
|
-
- lib/dm-forms.rb
|
71
|
+
- examples/login.rb
|
72
|
+
- History.rdoc
|
73
|
+
- lib/dm-forms/base.rb
|
63
74
|
- lib/dm-forms/core_ext.rb
|
64
|
-
- lib/dm-forms/
|
65
|
-
- lib/dm-forms/
|
75
|
+
- lib/dm-forms/helpers.rb
|
76
|
+
- lib/dm-forms/mixins/descriptions.rb
|
77
|
+
- lib/dm-forms/mixins/errors.rb
|
78
|
+
- lib/dm-forms/mixins/labels.rb
|
79
|
+
- lib/dm-forms/mixins/wrappers.rb
|
80
|
+
- lib/dm-forms/mixins.rb
|
66
81
|
- lib/dm-forms/tag.rb
|
67
82
|
- lib/dm-forms/version.rb
|
68
|
-
-
|
69
|
-
-
|
83
|
+
- lib/dm-forms.rb
|
84
|
+
- Manifest
|
85
|
+
- Rakefile
|
86
|
+
- README.rdoc
|
87
|
+
- spec/functional/helpers_spec.rb
|
88
|
+
- spec/functional/mixins/descriptions_spec.rb
|
89
|
+
- spec/functional/mixins/labels_spec.rb
|
90
|
+
- spec/functional/mixins/wrappers_spec.rb
|
70
91
|
- spec/functional/tag_spec.rb
|
71
92
|
- spec/integration/datamapper_spec.rb
|
72
|
-
- spec/integration/haml_spec.rb
|
73
93
|
- spec/spec_helper.rb
|
74
94
|
- tasks/benchmarks.rake
|
75
95
|
- tasks/docs.rake
|
76
96
|
- tasks/gemspec.rake
|
77
97
|
- tasks/spec.rake
|
78
|
-
-
|
98
|
+
- Todo.rdoc
|
79
99
|
has_rdoc: true
|
80
100
|
homepage: http://github.com/visionmedia/dm-forms
|
81
101
|
post_install_message:
|
data/examples/datamapper.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
|
2
|
-
$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
|
-
require 'dm-forms'
|
4
|
-
require 'dm-core'
|
5
|
-
require 'dm-validations'
|
6
|
-
|
7
|
-
include DataMapper::Form::ModelElements
|
8
|
-
DataMapper.setup :default, 'sqlite3::memory:'
|
9
|
-
|
10
|
-
class User
|
11
|
-
include DataMapper::Resource
|
12
|
-
property :id, Serial
|
13
|
-
property :name, String, :format => /^[\w]+$/
|
14
|
-
property :email, String, :format => :email_address
|
15
|
-
end
|
16
|
-
|
17
|
-
DataMapper.auto_migrate!
|
18
|
-
user = User.new :name => 'tj', :email => 'invalid email@lame.com'
|
19
|
-
|
20
|
-
s = errors_for(user)
|
21
|
-
s << form_for(user, :action => '/user') do |f|
|
22
|
-
f.textarea :name
|
23
|
-
f.textarea :email
|
24
|
-
f.submit :op, :value => 'Add'
|
25
|
-
end
|
26
|
-
puts s
|
27
|
-
|
28
|
-
user.email = 'tj@vision-media.ca'
|
29
|
-
user.save
|
30
|
-
|
31
|
-
s = errors_for(user)
|
32
|
-
s << form_for(user, :action => '/user') do |f|
|
33
|
-
f.textarea :name, :label => 'Name'
|
34
|
-
f.textarea :email, :label => 'Email'
|
35
|
-
f.submit :op, :value => 'Update'
|
36
|
-
end
|
37
|
-
puts s
|
data/examples/elements.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
|
2
|
-
$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
|
-
require 'dm-forms'
|
4
|
-
|
5
|
-
include DataMapper::Form::Elements
|
6
|
-
|
7
|
-
def example before, &block
|
8
|
-
puts before << "\n\n"
|
9
|
-
puts yield.gsub!(/^/, ' ')
|
10
|
-
puts
|
11
|
-
end
|
12
|
-
|
13
|
-
example %(textarea :comments) do
|
14
|
-
textarea :comments
|
15
|
-
end
|
16
|
-
|
17
|
-
example %(textarea :comments, :label => 'Comments', :description => 'Tell us what you think') do
|
18
|
-
textarea :comments, :label => 'Comments', :description => 'Tell us what you think'
|
19
|
-
end
|
20
|
-
|
21
|
-
example %(textfield :email, :label => 'Email', :required => true) do
|
22
|
-
textfield :email, :label => 'Email', :required => true
|
23
|
-
end
|
24
|
-
|
25
|
-
example 'Login' do
|
26
|
-
form :login do |f|
|
27
|
-
f.textfield :name, :label => 'Username'
|
28
|
-
f.textfield :pass, :label => 'Password'
|
29
|
-
f.submit :op, :value => 'Login'
|
30
|
-
end
|
31
|
-
end
|
data/examples/haml.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
|
2
|
-
$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
|
-
require 'rubygems'
|
4
|
-
require 'haml'
|
5
|
-
require 'dm-forms'
|
6
|
-
|
7
|
-
include DataMapper::Form::ModelElements
|
8
|
-
|
9
|
-
# Haml does not play very nice with nested Ruby, but then again
|
10
|
-
# there is relatively nothing that cannot be altered via styling
|
11
|
-
# so placing forms directly within a Haml view is not entirely
|
12
|
-
# necessary.
|
13
|
-
def login_form
|
14
|
-
form :login, :action => '/user' do |f|
|
15
|
-
f.textarea :name, :label => 'Name'
|
16
|
-
f.textarea :email, :label => 'Email'
|
17
|
-
f.submit :op, :value => 'Login'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
puts Haml::Engine.new(File.read(File.dirname(__FILE__) + '/login.haml')).render
|
data/examples/login.haml
DELETED
data/lib/dm-forms/elements.rb
DELETED
@@ -1,210 +0,0 @@
|
|
1
|
-
|
2
|
-
module DataMapper
|
3
|
-
module Form
|
4
|
-
module Elements
|
5
|
-
|
6
|
-
##
|
7
|
-
# Proxy object for capturing elements. See Elements#capture_elements.
|
8
|
-
|
9
|
-
class Proxy
|
10
|
-
def initialize model = nil
|
11
|
-
@model = model
|
12
|
-
end
|
13
|
-
|
14
|
-
def method_missing meth, *args, &block
|
15
|
-
add_error_class_to args if has_a_model_with_errors_on? args.first
|
16
|
-
(@elements ||= []) << Elements.send(meth, *args, &block)
|
17
|
-
end
|
18
|
-
|
19
|
-
def add_error_class_to args
|
20
|
-
((args[1] ||= {})[:class] ||= '') << ' error'
|
21
|
-
end
|
22
|
-
|
23
|
-
def has_a_model_with_errors_on? meth
|
24
|
-
@model and !@model.valid? and @model.errors.on meth
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
module_function
|
29
|
-
|
30
|
-
##
|
31
|
-
# Generates a generic HTML +name+ tag. Although this method is
|
32
|
-
# generally used internally by dm-forms, you may utilize it directly
|
33
|
-
# passing any of the following +options+.
|
34
|
-
#
|
35
|
-
# === Options:
|
36
|
-
#
|
37
|
-
# :self_closing Wither or not the element should self-close (<br />)
|
38
|
-
# :attributes Hash of attributes such as :type => :textfield
|
39
|
-
#
|
40
|
-
|
41
|
-
def tag name, options = {}, &block
|
42
|
-
Tag.new(name, options, &block).render
|
43
|
-
end
|
44
|
-
|
45
|
-
##
|
46
|
-
# Generates a label.
|
47
|
-
|
48
|
-
def label value, options = {}
|
49
|
-
value << ':'
|
50
|
-
value << '<em>*</em>' if options.delete :required
|
51
|
-
%(<label for="#{options[:for]}">#{value}</label>\n)
|
52
|
-
end
|
53
|
-
|
54
|
-
##
|
55
|
-
# Generates a legend.
|
56
|
-
|
57
|
-
def legend value
|
58
|
-
%(<legend>#{value}</legend>)
|
59
|
-
end
|
60
|
-
|
61
|
-
##
|
62
|
-
# Generates a description.
|
63
|
-
|
64
|
-
def desc text
|
65
|
-
%(\n<p class="description">#{text}</p>) unless text.blank?
|
66
|
-
end
|
67
|
-
|
68
|
-
##
|
69
|
-
# Generates an option.
|
70
|
-
|
71
|
-
def option value, title
|
72
|
-
%(<option value="#{value}">#{title}</option>\n)
|
73
|
-
end
|
74
|
-
|
75
|
-
##
|
76
|
-
# Generates a form.
|
77
|
-
|
78
|
-
def form name, options = {}, &block
|
79
|
-
options = { :method => :post, :id => "form-#{name}" }.merge options
|
80
|
-
unless valid_http_verb? options
|
81
|
-
old_value = options[:value] || ''
|
82
|
-
options[:value] = hidden_method(options[:method]) << old_value
|
83
|
-
options[:method] = :post
|
84
|
-
end
|
85
|
-
tag :form, :attributes => options, &block
|
86
|
-
end
|
87
|
-
|
88
|
-
##
|
89
|
-
# Generates a fieldset.
|
90
|
-
|
91
|
-
def fieldset name, options = {}, &block
|
92
|
-
legend_value = options.has_key?(:legend) ? options.delete(:legend) : name.humanize.capitalize
|
93
|
-
options = { :class => "fieldset-#{name}" }.merge options
|
94
|
-
options[:value] = "\n" << legend(legend_value) << (options.delete(:value) || '')
|
95
|
-
tag :fieldset, :attributes => options, &block
|
96
|
-
end
|
97
|
-
|
98
|
-
##
|
99
|
-
# Generates a textfield.
|
100
|
-
|
101
|
-
def textfield name, options = {}
|
102
|
-
options = { :type => :textfield, :name => name }.merge options
|
103
|
-
tag :input, :self_closing => true, :attributes => options
|
104
|
-
end
|
105
|
-
|
106
|
-
##
|
107
|
-
# Generates a password field.
|
108
|
-
|
109
|
-
def password name, options = {}
|
110
|
-
options = { :type => :password, :name => name }.merge options
|
111
|
-
tag :input, :self_closing => true, :attributes => options
|
112
|
-
end
|
113
|
-
|
114
|
-
##
|
115
|
-
# Generates a checkbox.
|
116
|
-
|
117
|
-
def checkbox name, options = {}
|
118
|
-
options = { :type => :checkbox, :name => name }.merge options
|
119
|
-
tag :input, :self_closing => true, :attributes => options
|
120
|
-
end
|
121
|
-
|
122
|
-
##
|
123
|
-
# Generates a hidden field.
|
124
|
-
|
125
|
-
def hidden name, options = {}
|
126
|
-
options = { :type => :hidden, :name => name }.merge options
|
127
|
-
tag :input, :self_closing => true, :attributes => options
|
128
|
-
end
|
129
|
-
|
130
|
-
##
|
131
|
-
# Creates hidden _method, with value of +method+.
|
132
|
-
|
133
|
-
def hidden_method method
|
134
|
-
hidden :_method, :value => method
|
135
|
-
end
|
136
|
-
|
137
|
-
##
|
138
|
-
# Generates a radio button.
|
139
|
-
|
140
|
-
def radio name, options = {}
|
141
|
-
options = { :type => :radio, :name => name }.merge options
|
142
|
-
tag :input, :self_closing => true, :attributes => options
|
143
|
-
end
|
144
|
-
|
145
|
-
##
|
146
|
-
# Generates a file field.
|
147
|
-
|
148
|
-
def file name, options = {}
|
149
|
-
options = { :type => :file, :name => name }.merge options
|
150
|
-
tag :input, :self_closing => true, :attributes => options
|
151
|
-
end
|
152
|
-
|
153
|
-
##
|
154
|
-
# Generates a select field.
|
155
|
-
|
156
|
-
def select name, options = {}, &block
|
157
|
-
options = { :name => name, :value => "\n" }.merge options
|
158
|
-
options[:value] << capture_elements(&block) if block_given?
|
159
|
-
options[:value] << select_options(options) if options.include? :options
|
160
|
-
tag :select, :attributes => options
|
161
|
-
end
|
162
|
-
|
163
|
-
##
|
164
|
-
# Generates a textarea.
|
165
|
-
|
166
|
-
def textarea name, options = {}, &block
|
167
|
-
options = { :name => name }.merge options
|
168
|
-
tag :textarea, :attributes => options, &block
|
169
|
-
end
|
170
|
-
|
171
|
-
##
|
172
|
-
# Generates a submit button.
|
173
|
-
|
174
|
-
def submit name, options = {}
|
175
|
-
options = { :type => :submit, :name => name }.merge options
|
176
|
-
tag :input, :self_closing => true, :attributes => options
|
177
|
-
end
|
178
|
-
|
179
|
-
##
|
180
|
-
# Generates a button.
|
181
|
-
|
182
|
-
def button name, options = {}
|
183
|
-
type = options.has_key?(:src) ? :image : :button
|
184
|
-
options = { :type => type, :name => name }.merge options
|
185
|
-
tag :input, :self_closing => true, :attributes => options
|
186
|
-
end
|
187
|
-
|
188
|
-
##
|
189
|
-
# Capture results of elements called within +block+. Optionally
|
190
|
-
# a DataMapper model may be passed, at which point error classes
|
191
|
-
# will be applied to invalid elements.
|
192
|
-
|
193
|
-
def capture_elements model = nil, &block
|
194
|
-
elements = yield Proxy.new(model)
|
195
|
-
elements.join
|
196
|
-
end
|
197
|
-
|
198
|
-
private
|
199
|
-
|
200
|
-
def select_options options #:nodoc:
|
201
|
-
options.delete(:options).collect { |value, title| option(value, title) }.join
|
202
|
-
end
|
203
|
-
|
204
|
-
def valid_http_verb? options #:nodoc:
|
205
|
-
[:get, :post].include? options[:method]
|
206
|
-
end
|
207
|
-
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|