sinatra-formhelpers-huii 0.0.1
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 +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.travis.yml +11 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +47 -0
- data/LICENSE +21 -0
- data/README.md +126 -0
- data/Rakefile +7 -0
- data/lib/sinatra/form_helpers/version.rb +5 -0
- data/lib/sinatra/form_helpers.rb +229 -0
- data/sinatra-formhelpers-huii.gemspec +28 -0
- data/spec/integration/form_helpers_spec.rb +250 -0
- data/spec/spec_helper.rb +39 -0
- data/spec/units/form_helpers_spec.rb +116 -0
- metadata +149 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a61ee9d516ea9200d8e977cf6c13e7dea468db16
|
4
|
+
data.tar.gz: f770b7739bdded37177de9783bd3f4281403c9e2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 59bbde3ec8d1d62815c25081148a98294efc52deb8aa9b7684d8ea3d7213dd28d9c53ce80ea6f7e9138cc6bffa2cbbcf695ffde1fdfe1378189a5e5748e7049e
|
7
|
+
data.tar.gz: 9eda4ae2240719dabad399327cb92a5eff5ce7a84ba5bab8eaa1f9ffe817d0e287905ef51ac6b5d98912f79f5c55ad10519ed15e08e76348e0414f42a6fa7c2b
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
sinatra-formhelpers-huii (1.9.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.2.5)
|
10
|
+
docile (1.1.2)
|
11
|
+
multi_json (1.8.4)
|
12
|
+
rack (1.5.2)
|
13
|
+
rack-protection (1.5.2)
|
14
|
+
rack
|
15
|
+
rack-test (0.6.2)
|
16
|
+
rack (>= 1.0)
|
17
|
+
rake (10.1.1)
|
18
|
+
rspec (2.14.1)
|
19
|
+
rspec-core (~> 2.14.0)
|
20
|
+
rspec-expectations (~> 2.14.0)
|
21
|
+
rspec-mocks (~> 2.14.0)
|
22
|
+
rspec-core (2.14.7)
|
23
|
+
rspec-expectations (2.14.4)
|
24
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
25
|
+
rspec-mocks (2.14.4)
|
26
|
+
simplecov (0.8.2)
|
27
|
+
docile (~> 1.1.0)
|
28
|
+
multi_json
|
29
|
+
simplecov-html (~> 0.8.0)
|
30
|
+
simplecov-html (0.8.0)
|
31
|
+
sinatra (1.4.4)
|
32
|
+
rack (~> 1.4)
|
33
|
+
rack-protection (~> 1.4)
|
34
|
+
tilt (~> 1.3, >= 1.3.4)
|
35
|
+
tilt (1.4.1)
|
36
|
+
|
37
|
+
PLATFORMS
|
38
|
+
ruby
|
39
|
+
|
40
|
+
DEPENDENCIES
|
41
|
+
bundler (~> 1.5)
|
42
|
+
rack-test (~> 0.6)
|
43
|
+
rake (~> 10.1)
|
44
|
+
rspec (~> 2.14)
|
45
|
+
simplecov (~> 0.8)
|
46
|
+
sinatra (~> 1.4)
|
47
|
+
sinatra-formhelpers-huii!
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
sinatra-formhelpers - Suite of form helpers for sinatra
|
2
|
+
Copyright 2009 Tom Wilson
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
# Sinatra::FormHelpers - Lightweight form helpers for Sinatra
|
2
|
+
|
3
|
+
This plugin adds lightweight (3-5 lines each) form helpers to Sinatra that aid with
|
4
|
+
common form and HTML tags.
|
5
|
+
|
6
|
+
link "google", "http://www.google.com" # <a href="http://www.google.com">google</a>
|
7
|
+
label :person, :first_name # <label for="person_first_name">First Name</label>
|
8
|
+
input :person, :first_name # <input name="person[first_name]" id="person_first_name" type="text" />
|
9
|
+
|
10
|
+
There are also helpers for: form, textarea, submit, image, radio, checkbox, and select
|
11
|
+
|
12
|
+
|
13
|
+
## Why Bother?
|
14
|
+
|
15
|
+
After all, you can just write Haml or write your own helpers or hand-code raw HTML or whatever. Well, here's some considerations:
|
16
|
+
|
17
|
+
1. Helpers maintain correct state across form submissions (eg, on errors, form stays filled in)
|
18
|
+
2. Generate automatic labels, valid CSS ID's, and `nested[names]` to make ORMs happy
|
19
|
+
3. No Rails ultra-magic(tm) here. Just fast, simple code.
|
20
|
+
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
With Bundler/Isolate:
|
25
|
+
|
26
|
+
gem 'sinatra-formhelpers-huii'
|
27
|
+
|
28
|
+
Then, include it in a Sinatra application:
|
29
|
+
|
30
|
+
require 'sinatra/form_helpers'
|
31
|
+
|
32
|
+
If you're subclassing `Sinatra::Base`, you also need to call `helpers` manually:
|
33
|
+
|
34
|
+
class MyApp < Sinatra::Base
|
35
|
+
helpers Sinatra::FormHelpers
|
36
|
+
# ...
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
## Views
|
41
|
+
|
42
|
+
In your views, use these helpers to dynamically create form HTML elements. Here's an example in ERB:
|
43
|
+
|
44
|
+
<p>
|
45
|
+
Fill out the below form to sign up.
|
46
|
+
For more information, visit our <%= link 'FAQ', '/faq' %>
|
47
|
+
</p>
|
48
|
+
|
49
|
+
<%= form('/users', :post) %>
|
50
|
+
|
51
|
+
<%= input(:user, :first_name) %>
|
52
|
+
<%= input(:user, :last_name) %>
|
53
|
+
|
54
|
+
<%= input(:user, :email, :size => 40) %>
|
55
|
+
|
56
|
+
<%= password(:user, :password) %>
|
57
|
+
<%= password(:user, :confirm_password) %>
|
58
|
+
|
59
|
+
<%= radio(:user, :gender, ['M', 'F']) %>
|
60
|
+
|
61
|
+
<%= submit %>
|
62
|
+
|
63
|
+
Unlike the super-magic Rails `form_for` method, the `form()` helper just takes a URL and method. (Note that `form()` will accept `:create`, `:update`, and `:delete` and include the special `_method` hidden param for you.)
|
64
|
+
|
65
|
+
To reduce repetition, use `fieldset()` to prefix fields with a namespace:
|
66
|
+
|
67
|
+
<%= form('/users', :create) %>
|
68
|
+
|
69
|
+
<% fieldset(:user) do |f| %>
|
70
|
+
<%= f.input(:first_name) %>
|
71
|
+
<%= f.input(:last_name) %>
|
72
|
+
|
73
|
+
<%= f.input(:email, :size => 40) %>
|
74
|
+
|
75
|
+
<%= f.password(:password) %>
|
76
|
+
<%= f.password(:confirm_password) %>
|
77
|
+
|
78
|
+
<%= f.radio(:gender, ['M', 'F']) %>
|
79
|
+
<% end %>
|
80
|
+
|
81
|
+
</form> <-- You need to close it manually if you are not passing a block
|
82
|
+
|
83
|
+
<%= submit 'Create account' %>
|
84
|
+
<%= submit 'Cancel', :onclick => 'window.location=http://mydomain.com;return false' %>
|
85
|
+
|
86
|
+
or
|
87
|
+
|
88
|
+
<%= form(:user, :post, action: '/users') do |f| %> <-- This will create a fieldset automatically
|
89
|
+
<%= f.input(:first_name) %>
|
90
|
+
<%= f.input(:last_name) %>
|
91
|
+
|
92
|
+
<%= f.input(:email, :size => 40) %>
|
93
|
+
|
94
|
+
<%= f.password(:password) %>
|
95
|
+
<%= f.password(:confirm_password) %>
|
96
|
+
|
97
|
+
<%= f.radio(:gender, ['M', 'F']) %>
|
98
|
+
<% end %>
|
99
|
+
|
100
|
+
<%= submit 'Create account' %>
|
101
|
+
<%= submit 'Cancel', :onclick => 'window.location=http://mydomain.com;return false' %>
|
102
|
+
|
103
|
+
This will create fields named `user[first_name]`, `user[last_name]`, and so forth.
|
104
|
+
|
105
|
+
## Known Bugs
|
106
|
+
|
107
|
+
* `fieldset` must be optional in `form`
|
108
|
+
|
109
|
+
|
110
|
+
## Fixed Bugs
|
111
|
+
|
112
|
+
* Currently `fieldset` does not return a <fieldset> tag properly.
|
113
|
+
* The state of select tags was not persisted across form submissions.
|
114
|
+
|
115
|
+
|
116
|
+
## Running tests
|
117
|
+
|
118
|
+
Just run `bundle exec rake` or `bundle exec rspec` or `rspec`.
|
119
|
+
|
120
|
+
|
121
|
+
## Authors
|
122
|
+
|
123
|
+
* [Initial efforts](https://github.com/twilson63/sinatra-formhelpers) (c) 2009 [Tom Wilson](https://github.com/twilson63).
|
124
|
+
* [Additional efforts](https://github.com/nateware/sinatra-formhelpers) (c) 2011 [Nate Wiger](http://nateware.com).
|
125
|
+
* [Further efforts](https://github.com/cymen/sinatra-formhelpers-ng) (c) 2013 [Cymen Vig](http://blog.cymen.org/).
|
126
|
+
* [Other efforts](https://github.com/ollie/sinatra-formhelpers-huii) (c) 2014 [Oldrich Vetesnik](https://github.com/ollie).
|
data/Rakefile
ADDED
@@ -0,0 +1,229 @@
|
|
1
|
+
module Sinatra
|
2
|
+
module FormHelpers
|
3
|
+
# FormHelpers are a suite of helper methods
|
4
|
+
# built to make building forms in Sinatra
|
5
|
+
# a breeze.
|
6
|
+
#
|
7
|
+
# link "jackhq", "http://www.jackhq.com"
|
8
|
+
#
|
9
|
+
# label :person, :first_name
|
10
|
+
# input :person, :first_name
|
11
|
+
# textarea :person, :notes
|
12
|
+
#
|
13
|
+
# etc.
|
14
|
+
def form(action, method = :get, options = {}, &block)
|
15
|
+
method_input = ''
|
16
|
+
# the docs suggest using ':create', ':update', or ':delete'
|
17
|
+
# but you can use any symbol for the method value
|
18
|
+
# allows for more than 3 forms on a single page
|
19
|
+
if method.is_a? Symbol
|
20
|
+
method_input = %Q(<input type="hidden" name="_method" value="#{method}" />)
|
21
|
+
method = :post
|
22
|
+
end
|
23
|
+
action = "/#{action}" if action.is_a? Symbol
|
24
|
+
|
25
|
+
out = tag(:form, nil, { action: action, method: method.to_s }.merge(options)) + method_input
|
26
|
+
out << fieldset(action, &block) + '</form>' if block_given?
|
27
|
+
out
|
28
|
+
end
|
29
|
+
|
30
|
+
def fieldset(obj, legend = nil, &block)
|
31
|
+
raise ArgumentError, "Missing block to fieldset()" unless block_given?
|
32
|
+
out = yield Fieldset.new(self, obj)
|
33
|
+
'<fieldset>' + (legend.nil? ? '' : "<legend>#{fast_escape_html(legend)}</legend>") + out.to_s + '</fieldset>'
|
34
|
+
end
|
35
|
+
|
36
|
+
# Link to a URL
|
37
|
+
def link(content, href = content, options = {})
|
38
|
+
tag :a, content, options.merge(href: href)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Link to an image
|
42
|
+
def image(src, options = {})
|
43
|
+
single_tag :img, options.merge(src: src)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Form field label
|
47
|
+
def label(obj, field, display = "", options = {})
|
48
|
+
tag :label, (display.nil? || display == '') ? titleize(field.to_s) : display, options.merge(for: css_id(obj, field))
|
49
|
+
end
|
50
|
+
|
51
|
+
# Form text input. Specify the value as value: 'foo'
|
52
|
+
def input(obj, field = nil, options = {})
|
53
|
+
value = param_or_default(obj, field, options[:value])
|
54
|
+
single_tag :input, options.merge(
|
55
|
+
type: options[:type] || "text",
|
56
|
+
id: css_id(obj, field),
|
57
|
+
name: field.nil? ? obj : "#{obj}[#{field}]",
|
58
|
+
value: value
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Form password input. Specify the value as value: 'foo'
|
63
|
+
def password(obj, field = nil, options = {})
|
64
|
+
input(obj, field, options.merge(type: 'password'))
|
65
|
+
end
|
66
|
+
|
67
|
+
# Form textarea box.
|
68
|
+
def textarea(obj, field = nil, content = '', options = {})
|
69
|
+
content = param_or_default(obj, field, content)
|
70
|
+
tag :textarea, content, options.merge(
|
71
|
+
id: css_id(obj, field),
|
72
|
+
name: field.nil? ? obj : "#{obj}[#{field}]"
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Form submit tag.
|
77
|
+
def submit(value = 'Submit', options = {})
|
78
|
+
single_tag :input, {
|
79
|
+
name: "submit",
|
80
|
+
type: "submit",
|
81
|
+
value: value,
|
82
|
+
id: css_id('button', value)
|
83
|
+
}.merge(options)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Form reset tag. Does anyone use these anymore?
|
87
|
+
def reset(value = 'Reset', options = {})
|
88
|
+
single_tag :input, {
|
89
|
+
name: "reset",
|
90
|
+
type: "reset",
|
91
|
+
value: value,
|
92
|
+
id: css_id('button', value)
|
93
|
+
}.merge(options)
|
94
|
+
end
|
95
|
+
|
96
|
+
# General purpose button, usually these need JavaScript hooks.
|
97
|
+
def button(value, options = {})
|
98
|
+
single_tag :input, {
|
99
|
+
name: "button",
|
100
|
+
type: "button",
|
101
|
+
value: value,
|
102
|
+
id: css_id('button', value)
|
103
|
+
}.merge(options)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Form checkbox. Specify an array of values to get a checkbox group.
|
107
|
+
def checkbox(obj, field, values, options = {})
|
108
|
+
join = options.delete(:join) || ' '
|
109
|
+
labs = options.delete(:label)
|
110
|
+
vals = param_or_default(obj, field, [])
|
111
|
+
ary = values.is_a?(Array) && values.length > 1 ? '[]' : ''
|
112
|
+
Array(values).collect do |val|
|
113
|
+
id, text = id_and_text_from_value(val)
|
114
|
+
single_tag(:input, options.merge(
|
115
|
+
type: "checkbox",
|
116
|
+
id: css_id(obj, field, id),
|
117
|
+
name: "#{obj}[#{field}]#{ary}",
|
118
|
+
value: id,
|
119
|
+
checked: vals.include?(id) ? 'checked' : nil
|
120
|
+
)) +
|
121
|
+
(labs.nil? || labs == true ? label(obj, "#{field}_#{id.to_s.downcase}", text) : '')
|
122
|
+
end.join(join)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Form radio input. Specify an array of values to get a radio group.
|
126
|
+
def radio(obj, field, values, options = {})
|
127
|
+
#content = @params[obj] && @params[obj][field.to_s] == value ? "true" : ""
|
128
|
+
# , checked: content
|
129
|
+
join = options.delete(:join) || ' '
|
130
|
+
labs = options.delete(:label)
|
131
|
+
vals = param_or_default(obj, field, [])
|
132
|
+
Array(values).collect do |val|
|
133
|
+
id, text = id_and_text_from_value(val)
|
134
|
+
single_tag(:input, options.merge(
|
135
|
+
type: "radio",
|
136
|
+
id: css_id(obj, field, id),
|
137
|
+
name: "#{obj}[#{field}]",
|
138
|
+
value: id,
|
139
|
+
checked: vals.include?(id) ? 'checked' : nil
|
140
|
+
)) +
|
141
|
+
(labs.nil? || labs == true ? label(obj, "#{field}_#{id.to_s.downcase}", text) : '')
|
142
|
+
end.join(join)
|
143
|
+
end
|
144
|
+
|
145
|
+
# Form select dropdown. Currently only single-select (not multi-select) is supported.
|
146
|
+
def select(obj, field, values, options = {})
|
147
|
+
value = param_or_default(obj, field, options[:value])
|
148
|
+
content = ""
|
149
|
+
Array(values).each do |val|
|
150
|
+
id, text = id_and_text_from_value(val)
|
151
|
+
tag_options = { value: id }
|
152
|
+
tag_options[:selected] = 'selected' if id == value
|
153
|
+
content << tag(:option, text, tag_options)
|
154
|
+
end
|
155
|
+
tag :select, content, options.merge(id: css_id(obj, field), name: "#{obj}[#{field}]")
|
156
|
+
end
|
157
|
+
|
158
|
+
# Form hidden input. Specify value as value: 'foo'
|
159
|
+
def hidden(obj, field = nil, options = {})
|
160
|
+
input(obj, field, options.merge(type: 'hidden'))
|
161
|
+
end
|
162
|
+
|
163
|
+
# Standard open and close tags
|
164
|
+
# EX : tag :h1, "shizam", title: "shizam"
|
165
|
+
# => <h1 title="shizam">shizam</h1>
|
166
|
+
def tag(name, content, options = {})
|
167
|
+
"<#{name.to_s}" +
|
168
|
+
(options.length > 0 ? " #{hash_to_html_attrs(options)}" : '') +
|
169
|
+
(content.nil? ? '>' : ">#{content}</#{name}>")
|
170
|
+
end
|
171
|
+
|
172
|
+
# Standard single closing tags
|
173
|
+
# single_tag :img, src: "images/google.jpg"
|
174
|
+
# => <img src="images/google.jpg" />
|
175
|
+
def single_tag(name, options = {})
|
176
|
+
"<#{name.to_s} #{hash_to_html_attrs(options)} />"
|
177
|
+
end
|
178
|
+
|
179
|
+
def fast_escape_html(text)
|
180
|
+
text.to_s.gsub(/\&/,'&').gsub(/\"/,'"').gsub(/>/,'>').gsub(/</,'<')
|
181
|
+
end
|
182
|
+
|
183
|
+
def titleize(text)
|
184
|
+
text.to_s.gsub(/_+/, ' ').gsub(/\b('?[a-z])/) { $1.capitalize }
|
185
|
+
end
|
186
|
+
|
187
|
+
def param_or_default(obj, field, default)
|
188
|
+
if field
|
189
|
+
params[obj] ? params[obj][field.to_s] || default : default
|
190
|
+
else
|
191
|
+
params[obj] || default
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def hash_to_html_attrs(options = {})
|
196
|
+
html_attrs = ""
|
197
|
+
options.keys.sort.each do |key|
|
198
|
+
next if options[key].nil? # do not include empty attributes
|
199
|
+
html_attrs << %Q(#{key}="#{fast_escape_html(options[key])}" )
|
200
|
+
end
|
201
|
+
html_attrs.chop
|
202
|
+
end
|
203
|
+
|
204
|
+
def id_and_text_from_value(val)
|
205
|
+
if val.is_a? Array
|
206
|
+
[val.first, val.last]
|
207
|
+
else
|
208
|
+
[val, val]
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def css_id(*things)
|
213
|
+
things.compact.map{|t| t.to_s}.join('_').downcase.gsub(/\W/,'_')
|
214
|
+
end
|
215
|
+
|
216
|
+
class Fieldset
|
217
|
+
def initialize(parent, name)
|
218
|
+
@parent = parent
|
219
|
+
@name = name.to_s.gsub(/\W+/,'')
|
220
|
+
end
|
221
|
+
|
222
|
+
def method_missing(meth, *args)
|
223
|
+
@parent.send(meth, @name, *args)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
helpers FormHelpers
|
229
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'sinatra/form_helpers/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'sinatra-formhelpers-huii'
|
8
|
+
spec.version = Sinatra::FormHelpers::VERSION
|
9
|
+
spec.authors = ['twilson63', 'Nate Wiger', 'Cymen Vig', 'Oldrich Vetesnik']
|
10
|
+
spec.email = ['oldrich.vetesnik@gmail.com']
|
11
|
+
spec.summary = %q{Form helpers for Sinatra}
|
12
|
+
spec.description = %q{Simple, lightweight form helpers for Sinatra.}
|
13
|
+
spec.homepage = 'https://github.com/ollie/sinatra-formhelpers-huii'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.5'
|
22
|
+
spec.add_development_dependency 'rake', '~> 10.1'
|
23
|
+
spec.add_development_dependency 'rack-test', '~> 0.6'
|
24
|
+
spec.add_development_dependency 'rspec', '~> 2.14'
|
25
|
+
spec.add_development_dependency 'simplecov', '~> 0.8'
|
26
|
+
spec.add_development_dependency 'sinatra', '~> 1.4'
|
27
|
+
# spec.add_development_dependency 'pry', '~> 0.9'
|
28
|
+
end
|
@@ -0,0 +1,250 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Sinatra::FormHelpers in app" do
|
4
|
+
it 'renders an anchor tag' do
|
5
|
+
app.get '/link' do
|
6
|
+
erb "<%= link 'google', 'http://www.google.com', :title => 'Google' %>"
|
7
|
+
end
|
8
|
+
|
9
|
+
get '/link'
|
10
|
+
expect( last_response.body ).to eq( %q(<a href="http://www.google.com" title="Google">google</a>) )
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'renders a label tag' do
|
14
|
+
app.get '/label' do
|
15
|
+
erb "<%= label :person, :first_name %>"
|
16
|
+
end
|
17
|
+
|
18
|
+
get '/label'
|
19
|
+
expect( last_response.body ).to eq( %q(<label for="person_first_name">First Name</label>) )
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'renders a label tag with display input' do
|
23
|
+
app.get '/hello' do
|
24
|
+
erb "<%= label :person, :first_name, 'Hello World'%>"
|
25
|
+
end
|
26
|
+
|
27
|
+
get '/hello'
|
28
|
+
expect( last_response.body ).to eq( %q(<label for="person_first_name">Hello World</label>) )
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'renders an input tag type text without @params' do
|
32
|
+
app.get '/text' do
|
33
|
+
erb "<%= input :person, :first_name %>"
|
34
|
+
end
|
35
|
+
|
36
|
+
get '/text'
|
37
|
+
expect( last_response.body ).to match( /name="person\[first_name\]"/ )
|
38
|
+
expect( last_response.body ).to eq( %q(<input id="person_first_name" name="person[first_name]" type="text" />) )
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'accepts an input tag with custom type option' do
|
42
|
+
app.get '/input-with-custom-type' do
|
43
|
+
erb "<%= input :person, :password, type: 'password' %>"
|
44
|
+
end
|
45
|
+
|
46
|
+
get '/input-with-custom-type'
|
47
|
+
expect( last_response.body ).to eq( '<input id="person_password" name="person[password]" type="password" />' )
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'renders an input tag type text with single arg' do
|
51
|
+
app.get '/q' do
|
52
|
+
erb "<%= input :q %>"
|
53
|
+
end
|
54
|
+
|
55
|
+
get '/q'
|
56
|
+
expect( last_response.body ).to eq( %q(<input id="q" name="q" type="text" />) )
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'renders an input tag type text with @params' do
|
60
|
+
app.get '/tom' do
|
61
|
+
@params = { :person => {"first_name" => "Tom"}}
|
62
|
+
erb "<%= input :person, :first_name %>"
|
63
|
+
end
|
64
|
+
|
65
|
+
get '/tom'
|
66
|
+
expect( last_response.body ).to eq( %q(<input id="person_first_name" name="person[first_name]" type="text" value="Tom" />) )
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'renders a password tag type password' do
|
70
|
+
app.get '/password' do
|
71
|
+
erb "<%= password :person, :password %>"
|
72
|
+
end
|
73
|
+
|
74
|
+
get '/password'
|
75
|
+
expect( last_response.body ).to eq( '<input id="person_password" name="person[password]" type="password" />' )
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'renders a button tag type button' do
|
79
|
+
app.get '/button' do
|
80
|
+
erb "<%= button :new %>"
|
81
|
+
end
|
82
|
+
|
83
|
+
get '/button'
|
84
|
+
expect( last_response.body ).to eq( '<input id="button_new" name="button" type="button" value="new" />' )
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'renders an textarea tag type text without @params' do
|
88
|
+
app.get '/notes' do
|
89
|
+
erb "<%= textarea :person, :notes %>"
|
90
|
+
end
|
91
|
+
|
92
|
+
get '/notes?person[notes]=Yeppers'
|
93
|
+
expect( last_response.body ).to eq( %q(<textarea id="person_notes" name="person[notes]">Yeppers</textarea>) )
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'renders a textarea tag with @params' do
|
97
|
+
app.get '/notes2' do
|
98
|
+
@params = { :person => {"notes" => "This is a note"}}
|
99
|
+
erb "<%= textarea :person, :notes %>"
|
100
|
+
end
|
101
|
+
|
102
|
+
get '/notes2'
|
103
|
+
expect( last_response.body ).to eq( %q(<textarea id="person_notes" name="person[notes]">This is a note</textarea>) )
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'renders a textarea tag with @params' do
|
107
|
+
app.get '/img' do
|
108
|
+
erb "<%= image '/images/hello.png', :alt => 'Lolcatz' %>"
|
109
|
+
end
|
110
|
+
|
111
|
+
get '/img'
|
112
|
+
expect( last_response.body ).to eq( '<img alt="Lolcatz" src="/images/hello.png" />' )
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'renders an input tag with a submit type' do
|
116
|
+
app.get '/sub' do
|
117
|
+
erb "<%= submit 'Create' %>"
|
118
|
+
end
|
119
|
+
|
120
|
+
get '/sub'
|
121
|
+
expect( last_response.body ).to eq( '<input id="button_create" name="submit" type="submit" value="Create" />' )
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'renders an input tag with a submit type with zero args' do
|
125
|
+
app.get '/create' do
|
126
|
+
erb "<%= submit %>"
|
127
|
+
end
|
128
|
+
|
129
|
+
get '/create'
|
130
|
+
expect( last_response.body ).to eq( '<input id="button_submit" name="submit" type="submit" value="Submit" />' )
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'renders an input tag with a checkbox type' do
|
134
|
+
app.get '/check' do
|
135
|
+
erb "<%= checkbox :person, :active, 'Yes' %>"
|
136
|
+
end
|
137
|
+
|
138
|
+
get '/check'
|
139
|
+
expect( last_response.body ).to eq(
|
140
|
+
'<input id="person_active_yes" name="person[active]" type="checkbox" value="Yes" /><label for="person_active_yes">Yes</label>'
|
141
|
+
)
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'renders an input tag with a multiple checkbox type' do
|
145
|
+
app.get '/check2' do
|
146
|
+
erb "<%= checkbox :person, :eyes, [1,2,3] %>"
|
147
|
+
end
|
148
|
+
|
149
|
+
get '/check2'
|
150
|
+
expect( last_response.body ).to eq(
|
151
|
+
'<input id="person_eyes_1" name="person[eyes][]" type="checkbox" value="1" /><label for="person_eyes_1">1</label> ' +
|
152
|
+
'<input id="person_eyes_2" name="person[eyes][]" type="checkbox" value="2" /><label for="person_eyes_2">2</label> ' +
|
153
|
+
'<input id="person_eyes_3" name="person[eyes][]" type="checkbox" value="3" /><label for="person_eyes_3">3</label>'
|
154
|
+
)
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'renders an input tag with a radio type' do
|
158
|
+
app.get '/radio' do
|
159
|
+
erb "<%= radio :person, :gender, [['M','Male'],['F','Female'],'Other'] %>"
|
160
|
+
end
|
161
|
+
|
162
|
+
get '/radio'
|
163
|
+
expect( last_response.body ).to eq(
|
164
|
+
%(<input id="person_gender_m" name="person[gender]" type="radio" value="M" /><label for="person_gender_m">Male</label> ) +
|
165
|
+
%(<input id="person_gender_f" name="person[gender]" type="radio" value="F" /><label for="person_gender_f">Female</label> ) +
|
166
|
+
%(<input id="person_gender_other" name="person[gender]" type="radio" value="Other" /><label for="person_gender_other">Other</label>)
|
167
|
+
)
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'renders a select tag' do
|
171
|
+
app.get '/select' do
|
172
|
+
erb "<%= select :person, :relationship, ['Friend','CoWorker','Lead'] %>"
|
173
|
+
end
|
174
|
+
|
175
|
+
get '/select'
|
176
|
+
expect( last_response.body ).to eq( '<select id="person_relationship" name="person[relationship]">' +
|
177
|
+
'<option value="Friend">Friend</option><option value="CoWorker">CoWorker</option>' +
|
178
|
+
'<option value="Lead">Lead</option></select>' )
|
179
|
+
end
|
180
|
+
|
181
|
+
it 'renders a select tag with selected option' do
|
182
|
+
app.get '/select2' do
|
183
|
+
@params = { :person => {"relationship" => "CoWorker"}}
|
184
|
+
erb "<%= select :person, :relationship, ['Friend','CoWorker','Lead'] %>"
|
185
|
+
end
|
186
|
+
|
187
|
+
get '/select2'
|
188
|
+
expect( last_response.body ).to eq( '<select id="person_relationship" name="person[relationship]">' +
|
189
|
+
'<option value="Friend">Friend</option><option selected="selected" value="CoWorker">CoWorker</option>' +
|
190
|
+
'<option value="Lead">Lead</option></select>' )
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'renders a hidden tag with single arg' do
|
194
|
+
app.get '/hidden' do
|
195
|
+
erb "<%= hidden :q %>"
|
196
|
+
end
|
197
|
+
|
198
|
+
get '/hidden'
|
199
|
+
expect( last_response.body ).to eq( %q(<input id="q" name="q" type="hidden" />) )
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'renders a hidden tag with value' do
|
203
|
+
app.get '/hidden2' do
|
204
|
+
erb '<%= hidden :person, :id, :value => 1 %>'
|
205
|
+
end
|
206
|
+
|
207
|
+
get '/hidden2'
|
208
|
+
expect( last_response.body ).to eq( '<input id="person_id" name="person[id]" type="hidden" value="1" />' )
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'renders a form tag' do
|
212
|
+
app.get '/form' do
|
213
|
+
erb "<%= form :person, :create %>"
|
214
|
+
end
|
215
|
+
|
216
|
+
get '/form'
|
217
|
+
expect( last_response.body ).to eq( %q(<form action="/person" method="post"><input type="hidden" name="_method" value="create" />) )
|
218
|
+
end
|
219
|
+
|
220
|
+
it 'renders a fieldset group' do
|
221
|
+
app.get '/fieldset' do
|
222
|
+
erb <<-EndTemplate
|
223
|
+
<% fieldset(:user) do |f| %>
|
224
|
+
<%= f.input(:first_name) %>
|
225
|
+
<%= f.input(:last_name) %>
|
226
|
+
|
227
|
+
<%= f.input(:email, :size => 40) %>
|
228
|
+
|
229
|
+
<%= f.password(:password) %>
|
230
|
+
<%= f.password(:confirm_password) %>
|
231
|
+
|
232
|
+
<%= f.radio(:gender, ['M', 'F']) %>
|
233
|
+
<% end %>
|
234
|
+
<%= submit %>
|
235
|
+
EndTemplate
|
236
|
+
end
|
237
|
+
|
238
|
+
get '/fieldset'
|
239
|
+
expect( last_response.body ).to eq(
|
240
|
+
%( <input id="user_first_name" name="user[first_name]" type="text" />\n) +
|
241
|
+
%( <input id="user_last_name" name="user[last_name]" type="text" />\n\n) +
|
242
|
+
%( <input id="user_email" name="user[email]" size="40" type="text" />\n\n) +
|
243
|
+
%( <input id="user_password" name="user[password]" type="password" />\n) +
|
244
|
+
%( <input id="user_confirm_password" name="user[confirm_password]" type="password" />\n\n) +
|
245
|
+
%( <input id="user_gender_m" name="user[gender]" type="radio" value="M" /><label for="user_gender_m">M</label>) +
|
246
|
+
%( <input id="user_gender_f" name="user[gender]" type="radio" value="F" /><label for="user_gender_f">F</label>\n) +
|
247
|
+
%(<input id="button_submit" name="submit" type="submit" value="Submit" />)
|
248
|
+
)
|
249
|
+
end
|
250
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'rack/test'
|
2
|
+
require 'simplecov'
|
3
|
+
require 'sinatra/base'
|
4
|
+
|
5
|
+
# Coverage tool, needs to be started as soon as possible
|
6
|
+
SimpleCov.start do
|
7
|
+
add_filter '/spec/' # Ignore spec directory
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'sinatra/form_helpers'
|
11
|
+
|
12
|
+
class TestFormHelpers
|
13
|
+
include Sinatra::FormHelpers
|
14
|
+
attr_accessor :params
|
15
|
+
def initialize
|
16
|
+
@params = {}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
def fh
|
20
|
+
@fh ||= TestFormHelpers.new
|
21
|
+
end
|
22
|
+
|
23
|
+
class Application < Sinatra::Base
|
24
|
+
helpers Sinatra::FormHelpers
|
25
|
+
set :raise_errors, false
|
26
|
+
set :show_exceptions, false
|
27
|
+
end
|
28
|
+
|
29
|
+
module RSpecMixin
|
30
|
+
include Rack::Test::Methods
|
31
|
+
|
32
|
+
def app
|
33
|
+
Application
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
RSpec.configure do |config|
|
38
|
+
config.include RSpecMixin
|
39
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Sinatra::FormHelpers methods" do
|
4
|
+
it 'renders an anchor tag' do
|
5
|
+
expect( fh.form(:person, :create) ).to eq( '<form action="/person" method="post"><input type="hidden" name="_method" value="create" />' )
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'renders a form tag' do
|
9
|
+
expect( fh.form(:person, :update, :action => "/people/14") ).to eq(
|
10
|
+
'<form action="/people/14" method="post"><input type="hidden" name="_method" value="update" />'
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'renders a form tag (2)' do
|
15
|
+
expect( fh.form("/people/7", :delete) ).to eq(
|
16
|
+
'<form action="/people/7" method="post"><input type="hidden" name="_method" value="delete" />'
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'renders a form tag (3)' do
|
21
|
+
expect( fh.form("/people", :create) ).to eq(
|
22
|
+
'<form action="/people" method="post"><input type="hidden" name="_method" value="create" />'
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'renders a nested form tag' do
|
27
|
+
expect( fh.form(:person, :create) do |f|
|
28
|
+
# f.input(:first_name)
|
29
|
+
f.input(:last_name)
|
30
|
+
end ).to eq( '<form action="/person" method="post"><input type="hidden" name="_method" value="create" /><fieldset>' +
|
31
|
+
# '<input id="person_first_name" name="person[first_name]" type="text" />' +
|
32
|
+
'<input id="person_last_name" name="person[last_name]" type="text" />' +
|
33
|
+
'</fieldset></form>'
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'renders a nested form tag with different action and namespace' do
|
38
|
+
expect( fh.form(:person, :create, :action => "/people") do |f|
|
39
|
+
f.input(:name)
|
40
|
+
end ).to eq( '<form action="/people" method="post"><input type="hidden" name="_method" value="create" /><fieldset>' +
|
41
|
+
'<input id="person_name" name="person[name]" type="text" />' +
|
42
|
+
'</fieldset></form>'
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'nests form elements arbitrarily' do
|
47
|
+
expect( fh.fieldset(:person) do |n|
|
48
|
+
# n.radio(:partners, 1..6)
|
49
|
+
n.textarea(:comments, "yo yo yo!")
|
50
|
+
end ).to eq( '<fieldset>' +
|
51
|
+
# '<input id="person_partners_1" name="person[partners]" type="radio" value="1" /> ' +
|
52
|
+
# '<input id="person_partners_2" name="person[partners]" type="radio" value="2" /> ' +
|
53
|
+
# '<input id="person_partners_3" name="person[partners]" type="radio" value="3" /> ' +
|
54
|
+
# '<input id="person_partners_4" name="person[partners]" type="radio" value="4" /> ' +
|
55
|
+
# '<input id="person_partners_5" name="person[partners]" type="radio" value="5" /> ' +
|
56
|
+
# '<input id="person_partners_6" name="person[partners]" type="radio" value="6" />' +
|
57
|
+
'<textarea id="person_comments" name="person[comments]">yo yo yo!</textarea></fieldset>'
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'renders a fieldset tag with an input' do
|
62
|
+
expect( fh.fieldset(:user) do |f|
|
63
|
+
f.input(:last_name)
|
64
|
+
end ).to eq( '<fieldset><input id="user_last_name" name="user[last_name]" type="text" /></fieldset>' )
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'renders an empty fieldset tag' do
|
68
|
+
expect( fh.fieldset(:user) do |f|
|
69
|
+
end ).to eq( '<fieldset></fieldset>' )
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'renders a fieldset tag with legend' do
|
73
|
+
expect( fh.fieldset(:user, 'Oh boy!') do |f|
|
74
|
+
end ).to eq( '<fieldset><legend>Oh boy!</legend></fieldset>' )
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'renders a link tag' do
|
78
|
+
expect( fh.link('http://google.com') ).to eq( '<a href="http://google.com">http://google.com</a>' )
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'renders a form label tag' do
|
82
|
+
expect( fh.label(:person, :first_name) ).to eq( '<label for="person_first_name">First Name</label>' )
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'renders a form checkbox tag' do
|
86
|
+
expect( fh.checkbox(:person, :gender, %w[M F], :join => '<br />') ).to eq(
|
87
|
+
'<input id="person_gender_m" name="person[gender][]" type="checkbox" value="M" /><label for="person_gender_m">M</label><br />' +
|
88
|
+
'<input id="person_gender_f" name="person[gender][]" type="checkbox" value="F" /><label for="person_gender_f">F</label>'
|
89
|
+
)
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'renders a minimal text tag' do
|
93
|
+
expect( fh.input(:q) ).to eq( %q(<input id="q" name="q" type="text" />) )
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'renders a minimal textarea tag' do
|
97
|
+
expect( fh.textarea(:r) ).to eq( %q(<textarea id="r" name="r"></textarea>) )
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'renders a submit tag' do
|
101
|
+
expect( fh.submit ).to eq( %q(<input id="button_submit" name="submit" type="submit" value="Submit" />) )
|
102
|
+
expect( fh.submit("Send!") ).to eq( %q(<input id="button_send_" name="submit" type="submit" value="Send!" />) )
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'renders a reset tag' do
|
106
|
+
expect( fh.reset ).to eq( %q(<input id="button_reset" name="reset" type="reset" value="Reset" />) )
|
107
|
+
expect( fh.reset("Blark") ).to eq( %q(<input id="button_blark" name="reset" type="reset" value="Blark" />) )
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'supports multiple values for checkboxes' do
|
111
|
+
fh.params = {:user => {'devices' => ['iPhone', 'iPad'] }}
|
112
|
+
expect( fh.checkbox(:user, :devices, ['iPhone', 'iPad', 'iPod', 'iPoop']) ).to eq(
|
113
|
+
"<input checked=\"checked\" id=\"user_devices_iphone\" name=\"user[devices][]\" type=\"checkbox\" value=\"iPhone\" /><label for=\"user_devices_iphone\">iPhone</label> <input checked=\"checked\" id=\"user_devices_ipad\" name=\"user[devices][]\" type=\"checkbox\" value=\"iPad\" /><label for=\"user_devices_ipad\">iPad</label> <input id=\"user_devices_ipod\" name=\"user[devices][]\" type=\"checkbox\" value=\"iPod\" /><label for=\"user_devices_ipod\">iPod</label> <input id=\"user_devices_ipoop\" name=\"user[devices][]\" type=\"checkbox\" value=\"iPoop\" /><label for=\"user_devices_ipoop\">iPoop</label>"
|
114
|
+
)
|
115
|
+
end
|
116
|
+
end
|
metadata
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sinatra-formhelpers-huii
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- twilson63
|
8
|
+
- Nate Wiger
|
9
|
+
- Cymen Vig
|
10
|
+
- Oldrich Vetesnik
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2014-02-12 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: bundler
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '1.5'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.5'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ~>
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '10.1'
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '10.1'
|
44
|
+
- !ruby/object:Gem::Dependency
|
45
|
+
name: rack-test
|
46
|
+
requirement: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ~>
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0.6'
|
51
|
+
type: :development
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ~>
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0.6'
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: rspec
|
60
|
+
requirement: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ~>
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '2.14'
|
65
|
+
type: :development
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ~>
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '2.14'
|
72
|
+
- !ruby/object:Gem::Dependency
|
73
|
+
name: simplecov
|
74
|
+
requirement: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ~>
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0.8'
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0.8'
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: sinatra
|
88
|
+
requirement: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ~>
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '1.4'
|
93
|
+
type: :development
|
94
|
+
prerelease: false
|
95
|
+
version_requirements: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ~>
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '1.4'
|
100
|
+
description: Simple, lightweight form helpers for Sinatra.
|
101
|
+
email:
|
102
|
+
- oldrich.vetesnik@gmail.com
|
103
|
+
executables: []
|
104
|
+
extensions: []
|
105
|
+
extra_rdoc_files: []
|
106
|
+
files:
|
107
|
+
- .gitignore
|
108
|
+
- .rspec
|
109
|
+
- .travis.yml
|
110
|
+
- Gemfile
|
111
|
+
- Gemfile.lock
|
112
|
+
- LICENSE
|
113
|
+
- README.md
|
114
|
+
- Rakefile
|
115
|
+
- lib/sinatra/form_helpers.rb
|
116
|
+
- lib/sinatra/form_helpers/version.rb
|
117
|
+
- sinatra-formhelpers-huii.gemspec
|
118
|
+
- spec/integration/form_helpers_spec.rb
|
119
|
+
- spec/spec_helper.rb
|
120
|
+
- spec/units/form_helpers_spec.rb
|
121
|
+
homepage: https://github.com/ollie/sinatra-formhelpers-huii
|
122
|
+
licenses:
|
123
|
+
- MIT
|
124
|
+
metadata: {}
|
125
|
+
post_install_message:
|
126
|
+
rdoc_options: []
|
127
|
+
require_paths:
|
128
|
+
- lib
|
129
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
requirements: []
|
140
|
+
rubyforge_project:
|
141
|
+
rubygems_version: 2.2.2
|
142
|
+
signing_key:
|
143
|
+
specification_version: 4
|
144
|
+
summary: Form helpers for Sinatra
|
145
|
+
test_files:
|
146
|
+
- spec/integration/form_helpers_spec.rb
|
147
|
+
- spec/spec_helper.rb
|
148
|
+
- spec/units/form_helpers_spec.rb
|
149
|
+
has_rdoc:
|