Compare commits

..

13 Commits

Author SHA1 Message Date
Charlie Somerville
4fc14b1f71 3.2.19.github9 2014-11-10 15:30:19 +11:00
Charlie Somerville
7c89fc489d Merge pull request #36 from github/3-2-github+ambiguous-times
Force a period when local times are ambiguous
2014-11-10 15:26:47 +11:00
John Barnette
7a559d389c Force a period when local times are ambiguous
This commit includes the essence of
https://github.com/rails/rails/pull/17409.
2014-11-10 12:56:35 +11:00
Dirkjan Bussink
726e996306 New version because of Proc#bind removal 2014-10-09 08:42:43 +02:00
Dirkjan Bussink
eadedf7189 Merge pull request #34 from github/dbussink/rails32-proc-bind
Remove Proc#bind from Rails 3.2
2014-10-09 08:42:11 +02:00
Dirkjan Bussink
c831f67d8b Remove Proc#bind from Rails 3.2 2014-10-08 14:08:40 +02:00
Charlie Somerville
b6f150c40c 3.2.19.github7 2014-10-07 16:41:52 +11:00
Charlie Somerville
76ad4030e5 whoops, we don't want to create an output_buffer local 2014-10-07 16:35:37 +11:00
Charlie Somerville
0a3c7ba903 3.2.19.github6 2014-10-07 16:29:46 +11:00
Charlie Somerville
d69e65ab34 use bytesize and byteslice rather than length and slice! 2014-10-07 16:29:14 +11:00
Charlie Somerville
56d2614309 3.2.19.github5 2014-09-26 16:58:46 +10:00
Rob Sanheim
0afd326c36 Move commit exception handling to a method so we can override
It looks like these methods all get included into the AbstractAdapter,
and then in github/github we have our own Adapter as an internal gem.

So this should be easy enough to override in our vendor'ed adapter.

This will allow us to still grab errors that happen in `after_commit`
which would normally be swallowed in Rails 3.0 (and beyond).

Conflicts:
	activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb
2014-09-26 16:25:08 +10:00
Rob Sanheim
c957f5f609 only _run_commit_callbacks when destroyed or persisted:
should fix issues with commit callbacks getting called when the record
is not persisted (yet) in a inner transaction or due to some other edge
case.

see also caabed6c76

Conflicts:
	activerecord/lib/active_record/transactions.rb
2014-09-26 16:19:59 +10:00
11 changed files with 36 additions and 43 deletions

View File

@@ -1 +1 @@
3.2.19.github4
3.2.19.github9

View File

@@ -2,7 +2,6 @@ require 'mail'
require 'action_mailer/collector'
require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/proc'
require 'active_support/core_ext/string/inflections'
require 'active_support/core_ext/hash/except'
require 'active_support/core_ext/module/anonymous'
@@ -627,7 +626,7 @@ module ActionMailer #:nodoc:
# Call all the procs (if any)
default_values = self.class.default.merge(self.class.default) do |k,v|
v.respond_to?(:call) ? v.bind(self).call : v
v.respond_to?(:call) ? instance_eval(&v) : v
end
# Handle defaults

View File

@@ -2,11 +2,11 @@ module ActionView
# = Action View Cache Helper
module Helpers
module CacheHelper
# This helper exposes a method for caching fragments of a view
# This helper exposes a method for caching fragments of a view
# rather than an entire action or page. This technique is useful
# caching pieces like menus, lists of newstopics, static HTML
# fragments, and so on. This method takes a block that contains
# the content you wish to cache.
# the content you wish to cache.
#
# See ActionController::Caching::Fragments for usage instructions.
#
@@ -23,7 +23,7 @@ module ActionView
# <p>Hello users! Welcome to our website!</p>
# <% end %>
#
# Static content with embedded ruby content can be cached as
# Static content with embedded ruby content can be cached as
# well:
#
# <% cache do %>
@@ -49,10 +49,11 @@ module ActionView
else
# VIEW TODO: Make #capture usable outside of ERB
# This dance is needed because Builder can't use capture
pos = output_buffer.length
pos = output_buffer.bytesize
yield
output_safe = output_buffer.html_safe?
fragment = output_buffer.slice!(pos..-1)
fragment = output_buffer.byteslice(pos..-1)
self.output_buffer = output_buffer.byteslice(0...pos)
if output_safe
self.output_buffer = output_buffer.class.new(output_buffer)
end

