merb-helpers 1.0.15 → 1.1.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/README +6 -5
- data/Rakefile +56 -64
- data/lib/merb-helpers/core_ext/numeric.rb +3 -2
- data/lib/merb-helpers/core_ext.rb +2 -1
- data/lib/merb-helpers/date_time_formatting.rb +1 -1
- data/lib/merb-helpers/date_time_helpers.rb +18 -18
- data/lib/merb-helpers/form/builder.rb +14 -10
- data/lib/merb-helpers/form/helpers.rb +1 -1
- data/lib/merb-helpers/form_helpers.rb +5 -2
- data/lib/merb-helpers/version.rb +5 -0
- data/lib/merb-helpers.rb +5 -3
- data/spec/core_ext_spec.rb +1 -1
- data/spec/fixture/app/models/namespaced_generic_fake_model.rb +7 -0
- data/spec/fixture/app/views/bound_radio_group_specs/basic.html.erb +1 -1
- data/spec/fixture/app/views/bound_radio_group_specs/mixed.html.erb +2 -2
- data/spec/fixture/app/views/form_for_specs/advanced.html.erb +3 -0
- data/spec/fixture/app/views/hacker/radio_group.html.erb +1 -1
- data/spec/fixture/config/router.rb +4 -4
- data/spec/merb_helpers_date_time_spec.rb +11 -3
- data/spec/merb_helpers_form_spec.rb +41 -18
- data/spec/merb_helpers_tag_helper_spec.rb +1 -1
- data/spec/merb_helpers_text_spec.rb +1 -1
- data/spec/numeric_extlib_spec.rb +2 -1
- data/spec/ordinalize_spec.rb +1 -1
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +17 -16
- data/spec/time_dsl_spec.rb +1 -1
- metadata +54 -23
- data/spec/merb_helpers_config_spec.rb +0 -82
- data/spec/merb_test.log +0 -504
data/README
CHANGED
@@ -5,13 +5,14 @@ A plugin for the Merb Web framework that provides different view helpers.
|
|
5
5
|
|
6
6
|
To use this plugin in merb in your app
|
7
7
|
|
8
|
-
|
8
|
+
edit:
|
9
|
+
./Gemfile
|
9
10
|
|
10
|
-
|
11
|
+
add the li:
|
12
|
+
gem "merb-helpers"
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
#...
|
14
|
+
run:
|
15
|
+
gem bundle
|
15
16
|
|
16
17
|
# TODO: describe date_time_helpers, form_helpers, tag_helpers
|
17
18
|
|
data/Rakefile
CHANGED
@@ -1,73 +1,65 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
##############################################################################
|
4
|
-
# Package && release
|
5
|
-
##############################################################################
|
6
|
-
RUBY_FORGE_PROJECT = "merb"
|
7
|
-
PROJECT_URL = "http://merbivore.com"
|
8
|
-
PROJECT_SUMMARY = "Helper support for Merb"
|
9
|
-
PROJECT_DESCRIPTION = PROJECT_SUMMARY
|
10
|
-
|
11
|
-
GEM_AUTHOR = "Michael D. Ivey"
|
12
|
-
GEM_EMAIL = "ivey@gweezlebur.com"
|
13
|
-
|
14
|
-
GEM_NAME = "merb-helpers"
|
15
|
-
PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
|
16
|
-
GEM_VERSION = Merb::VERSION + PKG_BUILD
|
17
|
-
|
18
|
-
RELEASE_NAME = "REL #{GEM_VERSION}"
|
19
|
-
|
20
|
-
require "extlib/tasks/release"
|
21
|
-
|
22
|
-
spec = Gem::Specification.new do |s|
|
23
|
-
s.rubyforge_project = RUBY_FORGE_PROJECT
|
24
|
-
s.name = GEM_NAME
|
25
|
-
s.version = GEM_VERSION
|
26
|
-
s.platform = Gem::Platform::RUBY
|
27
|
-
s.has_rdoc = true
|
28
|
-
s.extra_rdoc_files = ["README", "LICENSE", 'TODO']
|
29
|
-
s.summary = PROJECT_SUMMARY
|
30
|
-
s.description = PROJECT_DESCRIPTION
|
31
|
-
s.author = GEM_AUTHOR
|
32
|
-
s.email = GEM_EMAIL
|
33
|
-
s.homepage = PROJECT_URL
|
34
|
-
s.add_dependency('merb-core', "~> #{Merb::VERSION}")
|
35
|
-
s.require_path = 'lib'
|
36
|
-
s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,spec}/**/*")
|
37
|
-
end
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
38
3
|
|
39
|
-
|
40
|
-
|
41
|
-
end
|
4
|
+
# Assume a typical dev checkout to fetch the current merb-core version
|
5
|
+
require File.expand_path('../../merb-core/lib/merb-core/version', __FILE__)
|
42
6
|
|
43
|
-
|
44
|
-
|
45
|
-
Merb::RakeHelper.install(GEM_NAME, :version => GEM_VERSION)
|
46
|
-
end
|
7
|
+
# Load this library's version information
|
8
|
+
require File.expand_path('../lib/merb-helpers/version', __FILE__)
|
47
9
|
|
48
|
-
desc "Uninstall the gem"
|
49
|
-
task :uninstall do
|
50
|
-
Merb::RakeHelper.uninstall(GEM_NAME, :version => GEM_VERSION)
|
51
|
-
end
|
52
10
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
11
|
+
begin
|
12
|
+
|
13
|
+
gem 'jeweler', '~> 1.4'
|
14
|
+
require 'jeweler'
|
15
|
+
|
16
|
+
Jeweler::Tasks.new do |gemspec|
|
17
|
+
|
18
|
+
gemspec.version = Merb::Helpers::VERSION
|
19
|
+
|
20
|
+
gemspec.name = "merb-helpers"
|
21
|
+
gemspec.description = "Merb plugin containing view helpers"
|
22
|
+
gemspec.summary = "Merb plugin that provides helpers for writing HTML templates"
|
23
|
+
|
24
|
+
gemspec.authors = [ "Michael D. Ivey" ]
|
25
|
+
gemspec.email = "ivey@gweezlebur.com"
|
26
|
+
gemspec.homepage = "http://merbivore.com/"
|
27
|
+
|
28
|
+
gemspec.files = %w(LICENSE Rakefile README TODO) + Dir['{lib,spec}/**/*']
|
29
|
+
|
30
|
+
# Runtime dependencies
|
31
|
+
gemspec.add_dependency 'merb-core', "~> #{Merb::VERSION}"
|
32
|
+
|
33
|
+
# Development dependencies
|
34
|
+
gemspec.add_development_dependency 'rspec', '>= 1.2.9'
|
35
|
+
|
57
36
|
end
|
37
|
+
|
38
|
+
Jeweler::GemcutterTasks.new
|
39
|
+
|
40
|
+
rescue LoadError
|
41
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
58
42
|
end
|
59
43
|
|
60
|
-
|
61
|
-
Spec::Rake::SpecTask.new(
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
44
|
+
require 'spec/rake/spectask'
|
45
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
46
|
+
spec.spec_opts << '--options' << 'spec/spec.opts' if File.exists?('spec/spec.opts')
|
47
|
+
spec.libs << 'lib' << 'spec'
|
48
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
49
|
+
end
|
50
|
+
|
51
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
52
|
+
spec.libs << 'lib' << 'spec'
|
53
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
54
|
+
spec.rcov = true
|
70
55
|
end
|
71
56
|
|
72
|
-
|
73
|
-
|
57
|
+
task :default => :spec
|
58
|
+
|
59
|
+
require 'rake/rdoctask'
|
60
|
+
Rake::RDocTask.new do |rdoc|
|
61
|
+
rdoc.rdoc_dir = 'rdoc'
|
62
|
+
rdoc.title = "test_gem #{Merb::Helpers::VERSION}"
|
63
|
+
rdoc.rdoc_files.include('README*')
|
64
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
65
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
class Numeric
|
2
3
|
module Transformer
|
3
4
|
|
@@ -36,7 +37,7 @@ class Numeric
|
|
36
37
|
:separator => '.'
|
37
38
|
},
|
38
39
|
:currency => {
|
39
|
-
:unit => '
|
40
|
+
:unit => '$',
|
40
41
|
:format => '%u%n',
|
41
42
|
:precision => 2
|
42
43
|
}
|
@@ -385,4 +386,4 @@ class Numeric
|
|
385
386
|
end
|
386
387
|
|
387
388
|
|
388
|
-
end
|
389
|
+
end
|
@@ -151,6 +151,6 @@ module OrdinalizedFormatting
|
|
151
151
|
# ==== Examples
|
152
152
|
# 5.days.ago.strftime_ordinalized('%b %d, %Y') # =>
|
153
153
|
def strftime_ordinalized(fmt, format=nil)
|
154
|
-
strftime(fmt.gsub(/(^|[^-])%d/, '\1_%d_')).gsub(/_(\d+)_/) {
|
154
|
+
strftime(fmt.gsub(/(^|[^-])%d/, '\1_%d_')).gsub(/_(\d+)_/) { $1.to_i.ordinalize }
|
155
155
|
end
|
156
156
|
end
|
@@ -80,13 +80,13 @@ module Merb
|
|
80
80
|
relative_date(times.first)
|
81
81
|
else
|
82
82
|
first = times.first; last = times.last; now = DateAndTime.time_class.now
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
83
|
+
str = first.strftime_ordinalized('%b %d')
|
84
|
+
str << ", #{first.year}" unless first.year == last.year
|
85
|
+
str << ' - '
|
86
|
+
str << last.strftime('%b') << ' ' unless first.year == last.year && first.month == last.month
|
87
|
+
str << last.day.ordinalize
|
88
|
+
str << ", #{last.year}" unless first.year == last.year && last.year == now.year
|
89
|
+
str
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
@@ -114,17 +114,17 @@ module Merb
|
|
114
114
|
|
115
115
|
else
|
116
116
|
first = times.first; last = times.last; now = DateAndTime.time_class.now
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
117
|
+
str = prettier_time(first)
|
118
|
+
str << ' '
|
119
|
+
str << first.strftime_ordinalized('%b %d')
|
120
|
+
str << ", #{first.year}" unless first.year == last.year
|
121
|
+
str << ' - '
|
122
|
+
str << prettier_time(last)
|
123
|
+
str << ' '
|
124
|
+
str << last.strftime('%b') << ' ' unless first.year == last.year && first.month == last.month
|
125
|
+
str << last.day.ordinalize
|
126
|
+
str << ", #{last.year}" unless first.year == last.year && last.year == now.year
|
127
|
+
str.to_s
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
@@ -1,4 +1,6 @@
|
|
1
|
-
load File.dirname(__FILE__) / ".." / "tag_helpers.rb"
|
1
|
+
#load File.dirname(__FILE__) / ".." / "tag_helpers.rb"
|
2
|
+
|
3
|
+
require 'merb-helpers/tag_helpers'
|
2
4
|
|
3
5
|
module Merb::Helpers::Form::Builder
|
4
6
|
|
@@ -116,7 +118,7 @@ module Merb::Helpers::Form::Builder
|
|
116
118
|
|
117
119
|
def submit(value, attrs)
|
118
120
|
attrs[:type] ||= "submit"
|
119
|
-
attrs[:name] ||= "
|
121
|
+
attrs[:name] ||= "form_submit"
|
120
122
|
attrs[:value] ||= value
|
121
123
|
update_unbound_controls(attrs, "submit")
|
122
124
|
self_closing_tag(:input, attrs)
|
@@ -131,7 +133,7 @@ module Merb::Helpers::Form::Builder
|
|
131
133
|
attrs[:method] = :post unless attrs[:method] == :get
|
132
134
|
# Use a fake PUT if the object is not new, otherwise use the method
|
133
135
|
# passed in. Defaults to :post if no method is set.
|
134
|
-
method ||= (@obj.respond_to?(:
|
136
|
+
method ||= (@obj.respond_to?(:new_record?) && !@obj.new_record?) ? :put : :post
|
135
137
|
|
136
138
|
attrs[:enctype] = "multipart/form-data" if attrs.delete(:multipart) || @multipart
|
137
139
|
|
@@ -140,7 +142,7 @@ module Merb::Helpers::Form::Builder
|
|
140
142
|
|
141
143
|
# This can be overridden to use another method to fake out methods
|
142
144
|
def fake_out_method(attrs, method)
|
143
|
-
|
145
|
+
unbound_hidden_field(:name => "_method", :value => method)
|
144
146
|
end
|
145
147
|
|
146
148
|
def update_bound_controls(method, attrs, type)
|
@@ -375,8 +377,7 @@ module Merb::Helpers::Form::Builder
|
|
375
377
|
|
376
378
|
def update_unbound_controls(attrs, type)
|
377
379
|
if attrs[:name] && !attrs[:id]
|
378
|
-
|
379
|
-
attrs.merge!(:id => attrs[:name].to_s.gsub(/(\[|\])/, '_'))
|
380
|
+
attrs.merge!(:id => valid_xhtml_id(attrs[:name]))
|
380
381
|
end
|
381
382
|
case type
|
382
383
|
when "text", "radio", "password", "hidden", "checkbox", "file"
|
@@ -385,6 +386,10 @@ module Merb::Helpers::Form::Builder
|
|
385
386
|
super
|
386
387
|
end
|
387
388
|
|
389
|
+
def valid_xhtml_id(candidate)
|
390
|
+
candidate.to_s.gsub(/(\[|\])/, '_')
|
391
|
+
end
|
392
|
+
|
388
393
|
def radio_group_item(method, attrs)
|
389
394
|
unless attrs[:id]
|
390
395
|
attrs.merge!(:id => "#{@name}_#{method}_#{attrs[:value]}")
|
@@ -400,21 +405,20 @@ module Merb::Helpers::Form::Builder
|
|
400
405
|
obj ||= @obj
|
401
406
|
return "" unless obj.respond_to?(:errors)
|
402
407
|
|
403
|
-
|
404
|
-
errors = sequel ? obj.errors.full_messages : obj.errors
|
408
|
+
errors = obj.errors
|
405
409
|
|
406
410
|
return "" if errors.empty?
|
407
411
|
|
408
412
|
header_message = header % [errors.size, errors.size == 1 ? "" : "s"]
|
409
413
|
markup = %Q{<div class='#{error_class}'>#{header_message}<ul>}
|
410
|
-
errors.each {|err| markup << (build_li %
|
414
|
+
errors.each {|err| markup << (build_li % err.join(" "))}
|
411
415
|
markup << %Q{</ul></div>}
|
412
416
|
end
|
413
417
|
|
414
418
|
private
|
415
419
|
|
416
420
|
def update_bound_controls(method, attrs, type)
|
417
|
-
if @obj && !@obj.errors
|
421
|
+
if @obj && !@obj.errors[method.to_sym].blank?
|
418
422
|
add_css_class(attrs, "error")
|
419
423
|
end
|
420
424
|
super
|
@@ -20,7 +20,7 @@ module Merb::Helpers::Form
|
|
20
20
|
if name.is_a?(String) || name.is_a?(Symbol)
|
21
21
|
ivar = instance_variable_get("@#{name}")
|
22
22
|
else
|
23
|
-
ivar, name = name, name.class.to_s.snake_case
|
23
|
+
ivar, name = name, name.class.to_s.snake_case.split('::').last
|
24
24
|
end
|
25
25
|
builder ||= current_form_context.class if current_form_context
|
26
26
|
(builder || self._default_builder).new(ivar, name, self)
|
@@ -1,5 +1,8 @@
|
|
1
|
-
load File.dirname(__FILE__) / "form" / "helpers.rb"
|
2
|
-
load File.dirname(__FILE__) / "form" / "builder.rb"
|
1
|
+
#load File.dirname(__FILE__) / "form" / "helpers.rb"
|
2
|
+
#load File.dirname(__FILE__) / "form" / "builder.rb"
|
3
|
+
|
4
|
+
require 'merb-helpers/form/helpers'
|
5
|
+
require 'merb-helpers/form/builder'
|
3
6
|
|
4
7
|
module Merb::GlobalHelpers
|
5
8
|
include Merb::Helpers::Form
|
data/lib/merb-helpers.rb
CHANGED
@@ -6,9 +6,10 @@ module Merb
|
|
6
6
|
@@helpers_files = Dir["#{@@helpers_dir}/*_helpers.rb"].collect {|h| h.match(/\/(\w+)\.rb/)[1]}
|
7
7
|
|
8
8
|
def self.load
|
9
|
-
|
10
|
-
require
|
11
|
-
require
|
9
|
+
|
10
|
+
require 'merb-helpers/time_dsl'
|
11
|
+
require 'merb-helpers/core_ext'
|
12
|
+
require 'merb-helpers/core_ext/numeric'
|
12
13
|
|
13
14
|
if Merb::Plugins.config[:merb_helpers]
|
14
15
|
config = Merb::Plugins.config[:merb_helpers]
|
@@ -28,6 +29,7 @@ module Merb
|
|
28
29
|
|
29
30
|
# Load only specific helpers instead of loading all the helpers
|
30
31
|
def self.load_helpers(helpers = @@helpers_files)
|
32
|
+
helpers = helpers.is_a?(Array) ? helpers : [helpers]
|
31
33
|
helpers.each {|helper| Kernel.load(File.join(@@helpers_dir, "#{helper}.rb") )} # using load here allows specs to work
|
32
34
|
end
|
33
35
|
|
data/spec/core_ext_spec.rb
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
# See merb/specs/merb/router.rb for a fairly complete usage sample.
|
21
21
|
|
22
22
|
Merb.logger.info("Compiling routes...")
|
23
|
-
Merb::Router.prepare do
|
23
|
+
Merb::Router.prepare do
|
24
24
|
# RESTful routes
|
25
25
|
# r.resources :posts
|
26
26
|
resources :fake_models
|
@@ -31,8 +31,8 @@ Merb::Router.prepare do |r|
|
|
31
31
|
# This is fine for most cases. If you're heavily using resource-based
|
32
32
|
# routes, you may want to comment/remove this line to prevent
|
33
33
|
# clients from calling your create or destroy actions with a GET
|
34
|
-
|
34
|
+
default_routes
|
35
35
|
|
36
36
|
# Change this for your home page to be available at /
|
37
|
-
#
|
38
|
-
end
|
37
|
+
# match('/').to(:controller => 'whatever', :action =>'index')
|
38
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "relative_date" do
|
4
4
|
include Merb::Helpers::DateAndTime
|
@@ -237,11 +237,19 @@ describe "Date" do
|
|
237
237
|
end
|
238
238
|
|
239
239
|
it "Should do to_time conversion to utc by default" do
|
240
|
-
|
240
|
+
if RUBY_VERSION < "1.9"
|
241
|
+
@date.to_time.to_s.should == 'Fri Nov 02 00:00:00 UTC 2007'
|
242
|
+
else
|
243
|
+
@date.to_time.to_s.should == '2007-11-02 00:00:00 UTC'
|
244
|
+
end
|
241
245
|
end
|
242
246
|
|
243
247
|
it "Should do to_time conversion to utc when param :utc is given" do
|
244
|
-
|
248
|
+
if RUBY_VERSION < "1.9"
|
249
|
+
@date.to_time(:utc).to_s.should == 'Fri Nov 02 00:00:00 UTC 2007'
|
250
|
+
else
|
251
|
+
@date.to_time(:utc).to_s.should == '2007-11-02 00:00:00 UTC'
|
252
|
+
end
|
245
253
|
end
|
246
254
|
|
247
255
|
it "Should do to_time conversion to local time when param :local is given" do
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
# Quick rundown of how these specs work
|
4
4
|
# please read before hacking on this plugin
|
@@ -49,8 +49,7 @@ describe "error_messages_for" do
|
|
49
49
|
@dm_obj = Object.new
|
50
50
|
@sq_obj = Object.new
|
51
51
|
@dm_errors = [["foo", "bar"],["baz","bat"]]
|
52
|
-
@sq_errors =
|
53
|
-
@sq_errors.stub!(:full_messages).and_return(["foo", "baz"])
|
52
|
+
@sq_errors = {:foo => ["bar"],:baz => ["bat"]}
|
54
53
|
@dm_obj.stub!(:errors).and_return(@dm_errors)
|
55
54
|
@dm_obj.stub!(:new_record?).and_return(false)
|
56
55
|
@sq_obj.stub!(:errors).and_return(@sq_errors)
|
@@ -67,8 +66,8 @@ describe "error_messages_for" do
|
|
67
66
|
it "should build default error messages for Sequel-like models" do
|
68
67
|
errs = @c.error_messages_for(@sq_obj)
|
69
68
|
errs.should include("<h2>Form submission failed because of 2 problems</h2>")
|
70
|
-
errs.should include("<li>foo</li>")
|
71
|
-
errs.should include("<li>baz</li>")
|
69
|
+
errs.should include("<li>foo bar</li>")
|
70
|
+
errs.should include("<li>baz bat</li>")
|
72
71
|
end
|
73
72
|
|
74
73
|
# it "should build default error messages for symbol" do
|
@@ -132,13 +131,13 @@ describe "form" do
|
|
132
131
|
it "should fake out the put method if set" do
|
133
132
|
ret = @c.render(:fake_put_if_set)
|
134
133
|
ret.should have_selector("form[method=post]")
|
135
|
-
ret.should have_selector("input[type=hidden][name=_method][value=put]")
|
134
|
+
ret.should have_selector("input[type=hidden][name=_method][value=put][class=hidden]")
|
136
135
|
end
|
137
136
|
|
138
137
|
it "should fake out the delete method if set" do
|
139
138
|
ret = @c.render(:fake_delete_if_set)
|
140
139
|
ret.should have_selector("form[method=post]")
|
141
|
-
ret.should have_selector("input[type=hidden][name=_method][value=delete]")
|
140
|
+
ret.should have_selector("input[type=hidden][name=_method][value=delete][class=hidden]")
|
142
141
|
end
|
143
142
|
|
144
143
|
# TODO: Why is this required?
|
@@ -187,6 +186,13 @@ describe "form_for" do
|
|
187
186
|
form.should_not have_selector("input[type=hidden][name=_method]")
|
188
187
|
end
|
189
188
|
|
189
|
+
it "should use POST if the object passed in is nil" do
|
190
|
+
@c.instance_variable_set(:@obj, nil)
|
191
|
+
form = @c.render :advanced
|
192
|
+
form.should have_selector("form[method=post]")
|
193
|
+
form.should_not have_selector("input[type=hidden][value=put][name=_method]")
|
194
|
+
end
|
195
|
+
|
190
196
|
it "should support PUT if the object passed in is not a new_record? via a hidden field" do
|
191
197
|
form = @c.render :basic
|
192
198
|
form.should have_selector("form[method=post]")
|
@@ -226,6 +232,13 @@ describe "fields_for" do
|
|
226
232
|
r = @c.render :midstream
|
227
233
|
r.should have_selector("input[id=fake_model_foo][name='fake_model[foo]'][type=text][extra=true]")
|
228
234
|
end
|
235
|
+
|
236
|
+
it "should be able to handle namespaced models by setting name attribute to concrete class name" do
|
237
|
+
@c.instance_variable_set(:@obj2, MyNamespace::NamespacedFakeModel.new)
|
238
|
+
r = @c.render :midstream
|
239
|
+
r.should have_selector("input[type=text][value=foowee]")
|
240
|
+
r.should have_selector("input[name='namespaced_fake_model[foo]'][type=text][value=named_foo]")
|
241
|
+
end
|
229
242
|
end
|
230
243
|
|
231
244
|
describe "text_field" do
|
@@ -273,6 +286,12 @@ describe "bound_text_field" do
|
|
273
286
|
r.should have_selector("input[type=text][id=fake_model_foo][name='fake_model[foo]'][value=foowee]")
|
274
287
|
end
|
275
288
|
|
289
|
+
it "should take a namespaced model and return correct fieldname" do
|
290
|
+
@c.instance_variable_set(:@obj, MyNamespace::NamespacedFakeModel.new)
|
291
|
+
r = @c.render :basic
|
292
|
+
r.should have_selector("input[type=text][id=namespaced_fake_model_foo][name='namespaced_fake_model[foo]'][value=named_foo]")
|
293
|
+
end
|
294
|
+
|
276
295
|
it "should take additional attributes and use them" do
|
277
296
|
r = @c.render :basic
|
278
297
|
r.should have_selector("input[type=text][name='fake_model[foo]'][value=foowee][bar='7']")
|
@@ -300,7 +319,7 @@ describe "bound_text_field" do
|
|
300
319
|
model.stub!(:class).and_return("MyClass")
|
301
320
|
model.stub!(:foo).and_return("FOO")
|
302
321
|
errors = mock("errors")
|
303
|
-
errors.should_receive(:
|
322
|
+
errors.should_receive(:[]).with(:foo).and_return(true)
|
304
323
|
|
305
324
|
model.stub!(:errors).and_return(errors)
|
306
325
|
@c.instance_variable_set(:@obj, model)
|
@@ -348,7 +367,7 @@ describe "bound_radio_button" do
|
|
348
367
|
model.stub!(:class).and_return("MyClass")
|
349
368
|
model.stub!(:foo).and_return("FOO")
|
350
369
|
errors = mock("errors")
|
351
|
-
errors.should_receive(:
|
370
|
+
errors.should_receive(:[]).with(:foo).and_return(true)
|
352
371
|
|
353
372
|
model.stub!(:errors).and_return(errors)
|
354
373
|
@c.instance_variable_set(:@obj, model)
|
@@ -419,7 +438,7 @@ describe "bound_password_field" do
|
|
419
438
|
model.stub!(:class).and_return("MyClass")
|
420
439
|
model.stub!(:foo).and_return("FOO")
|
421
440
|
errors = mock("errors")
|
422
|
-
errors.should_receive(:
|
441
|
+
errors.should_receive(:[]).with(:foo).and_return(true)
|
423
442
|
|
424
443
|
model.stub!(:errors).and_return(errors)
|
425
444
|
|
@@ -583,8 +602,8 @@ describe "bound_check_box" do
|
|
583
602
|
model.stub!(:baz).and_return("BAZ")
|
584
603
|
model.stub!(:bat).and_return("BAT")
|
585
604
|
errors = mock("errors")
|
586
|
-
errors.should_receive(:
|
587
|
-
errors.should_receive(:
|
605
|
+
errors.should_receive(:[]).with(:baz).and_return(true)
|
606
|
+
errors.should_receive(:[]).with(:bat).and_return(true)
|
588
607
|
|
589
608
|
model.stub!(:errors).and_return(errors)
|
590
609
|
|
@@ -619,11 +638,16 @@ describe "hidden_field" do
|
|
619
638
|
@c = HiddenFieldSpecs.new(Merb::Request.new({}))
|
620
639
|
end
|
621
640
|
|
622
|
-
it "should return a basic
|
641
|
+
it "should return a basic hidden field based on the values passed in" do
|
623
642
|
r = @c.render :basic
|
624
643
|
r.should match_tag(:input, :type => "hidden", :id => "foo", :name => "foo", :value => "bar")
|
625
644
|
end
|
626
645
|
|
646
|
+
it "should have class 'hidden' by default" do
|
647
|
+
r = @c.render :basic
|
648
|
+
r.should match_tag(:input, :type => "hidden", :class => 'hidden')
|
649
|
+
end
|
650
|
+
|
627
651
|
it "should not render a label if the :label option is passed in" do
|
628
652
|
res = @c.render :label
|
629
653
|
res.should_not match(/<label>LABEL/)
|
@@ -670,7 +694,7 @@ describe "bound_hidden_field" do
|
|
670
694
|
model.stub!(:class).and_return("MyClass")
|
671
695
|
model.stub!(:foo).and_return("FOO")
|
672
696
|
errors = mock("errors")
|
673
|
-
errors.should_receive(:
|
697
|
+
errors.should_receive(:[]).with(:foo).and_return(true)
|
674
698
|
|
675
699
|
model.stub!(:errors).and_return(errors)
|
676
700
|
|
@@ -788,7 +812,6 @@ describe "bound_radio_group" do
|
|
788
812
|
r = @c.render :basic
|
789
813
|
r.should match_tag(:input, :type => "radio", :id => "fake_model_foo_foowee", :name => "fake_model[foo]", :value => "foowee", :checked => "checked")
|
790
814
|
r.should match_tag(:input, :type => "radio", :id => "fake_model_foo_baree", :name => "fake_model[foo]", :value => "baree")
|
791
|
-
r.should_not match_tag(:checked => "checked")
|
792
815
|
end
|
793
816
|
|
794
817
|
it "should provide an additional label tag for each option in array-based options" do
|
@@ -1093,7 +1116,7 @@ describe "option tags" do
|
|
1093
1116
|
it "should provide selected options by value" do
|
1094
1117
|
r = @c.render :selected
|
1095
1118
|
r.should match_tag( :option, :value => 'rabbit', :selected => 'selected', :content => 'Rabbit' )
|
1096
|
-
r.should_not match_tag( :option, :value => 'chicken', :selected => '', :content => 'Chicken' )
|
1119
|
+
r.should_not match_tag( :option, :value => 'chicken', :selected => 'nil', :content => 'Chicken' )
|
1097
1120
|
end
|
1098
1121
|
|
1099
1122
|
it "should handle arrays for selected when :multiple is true" do
|
@@ -1228,7 +1251,7 @@ describe "submit" do
|
|
1228
1251
|
|
1229
1252
|
it "should provide an additional label tag if the :label option is passed in" do
|
1230
1253
|
r = @c.render :submit_with_label
|
1231
|
-
r.should have_selector("input[type=submit][name=
|
1254
|
+
r.should have_selector("input[type=submit][name=form_submit][value=Done]")
|
1232
1255
|
r.should have_selector("label:contains('LABEL')")
|
1233
1256
|
end
|
1234
1257
|
|
@@ -1379,4 +1402,4 @@ describe "escaping values" do
|
|
1379
1402
|
r.should =~ /&"<>/
|
1380
1403
|
end
|
1381
1404
|
|
1382
|
-
end
|
1405
|
+
end
|
data/spec/numeric_extlib_spec.rb
CHANGED