mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge branch 'master' of git://github.com/rails/rails
This commit is contained in:
commit
3bf45890b3
26 changed files with 489 additions and 56 deletions
|
@ -305,6 +305,7 @@ module ActionController
|
|||
end
|
||||
|
||||
def add_route(path, options = {})
|
||||
options.each { |k, v| options[k] = v.to_s if [:controller, :action].include?(k) && v.is_a?(Symbol) }
|
||||
route = builder.build(path, options)
|
||||
routes << route
|
||||
route
|
||||
|
|
|
@ -454,6 +454,21 @@ module ActionView
|
|||
end
|
||||
alias_method :path_to_image, :image_path # aliased to avoid conflicts with an image_path named route
|
||||
|
||||
# Computes the path to a video asset in the public videos directory.
|
||||
# Full paths from the document root will be passed through.
|
||||
# Used internally by +video_tag+ to build the video path.
|
||||
#
|
||||
# ==== Examples
|
||||
# video_path("hd") # => /videos/hd
|
||||
# video_path("hd.avi") # => /videos/hd.avi
|
||||
# video_path("trailers/hd.avi") # => /videos/trailers/hd.avi
|
||||
# video_path("/trailers/hd.avi") # => /videos/hd.avi
|
||||
# video_path("http://www.railsapplication.com/vid/hd.avi") # => http://www.railsapplication.com/vid/hd.avi
|
||||
def video_path(source)
|
||||
compute_public_path(source, 'videos')
|
||||
end
|
||||
alias_method :path_to_video, :video_path # aliased to avoid conflicts with an video_path named route
|
||||
|
||||
# Returns an html image tag for the +source+. The +source+ can be a full
|
||||
# path or a file that exists in your public images directory.
|
||||
#
|
||||
|
@ -490,8 +505,8 @@ module ActionView
|
|||
def image_tag(source, options = {})
|
||||
options.symbolize_keys!
|
||||
|
||||
options[:src] = path_to_image(source)
|
||||
options[:alt] ||= File.basename(options[:src], '.*').split('.').first.to_s.capitalize
|
||||
src = options[:src] = path_to_image(source)
|
||||
options[:alt] ||= File.basename(src, '.*').split('.').first.to_s.capitalize
|
||||
|
||||
if size = options.delete(:size)
|
||||
options[:width], options[:height] = size.split("x") if size =~ %r{^\d+x\d+$}
|
||||
|
@ -499,12 +514,64 @@ module ActionView
|
|||
|
||||
if mouseover = options.delete(:mouseover)
|
||||
options[:onmouseover] = "this.src='#{image_path(mouseover)}'"
|
||||
options[:onmouseout] = "this.src='#{image_path(options[:src])}'"
|
||||
options[:onmouseout] = "this.src='#{src}'"
|
||||
end
|
||||
|
||||
tag("img", options)
|
||||
end
|
||||
|
||||
# Returns an html video tag for the +sources+. If +sources+ is a string,
|
||||
# a single video tag will be returned. If +sources+ is an array, a video
|
||||
# tag with nested source tags for each source will be returned. The
|
||||
# +sources+ can be full paths or files that exists in your public videos
|
||||
# directory.
|
||||
#
|
||||
# ==== Options
|
||||
# You can add HTML attributes using the +options+. The +options+ supports
|
||||
# two additional keys for convenience and conformance:
|
||||
#
|
||||
# * <tt>:poster</tt> - Set an image (like a screenshot) to be shown
|
||||
# before the video loads. The path is calculated like the +src+ of +image_tag+.
|
||||
# * <tt>:size</tt> - Supplied as "{Width}x{Height}", so "30x45" becomes
|
||||
# width="30" and height="45". <tt>:size</tt> will be ignored if the
|
||||
# value is not in the correct format.
|
||||
#
|
||||
# ==== Examples
|
||||
# video_tag("trailer") # =>
|
||||
# <video src="/videos/trailer" />
|
||||
# video_tag("trailer.ogg") # =>
|
||||
# <video src="/videos/trailer.ogg" />
|
||||
# video_tag("trailer.ogg", :controls => true, :autobuffer => true) # =>
|
||||
# <video autobuffer="autobuffer" controls="controls" src="/videos/trailer.ogg" />
|
||||
# video_tag("trailer.m4v", :size => "16x10", :poster => "screenshot.png") # =>
|
||||
# <video src="/videos/trailer.m4v" width="16" height="10" poster="/images/screenshot.png" />
|
||||
# video_tag("/trailers/hd.avi", :size => "16x16") # =>
|
||||
# <video src="/trailers/hd.avi" width="16" height="16" />
|
||||
# video_tag("/trailers/hd.avi", :height => '32', :width => '32') # =>
|
||||
# <video height="32" src="/trailers/hd.avi" width="32" />
|
||||
# video_tag(["trailer.ogg", "trailer.flv"]) # =>
|
||||
# <video><source src="trailer.ogg" /><source src="trailer.ogg" /><source src="trailer.flv" /></video>
|
||||
# video_tag(["trailer.ogg", "trailer.flv"] :size => "160x120") # =>
|
||||
# <video height="120" width="160"><source src="trailer.ogg" /><source src="trailer.flv" /></video>
|
||||
def video_tag(sources, options = {})
|
||||
options.symbolize_keys!
|
||||
|
||||
options[:poster] = path_to_image(options[:poster]) if options[:poster]
|
||||
|
||||
if size = options.delete(:size)
|
||||
options[:width], options[:height] = size.split("x") if size =~ %r{^\d+x\d+$}
|
||||
end
|
||||
|
||||
if sources.is_a?(Array)
|
||||
content_tag("video", options) do
|
||||
sources.map { |source| tag("source", :src => source) }.join
|
||||
end
|
||||
else
|
||||
options[:src] = path_to_video(sources)
|
||||
tag("video", options)
|
||||
end
|
||||
end
|
||||
|
||||
def self.cache_asset_timestamps
|
||||
@@cache_asset_timestamps
|
||||
end
|
||||
|
|
|
@ -926,6 +926,7 @@ module ActionView
|
|||
attr_accessor :object_name, :object, :options
|
||||
|
||||
def initialize(object_name, object, template, options, proc)
|
||||
@nested_child_index = {}
|
||||
@object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
|
||||
@default_options = @options ? @options.slice(:index) : {}
|
||||
if @object_name.to_s.match(/\[\]$/)
|
||||
|
@ -1028,7 +1029,7 @@ module ActionView
|
|||
explicit_child_index = args.last[:child_index] if args.last.is_a?(Hash)
|
||||
|
||||
children.map do |child|
|
||||
fields_for_nested_model("#{name}[#{explicit_child_index || nested_child_index}]", child, args, block)
|
||||
fields_for_nested_model("#{name}[#{explicit_child_index || nested_child_index(name)}]", child, args, block)
|
||||
end.join
|
||||
else
|
||||
fields_for_nested_model(name, explicit_object || association, args, block)
|
||||
|
@ -1046,9 +1047,9 @@ module ActionView
|
|||
end
|
||||
end
|
||||
|
||||
def nested_child_index
|
||||
@nested_child_index ||= -1
|
||||
@nested_child_index += 1
|
||||
def nested_child_index(name)
|
||||
@nested_child_index[name] ||= -1
|
||||
@nested_child_index[name] += 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -1056,5 +1057,6 @@ module ActionView
|
|||
class << Base
|
||||
attr_accessor :default_form_builder
|
||||
end
|
||||
|
||||
Base.default_form_builder = ::ActionView::Helpers::FormBuilder
|
||||
end
|
||||
|
|
|
@ -8,7 +8,8 @@ module ActionView
|
|||
module TagHelper
|
||||
include ERB::Util
|
||||
|
||||
BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked).to_set
|
||||
BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked autobuffer
|
||||
autoplay controls loop).to_set
|
||||
BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map {|attr| attr.to_sym })
|
||||
|
||||
# Returns an empty HTML tag of type +name+ which by default is XHTML
|
||||
|
|
|
@ -2492,6 +2492,16 @@ class RouteSetTest < Test::Unit::TestCase
|
|||
end
|
||||
assert_equal({:controller => 'pages', :action => 'show', :name => 'JAMIS'}, set.recognize_path('/page/JAMIS'))
|
||||
end
|
||||
|
||||
def test_routes_with_symbols
|
||||
set.draw do |map|
|
||||
map.connect 'unnamed', :controller => :pages, :action => :show, :name => :as_symbol
|
||||
map.named 'named', :controller => :pages, :action => :show, :name => :as_symbol
|
||||
end
|
||||
assert_equal({:controller => 'pages', :action => 'show', :name => :as_symbol}, set.recognize_path('/unnamed'))
|
||||
assert_equal({:controller => 'pages', :action => 'show', :name => :as_symbol}, set.recognize_path('/named'))
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class RouteLoadingTest < Test::Unit::TestCase
|
||||
|
|
|
@ -171,7 +171,7 @@ class ActiveRecordHelperTest < ActionView::TestCase
|
|||
@request_forgery_protection_token = 'authenticity_token'
|
||||
@form_authenticity_token = '123'
|
||||
assert_dom_equal(
|
||||
%(<form action="create" method="post"><div style='margin:0;padding:0'><input type='hidden' name='authenticity_token' value='123' /></div><p><label for="post_title">Title</label><br /><input id="post_title" name="post[title]" size="30" type="text" value="Hello World" /></p>\n<p><label for="post_body">Body</label><br /><div class="fieldWithErrors"><textarea cols="40" id="post_body" name="post[body]" rows="20">Back to the hill and over it again!</textarea></div></p><input name="commit" type="submit" value="Create" /></form>),
|
||||
%(<form action="create" method="post"><div style='margin:0;padding:0;display:inline'><input type='hidden' name='authenticity_token' value='123' /></div><p><label for="post_title">Title</label><br /><input id="post_title" name="post[title]" size="30" type="text" value="Hello World" /></p>\n<p><label for="post_body">Body</label><br /><div class="fieldWithErrors"><textarea cols="40" id="post_body" name="post[body]" rows="20">Back to the hill and over it again!</textarea></div></p><input name="commit" type="submit" value="Create" /></form>),
|
||||
form("post")
|
||||
)
|
||||
end
|
||||
|
|
|
@ -138,11 +138,38 @@ class AssetTagHelperTest < ActionView::TestCase
|
|||
%(image_tag("error.png", "size" => "45 x 70")) => %(<img alt="Error" src="/images/error.png" />),
|
||||
%(image_tag("error.png", "size" => "x")) => %(<img alt="Error" src="/images/error.png" />),
|
||||
%(image_tag("http://www.rubyonrails.com/images/rails.png")) => %(<img alt="Rails" src="http://www.rubyonrails.com/images/rails.png" />),
|
||||
%(image_tag("http://www.rubyonrails.com/images/rails.png")) => %(<img alt="Rails" src="http://www.rubyonrails.com/images/rails.png" />),
|
||||
%(image_tag("mouse.png", :mouseover => "/images/mouse_over.png")) => %(<img alt="Mouse" onmouseover="this.src='/images/mouse_over.png'" onmouseout="this.src='/images/mouse.png'" src="/images/mouse.png" />),
|
||||
%(image_tag("mouse.png", :mouseover => image_path("mouse_over.png"))) => %(<img alt="Mouse" onmouseover="this.src='/images/mouse_over.png'" onmouseout="this.src='/images/mouse.png'" src="/images/mouse.png" />)
|
||||
}
|
||||
|
||||
VideoPathToTag = {
|
||||
%(video_path("xml")) => %(/videos/xml),
|
||||
%(video_path("xml.ogg")) => %(/videos/xml.ogg),
|
||||
%(video_path("dir/xml.ogg")) => %(/videos/dir/xml.ogg),
|
||||
%(video_path("/dir/xml.ogg")) => %(/dir/xml.ogg)
|
||||
}
|
||||
|
||||
PathToVideoToTag = {
|
||||
%(path_to_video("xml")) => %(/videos/xml),
|
||||
%(path_to_video("xml.ogg")) => %(/videos/xml.ogg),
|
||||
%(path_to_video("dir/xml.ogg")) => %(/videos/dir/xml.ogg),
|
||||
%(path_to_video("/dir/xml.ogg")) => %(/dir/xml.ogg)
|
||||
}
|
||||
|
||||
VideoLinkToTag = {
|
||||
%(video_tag("xml.ogg")) => %(<video src="/videos/xml.ogg" />),
|
||||
%(video_tag("rss.m4v", :autoplay => true, :controls => true)) => %(<video autoplay="autoplay" controls="controls" src="/videos/rss.m4v" />),
|
||||
%(video_tag("rss.m4v", :autobuffer => true)) => %(<video autobuffer="autobuffer" src="/videos/rss.m4v" />),
|
||||
%(video_tag("gold.m4v", :size => "160x120")) => %(<video height="120" src="/videos/gold.m4v" width="160" />),
|
||||
%(video_tag("gold.m4v", "size" => "320x240")) => %(<video height="240" src="/videos/gold.m4v" width="320" />),
|
||||
%(video_tag("trailer.ogg", :poster => "screenshot.png")) => %(<video poster="/images/screenshot.png" src="/videos/trailer.ogg" />),
|
||||
%(video_tag("error.avi", "size" => "100")) => %(<video src="/videos/error.avi" />),
|
||||
%(video_tag("error.avi", "size" => "100 x 100")) => %(<video src="/videos/error.avi" />),
|
||||
%(video_tag("error.avi", "size" => "x")) => %(<video src="/videos/error.avi" />),
|
||||
%(video_tag("http://media.rubyonrails.org/video/rails_blog_2.mov")) => %(<video src="http://media.rubyonrails.org/video/rails_blog_2.mov" />),
|
||||
%(video_tag(["multiple.ogg", "multiple.avi"])) => %(<video><source src="multiple.ogg" /><source src="multiple.avi" /></video>),
|
||||
%(video_tag(["multiple.ogg", "multiple.avi"], :size => "160x120", :controls => true)) => %(<video controls="controls" height="120" width="160"><source src="multiple.ogg" /><source src="multiple.avi" /></video>)
|
||||
}
|
||||
|
||||
def test_auto_discovery_link_tag
|
||||
AutoDiscoveryToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
|
||||
|
@ -272,6 +299,18 @@ class AssetTagHelperTest < ActionView::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
def test_video_path
|
||||
VideoPathToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
|
||||
end
|
||||
|
||||
def test_path_to_video_alias_for_video_path
|
||||
PathToVideoToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
|
||||
end
|
||||
|
||||
def test_video_tag
|
||||
VideoLinkToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
|
||||
end
|
||||
|
||||
def test_timebased_asset_id
|
||||
expected_time = File.stat(File.expand_path(File.dirname(__FILE__) + "/../fixtures/public/images/rails.png")).mtime.to_i.to_s
|
||||
assert_equal %(<img alt="Rails" src="/images/rails.png?#{expected_time}" />), image_tag("rails.png")
|
||||
|
@ -284,7 +323,7 @@ class AssetTagHelperTest < ActionView::TestCase
|
|||
ensure
|
||||
ActionController::Base.relative_url_root = ""
|
||||
end
|
||||
|
||||
|
||||
def test_should_skip_asset_id_on_complete_url
|
||||
assert_equal %(<img alt="Rails" src="http://www.example.com/rails.png" />), image_tag("http://www.example.com/rails.png")
|
||||
end
|
||||
|
|
|
@ -21,6 +21,9 @@ silence_warnings do
|
|||
|
||||
attr_accessor :comments
|
||||
def comments_attributes=(attributes); end
|
||||
|
||||
attr_accessor :tags
|
||||
def tags_attributes=(attributes); end
|
||||
end
|
||||
|
||||
class Comment
|
||||
|
@ -33,6 +36,50 @@ silence_warnings do
|
|||
def name
|
||||
@id.nil? ? "new #{self.class.name.downcase}" : "#{self.class.name.downcase} ##{@id}"
|
||||
end
|
||||
|
||||
attr_accessor :relevances
|
||||
def relevances_attributes=(attributes); end
|
||||
|
||||
end
|
||||
|
||||
class Tag
|
||||
attr_reader :id
|
||||
attr_reader :post_id
|
||||
def initialize(id = nil, post_id = nil); @id, @post_id = id, post_id end
|
||||
def save; @id = 1; @post_id = 1 end
|
||||
def new_record?; @id.nil? end
|
||||
def to_param; @id; end
|
||||
def value
|
||||
@id.nil? ? "new #{self.class.name.downcase}" : "#{self.class.name.downcase} ##{@id}"
|
||||
end
|
||||
|
||||
attr_accessor :relevances
|
||||
def relevances_attributes=(attributes); end
|
||||
|
||||
end
|
||||
|
||||
class CommentRelevance
|
||||
attr_reader :id
|
||||
attr_reader :comment_id
|
||||
def initialize(id = nil, comment_id = nil); @id, @comment_id = id, comment_id end
|
||||
def save; @id = 1; @comment_id = 1 end
|
||||
def new_record?; @id.nil? end
|
||||
def to_param; @id; end
|
||||
def value
|
||||
@id.nil? ? "new #{self.class.name.downcase}" : "#{self.class.name.downcase} ##{@id}"
|
||||
end
|
||||
end
|
||||
|
||||
class TagRelevance
|
||||
attr_reader :id
|
||||
attr_reader :tag_id
|
||||
def initialize(id = nil, tag_id = nil); @id, @tag_id = id, tag_id end
|
||||
def save; @id = 1; @tag_id = 1 end
|
||||
def new_record?; @id.nil? end
|
||||
def to_param; @id; end
|
||||
def value
|
||||
@id.nil? ? "new #{self.class.name.downcase}" : "#{self.class.name.downcase} ##{@id}"
|
||||
end
|
||||
end
|
||||
|
||||
class Author < Comment
|
||||
|
@ -383,7 +430,7 @@ class FormHelperTest < ActionView::TestCase
|
|||
|
||||
expected =
|
||||
"<form action='http://www.example.com' id='create-post' method='post'>" +
|
||||
"<div style='margin:0;padding:0'><input name='_method' type='hidden' value='put' /></div>" +
|
||||
"<div style='margin:0;padding:0;display:inline'><input name='_method' type='hidden' value='put' /></div>" +
|
||||
"<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
|
||||
"<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
|
||||
"<input name='post[secret]' type='hidden' value='0' />" +
|
||||
|
@ -740,6 +787,51 @@ class FormHelperTest < ActionView::TestCase
|
|||
assert_dom_equal expected, output_buffer
|
||||
end
|
||||
|
||||
def test_nested_fields_uses_unique_indices_for_different_collection_associations
|
||||
@post.comments = [Comment.new(321)]
|
||||
@post.tags = [Tag.new(123), Tag.new(456)]
|
||||
@post.comments[0].relevances = []
|
||||
@post.tags[0].relevances = []
|
||||
@post.tags[1].relevances = []
|
||||
form_for(:post, @post) do |f|
|
||||
f.fields_for(:comments, @post.comments[0]) do |cf|
|
||||
concat cf.text_field(:name)
|
||||
cf.fields_for(:relevances, CommentRelevance.new(314)) do |crf|
|
||||
concat crf.text_field(:value)
|
||||
end
|
||||
end
|
||||
f.fields_for(:tags, @post.tags[0]) do |tf|
|
||||
concat tf.text_field(:value)
|
||||
tf.fields_for(:relevances, TagRelevance.new(3141)) do |trf|
|
||||
concat trf.text_field(:value)
|
||||
end
|
||||
end
|
||||
f.fields_for('tags', @post.tags[1]) do |tf|
|
||||
concat tf.text_field(:value)
|
||||
tf.fields_for(:relevances, TagRelevance.new(31415)) do |trf|
|
||||
concat trf.text_field(:value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
expected = '<form action="http://www.example.com" method="post">' +
|
||||
'<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="321" />' +
|
||||
'<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #321" />' +
|
||||
'<input id="post_comments_attributes_0_relevances_attributes_0_id" name="post[comments_attributes][0][relevances_attributes][0][id]" type="hidden" value="314" />' +
|
||||
'<input id="post_comments_attributes_0_relevances_attributes_0_value" name="post[comments_attributes][0][relevances_attributes][0][value]" size="30" type="text" value="commentrelevance #314" />' +
|
||||
'<input id="post_tags_attributes_0_id" name="post[tags_attributes][0][id]" type="hidden" value="123" />' +
|
||||
'<input id="post_tags_attributes_0_value" name="post[tags_attributes][0][value]" size="30" type="text" value="tag #123" />' +
|
||||
'<input id="post_tags_attributes_0_relevances_attributes_0_id" name="post[tags_attributes][0][relevances_attributes][0][id]" type="hidden" value="3141" />' +
|
||||
'<input id="post_tags_attributes_0_relevances_attributes_0_value" name="post[tags_attributes][0][relevances_attributes][0][value]" size="30" type="text" value="tagrelevance #3141" />' +
|
||||
'<input id="post_tags_attributes_1_id" name="post[tags_attributes][1][id]" type="hidden" value="456" />' +
|
||||
'<input id="post_tags_attributes_1_value" name="post[tags_attributes][1][value]" size="30" type="text" value="tag #456" />' +
|
||||
'<input id="post_tags_attributes_1_relevances_attributes_0_id" name="post[tags_attributes][1][relevances_attributes][0][id]" type="hidden" value="31415" />' +
|
||||
'<input id="post_tags_attributes_1_relevances_attributes_0_value" name="post[tags_attributes][1][relevances_attributes][0][value]" size="30" type="text" value="tagrelevance #31415" />' +
|
||||
'</form>'
|
||||
|
||||
assert_dom_equal expected, output_buffer
|
||||
end
|
||||
|
||||
def test_fields_for
|
||||
fields_for(:post, @post) do |f|
|
||||
concat f.text_field(:title)
|
||||
|
@ -1092,7 +1184,7 @@ class FormHelperTest < ActionView::TestCase
|
|||
def test_form_for_with_existing_object
|
||||
form_for(@post) do |f| end
|
||||
|
||||
expected = "<form action=\"/posts/123\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
|
||||
expected = "<form action=\"/posts/123\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0;display:inline\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
|
||||
assert_equal expected, output_buffer
|
||||
end
|
||||
|
||||
|
@ -1113,7 +1205,7 @@ class FormHelperTest < ActionView::TestCase
|
|||
|
||||
form_for([@post, @comment]) {}
|
||||
|
||||
expected = %(<form action="#{comment_path(@post, @comment)}" class="edit_comment" id="edit_comment_1" method="post"><div style="margin:0;padding:0"><input name="_method" type="hidden" value="put" /></div></form>)
|
||||
expected = %(<form action="#{comment_path(@post, @comment)}" class="edit_comment" id="edit_comment_1" method="post"><div style="margin:0;padding:0;display:inline"><input name="_method" type="hidden" value="put" /></div></form>)
|
||||
assert_dom_equal expected, output_buffer
|
||||
end
|
||||
|
||||
|
@ -1132,7 +1224,7 @@ class FormHelperTest < ActionView::TestCase
|
|||
|
||||
form_for([:admin, @post, @comment]) {}
|
||||
|
||||
expected = %(<form action="#{admin_comment_path(@post, @comment)}" class="edit_comment" id="edit_comment_1" method="post"><div style="margin:0;padding:0"><input name="_method" type="hidden" value="put" /></div></form>)
|
||||
expected = %(<form action="#{admin_comment_path(@post, @comment)}" class="edit_comment" id="edit_comment_1" method="post"><div style="margin:0;padding:0;display:inline"><input name="_method" type="hidden" value="put" /></div></form>)
|
||||
assert_dom_equal expected, output_buffer
|
||||
end
|
||||
|
||||
|
@ -1148,7 +1240,7 @@ class FormHelperTest < ActionView::TestCase
|
|||
def test_form_for_with_existing_object_and_custom_url
|
||||
form_for(@post, :url => "/super_posts") do |f| end
|
||||
|
||||
expected = "<form action=\"/super_posts\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
|
||||
expected = "<form action=\"/super_posts\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0;display:inline\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
|
||||
assert_equal expected, output_buffer
|
||||
end
|
||||
|
||||
|
|
|
@ -40,13 +40,13 @@ class FormTagHelperTest < ActionView::TestCase
|
|||
|
||||
def test_form_tag_with_method_put
|
||||
actual = form_tag({}, { :method => :put })
|
||||
expected = %(<form action="http://www.example.com" method="post"><div style='margin:0;padding:0'><input type="hidden" name="_method" value="put" /></div>)
|
||||
expected = %(<form action="http://www.example.com" method="post"><div style='margin:0;padding:0;display:inline'><input type="hidden" name="_method" value="put" /></div>)
|
||||
assert_dom_equal expected, actual
|
||||
end
|
||||
|
||||
def test_form_tag_with_method_delete
|
||||
actual = form_tag({}, { :method => :delete })
|
||||
expected = %(<form action="http://www.example.com" method="post"><div style='margin:0;padding:0'><input type="hidden" name="_method" value="delete" /></div>)
|
||||
expected = %(<form action="http://www.example.com" method="post"><div style='margin:0;padding:0;display:inline'><input type="hidden" name="_method" value="delete" /></div>)
|
||||
assert_dom_equal expected, actual
|
||||
end
|
||||
|
||||
|
@ -62,7 +62,7 @@ class FormTagHelperTest < ActionView::TestCase
|
|||
__in_erb_template = ''
|
||||
form_tag("http://example.com", :method => :put) { concat "Hello world!" }
|
||||
|
||||
expected = %(<form action="http://example.com" method="post"><div style='margin:0;padding:0'><input type="hidden" name="_method" value="put" /></div>Hello world!</form>)
|
||||
expected = %(<form action="http://example.com" method="post"><div style='margin:0;padding:0;display:inline'><input type="hidden" name="_method" value="put" /></div>Hello world!</form>)
|
||||
assert_dom_equal expected, output_buffer
|
||||
end
|
||||
|
||||
|
|
|
@ -136,7 +136,7 @@ class PrototypeHelperTest < PrototypeHelperBaseTest
|
|||
end
|
||||
|
||||
def test_form_remote_tag_with_method
|
||||
assert_dom_equal %(<form action=\"http://www.example.com/fast\" method=\"post\" onsubmit=\"new Ajax.Updater('glass_of_beer', 'http://www.example.com/fast', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;\"><div style='margin:0;padding:0'><input name='_method' type='hidden' value='put' /></div>),
|
||||
assert_dom_equal %(<form action=\"http://www.example.com/fast\" method=\"post\" onsubmit=\"new Ajax.Updater('glass_of_beer', 'http://www.example.com/fast', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;\"><div style='margin:0;padding:0;display:inline'><input name='_method' type='hidden' value='put' /></div>),
|
||||
form_remote_tag(:update => "glass_of_beer", :url => { :action => :fast }, :html => { :method => :put })
|
||||
end
|
||||
|
||||
|
@ -164,7 +164,7 @@ class PrototypeHelperTest < PrototypeHelperBaseTest
|
|||
@record.save
|
||||
remote_form_for(@record) {}
|
||||
|
||||
expected = %(<form action='#{author_path(@record)}' id='edit_author_1' method='post' onsubmit="new Ajax.Request('#{author_path(@record)}', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;" class='edit_author'><div style='margin:0;padding:0'><input name='_method' type='hidden' value='put' /></div></form>)
|
||||
expected = %(<form action='#{author_path(@record)}' id='edit_author_1' method='post' onsubmit="new Ajax.Request('#{author_path(@record)}', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;" class='edit_author'><div style='margin:0;padding:0;display:inline'><input name='_method' type='hidden' value='put' /></div></form>)
|
||||
assert_dom_equal expected, output_buffer
|
||||
end
|
||||
|
||||
|
@ -180,7 +180,7 @@ class PrototypeHelperTest < PrototypeHelperBaseTest
|
|||
@article.save
|
||||
remote_form_for([@author, @article]) {}
|
||||
|
||||
expected = %(<form action='#{author_article_path(@author, @article)}' id='edit_article_1' method='post' onsubmit="new Ajax.Request('#{author_article_path(@author, @article)}', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;" class='edit_article'><div style='margin:0;padding:0'><input name='_method' type='hidden' value='put' /></div></form>)
|
||||
expected = %(<form action='#{author_article_path(@author, @article)}' id='edit_article_1' method='post' onsubmit="new Ajax.Request('#{author_article_path(@author, @article)}', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;" class='edit_article'><div style='margin:0;padding:0;display:inline'><input name='_method' type='hidden' value='put' /></div></form>)
|
||||
assert_dom_equal expected, output_buffer
|
||||
end
|
||||
|
||||
|
|
|
@ -68,10 +68,12 @@ module ActiveSupport
|
|||
|
||||
def inspect #:nodoc:
|
||||
consolidated = parts.inject(::Hash.new(0)) { |h,part| h[part.first] += part.last; h }
|
||||
[:years, :months, :days, :minutes, :seconds].map do |length|
|
||||
parts = [:years, :months, :days, :minutes, :seconds].map do |length|
|
||||
n = consolidated[length]
|
||||
"#{n} #{n == 1 ? length.to_s.singularize : length.to_s}" if n.nonzero?
|
||||
end.compact.to_sentence(:locale => :en)
|
||||
end.compact
|
||||
parts = ["0 seconds"] if parts.empty?
|
||||
parts.to_sentence(:locale => :en)
|
||||
end
|
||||
|
||||
protected
|
||||
|
|
|
@ -202,7 +202,7 @@ module ActiveSupport
|
|||
# end
|
||||
|
||||
name = "_conditional_callback_#{@kind}_#{next_id}"
|
||||
txt, line = <<-RUBY_EVAL, __LINE__
|
||||
txt, line = <<-RUBY_EVAL, __LINE__ + 1
|
||||
def #{name}(halted)
|
||||
#{@compiled_options[0] || "if true"} && !halted
|
||||
#{@filter} do
|
||||
|
|
|
@ -12,11 +12,25 @@ module ActiveSupport
|
|||
|
||||
def self.[](*args)
|
||||
ordered_hash = new
|
||||
args.each_with_index { |val,ind|
|
||||
# Only every second value is a key.
|
||||
next if ind % 2 != 0
|
||||
|
||||
if (args.length == 1 && args.first.is_a?(Array))
|
||||
args.first.each do |key_value_pair|
|
||||
next unless (key_value_pair.is_a?(Array))
|
||||
ordered_hash[key_value_pair[0]] = key_value_pair[1]
|
||||
end
|
||||
|
||||
return ordered_hash
|
||||
end
|
||||
|
||||
unless (args.size % 2 == 0)
|
||||
raise ArgumentError.new("odd number of arguments for Hash")
|
||||
end
|
||||
|
||||
args.each_with_index do |val, ind|
|
||||
next if (ind % 2 != 0)
|
||||
ordered_hash[val] = args[ind + 1]
|
||||
}
|
||||
end
|
||||
|
||||
ordered_hash
|
||||
end
|
||||
|
||||
|
|
|
@ -21,6 +21,11 @@ module ActiveSupport::Testing
|
|||
end
|
||||
|
||||
def run(result)
|
||||
unless defined?(@@ran_class_setup)
|
||||
self.class.setup
|
||||
@@ran_class_setup = true
|
||||
end
|
||||
|
||||
yield(Test::Unit::TestCase::STARTED, name)
|
||||
|
||||
@_result = result
|
||||
|
|
|
@ -3,6 +3,7 @@ require 'active_support/time'
|
|||
|
||||
class DurationTest < ActiveSupport::TestCase
|
||||
def test_inspect
|
||||
assert_equal '0 seconds', 0.seconds.inspect
|
||||
assert_equal '1 month', 1.month.inspect
|
||||
assert_equal '1 month and 1 day', (1.month + 1.day).inspect
|
||||
assert_equal '6 months and -2 days', (6.months - 2.days).inspect
|
||||
|
|
|
@ -5,6 +5,12 @@ if ENV['CHILD']
|
|||
class ChildIsolationTest < ActiveSupport::TestCase
|
||||
include ActiveSupport::Testing::Isolation
|
||||
|
||||
def self.setup
|
||||
File.open(File.join(File.dirname(__FILE__), "fixtures", "isolation_test"), "a") do |f|
|
||||
f.puts "hello"
|
||||
end
|
||||
end
|
||||
|
||||
def setup
|
||||
@instance = "HELLO"
|
||||
end
|
||||
|
@ -64,6 +70,8 @@ if ENV['CHILD']
|
|||
else
|
||||
class ParentIsolationTest < ActiveSupport::TestCase
|
||||
|
||||
File.open(File.join(File.dirname(__FILE__), "fixtures", "isolation_test"), "w") {}
|
||||
|
||||
ENV["CHILD"] = "1"
|
||||
OUTPUT = `#{Gem.ruby} -I#{File.dirname(__FILE__)} #{File.expand_path(__FILE__)} -v`
|
||||
ENV.delete("CHILD")
|
||||
|
@ -131,12 +139,17 @@ else
|
|||
|
||||
test "backtrace is printed for errors" do
|
||||
assert_equal 'Error', @backtraces["test_captures_errors"][:type]
|
||||
assert_match %{isolation_test.rb:21:in `test_captures_errors'}, @backtraces["test_captures_errors"][:output]
|
||||
assert_match %r{isolation_test.rb:\d+:in `test_captures_errors'}, @backtraces["test_captures_errors"][:output]
|
||||
end
|
||||
|
||||
test "backtrace is printed for failures" do
|
||||
assert_equal 'Failure', @backtraces["test_captures_failures"][:type]
|
||||
assert_match %{isolation_test.rb:25:in `test_captures_failures'}, @backtraces["test_captures_failures"][:output]
|
||||
assert_match %r{isolation_test.rb:\d+:in `test_captures_failures'}, @backtraces["test_captures_failures"][:output]
|
||||
end
|
||||
|
||||
test "self.setup is run only once" do
|
||||
text = File.read(File.join(File.dirname(__FILE__), "fixtures", "isolation_test"))
|
||||
assert_equal "hello\n", text
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -163,9 +163,32 @@ class OrderedHashTest < Test::Unit::TestCase
|
|||
assert @ordered_hash.inspect.include?(@hash.inspect)
|
||||
end
|
||||
|
||||
def test_alternate_initialization
|
||||
def test_alternate_initialization_with_splat
|
||||
alternate = ActiveSupport::OrderedHash[1,2,3,4]
|
||||
assert_kind_of ActiveSupport::OrderedHash, alternate
|
||||
assert_equal [1, 3], alternate.keys
|
||||
end
|
||||
|
||||
def test_alternate_initialization_with_array
|
||||
alternate = ActiveSupport::OrderedHash[ [
|
||||
[1, 2],
|
||||
[3, 4],
|
||||
"bad key value pair",
|
||||
[ 'missing value' ]
|
||||
]]
|
||||
|
||||
assert_kind_of ActiveSupport::OrderedHash, alternate
|
||||
assert_equal [1, 3, 'missing value'], alternate.keys
|
||||
assert_equal [2, 4, nil ], alternate.values
|
||||
end
|
||||
|
||||
def test_alternate_initialization_raises_exception_on_odd_length_args
|
||||
begin
|
||||
alternate = ActiveSupport::OrderedHash[1,2,3,4,5]
|
||||
flunk "Hash::[] should have raised an exception on initialization " +
|
||||
"with an odd number of parameters"
|
||||
rescue
|
||||
assert_equal "odd number of arguments for Hash", $!.message
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -125,11 +125,8 @@ module Rails
|
|||
if Rails.vendor_rails?
|
||||
begin; require "rubygems"; rescue LoadError; return; end
|
||||
|
||||
stubs = %w(rails activesupport activerecord actionpack actionmailer activeresource)
|
||||
stubs.reject! { |s| Gem.loaded_specs.key?(s) }
|
||||
|
||||
stubs.each do |stub|
|
||||
Gem.loaded_specs[stub] = Gem::Specification.new do |s|
|
||||
%w(rails activesupport activerecord actionpack actionmailer activeresource).each do |stub|
|
||||
Gem.loaded_specs[stub] ||= Gem::Specification.new do |s|
|
||||
s.name = stub
|
||||
s.version = Rails::VERSION::STRING
|
||||
s.loaded_from = ""
|
||||
|
|
|
@ -122,10 +122,14 @@ module Rails
|
|||
|
||||
def built?
|
||||
return false unless frozen?
|
||||
specification.extensions.each do |ext|
|
||||
makefile = File.join(unpacked_gem_directory, File.dirname(ext), 'Makefile')
|
||||
return false unless File.exists?(makefile)
|
||||
|
||||
if vendor_gem?
|
||||
specification.extensions.each do |ext|
|
||||
makefile = File.join(unpacked_gem_directory, File.dirname(ext), 'Makefile')
|
||||
return false unless File.exists?(makefile)
|
||||
end
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
|
|
|
@ -199,6 +199,15 @@ class GemDependencyTest < Test::Unit::TestCase
|
|||
assert_equal true, Rails::GemDependency.new("dummy-gem-i").built?
|
||||
assert_equal false, Rails::GemDependency.new("dummy-gem-j").built?
|
||||
end
|
||||
|
||||
def test_gem_determines_build_status_only_on_vendor_gems
|
||||
framework_gem = Rails::GemDependency.new('dummy-framework-gem')
|
||||
framework_gem.stubs(:framework_gem?).returns(true) # already loaded
|
||||
framework_gem.stubs(:vendor_rails?).returns(false) # but not in vendor/rails
|
||||
framework_gem.stubs(:vendor_gem?).returns(false) # and not in vendor/gems
|
||||
framework_gem.add_load_paths # freeze framework gem early
|
||||
assert framework_gem.built?
|
||||
end
|
||||
|
||||
def test_gem_build_passes_options_to_dependencies
|
||||
start_gem = Rails::GemDependency.new("dummy-gem-g")
|
||||
|
|
51
railties/test/initializer/check_ruby_version_test.rb
Normal file
51
railties/test/initializer/check_ruby_version_test.rb
Normal file
|
@ -0,0 +1,51 @@
|
|||
require "initializer/test_helper"
|
||||
|
||||
module InitializerTests
|
||||
class PathsTest < ActiveSupport::TestCase
|
||||
include ActiveSupport::Testing::Isolation
|
||||
|
||||
test "rails does not initialize with ruby version 1.8.1" do
|
||||
assert_rails_does_not_boot "1.8.1"
|
||||
end
|
||||
|
||||
test "rails initializes with ruby version 1.8.2" do
|
||||
assert_rails_boots "1.8.2"
|
||||
end
|
||||
|
||||
test "rails does not initialize with ruby version 1.8.3" do
|
||||
assert_rails_does_not_boot "1.8.3"
|
||||
end
|
||||
|
||||
test "rails initializes with ruby version 1.8.4" do
|
||||
assert_rails_boots "1.8.4"
|
||||
end
|
||||
|
||||
test "rails initializes with ruby version 1.8.5" do
|
||||
assert_rails_boots "1.8.5"
|
||||
end
|
||||
|
||||
test "rails initializes with ruby version 1.8.6" do
|
||||
assert_rails_boots "1.8.6"
|
||||
end
|
||||
|
||||
def set_ruby_version(version)
|
||||
$-w = nil
|
||||
Object.const_set(:RUBY_VERSION, version.freeze)
|
||||
end
|
||||
|
||||
def assert_rails_boots(version)
|
||||
set_ruby_version(version)
|
||||
assert_nothing_raised "It appears that rails does not boot" do
|
||||
Rails::Initializer.run { |c| c.frameworks = [] }
|
||||
end
|
||||
end
|
||||
|
||||
def assert_rails_does_not_boot(version)
|
||||
set_ruby_version(version)
|
||||
$stderr = File.open("/dev/null", "w")
|
||||
assert_raises(SystemExit) do
|
||||
Rails::Initializer.run { |c| c.frameworks = [] }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
85
railties/test/initializer/install_gem_spec_stubs_test.rb
Normal file
85
railties/test/initializer/install_gem_spec_stubs_test.rb
Normal file
|
@ -0,0 +1,85 @@
|
|||
require "initializer/test_helper"
|
||||
|
||||
module InitializerTests
|
||||
class GemSpecStubsTest < ActiveSupport::TestCase
|
||||
include ActiveSupport::Testing::Isolation
|
||||
|
||||
def setup
|
||||
$stderr = StringIO.new
|
||||
end
|
||||
|
||||
test "user has an old boot.rb (defined by having no Rails.vendor_rails?)" do
|
||||
class << Rails
|
||||
undef vendor_rails?
|
||||
end
|
||||
|
||||
assert_stderr(/outdated/) do
|
||||
assert_raises(SystemExit) do
|
||||
Rails::Initializer.run { |c| c.frameworks = [] }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
test "requires rubygems" do
|
||||
Kernel.module_eval do
|
||||
alias old_require require
|
||||
def require(name)
|
||||
$rubygems_required = true if name == "rubygems"
|
||||
old_require(name)
|
||||
end
|
||||
end
|
||||
|
||||
Rails.vendor_rails = true
|
||||
Rails::Initializer.run { |c| c.frameworks = [] }
|
||||
assert $rubygems_required
|
||||
end
|
||||
|
||||
test "does not fail if rubygems does not exist" do
|
||||
Kernel.module_eval do
|
||||
alias old_require require
|
||||
def require(name)
|
||||
raise LoadError if name == "rubygems"
|
||||
old_require(name)
|
||||
end
|
||||
end
|
||||
|
||||
assert_nothing_raised do
|
||||
Rails::Initializer.run { |c| c.frameworks = [] }
|
||||
end
|
||||
end
|
||||
|
||||
test "adds fake Rubygems stubs if a framework is not loaded in Rubygems and we've vendored" do
|
||||
Rails.vendor_rails = true
|
||||
|
||||
Rails::Initializer.run { |c| c.frameworks = [] }
|
||||
|
||||
%w(rails activesupport activerecord actionpack actionmailer activeresource).each do |stub|
|
||||
gem_spec = Gem.loaded_specs[stub]
|
||||
assert_equal Gem::Version.new(Rails::VERSION::STRING), gem_spec.version
|
||||
assert_equal stub, gem_spec.name
|
||||
assert_equal "", gem_spec.loaded_from
|
||||
end
|
||||
end
|
||||
|
||||
test "doesn't replace gem specs that are already loaded" do
|
||||
Rails.vendor_rails = true
|
||||
|
||||
Gem.loaded_specs["rails"] = Gem::Specification.new do |s|
|
||||
s.name = "rails"
|
||||
s.version = Rails::VERSION::STRING
|
||||
s.loaded_from = "/foo/bar/baz"
|
||||
end
|
||||
|
||||
Rails::Initializer.run { |c| c.frameworks = [] }
|
||||
|
||||
assert_equal "/foo/bar/baz", Gem.loaded_specs["rails"].loaded_from
|
||||
|
||||
%w(activesupport activerecord actionpack actionmailer activeresource).each do |stub|
|
||||
gem_spec = Gem.loaded_specs[stub]
|
||||
assert_equal Gem::Version.new(Rails::VERSION::STRING), gem_spec.version
|
||||
assert_equal stub, gem_spec.name
|
||||
assert_equal "", gem_spec.loaded_from
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,21 +1,14 @@
|
|||
require 'abstract_unit'
|
||||
require 'active_support/ruby/shim'
|
||||
require 'initializer'
|
||||
|
||||
RAILS_ROOT.replace File.join(File.dirname(__FILE__), "root")
|
||||
|
||||
module Rails
|
||||
def self.vendor_rails? ; false ; end
|
||||
end
|
||||
|
||||
# TODO: Can this be reset?
|
||||
Rails::Initializer.run do |config|
|
||||
config.frameworks = [:action_controller, :action_view, :action_mailer, :active_record]
|
||||
end
|
||||
require "initializer/test_helper"
|
||||
|
||||
class PathsTest < ActiveSupport::TestCase
|
||||
include ActiveSupport::Testing::Isolation
|
||||
|
||||
def self.setup
|
||||
Rails::Initializer.run do |config|
|
||||
config.frameworks = [:action_controller, :action_view, :action_mailer, :active_record]
|
||||
end
|
||||
end
|
||||
|
||||
def setup
|
||||
@paths = Rails::Initializer.default.config.paths
|
||||
end
|
||||
|
|
24
railties/test/initializer/test_helper.rb
Normal file
24
railties/test/initializer/test_helper.rb
Normal file
|
@ -0,0 +1,24 @@
|
|||
require 'abstract_unit'
|
||||
require 'active_support/ruby/shim'
|
||||
require 'initializer'
|
||||
|
||||
RAILS_ROOT.replace File.join(File.dirname(__FILE__), "root")
|
||||
|
||||
module Rails
|
||||
class << self
|
||||
attr_accessor :vendor_rails
|
||||
def vendor_rails?() @vendor_rails end
|
||||
end
|
||||
end
|
||||
|
||||
class ActiveSupport::TestCase
|
||||
def assert_stderr(match)
|
||||
$stderr = StringIO.new
|
||||
yield
|
||||
$stderr.rewind
|
||||
err = $stderr.read
|
||||
assert_match match, err
|
||||
ensure
|
||||
$stderr = STDERR
|
||||
end
|
||||
end
|
|
@ -178,7 +178,7 @@ class ConfigurationFrameworkPathsTests < Test::Unit::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
require File.dirname(__FILE__) + '/plugin_test_helper'
|
||||
require 'plugin_test_helper'
|
||||
|
||||
class InitializerPluginLoadingTests < Test::Unit::TestCase
|
||||
def setup
|
||||
|
|
|
@ -4,7 +4,7 @@ $:.unshift File.dirname(__FILE__) + "/../../activesupport/lib"
|
|||
require 'test/unit'
|
||||
require 'active_support'
|
||||
require 'initializer'
|
||||
require File.join(File.dirname(__FILE__), 'abstract_unit')
|
||||
require 'abstract_unit'
|
||||
|
||||
# We need to set RAILS_ROOT if it isn't already set
|
||||
RAILS_ROOT = '.' unless defined?(RAILS_ROOT)
|
||||
|
|
Loading…
Reference in a new issue