merb-helpers 1.0.15 → 1.1.0.pre
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/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