activesupport 6.0.4.4 → 7.0.4.1
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.
Potentially problematic release.
This version of activesupport might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +257 -532
- data/MIT-LICENSE +1 -1
- data/lib/active_support/actionable_error.rb +1 -1
- data/lib/active_support/array_inquirer.rb +2 -2
- data/lib/active_support/backtrace_cleaner.rb +5 -5
- data/lib/active_support/benchmarkable.rb +3 -3
- data/lib/active_support/cache/file_store.rb +16 -10
- data/lib/active_support/cache/mem_cache_store.rb +163 -42
- data/lib/active_support/cache/memory_store.rb +57 -29
- data/lib/active_support/cache/null_store.rb +10 -2
- data/lib/active_support/cache/redis_cache_store.rb +79 -98
- data/lib/active_support/cache/strategy/local_cache.rb +49 -57
- data/lib/active_support/cache.rb +378 -179
- data/lib/active_support/callbacks.rb +230 -122
- data/lib/active_support/code_generator.rb +65 -0
- data/lib/active_support/concern.rb +49 -5
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +2 -4
- data/lib/active_support/concurrency/share_lock.rb +2 -2
- data/lib/active_support/configurable.rb +9 -6
- data/lib/active_support/configuration_file.rb +51 -0
- data/lib/active_support/core_ext/array/access.rb +1 -5
- data/lib/active_support/core_ext/array/conversions.rb +13 -12
- data/lib/active_support/core_ext/array/deprecated_conversions.rb +25 -0
- data/lib/active_support/core_ext/array/grouping.rb +6 -6
- data/lib/active_support/core_ext/array/inquiry.rb +2 -2
- data/lib/active_support/core_ext/array.rb +1 -0
- data/lib/active_support/core_ext/benchmark.rb +2 -2
- data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
- data/lib/active_support/core_ext/class/attribute.rb +34 -44
- data/lib/active_support/core_ext/class/subclasses.rb +9 -22
- data/lib/active_support/core_ext/date/blank.rb +1 -1
- data/lib/active_support/core_ext/date/calculations.rb +9 -9
- data/lib/active_support/core_ext/date/conversions.rb +16 -15
- data/lib/active_support/core_ext/date/deprecated_conversions.rb +26 -0
- data/lib/active_support/core_ext/date.rb +1 -0
- data/lib/active_support/core_ext/date_and_time/calculations.rb +17 -4
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +15 -0
- data/lib/active_support/core_ext/date_time/blank.rb +1 -1
- data/lib/active_support/core_ext/date_time/conversions.rb +13 -13
- data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +22 -0
- data/lib/active_support/core_ext/date_time.rb +1 -0
- data/lib/active_support/core_ext/digest/uuid.rb +39 -13
- data/lib/active_support/core_ext/enumerable.rb +164 -23
- data/lib/active_support/core_ext/file/atomic.rb +3 -1
- data/lib/active_support/core_ext/hash/conversions.rb +2 -3
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +1 -1
- data/lib/active_support/core_ext/hash/indifferent_access.rb +3 -3
- data/lib/active_support/core_ext/hash/keys.rb +2 -2
- data/lib/active_support/core_ext/hash/slice.rb +3 -2
- data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
- data/lib/active_support/core_ext/kernel/singleton_class.rb +1 -1
- data/lib/active_support/core_ext/load_error.rb +1 -1
- data/lib/active_support/core_ext/module/attr_internal.rb +2 -2
- data/lib/active_support/core_ext/module/attribute_accessors.rb +25 -29
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +26 -13
- data/lib/active_support/core_ext/module/concerning.rb +8 -2
- data/lib/active_support/core_ext/module/delegation.rb +40 -36
- data/lib/active_support/core_ext/module/introspection.rb +1 -25
- data/lib/active_support/core_ext/name_error.rb +23 -2
- data/lib/active_support/core_ext/numeric/conversions.rb +80 -73
- data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +60 -0
- data/lib/active_support/core_ext/numeric.rb +1 -0
- data/lib/active_support/core_ext/object/acts_like.rb +29 -5
- data/lib/active_support/core_ext/object/blank.rb +2 -2
- data/lib/active_support/core_ext/object/deep_dup.rb +1 -1
- data/lib/active_support/core_ext/object/duplicable.rb +11 -0
- data/lib/active_support/core_ext/object/json.rb +42 -26
- data/lib/active_support/core_ext/object/to_query.rb +2 -2
- data/lib/active_support/core_ext/object/try.rb +20 -20
- data/lib/active_support/core_ext/object/with_options.rb +20 -1
- data/lib/active_support/core_ext/pathname/existence.rb +21 -0
- data/lib/active_support/core_ext/pathname.rb +3 -0
- data/lib/active_support/core_ext/range/compare_range.rb +6 -25
- data/lib/active_support/core_ext/range/conversions.rb +8 -8
- data/lib/active_support/core_ext/range/deprecated_conversions.rb +26 -0
- data/lib/active_support/core_ext/range/each.rb +1 -1
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +4 -20
- data/lib/active_support/core_ext/range/overlaps.rb +1 -1
- data/lib/active_support/core_ext/range.rb +1 -1
- data/lib/active_support/core_ext/regexp.rb +8 -1
- data/lib/active_support/core_ext/securerandom.rb +1 -1
- data/lib/active_support/core_ext/string/access.rb +5 -24
- data/lib/active_support/core_ext/string/conversions.rb +3 -2
- data/lib/active_support/core_ext/string/filters.rb +1 -1
- data/lib/active_support/core_ext/string/inflections.rb +39 -5
- data/lib/active_support/core_ext/string/inquiry.rb +2 -1
- data/lib/active_support/core_ext/string/multibyte.rb +2 -2
- data/lib/active_support/core_ext/string/output_safety.rb +92 -41
- data/lib/active_support/core_ext/string/starts_ends_with.rb +2 -2
- data/lib/active_support/core_ext/symbol/starts_ends_with.rb +6 -0
- data/lib/active_support/core_ext/symbol.rb +3 -0
- data/lib/active_support/core_ext/time/calculations.rb +25 -7
- data/lib/active_support/core_ext/time/conversions.rb +15 -12
- data/lib/active_support/core_ext/time/deprecated_conversions.rb +22 -0
- data/lib/active_support/core_ext/time/zones.rb +7 -22
- data/lib/active_support/core_ext/time.rb +1 -0
- data/lib/active_support/core_ext/uri.rb +3 -23
- data/lib/active_support/core_ext.rb +2 -1
- data/lib/active_support/current_attributes/test_helper.rb +13 -0
- data/lib/active_support/current_attributes.rb +39 -16
- data/lib/active_support/dependencies/interlock.rb +10 -18
- data/lib/active_support/dependencies/require_dependency.rb +28 -0
- data/lib/active_support/dependencies.rb +58 -769
- data/lib/active_support/deprecation/behaviors.rb +23 -7
- data/lib/active_support/deprecation/disallowed.rb +56 -0
- data/lib/active_support/deprecation/instance_delegator.rb +0 -1
- data/lib/active_support/deprecation/method_wrappers.rb +6 -5
- data/lib/active_support/deprecation/proxy_wrappers.rb +4 -4
- data/lib/active_support/deprecation/reporting.rb +50 -7
- data/lib/active_support/deprecation.rb +7 -2
- data/lib/active_support/descendants_tracker.rb +174 -64
- data/lib/active_support/digest.rb +5 -3
- data/lib/active_support/duration/iso8601_parser.rb +3 -3
- data/lib/active_support/duration/iso8601_serializer.rb +24 -10
- data/lib/active_support/duration.rb +134 -55
- data/lib/active_support/encrypted_configuration.rb +13 -2
- data/lib/active_support/encrypted_file.rb +32 -3
- data/lib/active_support/environment_inquirer.rb +20 -0
- data/lib/active_support/error_reporter.rb +117 -0
- data/lib/active_support/evented_file_update_checker.rb +72 -138
- data/lib/active_support/execution_context/test_helper.rb +13 -0
- data/lib/active_support/execution_context.rb +53 -0
- data/lib/active_support/execution_wrapper.rb +43 -21
- data/lib/active_support/executor/test_helper.rb +7 -0
- data/lib/active_support/fork_tracker.rb +71 -0
- data/lib/active_support/gem_version.rb +3 -3
- data/lib/active_support/hash_with_indifferent_access.rb +51 -25
- data/lib/active_support/html_safe_translation.rb +43 -0
- data/lib/active_support/i18n.rb +1 -0
- data/lib/active_support/i18n_railtie.rb +14 -19
- data/lib/active_support/inflector/inflections.rb +24 -9
- data/lib/active_support/inflector/methods.rb +29 -49
- data/lib/active_support/inflector/transliterate.rb +5 -5
- data/lib/active_support/isolated_execution_state.rb +72 -0
- data/lib/active_support/json/decoding.rb +4 -4
- data/lib/active_support/json/encoding.rb +8 -4
- data/lib/active_support/key_generator.rb +23 -6
- data/lib/active_support/lazy_load_hooks.rb +28 -4
- data/lib/active_support/locale/en.yml +8 -4
- data/lib/active_support/log_subscriber/test_helper.rb +2 -2
- data/lib/active_support/log_subscriber.rb +23 -5
- data/lib/active_support/logger.rb +1 -1
- data/lib/active_support/logger_silence.rb +2 -26
- data/lib/active_support/logger_thread_safe_level.rb +34 -21
- data/lib/active_support/message_encryptor.rb +16 -13
- data/lib/active_support/message_verifier.rb +50 -18
- data/lib/active_support/messages/metadata.rb +2 -2
- data/lib/active_support/messages/rotation_configuration.rb +2 -1
- data/lib/active_support/messages/rotator.rb +6 -5
- data/lib/active_support/multibyte/chars.rb +13 -52
- data/lib/active_support/multibyte/unicode.rb +1 -87
- data/lib/active_support/multibyte.rb +1 -1
- data/lib/active_support/notifications/fanout.rb +110 -69
- data/lib/active_support/notifications/instrumenter.rb +37 -29
- data/lib/active_support/notifications.rb +55 -28
- data/lib/active_support/number_helper/number_converter.rb +2 -4
- data/lib/active_support/number_helper/number_to_currency_converter.rb +11 -6
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_human_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +2 -2
- data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +9 -5
- data/lib/active_support/number_helper/rounding_helper.rb +12 -32
- data/lib/active_support/number_helper.rb +29 -16
- data/lib/active_support/option_merger.rb +11 -18
- data/lib/active_support/ordered_hash.rb +1 -1
- data/lib/active_support/ordered_options.rb +9 -3
- data/lib/active_support/parameter_filter.rb +21 -11
- data/lib/active_support/per_thread_registry.rb +6 -1
- data/lib/active_support/rails.rb +1 -4
- data/lib/active_support/railtie.rb +77 -5
- data/lib/active_support/reloader.rb +1 -1
- data/lib/active_support/rescuable.rb +16 -16
- data/lib/active_support/ruby_features.rb +7 -0
- data/lib/active_support/secure_compare_rotator.rb +51 -0
- data/lib/active_support/security_utils.rb +19 -12
- data/lib/active_support/string_inquirer.rb +2 -2
- data/lib/active_support/subscriber.rb +19 -25
- data/lib/active_support/tagged_logging.rb +31 -6
- data/lib/active_support/test_case.rb +13 -21
- data/lib/active_support/testing/assertions.rb +50 -13
- data/lib/active_support/testing/deprecation.rb +52 -1
- data/lib/active_support/testing/isolation.rb +2 -2
- data/lib/active_support/testing/method_call_assertions.rb +5 -5
- data/lib/active_support/testing/parallelization/server.rb +82 -0
- data/lib/active_support/testing/parallelization/worker.rb +103 -0
- data/lib/active_support/testing/parallelization.rb +16 -95
- data/lib/active_support/testing/parallelize_executor.rb +76 -0
- data/lib/active_support/testing/stream.rb +3 -5
- data/lib/active_support/testing/tagged_logging.rb +1 -1
- data/lib/active_support/testing/time_helpers.rb +53 -5
- data/lib/active_support/time_with_zone.rb +126 -62
- data/lib/active_support/values/time_zone.rb +54 -23
- data/lib/active_support/version.rb +1 -1
- data/lib/active_support/xml_mini/jdom.rb +1 -1
- data/lib/active_support/xml_mini/libxml.rb +5 -5
- data/lib/active_support/xml_mini/libxmlsax.rb +1 -1
- data/lib/active_support/xml_mini/nokogiri.rb +4 -4
- data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
- data/lib/active_support/xml_mini/rexml.rb +9 -2
- data/lib/active_support/xml_mini.rb +5 -4
- data/lib/active_support.rb +29 -1
- metadata +46 -45
- data/lib/active_support/core_ext/array/prepend_and_append.rb +0 -5
- data/lib/active_support/core_ext/hash/compact.rb +0 -5
- data/lib/active_support/core_ext/hash/transform_values.rb +0 -5
- data/lib/active_support/core_ext/marshal.rb +0 -24
- data/lib/active_support/core_ext/module/reachable.rb +0 -6
- data/lib/active_support/core_ext/numeric/inquiry.rb +0 -5
- data/lib/active_support/core_ext/range/include_range.rb +0 -9
- data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -117
@@ -3,37 +3,12 @@
|
|
3
3
|
require "drb"
|
4
4
|
require "drb/unix" unless Gem.win_platform?
|
5
5
|
require "active_support/core_ext/module/attribute_accessors"
|
6
|
+
require "active_support/testing/parallelization/server"
|
7
|
+
require "active_support/testing/parallelization/worker"
|
6
8
|
|
7
9
|
module ActiveSupport
|
8
10
|
module Testing
|
9
11
|
class Parallelization # :nodoc:
|
10
|
-
class Server
|
11
|
-
include DRb::DRbUndumped
|
12
|
-
|
13
|
-
def initialize
|
14
|
-
@queue = Queue.new
|
15
|
-
end
|
16
|
-
|
17
|
-
def record(reporter, result)
|
18
|
-
raise DRb::DRbConnError if result.is_a?(DRb::DRbUnknown)
|
19
|
-
|
20
|
-
reporter.synchronize do
|
21
|
-
reporter.record(result)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def <<(o)
|
26
|
-
o[2] = DRbObject.new(o[2]) if o
|
27
|
-
@queue << o
|
28
|
-
end
|
29
|
-
|
30
|
-
def length
|
31
|
-
@queue.length
|
32
|
-
end
|
33
|
-
|
34
|
-
def pop; @queue.pop; end
|
35
|
-
end
|
36
|
-
|
37
12
|
@@after_fork_hooks = []
|
38
13
|
|
39
14
|
def self.after_fork_hook(&blk)
|
@@ -50,85 +25,31 @@ module ActiveSupport
|
|
50
25
|
|
51
26
|
cattr_reader :run_cleanup_hooks
|
52
27
|
|
53
|
-
def initialize(
|
54
|
-
@
|
55
|
-
@
|
56
|
-
@
|
57
|
-
|
58
|
-
@url = DRb.start_service("drbunix:", @queue).uri
|
59
|
-
end
|
60
|
-
|
61
|
-
def after_fork(worker)
|
62
|
-
self.class.after_fork_hooks.each do |cb|
|
63
|
-
cb.call(worker)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def run_cleanup(worker)
|
68
|
-
self.class.run_cleanup_hooks.each do |cb|
|
69
|
-
cb.call(worker)
|
70
|
-
end
|
28
|
+
def initialize(worker_count)
|
29
|
+
@worker_count = worker_count
|
30
|
+
@queue_server = Server.new
|
31
|
+
@worker_pool = []
|
32
|
+
@url = DRb.start_service("drbunix:", @queue_server).uri
|
71
33
|
end
|
72
34
|
|
73
35
|
def start
|
74
|
-
@
|
75
|
-
|
76
|
-
DRb.stop_service
|
77
|
-
|
78
|
-
begin
|
79
|
-
after_fork(worker)
|
80
|
-
rescue => setup_exception; end
|
81
|
-
|
82
|
-
queue = DRbObject.new_with_uri(@url)
|
83
|
-
|
84
|
-
while job = queue.pop
|
85
|
-
klass = job[0]
|
86
|
-
method = job[1]
|
87
|
-
reporter = job[2]
|
88
|
-
result = klass.with_info_handler reporter do
|
89
|
-
Minitest.run_one_method(klass, method)
|
90
|
-
end
|
91
|
-
|
92
|
-
add_setup_exception(result, setup_exception) if setup_exception
|
93
|
-
|
94
|
-
begin
|
95
|
-
queue.record(reporter, result)
|
96
|
-
rescue DRb::DRbConnError
|
97
|
-
result.failures.map! do |failure|
|
98
|
-
if failure.respond_to?(:error)
|
99
|
-
# minitest >5.14.0
|
100
|
-
error = DRb::DRbRemoteError.new(failure.error)
|
101
|
-
else
|
102
|
-
error = DRb::DRbRemoteError.new(failure.exception)
|
103
|
-
end
|
104
|
-
Minitest::UnexpectedError.new(error)
|
105
|
-
end
|
106
|
-
queue.record(reporter, result)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
ensure
|
110
|
-
run_cleanup(worker)
|
111
|
-
end
|
36
|
+
@worker_pool = @worker_count.times.map do |worker|
|
37
|
+
Worker.new(worker, @url).start
|
112
38
|
end
|
113
39
|
end
|
114
40
|
|
115
41
|
def <<(work)
|
116
|
-
@
|
42
|
+
@queue_server << work
|
117
43
|
end
|
118
44
|
|
119
|
-
def
|
120
|
-
@
|
121
|
-
@pool.each { |pid| Process.waitpid pid }
|
122
|
-
|
123
|
-
if @queue.length > 0
|
124
|
-
raise "Queue not empty, but all workers have finished. This probably means that a worker crashed and #{@queue.length} tests were missed."
|
125
|
-
end
|
45
|
+
def size
|
46
|
+
@worker_count
|
126
47
|
end
|
127
48
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
49
|
+
def shutdown
|
50
|
+
@queue_server.shutdown
|
51
|
+
@worker_pool.each { |pid| Process.waitpid pid }
|
52
|
+
end
|
132
53
|
end
|
133
54
|
end
|
134
55
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveSupport
|
4
|
+
module Testing
|
5
|
+
class ParallelizeExecutor # :nodoc:
|
6
|
+
attr_reader :size, :parallelize_with, :threshold
|
7
|
+
|
8
|
+
def initialize(size:, with:, threshold: ActiveSupport.test_parallelization_threshold)
|
9
|
+
@size = size
|
10
|
+
@parallelize_with = with
|
11
|
+
@threshold = threshold
|
12
|
+
end
|
13
|
+
|
14
|
+
def start
|
15
|
+
parallelize if should_parallelize?
|
16
|
+
show_execution_info
|
17
|
+
|
18
|
+
parallel_executor.start if parallelized?
|
19
|
+
end
|
20
|
+
|
21
|
+
def <<(work)
|
22
|
+
parallel_executor << work if parallelized?
|
23
|
+
end
|
24
|
+
|
25
|
+
def shutdown
|
26
|
+
parallel_executor.shutdown if parallelized?
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def parallel_executor
|
31
|
+
@parallel_executor ||= build_parallel_executor
|
32
|
+
end
|
33
|
+
|
34
|
+
def build_parallel_executor
|
35
|
+
case parallelize_with
|
36
|
+
when :processes
|
37
|
+
Testing::Parallelization.new(size)
|
38
|
+
when :threads
|
39
|
+
ActiveSupport::TestCase.lock_threads = false if defined?(ActiveSupport::TestCase.lock_threads)
|
40
|
+
Minitest::Parallel::Executor.new(size)
|
41
|
+
else
|
42
|
+
raise ArgumentError, "#{parallelize_with} is not a supported parallelization executor."
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def parallelize
|
47
|
+
@parallelized = true
|
48
|
+
Minitest::Test.parallelize_me!
|
49
|
+
end
|
50
|
+
|
51
|
+
def parallelized?
|
52
|
+
@parallelized if defined?(@parallelized)
|
53
|
+
end
|
54
|
+
|
55
|
+
def should_parallelize?
|
56
|
+
ENV["PARALLEL_WORKERS"] || tests_count > threshold
|
57
|
+
end
|
58
|
+
|
59
|
+
def tests_count
|
60
|
+
@tests_count ||= Minitest::Runnable.runnables.sum { |runnable| runnable.runnable_methods.size }
|
61
|
+
end
|
62
|
+
|
63
|
+
def show_execution_info
|
64
|
+
puts execution_info
|
65
|
+
end
|
66
|
+
|
67
|
+
def execution_info
|
68
|
+
if parallelized?
|
69
|
+
"Running #{tests_count} tests in parallel using #{parallel_executor.size} #{parallelize_with}"
|
70
|
+
else
|
71
|
+
"Running #{tests_count} tests in a single process (parallelization threshold is #{threshold})"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module ActiveSupport
|
4
4
|
module Testing
|
5
|
-
module Stream
|
5
|
+
module Stream # :nodoc:
|
6
6
|
private
|
7
7
|
def silence_stream(stream)
|
8
8
|
old_stream = stream.dup
|
@@ -14,11 +14,9 @@ module ActiveSupport
|
|
14
14
|
old_stream.close
|
15
15
|
end
|
16
16
|
|
17
|
-
def quietly
|
17
|
+
def quietly(&block)
|
18
18
|
silence_stream(STDOUT) do
|
19
|
-
silence_stream(STDERR)
|
20
|
-
yield
|
21
|
-
end
|
19
|
+
silence_stream(STDERR, &block)
|
22
20
|
end
|
23
21
|
end
|
24
22
|
|
@@ -4,7 +4,7 @@ module ActiveSupport
|
|
4
4
|
module Testing
|
5
5
|
# Logs a "PostsControllerTest: test name" heading before each test to
|
6
6
|
# make test.log easier to search and follow along with.
|
7
|
-
module TaggedLogging
|
7
|
+
module TaggedLogging # :nodoc:
|
8
8
|
attr_writer :tagged_logger
|
9
9
|
|
10
10
|
def before_setup
|
@@ -6,6 +6,7 @@ require "concurrent/map"
|
|
6
6
|
|
7
7
|
module ActiveSupport
|
8
8
|
module Testing
|
9
|
+
# Manages stubs for TimeHelpers
|
9
10
|
class SimpleStubs # :nodoc:
|
10
11
|
Stub = Struct.new(:object, :method_name, :original_method)
|
11
12
|
|
@@ -13,6 +14,13 @@ module ActiveSupport
|
|
13
14
|
@stubs = Concurrent::Map.new { |h, k| h[k] = {} }
|
14
15
|
end
|
15
16
|
|
17
|
+
# Stubs object.method_name with the given block
|
18
|
+
# If the method is already stubbed, remove that stub
|
19
|
+
# so that removing this stub will restore the original implementation.
|
20
|
+
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
21
|
+
# target = Time.zone.local(2004, 11, 24, 1, 4, 44)
|
22
|
+
# simple_stubs.stub_object(Time, :now) { at(target.to_i) }
|
23
|
+
# Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
|
16
24
|
def stub_object(object, method_name, &block)
|
17
25
|
if stub = stubbing(object, method_name)
|
18
26
|
unstub_object(stub)
|
@@ -26,6 +34,7 @@ module ActiveSupport
|
|
26
34
|
object.define_singleton_method(method_name, &block)
|
27
35
|
end
|
28
36
|
|
37
|
+
# Remove all object-method stubs held by this instance
|
29
38
|
def unstub_all!
|
30
39
|
@stubs.each_value do |object_stubs|
|
31
40
|
object_stubs.each_value do |stub|
|
@@ -35,11 +44,19 @@ module ActiveSupport
|
|
35
44
|
@stubs.clear
|
36
45
|
end
|
37
46
|
|
47
|
+
# Returns the Stub for object#method_name
|
48
|
+
# (nil if it is not stubbed)
|
38
49
|
def stubbing(object, method_name)
|
39
50
|
@stubs[object.object_id][method_name]
|
40
51
|
end
|
41
52
|
|
53
|
+
# Returns true if any stubs are set, false if there are none
|
54
|
+
def stubbed?
|
55
|
+
!@stubs.empty?
|
56
|
+
end
|
57
|
+
|
42
58
|
private
|
59
|
+
# Restores the original object.method described by the Stub
|
43
60
|
def unstub_object(stub)
|
44
61
|
singleton_class = stub.object.singleton_class
|
45
62
|
singleton_class.silence_redefinition_of_method stub.method_name
|
@@ -82,7 +99,7 @@ module ActiveSupport
|
|
82
99
|
# The stubs are automatically removed at the end of the test.
|
83
100
|
#
|
84
101
|
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
85
|
-
# travel_to Time.zone.local(2004, 11, 24,
|
102
|
+
# travel_to Time.zone.local(2004, 11, 24, 1, 4, 44)
|
86
103
|
# Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
|
87
104
|
# Date.current # => Wed, 24 Nov 2004
|
88
105
|
# DateTime.current # => Wed, 24 Nov 2004 01:04:44 -0500
|
@@ -104,12 +121,12 @@ module ActiveSupport
|
|
104
121
|
# state at the end of the block:
|
105
122
|
#
|
106
123
|
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
107
|
-
# travel_to Time.zone.local(2004, 11, 24,
|
124
|
+
# travel_to Time.zone.local(2004, 11, 24, 1, 4, 44) do
|
108
125
|
# Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
|
109
126
|
# end
|
110
127
|
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
111
128
|
def travel_to(date_or_time)
|
112
|
-
if block_given? &&
|
129
|
+
if block_given? && in_block
|
113
130
|
travel_to_nested_block_call = <<~MSG
|
114
131
|
|
115
132
|
Calling `travel_to` with a block, when we have previously already made a call to `travel_to`, can lead to confusing time stubbing.
|
@@ -139,19 +156,28 @@ module ActiveSupport
|
|
139
156
|
|
140
157
|
if date_or_time.is_a?(Date) && !date_or_time.is_a?(DateTime)
|
141
158
|
now = date_or_time.midnight.to_time
|
159
|
+
elsif date_or_time.is_a?(String)
|
160
|
+
now = Time.zone.parse(date_or_time)
|
142
161
|
else
|
143
162
|
now = date_or_time.to_time.change(usec: 0)
|
144
163
|
end
|
145
164
|
|
165
|
+
stubbed_time = Time.now if simple_stubs.stubbing(Time, :now)
|
146
166
|
simple_stubs.stub_object(Time, :now) { at(now.to_i) }
|
147
167
|
simple_stubs.stub_object(Date, :today) { jd(now.to_date.jd) }
|
148
168
|
simple_stubs.stub_object(DateTime, :now) { jd(now.to_date.jd, now.hour, now.min, now.sec, Rational(now.utc_offset, 86400)) }
|
149
169
|
|
150
170
|
if block_given?
|
151
171
|
begin
|
172
|
+
self.in_block = true
|
152
173
|
yield
|
153
174
|
ensure
|
154
|
-
|
175
|
+
if stubbed_time
|
176
|
+
travel_to stubbed_time
|
177
|
+
else
|
178
|
+
travel_back
|
179
|
+
end
|
180
|
+
self.in_block = false
|
155
181
|
end
|
156
182
|
end
|
157
183
|
end
|
@@ -160,12 +186,32 @@ module ActiveSupport
|
|
160
186
|
# +travel+, +travel_to+, and +freeze_time+.
|
161
187
|
#
|
162
188
|
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
163
|
-
#
|
189
|
+
#
|
190
|
+
# travel_to Time.zone.local(2004, 11, 24, 1, 4, 44)
|
164
191
|
# Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
|
192
|
+
#
|
165
193
|
# travel_back
|
166
194
|
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
195
|
+
#
|
196
|
+
# This method also accepts a block, which brings the stubs back at the end of the block:
|
197
|
+
#
|
198
|
+
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
199
|
+
#
|
200
|
+
# travel_to Time.zone.local(2004, 11, 24, 1, 4, 44)
|
201
|
+
# Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
|
202
|
+
#
|
203
|
+
# travel_back do
|
204
|
+
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
205
|
+
# end
|
206
|
+
#
|
207
|
+
# Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
|
167
208
|
def travel_back
|
209
|
+
stubbed_time = Time.current if block_given? && simple_stubs.stubbed?
|
210
|
+
|
168
211
|
simple_stubs.unstub_all!
|
212
|
+
yield if block_given?
|
213
|
+
ensure
|
214
|
+
travel_to stubbed_time if stubbed_time
|
169
215
|
end
|
170
216
|
alias_method :unfreeze_time, :travel_back
|
171
217
|
|
@@ -193,6 +239,8 @@ module ActiveSupport
|
|
193
239
|
def simple_stubs
|
194
240
|
@simple_stubs ||= SimpleStubs.new
|
195
241
|
end
|
242
|
+
|
243
|
+
attr_accessor :in_block
|
196
244
|
end
|
197
245
|
end
|
198
246
|
end
|