View File

@@ -371,7 +371,7 @@ module ActiveRecord
begin
record.committed!
rescue Exception => e
record.logger.error(e) if record.respond_to?(:logger) && record.logger
handle_commit_exceptions(record, e)
end
end
end
@@ -385,6 +385,11 @@ module ActiveRecord
row = result.rows.first
row && row.first
end
# Handle any exceptions caught trying to send the commit message to a record
def handle_commit_exceptions(record, e)
record.logger.error(e) if record.respond_to?(:logger) && record.logger
end
end
end
end

View File

@@ -278,7 +278,7 @@ module ActiveRecord
# Call the after_commit callbacks
def committed! #:nodoc:
run_callbacks :commit
run_callbacks :commit if destroyed? || persisted?
ensure
@_start_transaction_state.clear
end

View File

@@ -1,14 +0,0 @@
require "active_support/core_ext/kernel/singleton_class"
class Proc #:nodoc:
def bind(object)
block, time = self, Time.now
object.class_eval do
method_name = "__bind_#{time.to_i}_#{time.usec}"
define_method(method_name, &block)
method = instance_method(method_name)
remove_method(method_name)
method
end.bind(object)
end
end

View File

@@ -1,6 +1,5 @@
require 'active_support/concern'
require 'active_support/core_ext/class/attribute'
require 'active_support/core_ext/proc'
require 'active_support/core_ext/string/inflections'
require 'active_support/core_ext/array/extract_options'
@@ -108,7 +107,11 @@ module ActiveSupport
when Symbol
method(rescuer)
when Proc
rescuer.bind(self)
if rescuer.arity == 0
Proc.new { instance_exec(&rescuer) }
else
Proc.new { |_exception| instance_exec(_exception, &rescuer) }
end
end
end
end

View File

@@ -338,7 +338,7 @@ module ActiveSupport
# so transfer time values to a utc constructor if necessary
@time = transfer_time_values_to_utc_constructor(@time) unless @time.utc?
begin
@time_zone.period_for_local(@time)
@time_zone.period_for_local(@time) { |periods| periods.first }
rescue ::TZInfo::PeriodNotFound
# time is in the "spring forward" hour gap, so we're moving the time forward one hour and trying again
@time += 1.hour

View File

@@ -309,8 +309,8 @@ module ActiveSupport
end
# Adjust the given time to the simultaneous time in UTC. Returns a Time.utc() instance.
def local_to_utc(time, dst=true)
tzinfo.local_to_utc(time, dst)
def local_to_utc(time, dst=true, &block)
tzinfo.local_to_utc(time, dst, &block)
end
# Available so that TimeZone instances respond like TZInfo::Timezone instances
@@ -319,8 +319,8 @@ module ActiveSupport
end
# Available so that TimeZone instances respond like TZInfo::Timezone instances
def period_for_local(time, dst=true)
tzinfo.period_for_local(time, dst)
def period_for_local(time, dst=true, &block)
tzinfo.period_for_local(time, dst, &block)
end
def self.find_tzinfo(name)

View File

@@ -1,12 +0,0 @@
require 'abstract_unit'
require 'active_support/core_ext/proc'
class ProcTests < Test::Unit::TestCase
def test_bind_returns_method_with_changed_self
block = Proc.new { self }
assert_equal self, block.call
bound_block = block.bind("hello")
assert_not_equal block, bound_block
assert_equal "hello", bound_block.call
end
end

View File

@@ -136,6 +136,17 @@ class TimeZoneTest < Test::Unit::TestCase
assert_equal 'EDT', twz.zone
end
def test_local_handles_non_dst_clock_set_back
# If the clocks are set back during a transition from one non-DST observance
# to another, the time of the transition will be ambiguous. The earlier
# observance will be selected to mirror behaviour of DST to non-DST transitions.
# Such a transition occurred at 02:00 local time in Moscow on 26 October 2014.
zone = ActiveSupport::TimeZone['Moscow']
twz = zone.local(2014,10,26,1)
assert_equal Time.utc(2014,10,26,1), twz.time
assert_equal Time.utc(2014,10,25,21), twz.utc
end
def test_at
zone = ActiveSupport::TimeZone['Eastern Time (US & Canada)']
secs = 946684800.0