Permalink
Browse files

Merge branch 'master' of github.com:lifo/docrails

  • Loading branch information...
2 parents 24b1fd2 + dc64aec commit c8fe025965ceea0618ee7b620ca04ca8545d210b @elpic elpic committed Jan 2, 2012
Showing with 570 additions and 240 deletions.
  1. +33 −36 actionpack/lib/action_dispatch/routing/route_set.rb
  2. +1 −2 actionpack/lib/action_dispatch/routing/url_for.rb
  3. +29 −8 actionpack/lib/action_view/helpers/capture_helper.rb
  4. +2 −2 actionpack/lib/action_view/helpers/form_tag_helper.rb
  5. +1 −4 actionpack/lib/action_view/renderer/streaming_template_renderer.rb
  6. +1 −1 actionpack/test/controller/action_pack_assertions_test.rb
  7. +1 −1 actionpack/test/controller/new_base/render_streaming_test.rb
  8. +55 −0 actionpack/test/template/capture_helper_test.rb
  9. +1 −1 actionpack/test/template/streaming_render_test.rb
  10. +3 −0 activerecord/CHANGELOG.md
  11. +85 −55 activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb
  12. +5 −1 activerecord/lib/active_record/connection_adapters/connection_specification.rb
  13. +44 −25 activerecord/lib/active_record/fixtures.rb
  14. +12 −0 activerecord/test/cases/connection_adapters/connection_specification_test.rb
  15. +69 −14 activerecord/test/cases/connection_pool_test.rb
  16. +33 −0 activerecord/test/cases/fixtures_test.rb
  17. +81 −0 activerecord/test/cases/reaper_test.rb
  18. +7 −0 activerecord/test/fixtures/admin/randomly_named_a9.yml
  19. +7 −0 activerecord/test/fixtures/admin/randomly_named_b0.yml
  20. +7 −0 activerecord/test/fixtures/randomly_named_a9.yml
  21. +3 −0 activerecord/test/models/admin/randomly_named_c1.rb
  22. +3 −0 activerecord/test/models/randomly_named_c1.rb
  23. +5 −0 activerecord/test/schema/schema.rb
  24. +3 −16 activesupport/lib/active_support/callbacks.rb
  25. +1 −1 activesupport/lib/active_support/core_ext/date_time/conversions.rb
  26. +3 −1 activesupport/lib/active_support/core_ext/range/include_range.rb
  27. +0 −1 activesupport/lib/active_support/duration.rb
  28. +4 −0 activesupport/test/core_ext/range_ext_test.rb
  29. +69 −67 railties/guides/source/asset_pipeline.textile
  30. +2 −4 railties/guides/source/getting_started.textile
