nice-n-easy 1.0.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.
- data/.document +5 -0
- data/.gitignore +22 -0
- data/LICENSE +20 -0
- data/README.md +49 -0
- data/Rakefile +26 -0
- data/VERSION +1 -0
- data/lib/sinatra/nice_easy_helpers.rb +563 -0
- data/nice-n-easy.gemspec +63 -0
- data/tasks/rdoc.rb +21 -0
- data/tasks/test.rb +17 -0
- data/tasks/vendor/sdoc-helpers/markdown.rb +56 -0
- data/tasks/vendor/sdoc-helpers/pages.rb +28 -0
- data/test/nice_easy_helpers_test.rb +621 -0
- data/test/tag_matcher.rb +52 -0
- data/test/test_helper.rb +15 -0
- metadata +91 -0
data/nice-n-easy.gemspec
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{nice-n-easy}
|
8
|
+
s.version = "1.0.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Brian Landau"]
|
12
|
+
s.date = %q{2009-10-28}
|
13
|
+
s.description = %q{A set of Sinatra HTML view helpers to make your life nicer and easier. Helpers for forms, links, and assets.}
|
14
|
+
s.email = %q{brian.landau@viget.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.md"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"LICENSE",
|
23
|
+
"README.md",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"lib/sinatra/nice_easy_helpers.rb",
|
27
|
+
"nice-n-easy.gemspec",
|
28
|
+
"tasks/rdoc.rb",
|
29
|
+
"tasks/test.rb",
|
30
|
+
"tasks/vendor/sdoc-helpers/markdown.rb",
|
31
|
+
"tasks/vendor/sdoc-helpers/pages.rb",
|
32
|
+
"test/nice_easy_helpers_test.rb",
|
33
|
+
"test/tag_matcher.rb",
|
34
|
+
"test/test_helper.rb"
|
35
|
+
]
|
36
|
+
s.homepage = %q{http://github.com/brianjlandau/nice-n-easy}
|
37
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
38
|
+
s.require_paths = ["lib"]
|
39
|
+
s.rubygems_version = %q{1.3.5}
|
40
|
+
s.summary = %q{Sinatra HTML helpers that are nice-n-easy to use.}
|
41
|
+
s.test_files = [
|
42
|
+
"test/nice_easy_helpers_test.rb",
|
43
|
+
"test/tag_matcher.rb",
|
44
|
+
"test/test_helper.rb"
|
45
|
+
]
|
46
|
+
|
47
|
+
if s.respond_to? :specification_version then
|
48
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
49
|
+
s.specification_version = 3
|
50
|
+
|
51
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
52
|
+
s.add_runtime_dependency(%q<sinatra>, ["~> 0.9"])
|
53
|
+
s.add_runtime_dependency(%q<activesupport>, ["~> 2.3"])
|
54
|
+
else
|
55
|
+
s.add_dependency(%q<sinatra>, ["~> 0.9"])
|
56
|
+
s.add_dependency(%q<activesupport>, ["~> 2.3"])
|
57
|
+
end
|
58
|
+
else
|
59
|
+
s.add_dependency(%q<sinatra>, ["~> 0.9"])
|
60
|
+
s.add_dependency(%q<activesupport>, ["~> 2.3"])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
data/tasks/rdoc.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'rake/rdoctask'
|
3
|
+
require 'sdoc'
|
4
|
+
require File.join(File.dirname(__FILE__), 'vendor/sdoc-helpers/markdown')
|
5
|
+
require File.join(File.dirname(__FILE__), 'vendor/sdoc-helpers/pages')
|
6
|
+
|
7
|
+
Rake::RDocTask.new do |rdoc|
|
8
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
9
|
+
|
10
|
+
rdoc.rdoc_dir = 'docs'
|
11
|
+
rdoc.title = "Nice-n-Easy #{version} Documentation"
|
12
|
+
rdoc.rdoc_files.include('README*')
|
13
|
+
rdoc.rdoc_files.include('LICENSE')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
rdoc.main = 'README.md'
|
16
|
+
rdoc.template = 'direct'
|
17
|
+
rdoc.options << '--fmt' << 'shtml'
|
18
|
+
end
|
19
|
+
rescue LoadError
|
20
|
+
puts "sdoc RDoc tasks not loaded. Please intall sdoc."
|
21
|
+
end
|
data/tasks/test.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
Rake::TestTask.new(:test) do |test|
|
3
|
+
test.libs << 'lib' << 'test'
|
4
|
+
test.pattern = 'test/**/*_test.rb'
|
5
|
+
test.verbose = true
|
6
|
+
end
|
7
|
+
|
8
|
+
begin
|
9
|
+
require 'rcov/rcovtask'
|
10
|
+
Rcov::RcovTask.new do |test|
|
11
|
+
test.libs << 'test'
|
12
|
+
test.pattern = 'test/**/*_test.rb'
|
13
|
+
test.verbose = true
|
14
|
+
test.rcov_opts = %w[--sort coverage -T --only-uncovered]
|
15
|
+
end
|
16
|
+
rescue LoadError
|
17
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
|
3
|
+
module SDocHelpers
|
4
|
+
module MarkdownFiles
|
5
|
+
def description
|
6
|
+
return super unless full_name =~ /\.(md|markdown)$/
|
7
|
+
# assuming your path is ROOT/html or ROOT/doc
|
8
|
+
path = Dir.pwd + '/../' + full_name
|
9
|
+
Markdown.new(gfm(File.read(path))).to_html + open_links_in_new_window
|
10
|
+
end
|
11
|
+
|
12
|
+
def open_links_in_new_window
|
13
|
+
<<-html
|
14
|
+
<script type="text/javascript">$(function() {
|
15
|
+
$('a').each(function() { $(this).attr('target', '_blank') })
|
16
|
+
})</script>
|
17
|
+
html
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def gfm(text)
|
23
|
+
# Extract pre blocks
|
24
|
+
extractions = {}
|
25
|
+
text.gsub!(%r{<pre>.*?</pre>}m) do |match|
|
26
|
+
md5 = Digest::MD5.hexdigest(match)
|
27
|
+
extractions[md5] = match
|
28
|
+
"{gfm-extraction-#{md5}}"
|
29
|
+
end
|
30
|
+
|
31
|
+
# prevent foo_bar_baz from ending up with an italic word in the middle
|
32
|
+
text.gsub!(/(^(?! {4}|\t)\w+_\w+_\w[\w_]*)/) do |x|
|
33
|
+
x.gsub('_', '\_') if x.split('').sort.to_s[0..1] == '__'
|
34
|
+
end
|
35
|
+
|
36
|
+
# in very clear cases, let newlines become <br /> tags
|
37
|
+
text.gsub!(/(\A|^$\n)(^\w[^\n]*\n)(^\w[^\n]*$)+/m) do |x|
|
38
|
+
x.gsub(/^(.+)$/, "\\1 ")
|
39
|
+
end
|
40
|
+
|
41
|
+
# Insert pre block extractions
|
42
|
+
text.gsub!(/\{gfm-extraction-([0-9a-f]{32})\}/) do
|
43
|
+
extractions[$1]
|
44
|
+
end
|
45
|
+
|
46
|
+
text
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
begin
|
52
|
+
require 'rdiscount'
|
53
|
+
RDoc::TopLevel.send :include, SDocHelpers::MarkdownFiles
|
54
|
+
rescue LoadError
|
55
|
+
puts "Markdown support not enabled. Please install RDiscount."
|
56
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
namespace :pages do
|
2
|
+
task :publish => [ :check_dirty, :rerdoc ] do
|
3
|
+
`git checkout gh-pages`
|
4
|
+
`ls -1 | grep -v docs | xargs rm -rf; mv docs/* .; rm -rf docs`
|
5
|
+
`git add .; git commit -m "update docs"; git push origin gh-pages`
|
6
|
+
`git checkout master`
|
7
|
+
puts :done
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Initialize GitHub Pages with documentation"
|
11
|
+
task :init => [ :check_dirty, :rerdoc ] do
|
12
|
+
`git symbolic-ref HEAD refs/heads/gh-pages`
|
13
|
+
`rm .git/index`
|
14
|
+
`ls -1 | grep -v docs | xargs rm -rf; mv docs/* .; rm -rf docs`
|
15
|
+
`git add .;git commit -m "create docs"; git push origin gh-pages`
|
16
|
+
`git checkout master`
|
17
|
+
puts :done
|
18
|
+
end
|
19
|
+
|
20
|
+
task :check_dirty do
|
21
|
+
if !`git status`.include?('nothing to commit')
|
22
|
+
abort "dirty index - not publishing!"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "Build and publish documentation using GitHub Pages."
|
28
|
+
task :pages => "pages:publish"
|
@@ -0,0 +1,621 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
User = Struct.new(:email, :password, :picture, :bio, :gender, :subscribe, :external_id, :membership_type)
|
4
|
+
|
5
|
+
class NiceEasyHelpersTest < Test::Unit::TestCase
|
6
|
+
include Sinatra::NiceEasyHelpers
|
7
|
+
|
8
|
+
context 'link helper' do
|
9
|
+
should 'create a link tag' do
|
10
|
+
html = link("Go look at this", 'http://www.somewhere.com/')
|
11
|
+
assert_select_in html, 'a[href="http://www.somewhere.com/"]', "Go look at this"
|
12
|
+
end
|
13
|
+
|
14
|
+
should 'create a link tag with custom HTML attributes' do
|
15
|
+
html = link("Go look at this", 'http://www.somewhere.com/', :class => 'button')
|
16
|
+
assert_select_in html, 'a.button[href="http://www.somewhere.com/"]', "Go look at this"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'label helper' do
|
21
|
+
should 'create a label tag without a field' do
|
22
|
+
html = label(:email)
|
23
|
+
assert_select_in html, 'label[for="email"]', 'Email'
|
24
|
+
end
|
25
|
+
|
26
|
+
should 'create a label tag with a field' do
|
27
|
+
html = label(:user, :email)
|
28
|
+
assert_select_in html, 'label[for="user_email"]', 'Email'
|
29
|
+
end
|
30
|
+
|
31
|
+
should 'create a label tag without a field with custom label' do
|
32
|
+
html = label(:email, :text => 'Email Address')
|
33
|
+
assert_select_in html, 'label[for="email"]', 'Email Address'
|
34
|
+
end
|
35
|
+
|
36
|
+
should 'create a label tag with a field with custom label' do
|
37
|
+
html = label(:user, :email, :text => 'Email Address')
|
38
|
+
assert_select_in html, 'label[for="user_email"]', 'Email Address'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'text field helper' do
|
43
|
+
setup do
|
44
|
+
@params = {}
|
45
|
+
end
|
46
|
+
|
47
|
+
should 'create a input text tag without a field' do
|
48
|
+
html = text_field(:email)
|
49
|
+
assert_select_in html, 'input#email[type="text"][name="email"]'
|
50
|
+
end
|
51
|
+
|
52
|
+
should 'create a input text tag with a field' do
|
53
|
+
html = text_field(:user, :email)
|
54
|
+
assert_select_in html, 'input#user_email[type="text"][name=?]', "user[email]"
|
55
|
+
end
|
56
|
+
|
57
|
+
should 'create a text_field tag without a field with custom class' do
|
58
|
+
html = text_field(:email, :class => 'required')
|
59
|
+
assert_select_in html, 'input#email.required[type="text"][name="email"]'
|
60
|
+
end
|
61
|
+
|
62
|
+
should 'create a text_field tag with a field with custom class' do
|
63
|
+
html = text_field(:user, :email, :class => 'required')
|
64
|
+
assert_select_in html, 'input#user_email.required[type="text"][name=?]', 'user[email]'
|
65
|
+
end
|
66
|
+
|
67
|
+
should 'create a text_field tag with value set by params when no field provided' do
|
68
|
+
@params = {:email => 'joe@example.com'}.with_indifferent_access
|
69
|
+
html = text_field(:email)
|
70
|
+
assert_select_in html, 'input#email[type="text"][name="email"][value="joe@example.com"]'
|
71
|
+
end
|
72
|
+
|
73
|
+
should 'create a text_field tag with value set by params' do
|
74
|
+
@params = {:user => {:email => 'joe@example.com'}.with_indifferent_access}.with_indifferent_access
|
75
|
+
html = text_field(:user, :email)
|
76
|
+
assert_select_in html, 'input#user_email[type="text"][name=?][value="joe@example.com"]', 'user[email]'
|
77
|
+
end
|
78
|
+
|
79
|
+
should 'create a text_field tag with value set by object when provided' do
|
80
|
+
user = User.new
|
81
|
+
user.email = "joe@example.com"
|
82
|
+
|
83
|
+
html = text_field(user, :email)
|
84
|
+
assert_select_in html, 'input#user_email[type="text"][name=?][value="joe@example.com"]', 'user[email]'
|
85
|
+
end
|
86
|
+
|
87
|
+
teardown do
|
88
|
+
@param = nil
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'text area helper' do
|
93
|
+
setup do
|
94
|
+
@params = {}
|
95
|
+
end
|
96
|
+
|
97
|
+
should 'create a text area tag without a field' do
|
98
|
+
html = text_area(:bio)
|
99
|
+
assert_select_in html, 'textarea#bio[name="bio"]'
|
100
|
+
end
|
101
|
+
|
102
|
+
should 'create a text area tag with a field' do
|
103
|
+
html = text_area(:user, :bio)
|
104
|
+
assert_select_in html, 'textarea#user_bio[name=?]', 'user[bio]'
|
105
|
+
end
|
106
|
+
|
107
|
+
should 'create a text area tag without a field with custom class' do
|
108
|
+
html = text_area(:bio, :class => 'required')
|
109
|
+
assert_select_in html, 'textarea#bio.required[name="bio"]'
|
110
|
+
end
|
111
|
+
|
112
|
+
should 'create a text area tag with a field with custom class' do
|
113
|
+
html = text_area(:user, :bio, :class => 'required')
|
114
|
+
assert_select_in html, 'textarea#user_bio.required[name=?]', 'user[bio]'
|
115
|
+
end
|
116
|
+
|
117
|
+
should 'create a text area tag with value set by params when no field provided' do
|
118
|
+
@params = {:bio => %q(I'm from Canada)}.with_indifferent_access
|
119
|
+
html = text_area(:bio)
|
120
|
+
assert_select_in html, 'textarea#bio[name="bio"]', %q(I'm from Canada)
|
121
|
+
end
|
122
|
+
|
123
|
+
should 'create a text area tag with value set by params' do
|
124
|
+
@params = {:user => {:bio => %q(I'm from Canada)}.with_indifferent_access}.with_indifferent_access
|
125
|
+
html = text_area(:user, :bio)
|
126
|
+
assert_select_in html, 'textarea#user_bio', %q(I'm from Canada)
|
127
|
+
end
|
128
|
+
|
129
|
+
should 'create a text area tag with value set by object when provided' do
|
130
|
+
user = User.new
|
131
|
+
user.bio = %q(I'm from Canada)
|
132
|
+
|
133
|
+
html = text_area(user, :bio)
|
134
|
+
assert_select_in html, 'textarea#user_bio', %q(I'm from Canada)
|
135
|
+
end
|
136
|
+
|
137
|
+
teardown do
|
138
|
+
@params = nil
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'password field helper' do
|
143
|
+
setup do
|
144
|
+
@params = {}
|
145
|
+
end
|
146
|
+
|
147
|
+
should 'create a input password tag without a field' do
|
148
|
+
html = password_field(:password)
|
149
|
+
assert_select_in html, 'input#password[type="password"][name="password"]'
|
150
|
+
end
|
151
|
+
|
152
|
+
should 'create a input password tag with a field' do
|
153
|
+
html = password_field(:user, :password)
|
154
|
+
assert_select_in html, 'input#user_password[type="password"][name=?]', 'user[password]'
|
155
|
+
end
|
156
|
+
|
157
|
+
should 'create a password field tag without a field with custom class' do
|
158
|
+
html = password_field(:password, :class => 'required')
|
159
|
+
assert_select_in html, 'input#password.required[type="password"][name="password"]'
|
160
|
+
end
|
161
|
+
|
162
|
+
should 'create a password field tag with a field with custom class' do
|
163
|
+
html = password_field(:user, :password, :class => 'required')
|
164
|
+
assert_select_in html, 'input#user_password.required[type="password"][name=?]', 'user[password]'
|
165
|
+
end
|
166
|
+
|
167
|
+
should 'create a password field tag with value set by params when no field provided' do
|
168
|
+
@params = {:password => 'password'}.with_indifferent_access
|
169
|
+
html = password_field(:password)
|
170
|
+
assert_select_in html, 'input#password[type="password"][name="password"][value="password"]'
|
171
|
+
end
|
172
|
+
|
173
|
+
should 'create a password field tag with value set by params' do
|
174
|
+
@params = {:user => {:password => 'password'}.with_indifferent_access}.with_indifferent_access
|
175
|
+
html = password_field(:user, :password)
|
176
|
+
assert_select_in html, 'input#user_password[type="password"][name=?][value="password"]', 'user[password]'
|
177
|
+
end
|
178
|
+
|
179
|
+
should 'create a password_field tag with value set by object when provided' do
|
180
|
+
user = User.new
|
181
|
+
user.password = "password"
|
182
|
+
|
183
|
+
html = password_field(user, :password)
|
184
|
+
assert_select_in html, 'input#user_password[type="password"][name=?][value="password"]', 'user[password]'
|
185
|
+
end
|
186
|
+
|
187
|
+
teardown do
|
188
|
+
@param = nil
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
context 'file field helper' do
|
193
|
+
setup do
|
194
|
+
@params = {}
|
195
|
+
end
|
196
|
+
|
197
|
+
should 'create a input text tag without a field' do
|
198
|
+
html = file_field(:picture)
|
199
|
+
assert_select_in html, 'input#picture[type="file"][name="picture"]'
|
200
|
+
end
|
201
|
+
|
202
|
+
should 'create a input text tag with a field' do
|
203
|
+
html = file_field(:user, :picture)
|
204
|
+
assert_select_in html, 'input#user_picture[type="file"][name=?]', 'user[picture]'
|
205
|
+
end
|
206
|
+
|
207
|
+
should 'create a file_field tag without a field with custom class' do
|
208
|
+
html = file_field(:picture, :class => 'required')
|
209
|
+
assert_select_in html, 'input#picture.required[type="file"][name="picture"]'
|
210
|
+
end
|
211
|
+
|
212
|
+
should 'create a file_field tag with a field with custom class' do
|
213
|
+
html = file_field(:user, :picture, :class => 'required')
|
214
|
+
assert_select_in html, 'input#user_picture.required[type="file"][name=?]', 'user[picture]'
|
215
|
+
end
|
216
|
+
|
217
|
+
teardown do
|
218
|
+
@param = nil
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context 'button helper' do
|
223
|
+
should 'create a button element of submit type' do
|
224
|
+
html = button('save', 'Save and continue')
|
225
|
+
assert_select_in html, 'button#save[type="submit"][name="save"]', 'Save and continue'
|
226
|
+
end
|
227
|
+
|
228
|
+
should 'create a button element of submit type with a custom class' do
|
229
|
+
html = button('save', 'Save and continue', :class => 'light')
|
230
|
+
assert_select_in html, 'button#save.light[type="submit"][name="save"]', 'Save and continue'
|
231
|
+
end
|
232
|
+
|
233
|
+
|
234
|
+
should 'create a button element of submit type with a value' do
|
235
|
+
html = button('save', 'Save and continue', :value => 'continue')
|
236
|
+
assert_select_in html, 'button#save[type="submit"][name="save"][value="continue"]', 'Save and continue'
|
237
|
+
end
|
238
|
+
|
239
|
+
should 'create a button element of button type' do
|
240
|
+
html = button('action', 'Do something', 'button')
|
241
|
+
assert_select_in html, 'button#action[type="button"][name="action"]', 'Do something'
|
242
|
+
end
|
243
|
+
|
244
|
+
should 'create a button element of button type with custom class' do
|
245
|
+
html = button('action', 'Do something', 'button', :class => 'light')
|
246
|
+
assert_select_in html, 'button#action.light[type="button"][name="action"]', 'Do something'
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
context 'image submit button helper' do
|
251
|
+
should 'create an image input tag' do
|
252
|
+
html = image_input('save.png')
|
253
|
+
assert_select_in html, 'input[type="image"][src="/images/save.png"]'
|
254
|
+
end
|
255
|
+
|
256
|
+
should 'create an image input tag with custom class' do
|
257
|
+
html = image_input('save.png', :class => 'large')
|
258
|
+
assert_select_in html, 'input.large[type="image"][src="/images/save.png"]'
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
context 'submit helper' do
|
263
|
+
should 'create a submit button' do
|
264
|
+
html = submit
|
265
|
+
assert_select_in html, 'input[type="submit"][value="Save"]'
|
266
|
+
end
|
267
|
+
|
268
|
+
should 'create a sbumit button with custom text' do
|
269
|
+
html = submit('Continue')
|
270
|
+
assert_select_in html, 'input[type="submit"][value="Continue"]'
|
271
|
+
end
|
272
|
+
|
273
|
+
should 'create a sbumit button with custom text and custom class' do
|
274
|
+
html = submit('Continue', :class => 'large')
|
275
|
+
assert_select_in html, 'input.large[type="submit"][value="Continue"]'
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
context 'hidden field helper' do
|
280
|
+
setup do
|
281
|
+
@params = {}
|
282
|
+
end
|
283
|
+
|
284
|
+
should 'create a input hidden tag without a field' do
|
285
|
+
html = hidden_field(:external_id, :value => 25)
|
286
|
+
assert_select_in html, 'input#external_id[type="hidden"][name="external_id"][value="25"]'
|
287
|
+
end
|
288
|
+
|
289
|
+
should 'create a input hidden tag with a field' do
|
290
|
+
html = hidden_field(:user, :external_id, :value => 25)
|
291
|
+
assert_select_in html, 'input#user_external_id[type="hidden"][name=?][value="25"]', 'user[external_id]'
|
292
|
+
end
|
293
|
+
|
294
|
+
should 'create a hidden field tag without a field with custom class' do
|
295
|
+
html = hidden_field(:external_id, :class => 'required', :value => 25)
|
296
|
+
assert_select_in html, 'input#external_id.required[type="hidden"][name="external_id"][value="25"]'
|
297
|
+
end
|
298
|
+
|
299
|
+
should 'create a hidden field tag with a field with custom class' do
|
300
|
+
html = hidden_field(:user, :external_id, :class => 'required', :value => 25)
|
301
|
+
assert_select_in html, 'input#user_external_id.required[type="hidden"][name=?][value="25"]', 'user[external_id]'
|
302
|
+
end
|
303
|
+
|
304
|
+
should 'create a hidden field tag with value set by params when no field provided' do
|
305
|
+
@params = {:external_id => '3987'}.with_indifferent_access
|
306
|
+
html = hidden_field(:external_id)
|
307
|
+
assert_select_in html, 'input#external_id[type="hidden"][name="external_id"][value="3987"]'
|
308
|
+
end
|
309
|
+
|
310
|
+
should 'create a hidden field tag with value set by params' do
|
311
|
+
@params = {:user => {:external_id => '3987'}.with_indifferent_access}.with_indifferent_access
|
312
|
+
html = hidden_field(:user, :external_id)
|
313
|
+
assert_select_in html, 'input#user_external_id[type="hidden"][name=?][value="3987"]', 'user[external_id]'
|
314
|
+
end
|
315
|
+
|
316
|
+
should 'create a hidden field tag with value set by object when provided' do
|
317
|
+
user = User.new
|
318
|
+
user.external_id = "3987"
|
319
|
+
|
320
|
+
html = hidden_field(user, :external_id)
|
321
|
+
assert_select_in html, 'input#user_external_id[type="hidden"][name=?][value="3987"]', 'user[external_id]'
|
322
|
+
end
|
323
|
+
|
324
|
+
teardown do
|
325
|
+
@param = nil
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
context 'checkbox field helper' do
|
330
|
+
setup do
|
331
|
+
@params = {}
|
332
|
+
end
|
333
|
+
|
334
|
+
should 'create a input checkbox tag without a field' do
|
335
|
+
html = checkbox_field(:subscribe, :value => 1)
|
336
|
+
assert_select_in html, 'input#subscribe[type="checkbox"][name="subscribe"][value="1"]'
|
337
|
+
end
|
338
|
+
|
339
|
+
should 'require a value option' do
|
340
|
+
assert_raise ArgumentError do
|
341
|
+
checkbox_field(:subscribe)
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
should 'create a input checkbox tag with a field' do
|
346
|
+
html = checkbox_field(:user, :subscribe, :value => 1)
|
347
|
+
assert_select_in html, 'input#user_subscribe[type="checkbox"][name=?][value="1"]', 'user[subscribe]'
|
348
|
+
end
|
349
|
+
|
350
|
+
should 'create a checkbox field tag without a field with custom class' do
|
351
|
+
html = checkbox_field(:subscribe, :value => 1, :class => 'required')
|
352
|
+
assert_select_in html, 'input#subscribe.required[type="checkbox"][name="subscribe"][value="1"]'
|
353
|
+
end
|
354
|
+
|
355
|
+
should 'create a checkbox field tag with a field with custom class' do
|
356
|
+
html = checkbox_field(:user, :subscribe, :value => 1, :class => 'required')
|
357
|
+
assert_select_in html, 'input#user_subscribe.required[type="checkbox"][name=?][value="1"]', 'user[subscribe]'
|
358
|
+
end
|
359
|
+
|
360
|
+
should 'create a checkbox field tag with checked set by params when no field provided' do
|
361
|
+
@params = {:subscribe => 1}.with_indifferent_access
|
362
|
+
html = checkbox_field(:subscribe, :value => 1)
|
363
|
+
assert_select_in html, 'input#subscribe[type="checkbox"][name="subscribe"][value="1"][checked="checked"]'
|
364
|
+
end
|
365
|
+
|
366
|
+
should 'create a checkbox field tag with checked not set when value does not match' do
|
367
|
+
@params = {:subscribe => 2}.with_indifferent_access
|
368
|
+
html = checkbox_field(:subscribe, :value => 1)
|
369
|
+
assert_select_in html, 'input#subscribe[type="checkbox"][name="subscribe"][value="1"]:not([checked])'
|
370
|
+
end
|
371
|
+
|
372
|
+
should 'create a checkbox field tag with checked set by params' do
|
373
|
+
@params = {:user => {:subscribe => 1}.with_indifferent_access}.with_indifferent_access
|
374
|
+
html = checkbox_field(:user, :subscribe, :value => 1)
|
375
|
+
assert_select_in html, 'input#user_subscribe[type="checkbox"][name=?][value="1"][checked="checked"]', 'user[subscribe]'
|
376
|
+
end
|
377
|
+
|
378
|
+
should 'create a checkbox field tag with checked set by object when provided' do
|
379
|
+
user = User.new
|
380
|
+
user.subscribe = 1
|
381
|
+
|
382
|
+
html = checkbox_field(user, :subscribe, :value => 1)
|
383
|
+
assert_select_in html, 'input#user_subscribe[type="checkbox"][name=?][value="1"][checked="checked"]', 'user[subscribe]'
|
384
|
+
end
|
385
|
+
|
386
|
+
context 'multipe values possilbe' do
|
387
|
+
setup do
|
388
|
+
@params = {:user => {:subscribe => ['newsletter']}.with_indifferent_access}.with_indifferent_access
|
389
|
+
end
|
390
|
+
|
391
|
+
should 'craete a checkbox field tag with checked set if value is in param values' do
|
392
|
+
html = checkbox_field(:user, :subscribe, :value => 'newsletter')
|
393
|
+
assert_select_in html, 'input#user_subscribe[type="checkbox"][name=?][value="newsletter"][checked="checked"]', 'user[subscribe]'
|
394
|
+
end
|
395
|
+
|
396
|
+
should 'craete a checkbox field tag with checked not set if value is not in param values' do
|
397
|
+
html = checkbox_field(:user, :subscribe, :value => 'updates')
|
398
|
+
assert_select_in html, 'input#user_subscribe[type="checkbox"][name=?][value="updates"]:not([checked])', 'user[subscribe]'
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
teardown do
|
403
|
+
@param = nil
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
|
408
|
+
context 'radio button helper' do
|
409
|
+
setup do
|
410
|
+
@params = {}
|
411
|
+
end
|
412
|
+
|
413
|
+
should 'create a input radio tag without a field' do
|
414
|
+
html = radio_button(:gender, :value => 'male')
|
415
|
+
assert_select_in html, 'input#gender[type="radio"][name="gender"][value="male"]'
|
416
|
+
end
|
417
|
+
|
418
|
+
should 'require a value option' do
|
419
|
+
assert_raise ArgumentError do
|
420
|
+
radio_button(:gender)
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
424
|
+
should 'create a input radio tag with a field' do
|
425
|
+
html = radio_button(:user, :gender, :value => 'male')
|
426
|
+
assert_select_in html, 'input#user_gender[type="radio"][name=?][value="male"]', 'user[gender]'
|
427
|
+
end
|
428
|
+
|
429
|
+
should 'create a radio field tag without a field with custom class' do
|
430
|
+
html = radio_button(:gender, :value => "male", :class => 'required')
|
431
|
+
assert_select_in html, 'input#gender.required[type="radio"][name="gender"][value="male"]'
|
432
|
+
end
|
433
|
+
|
434
|
+
should 'create a radio field tag with a field with custom class' do
|
435
|
+
html = radio_button(:user, :gender, :value => "male", :class => 'required')
|
436
|
+
assert_select_in html, 'input#user_gender.required[type="radio"][name=?][value="male"]', 'user[gender]'
|
437
|
+
end
|
438
|
+
|
439
|
+
should 'create a radio field tag with checked set by params when no field provided' do
|
440
|
+
@params = {:gender => "male"}.with_indifferent_access
|
441
|
+
html = radio_button(:gender, :value => "male")
|
442
|
+
assert_select_in html, 'input#gender[type="radio"][name="gender"][value="male"][checked="checked"]'
|
443
|
+
end
|
444
|
+
|
445
|
+
should 'create a radio field tag with checked not set when value does not match' do
|
446
|
+
@params = {:gender => 'female'}.with_indifferent_access
|
447
|
+
html = radio_button(:gender, :value => "male")
|
448
|
+
assert_select_in html, 'input#gender[type="radio"][name="gender"][value="male"]:not([checked])'
|
449
|
+
end
|
450
|
+
|
451
|
+
should 'create a radio field tag with checked set by params' do
|
452
|
+
@params = {:user => {:gender => "male"}.with_indifferent_access}.with_indifferent_access
|
453
|
+
html = radio_button(:user, :gender, :value => "male")
|
454
|
+
assert_select_in html, 'input#user_gender[type="radio"][name=?][value="male"][checked="checked"]', 'user[gender]'
|
455
|
+
end
|
456
|
+
|
457
|
+
should 'create a radio field tag with checked set by object when provided' do
|
458
|
+
user = User.new
|
459
|
+
user.gender = "male"
|
460
|
+
|
461
|
+
html = radio_button(user, :gender, :value => "male")
|
462
|
+
assert_select_in html, 'input#user_gender[type="radio"][name=?][value="male"][checked="checked"]', 'user[gender]'
|
463
|
+
end
|
464
|
+
|
465
|
+
teardown do
|
466
|
+
@param = nil
|
467
|
+
end
|
468
|
+
end
|
469
|
+
|
470
|
+
context 'select field helper' do
|
471
|
+
setup do
|
472
|
+
@params = {}
|
473
|
+
end
|
474
|
+
|
475
|
+
should 'require an items argument' do
|
476
|
+
assert_raise ArgumentError do
|
477
|
+
select_field(:membership_type)
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
should 'create a select tag with options' do
|
482
|
+
html = select_field(:membership_type, ['Lifetime', '1 Month', '1 Year'])
|
483
|
+
|
484
|
+
assert_select_in html, 'select#membership_type[name="membership_type"]'
|
485
|
+
assert_select_in html, 'select#membership_type > option', 'Lifetime'
|
486
|
+
assert_select_in html, 'select#membership_type > option', '1 Month'
|
487
|
+
assert_select_in html, 'select#membership_type > option', '1 Year'
|
488
|
+
end
|
489
|
+
|
490
|
+
should 'create a select tag with options from an array of arrays' do
|
491
|
+
html = select_field(:membership_type, [['Lifetime', 1], ['1 Month', 2], ['1 Year', 3]])
|
492
|
+
|
493
|
+
assert_select_in html, 'select#membership_type[name="membership_type"]'
|
494
|
+
assert_select_in html, 'select#membership_type > option[value="1"]', 'Lifetime'
|
495
|
+
assert_select_in html, 'select#membership_type > option[value="2"]', '1 Month'
|
496
|
+
assert_select_in html, 'select#membership_type > option[value="3"]', '1 Year'
|
497
|
+
end
|
498
|
+
|
499
|
+
should 'create a select tag with options from a hash' do
|
500
|
+
html = select_field(:membership_type, {'Lifetime' => 1, '1 Month' => 2, '1 Year' => 3})
|
501
|
+
|
502
|
+
assert_select_in html, 'select#membership_type[name="membership_type"]'
|
503
|
+
assert_select_in html, 'select#membership_type > option[value="1"]', 'Lifetime'
|
504
|
+
assert_select_in html, 'select#membership_type > option[value="2"]', '1 Month'
|
505
|
+
assert_select_in html, 'select#membership_type > option[value="3"]', '1 Year'
|
506
|
+
end
|
507
|
+
|
508
|
+
should 'create a select tag with object and field' do
|
509
|
+
html = select_field(:user, :membership_type, ['Lifetime', '1 Month', '1 Year'])
|
510
|
+
assert_select_in html, 'select#user_membership_type[name=?]', 'user[membership_type]'
|
511
|
+
end
|
512
|
+
|
513
|
+
should 'create a select tag with custom class' do
|
514
|
+
html = select_field(:membership_type, ['Lifetime', '1 Month', '1 Year'], :class => 'required')
|
515
|
+
assert_select_in html, 'select#membership_type.required[name="membership_type"]'
|
516
|
+
end
|
517
|
+
|
518
|
+
should 'create a select tag with object and field with custom class' do
|
519
|
+
html = select_field(:user, :membership_type, ['Lifetime', '1 Month', '1 Year'], :class => 'required')
|
520
|
+
assert_select_in html, 'select#user_membership_type.required[name=?]', 'user[membership_type]'
|
521
|
+
end
|
522
|
+
|
523
|
+
should 'create a select tag with value from params' do
|
524
|
+
@params = {:membership_type => '1 Year'}.with_indifferent_access
|
525
|
+
html = select_field(:membership_type, ['Lifetime', '1 Month', '1 Year'])
|
526
|
+
assert_select_in html, 'select#membership_type[name="membership_type"] > option[selected="selected"]', '1 Year'
|
527
|
+
end
|
528
|
+
|
529
|
+
should 'create a select tag with object and field with value from params' do
|
530
|
+
@params = {:user => {:membership_type => '1 Year'}.with_indifferent_access}.with_indifferent_access
|
531
|
+
html = select_field(:user, :membership_type, ['Lifetime', '1 Month', '1 Year'])
|
532
|
+
assert_select_in html, 'select#user_membership_type > option[selected="selected"]', '1 Year'
|
533
|
+
end
|
534
|
+
|
535
|
+
should 'create a select tag with object and field with value from object' do
|
536
|
+
user = User.new
|
537
|
+
user.membership_type = '1 Year'
|
538
|
+
|
539
|
+
html = select_field(user, :membership_type, ['Lifetime', '1 Month', '1 Year'])
|
540
|
+
assert_select_in html, 'select#user_membership_type > option[selected="selected"]', '1 Year'
|
541
|
+
end
|
542
|
+
|
543
|
+
teardown do
|
544
|
+
@param = nil
|
545
|
+
end
|
546
|
+
end
|
547
|
+
|
548
|
+
context 'image tag helper' do
|
549
|
+
should 'create an image tag for an image in the standard location' do
|
550
|
+
html = image_tag('button.jpg')
|
551
|
+
assert_select_in html, 'img[src="/images/button.jpg"]'
|
552
|
+
end
|
553
|
+
|
554
|
+
should 'create an image tag for an image in the standard location with options' do
|
555
|
+
html = image_tag('button.jpg', :alt => 'Action', :class => 'rounded')
|
556
|
+
assert_select_in html, 'img.rounded[src="/images/button.jpg"][alt="Action"]'
|
557
|
+
end
|
558
|
+
|
559
|
+
should 'create an image tag for an image in a custom location' do
|
560
|
+
html = image_tag('/icons/button.jpg')
|
561
|
+
assert_select_in html, 'img[src="/icons/button.jpg"]'
|
562
|
+
end
|
563
|
+
|
564
|
+
should 'create an image tag for an image on another server' do
|
565
|
+
html = image_tag('http://www.example.com/buttons/close.jpg')
|
566
|
+
assert_select_in html, 'img[src="http://www.example.com/buttons/close.jpg"]'
|
567
|
+
end
|
568
|
+
end
|
569
|
+
|
570
|
+
context 'javascript include tag helper' do
|
571
|
+
should 'create a script tag for a javascript file in the standard location' do
|
572
|
+
html = javascript_include_tag('jquery')
|
573
|
+
assert_select_in html, 'script[src="/javascripts/jquery.js"]'
|
574
|
+
end
|
575
|
+
|
576
|
+
should 'create multiple script tags for javascript files in multiple locations' do
|
577
|
+
html = javascript_include_tag('jquery', 'facebox')
|
578
|
+
assert_select_in html, 'script[src="/javascripts/jquery.js"]'
|
579
|
+
assert_select_in html, 'script[src="/javascripts/facebox.js"]'
|
580
|
+
end
|
581
|
+
|
582
|
+
should 'create a script tag for a javascript file in a custom location' do
|
583
|
+
html = javascript_include_tag('/scripts/custom.js')
|
584
|
+
assert_select_in html, 'script[src="/scripts/custom.js"]'
|
585
|
+
end
|
586
|
+
|
587
|
+
should 'create a script tag for a javascript file on another server' do
|
588
|
+
html = javascript_include_tag('http://www.example.com/js/prototype.js')
|
589
|
+
assert_select_in html, 'script[src="http://www.example.com/js/prototype.js"]'
|
590
|
+
end
|
591
|
+
end
|
592
|
+
|
593
|
+
context 'stylesheet link tag helper' do
|
594
|
+
should 'create a link tag for a stylesheet file in the standard location' do
|
595
|
+
html = stylesheet_link_tag('global')
|
596
|
+
assert_select_in html, 'link[href="/stylesheets/global.css"][rel="stylesheet"][type="text/css"][media="screen"]'
|
597
|
+
end
|
598
|
+
|
599
|
+
should 'create a link tag for a stylesheet file in the standard location with media attribute' do
|
600
|
+
html = stylesheet_link_tag('print', :media => 'print')
|
601
|
+
assert_select_in html, 'link[href="/stylesheets/print.css"][rel="stylesheet"][type="text/css"][media="print"]'
|
602
|
+
end
|
603
|
+
|
604
|
+
should 'create multiple link tags for stylesheet files in multiple locations' do
|
605
|
+
html = stylesheet_link_tag('global', 'print')
|
606
|
+
assert_select_in html, 'link[href="/stylesheets/global.css"][rel="stylesheet"][type="text/css"]'
|
607
|
+
assert_select_in html, 'link[href="/stylesheets/print.css"][rel="stylesheet"][type="text/css"]'
|
608
|
+
end
|
609
|
+
|
610
|
+
should 'create a link tag for a stylesheet file in a custom location' do
|
611
|
+
html = stylesheet_link_tag('/styles/custom.css')
|
612
|
+
assert_select_in html, 'link[href="/styles/custom.css"][rel="stylesheet"][type="text/css"][media="screen"]'
|
613
|
+
end
|
614
|
+
|
615
|
+
should 'create a link tag for a stylesheet file on another server' do
|
616
|
+
html = stylesheet_link_tag('http://www.example.com/css/sample.css')
|
617
|
+
assert_select_in html, 'link[href="http://www.example.com/css/sample.css"][rel="stylesheet"][type="text/css"][media="screen"]'
|
618
|
+
end
|
619
|
+
end
|
620
|
+
|
621
|
+
end
|