@@ -124,9 +124,8 @@ def length
end
def install(destinations = [ActionController::Base, ActionView::Base])
- Array(destinations).each do |dest|
- dest.__send__(:include, @module)
- end
+ helper = @module
+ destinations.each { |d| d.module_eval { include helper } }
end
private
@@ -149,22 +148,23 @@ def define_named_route_methods(name, route)
def define_hash_access(route, name, kind, options)
selector = hash_access_name(name, kind)
- # We use module_eval to avoid leaks
- @module.module_eval <<-END_EVAL, __FILE__, __LINE__ + 1
- remove_possible_method :#{selector}
- def #{selector}(*args)
- options = args.extract_options!
- result = #{options.inspect}
+ @module.module_eval do
+ remove_possible_method selector
+
+ define_method(selector) do |*args|
+ inner_options = args.extract_options!
+ result = options.dup
if args.any?
result[:_positional_args] = args
- result[:_positional_keys] = #{route.segment_keys.inspect}
+ result[:_positional_keys] = route.segment_keys
end
- result.merge(options)
+ result.merge(inner_options)
end
- protected :#{selector}
- END_EVAL
+
+ protected selector
+ end
helpers << selector
end
@@ -276,8 +276,8 @@ def clear!
@prepend.each { |blk| eval_block(blk) }
end
- def install_helpers(destinations = [ActionController::Base, ActionView::Base])
- Array(destinations).each { |d| d.module_eval { include Helpers } }
+ def install_helpers(destinations)
+ destinations.each { |d| d.module_eval { include Helpers } }
named_routes.install(destinations)
end
@@ -306,32 +306,29 @@ def #{name}
end
def url_helpers
- @url_helpers ||= begin
- routes = self
+ routes = self
- helpers = Module.new do
- extend ActiveSupport::Concern
- include UrlFor
+ @url_helpers ||= Module.new {
+ extend ActiveSupport::Concern
+ include UrlFor
- @_routes = routes
- class << self
- delegate :url_for, :to => '@_routes'
- end
- extend routes.named_routes.module
-
- # ROUTES TODO: install_helpers isn't great... can we make a module with the stuff that
- # we can include?
- # Yes plz - JP
- included do
- routes.install_helpers(self)
- singleton_class.send(:redefine_method, :_routes) { routes }
- end
+ @_routes = routes
+ def self.url_for(options)
+ @_routes.url_for options
+ end
- define_method(:_routes) { @_routes || routes }
+ extend routes.named_routes.module
+
+ # ROUTES TODO: install_helpers isn't great... can we make a module with the stuff that
+ # we can include?
+ # Yes plz - JP
+ included do
+ routes.install_helpers([self])
+ singleton_class.send(:redefine_method, :_routes) { routes }
end
- helpers
- end
+ define_method(:_routes) { @_routes || routes }
+ }
end
def empty?
@@ -90,8 +90,7 @@ module UrlFor
if respond_to?(:class_attribute)
class_attribute :default_url_options
else
- mattr_accessor :default_url_options
- remove_method :default_url_options
+ mattr_writer :default_url_options
end
self.default_url_options = {}
@@ -81,8 +81,8 @@ def capture(*args)
# <%# This is the layout %>
# <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
# <head>
- # <title>My Website</title>
- # <%= yield :script %>
+ # <title>My Website</title>
+ # <%= yield :script %>
# </head>
# <body>
# <%= yield %>
@@ -110,7 +110,7 @@ def capture(*args)
# That will place +script+ tags for your default set of JavaScript files on the page;
# this technique is useful if you'll only be using these scripts in a few views.
#
- # Note that content_for concatenates the blocks it is given for a particular
+ # Note that content_for concatenates (default) the blocks it is given for a particular
# identifier in order. For example:
#
# <% content_for :navigation do %>
@@ -127,16 +127,37 @@ def capture(*args)
#
# <ul><%= content_for :navigation %></ul>
#
+ # If the flush parameter is true content_for replaces the blocks it is given. For example:
+ #
+ # <% content_for :navigation do %>
+ # <li><%= link_to 'Home', :action => 'index' %></li>
+ # <% end %>
+ #
+ # <%# Add some other content, or use a different template: %>
+ #
+ # <% content_for :navigation, true do %>
+ # <li><%= link_to 'Login', :action => 'login' %></li>
+ # <% end %>
+ #
+ # Then, in another template or layout, this code would render only the last link:
+ #
+ # <ul><%= content_for :navigation %></ul>
+ #
# Lastly, simple content can be passed as a parameter:
#
# <% content_for :script, javascript_include_tag(:defaults) %>
#
# WARNING: content_for is ignored in caches. So you shouldn't use it
# for elements that will be fragment cached.
- def content_for(name, content = nil, &block)
+ def content_for(name, content = nil, flush = false, &block)
if content || block_given?
- content = capture(&block) if block_given?
- @view_flow.append(name, content) if content
+ if block_given?
+ flush = content if content
+ content = capture(&block)
+ end
+ if content
+ flush ? @view_flow.set(name, content) : @view_flow.append(name, content)
+ end
nil
else
@view_flow.get(name)
@@ -164,8 +185,8 @@ def provide(name, content = nil, &block)
# <%# This is the layout %>
# <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
# <head>
- # <title>My Website</title>
- # <%= yield :script %>
+ # <title>My Website</title>
+ # <%= yield :script %>
# </head>
# <body class="<%= content_for?(:right_col) ? 'one-column' : 'two-column' %>">
# <%= yield %>
@@ -47,7 +47,7 @@ module FormTagHelper
# <% end -%>
# # => <form action="/posts" method="post"><div><input type="submit" name="submit" value="Save" /></div></form>
#
- # <%= form_tag('/posts', :remote => true) %>
+ # <%= form_tag('/posts', :remote => true) %>
# # => <form action="/posts" method="post" data-remote="true">
#
# form_tag('http://far.away.com/form', :authenticity_token => false)
@@ -577,7 +577,7 @@ def email_field_tag(name, value = nil, options = {})
#
# ==== Examples
# number_field_tag 'quantity', nil, :in => 1...10
- # => <input id="quantity" name="quantity" min="1" max="9" type="number" />
+ # # => <input id="quantity" name="quantity" min="1" max="9" type="number" />
def number_field_tag(name, value = nil, options = {})
options = options.stringify_keys
options["type"] ||= "number"
@@ -1,7 +1,4 @@
-# 1.9 ships with Fibers but we need to require the extra
-# methods explicitly. We only load those extra methods if
-# Fiber is available in the first place.
-require 'fiber' if defined?(Fiber)
+require 'fiber'
module ActionView
# == TODO
@@ -165,7 +165,7 @@ def test_redirect_to_named_route
match 'route_one', :to => 'action_pack_assertions#nothing', :as => :route_one
match ':controller/:action'
end
- set.install_helpers
+ set.install_helpers([ActionController::Base, ActionView::Base])
process :redirect_to_named_route
assert_redirected_to 'http://test.host/route_one'
@@ -111,4 +111,4 @@ def assert_streaming!(cache="no-cache")
assert_equal cache, headers["Cache-Control"]
end
end
-end if defined?(Fiber)
+end
@@ -53,6 +53,13 @@ def test_content_for_with_multiple_calls
assert_equal 'foobar', content_for(:title)
end
+ def test_content_for_with_multiple_calls_and_flush
+ assert ! content_for?(:title)
+ content_for :title, 'foo'
+ content_for :title, 'bar', true
+ assert_equal 'bar', content_for(:title)
+ end
+
def test_content_for_with_block
assert ! content_for?(:title)
content_for :title do
@@ -63,6 +70,39 @@ def test_content_for_with_block
assert_equal 'foobar', content_for(:title)
end
+ def test_content_for_with_block_and_multiple_calls_with_flush
+ assert ! content_for?(:title)
+ content_for :title do
+ 'foo'
+ end
+ content_for :title, true do
+ 'bar'
+ end
+ assert_equal 'bar', content_for(:title)
+ end
+
+ def test_content_for_with_block_and_multiple_calls_with_flush_nil_content
+ assert ! content_for?(:title)
+ content_for :title do
+ 'foo'
+ end
+ content_for :title, nil, true do
+ 'bar'
+ end
+ assert_equal 'bar', content_for(:title)
+ end
+
+ def test_content_for_with_block_and_multiple_calls_without_flush
+ assert ! content_for?(:title)
+ content_for :title do
+ 'foo'
+ end
+ content_for :title, false do
+ 'bar'
+ end
+ assert_equal 'foobar', content_for(:title)
+ end
+
def test_content_for_with_whitespace_block
assert ! content_for?(:title)
content_for :title, 'foo'
@@ -74,12 +114,27 @@ def test_content_for_with_whitespace_block
assert_equal 'foobar', content_for(:title)
end
+ def test_content_for_with_whitespace_block_and_flush
+ assert ! content_for?(:title)
+ content_for :title, 'foo'
+ content_for :title, true do
+ output_buffer << " \n "
+ nil
+ end
+ content_for :title, 'bar', true
+ assert_equal 'bar', content_for(:title)
+ end
+
def test_content_for_returns_nil_when_writing
assert ! content_for?(:title)
assert_equal nil, content_for(:title, 'foo')
assert_equal nil, content_for(:title) { output_buffer << 'bar'; nil }
assert_equal nil, content_for(:title) { output_buffer << " \n "; nil }
assert_equal 'foobar', content_for(:title)
+ assert_equal nil, content_for(:title, 'foo', true)
+ assert_equal nil, content_for(:title, true) { output_buffer << 'bar'; nil }
+ assert_equal nil, content_for(:title, true) { output_buffer << " \n "; nil }
+ assert_equal 'bar', content_for(:title)
end
def test_content_for_question_mark
@@ -106,4 +106,4 @@ def test_render_with_nested_streaming_multiple_yields_provide_and_content_for
buffered_render(:template => "test/nested_streaming", :layout => "layouts/streaming")
end
-end if defined?(Fiber)
+end
@@ -1,5 +1,8 @@
## Rails 4.0.0 (unreleased) ##
+* Connections *must* be closed at the end of a thread. If not, your
+ connection pool can fill and an exception will be raised.
+
* Added the `ActiveRecord::Model` module which can be included in a
class as an alternative to inheriting from `ActiveRecord::Base`:
Oops, something went wrong.

0 comments on commit c8fe025

Please sign in to comment.