activesupport 5.2.5 → 6.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activesupport might be problematic. Click here for more details.

Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +182 -534
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/lib/active_support.rb +1 -1
  6. data/lib/active_support/backtrace_cleaner.rb +23 -0
  7. data/lib/active_support/cache.rb +40 -18
  8. data/lib/active_support/cache/file_store.rb +19 -12
  9. data/lib/active_support/cache/mem_cache_store.rb +16 -2
  10. data/lib/active_support/cache/memory_store.rb +5 -0
  11. data/lib/active_support/cache/null_store.rb +5 -0
  12. data/lib/active_support/cache/redis_cache_store.rb +39 -20
  13. data/lib/active_support/callbacks.rb +16 -5
  14. data/lib/active_support/configurable.rb +4 -8
  15. data/lib/active_support/core_ext/array.rb +1 -1
  16. data/lib/active_support/core_ext/array/extract.rb +21 -0
  17. data/lib/active_support/core_ext/array/prepend_and_append.rb +2 -6
  18. data/lib/active_support/core_ext/class/attribute.rb +1 -1
  19. data/lib/active_support/core_ext/class/subclasses.rb +1 -1
  20. data/lib/active_support/core_ext/date/calculations.rb +6 -5
  21. data/lib/active_support/core_ext/date_and_time/calculations.rb +24 -17
  22. data/lib/active_support/core_ext/date_time/calculations.rb +1 -1
  23. data/lib/active_support/core_ext/enumerable.rb +71 -67
  24. data/lib/active_support/core_ext/hash.rb +0 -2
  25. data/lib/active_support/core_ext/hash/compact.rb +2 -26
  26. data/lib/active_support/core_ext/hash/keys.rb +0 -29
  27. data/lib/active_support/core_ext/hash/slice.rb +3 -25
  28. data/lib/active_support/core_ext/hash/transform_values.rb +2 -29
  29. data/lib/active_support/core_ext/integer/multiple.rb +1 -1
  30. data/lib/active_support/core_ext/load_error.rb +1 -1
  31. data/lib/active_support/core_ext/module.rb +0 -1
  32. data/lib/active_support/core_ext/module/attribute_accessors.rb +2 -5
  33. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +8 -14
  34. data/lib/active_support/core_ext/module/delegation.rb +27 -7
  35. data/lib/active_support/core_ext/module/introspection.rb +37 -13
  36. data/lib/active_support/core_ext/module/reachable.rb +1 -6
  37. data/lib/active_support/core_ext/module/redefine_method.rb +8 -17
  38. data/lib/active_support/core_ext/numeric.rb +0 -1
  39. data/lib/active_support/core_ext/numeric/conversions.rb +124 -128
  40. data/lib/active_support/core_ext/numeric/inquiry.rb +2 -25
  41. data/lib/active_support/core_ext/object/blank.rb +1 -2
  42. data/lib/active_support/core_ext/object/duplicable.rb +5 -2
  43. data/lib/active_support/core_ext/object/json.rb +1 -0
  44. data/lib/active_support/core_ext/object/try.rb +15 -7
  45. data/lib/active_support/core_ext/object/with_options.rb +1 -1
  46. data/lib/active_support/core_ext/range/compare_range.rb +1 -1
  47. data/lib/active_support/core_ext/range/conversions.rb +31 -29
  48. data/lib/active_support/core_ext/range/include_range.rb +6 -0
  49. data/lib/active_support/core_ext/regexp.rb +0 -4
  50. data/lib/active_support/core_ext/securerandom.rb +23 -3
  51. data/lib/active_support/core_ext/string/access.rb +8 -0
  52. data/lib/active_support/core_ext/string/filters.rb +41 -0
  53. data/lib/active_support/core_ext/string/multibyte.rb +4 -3
  54. data/lib/active_support/core_ext/string/output_safety.rb +16 -5
  55. data/lib/active_support/core_ext/string/strip.rb +3 -1
  56. data/lib/active_support/core_ext/uri.rb +1 -0
  57. data/lib/active_support/current_attributes.rb +2 -0
  58. data/lib/active_support/dependencies.rb +28 -11
  59. data/lib/active_support/deprecation.rb +1 -1
  60. data/lib/active_support/deprecation/behaviors.rb +1 -1
  61. data/lib/active_support/deprecation/method_wrappers.rb +4 -5
  62. data/lib/active_support/deprecation/proxy_wrappers.rb +0 -2
  63. data/lib/active_support/descendants_tracker.rb +6 -5
  64. data/lib/active_support/duration.rb +12 -14
  65. data/lib/active_support/duration/iso8601_parser.rb +2 -3
  66. data/lib/active_support/duration/iso8601_serializer.rb +3 -4
  67. data/lib/active_support/encrypted_configuration.rb +0 -4
  68. data/lib/active_support/evented_file_update_checker.rb +25 -7
  69. data/lib/active_support/execution_wrapper.rb +1 -0
  70. data/lib/active_support/gem_version.rb +4 -4
  71. data/lib/active_support/hash_with_indifferent_access.rb +16 -28
  72. data/lib/active_support/i18n.rb +1 -0
  73. data/lib/active_support/i18n_railtie.rb +8 -1
  74. data/lib/active_support/inflector/inflections.rb +1 -4
  75. data/lib/active_support/inflector/methods.rb +15 -27
  76. data/lib/active_support/inflector/transliterate.rb +6 -6
  77. data/lib/active_support/json/decoding.rb +23 -23
  78. data/lib/active_support/json/encoding.rb +6 -2
  79. data/lib/active_support/key_generator.rb +0 -32
  80. data/lib/active_support/lazy_load_hooks.rb +5 -1
  81. data/lib/active_support/locale/en.rb +31 -0
  82. data/lib/active_support/log_subscriber.rb +31 -8
  83. data/lib/active_support/logger.rb +0 -15
  84. data/lib/active_support/logger_silence.rb +28 -12
  85. data/lib/active_support/logger_thread_safe_level.rb +27 -6
  86. data/lib/active_support/message_encryptor.rb +2 -4
  87. data/lib/active_support/message_verifier.rb +2 -2
  88. data/lib/active_support/multibyte/chars.rb +29 -48
  89. data/lib/active_support/multibyte/unicode.rb +44 -281
  90. data/lib/active_support/notifications.rb +32 -4
  91. data/lib/active_support/notifications/fanout.rb +42 -4
  92. data/lib/active_support/notifications/instrumenter.rb +73 -2
  93. data/lib/active_support/number_helper.rb +7 -0
  94. data/lib/active_support/number_helper/number_to_currency_converter.rb +2 -2
  95. data/lib/active_support/number_helper/number_to_delimited_converter.rb +3 -1
  96. data/lib/active_support/number_helper/number_to_human_converter.rb +3 -1
  97. data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -1
  98. data/lib/active_support/number_helper/number_to_percentage_converter.rb +3 -1
  99. data/lib/active_support/number_helper/number_to_phone_converter.rb +2 -0
  100. data/lib/active_support/number_helper/number_to_rounded_converter.rb +5 -3
  101. data/lib/active_support/ordered_options.rb +1 -1
  102. data/lib/active_support/parameter_filter.rb +124 -0
  103. data/lib/active_support/rails.rb +0 -6
  104. data/lib/active_support/reloader.rb +4 -5
  105. data/lib/active_support/subscriber.rb +16 -26
  106. data/lib/active_support/tagged_logging.rb +13 -4
  107. data/lib/active_support/test_case.rb +91 -0
  108. data/lib/active_support/testing/assertions.rb +15 -1
  109. data/lib/active_support/testing/deprecation.rb +0 -1
  110. data/lib/active_support/testing/file_fixtures.rb +2 -0
  111. data/lib/active_support/testing/isolation.rb +2 -2
  112. data/lib/active_support/testing/method_call_assertions.rb +28 -1
  113. data/lib/active_support/testing/parallelization.rb +109 -0
  114. data/lib/active_support/testing/stream.rb +1 -1
  115. data/lib/active_support/testing/time_helpers.rb +7 -7
  116. data/lib/active_support/time_with_zone.rb +15 -5
  117. data/lib/active_support/values/time_zone.rb +12 -7
  118. data/lib/active_support/xml_mini.rb +2 -9
  119. data/lib/active_support/xml_mini/jdom.rb +2 -2
  120. data/lib/active_support/xml_mini/libxml.rb +2 -2
  121. data/lib/active_support/xml_mini/libxmlsax.rb +4 -4
  122. data/lib/active_support/xml_mini/nokogiri.rb +2 -2
  123. data/lib/active_support/xml_mini/nokogirisax.rb +3 -3
  124. data/lib/active_support/xml_mini/rexml.rb +2 -2
  125. metadata +12 -10
  126. data/lib/active_support/core_ext/digest.rb +0 -3
  127. data/lib/active_support/values/unicode_tables.dat +0 -0
@@ -35,7 +35,7 @@ module ActiveSupport
35
35
  # and the second is a library name.
36
36
  #
37
37
  # ActiveSupport::Deprecation.new('2.0', 'MyLibrary')
38
- def initialize(deprecation_horizon = "6.0", gem_name = "Rails")
38
+ def initialize(deprecation_horizon = "6.1", gem_name = "Rails")
39
39
  self.gem_name = gem_name
40
40
  self.deprecation_horizon = deprecation_horizon
41
41
  # By default, warnings are not silenced and debugging is off.
@@ -43,7 +43,7 @@ module ActiveSupport
43
43
  deprecation_horizon: deprecation_horizon)
44
44
  },
45
45
 
46
- silence: ->(message, callstack, deprecation_horizon, gem_name) {},
46
+ silence: ->(message, callstack, deprecation_horizon, gem_name) { },
47
47
  }
48
48
 
49
49
  # Behavior module allows to determine how to display deprecation messages.
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/core_ext/module/aliasing"
4
3
  require "active_support/core_ext/array/extract_options"
5
4
 
6
5
  module ActiveSupport
@@ -61,13 +60,13 @@ module ActiveSupport
61
60
  with_method = "#{aliased_method}_with_deprecation#{punctuation}"
62
61
  without_method = "#{aliased_method}_without_deprecation#{punctuation}"
63
62
 
64
- target_module.send(:define_method, with_method) do |*args, &block|
63
+ target_module.define_method(with_method) do |*args, &block|
65
64
  deprecator.deprecation_warning(method_name, options[method_name])
66
65
  send(without_method, *args, &block)
67
66
  end
68
67
 
69
- target_module.send(:alias_method, without_method, method_name)
70
- target_module.send(:alias_method, method_name, with_method)
68
+ target_module.alias_method(without_method, method_name)
69
+ target_module.alias_method(method_name, with_method)
71
70
 
72
71
  case
73
72
  when target_module.protected_method_defined?(without_method)
@@ -76,7 +75,7 @@ module ActiveSupport
76
75
  target_module.send(:private, method_name)
77
76
  end
78
77
  else
79
- mod.send(:define_method, method_name) do |*args, &block|
78
+ mod.define_method(method_name) do |*args, &block|
80
79
  deprecator.deprecation_warning(method_name, options[method_name])
81
80
  super(*args, &block)
82
81
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/core_ext/regexp"
4
-
5
3
  module ActiveSupport
6
4
  class Deprecation
7
5
  class DeprecationProxy #:nodoc:
@@ -38,12 +38,13 @@ module ActiveSupport
38
38
  end
39
39
 
40
40
  private
41
- def accumulate_descendants(klass, acc)
42
- if direct_descendants = @@direct_descendants[klass]
43
- acc.concat(direct_descendants)
44
- direct_descendants.each { |direct_descendant| accumulate_descendants(direct_descendant, acc) }
41
+
42
+ def accumulate_descendants(klass, acc)
43
+ if direct_descendants = @@direct_descendants[klass]
44
+ acc.concat(direct_descendants)
45
+ direct_descendants.each { |direct_descendant| accumulate_descendants(direct_descendant, acc) }
46
+ end
45
47
  end
46
- end
47
48
  end
48
49
 
49
50
  def inherited(base)
@@ -183,15 +183,15 @@ module ActiveSupport
183
183
  #
184
184
  def build(value)
185
185
  parts = {}
186
- remainder = value.round(9)
186
+ remainder = value.to_f
187
187
 
188
188
  PARTS.each do |part|
189
189
  unless part == :seconds
190
190
  part_in_seconds = PARTS_IN_SECONDS[part]
191
191
  parts[part] = remainder.div(part_in_seconds)
192
- remainder %= part_in_seconds
192
+ remainder = (remainder % part_in_seconds).round(9)
193
193
  end
194
- end unless value == 0
194
+ end
195
195
 
196
196
  parts[:seconds] = remainder
197
197
 
@@ -210,12 +210,15 @@ module ActiveSupport
210
210
  def initialize(value, parts) #:nodoc:
211
211
  @value, @parts = value, parts.to_h
212
212
  @parts.default = 0
213
- @parts.reject! { |k, v| v.zero? } unless value == 0
213
+ @parts.reject! { |k, v| v.zero? }
214
214
  end
215
215
 
216
216
  def coerce(other) #:nodoc:
217
- if Scalar === other
217
+ case other
218
+ when Scalar
218
219
  [other, self]
220
+ when Duration
221
+ [Scalar.new(other.value), self]
219
222
  else
220
223
  [Scalar.new(other), self]
221
224
  end
@@ -373,7 +376,6 @@ module ActiveSupport
373
376
  return "0 seconds" if parts.empty?
374
377
 
375
378
  parts.
376
- reduce(::Hash.new(0)) { |h, (l, r)| h[l] += r; h }.
377
379
  sort_by { |unit, _ | PARTS.index(unit) }.
378
380
  map { |unit, val| "#{val} #{val == 1 ? unit.to_s.chop : unit.to_s}" }.
379
381
  to_sentence(locale: ::I18n.default_locale)
@@ -400,14 +402,8 @@ module ActiveSupport
400
402
  private
401
403
 
402
404
  def sum(sign, time = ::Time.current)
403
- unless time.acts_like?(:time) || time.acts_like?(:date)
404
- raise ::ArgumentError, "expected a time or date, got #{time.inspect}"
405
- end
406
-
407
- if parts.empty?
408
- time.since(sign * value)
409
- else
410
- parts.inject(time) do |t, (type, number)|
405
+ parts.inject(time) do |t, (type, number)|
406
+ if t.acts_like?(:time) || t.acts_like?(:date)
411
407
  if type == :seconds
412
408
  t.since(sign * number)
413
409
  elsif type == :minutes
@@ -417,6 +413,8 @@ module ActiveSupport
417
413
  else
418
414
  t.advance(type => sign * number)
419
415
  end
416
+ else
417
+ raise ::ArgumentError, "expected a time or date, got #{time.inspect}"
420
418
  end
421
419
  end
422
420
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "strscan"
4
- require "active_support/core_ext/regexp"
5
4
 
6
5
  module ActiveSupport
7
6
  class Duration
@@ -14,8 +13,8 @@ module ActiveSupport
14
13
  class ParsingError < ::ArgumentError; end
15
14
 
16
15
  PERIOD_OR_COMMA = /\.|,/
17
- PERIOD = ".".freeze
18
- COMMA = ",".freeze
16
+ PERIOD = "."
17
+ COMMA = ","
19
18
 
20
19
  SIGN_MARKER = /\A\-|\+|/
21
20
  DATE_MARKER = /P/
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/core_ext/object/blank"
4
- require "active_support/core_ext/hash/transform_values"
5
4
 
6
5
  module ActiveSupport
7
6
  class Duration
@@ -15,14 +14,14 @@ module ActiveSupport
15
14
  # Builds and returns output string.
16
15
  def serialize
17
16
  parts, sign = normalize
18
- return "PT0S".freeze if parts.empty?
17
+ return "PT0S" if parts.empty?
19
18
 
20
- output = "P".dup
19
+ output = +"P"
21
20
  output << "#{parts[:years]}Y" if parts.key?(:years)
22
21
  output << "#{parts[:months]}M" if parts.key?(:months)
23
22
  output << "#{parts[:weeks]}W" if parts.key?(:weeks)
24
23
  output << "#{parts[:days]}D" if parts.key?(:days)
25
- time = "".dup
24
+ time = +""
26
25
  time << "#{parts[:hours]}H" if parts.key?(:hours)
27
26
  time << "#{parts[:minutes]}M" if parts.key?(:minutes)
28
27
  if parts.key?(:seconds)
@@ -38,10 +38,6 @@ module ActiveSupport
38
38
  @options ||= ActiveSupport::InheritableOptions.new(config)
39
39
  end
40
40
 
41
- def serialize(config)
42
- config.present? ? YAML.dump(config) : ""
43
- end
44
-
45
41
  def deserialize(config)
46
42
  YAML.load(config).presence || {}
47
43
  end
@@ -52,16 +52,17 @@ module ActiveSupport
52
52
  @pid = Process.pid
53
53
  @boot_mutex = Mutex.new
54
54
 
55
- if (@dtw = directories_to_watch).any?
55
+ dtw = directories_to_watch
56
+ @dtw, @missing = dtw.partition(&:exist?)
57
+
58
+ if @dtw.any?
56
59
  # Loading listen triggers warnings. These are originated by a legit
57
60
  # usage of attr_* macros for private attributes, but adds a lot of noise
58
61
  # to our test suite. Thus, we lazy load it and disable warnings locally.
59
62
  silence_warnings do
60
- begin
61
- require "listen"
62
- rescue LoadError => e
63
- raise LoadError, "Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile", e.backtrace
64
- end
63
+ require "listen"
64
+ rescue LoadError => e
65
+ raise LoadError, "Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile", e.backtrace
65
66
  end
66
67
  end
67
68
  boot!
@@ -75,6 +76,19 @@ module ActiveSupport
75
76
  @updated.make_true
76
77
  end
77
78
  end
79
+
80
+ if @missing.any?(&:exist?)
81
+ @boot_mutex.synchronize do
82
+ appeared, @missing = @missing.partition(&:exist?)
83
+ shutdown!
84
+
85
+ @dtw += appeared
86
+ boot!
87
+
88
+ @updated.make_true
89
+ end
90
+ end
91
+
78
92
  @updated.true?
79
93
  end
80
94
 
@@ -96,6 +110,10 @@ module ActiveSupport
96
110
  Listen.to(*@dtw, &method(:changed)).start
97
111
  end
98
112
 
113
+ def shutdown!
114
+ Listen.stop
115
+ end
116
+
99
117
  def changed(modified, added, removed)
100
118
  unless updated?
101
119
  @updated.make_true if (modified + added + removed).any? { |f| watching?(f) }
@@ -123,7 +141,7 @@ module ActiveSupport
123
141
  end
124
142
 
125
143
  def directories_to_watch
126
- dtw = (@files + @dirs.keys).map { |f| @ph.existing_parent(f) }
144
+ dtw = @files.map(&:dirname) + @dirs.keys
127
145
  dtw.compact!
128
146
  dtw.uniq!
129
147
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/callbacks"
4
+ require "concurrent/hash"
4
5
 
5
6
  module ActiveSupport
6
7
  class ExecutionWrapper
@@ -7,10 +7,10 @@ module ActiveSupport
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 5
11
- MINOR = 2
12
- TINY = 5
13
- PRE = nil
10
+ MAJOR = 6
11
+ MINOR = 0
12
+ TINY = 0
13
+ PRE = "beta1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "active_support/core_ext/hash/keys"
4
4
  require "active_support/core_ext/hash/reverse_merge"
5
+ require "active_support/core_ext/hash/except"
5
6
 
6
7
  module ActiveSupport
7
8
  # Implements a hash where keys <tt>:foo</tt> and <tt>"foo"</tt> are considered
@@ -163,19 +164,6 @@ module ActiveSupport
163
164
  super(convert_key(key))
164
165
  end
165
166
 
166
- # Same as <tt>Hash#assoc</tt> where the key passed as argument can be
167
- # either a string or a symbol:
168
- #
169
- # counters = ActiveSupport::HashWithIndifferentAccess.new
170
- # counters[:foo] = 1
171
- #
172
- # counters.assoc('foo') # => ["foo", 1]
173
- # counters.assoc(:foo) # => ["foo", 1]
174
- # counters.assoc(:zoo) # => nil
175
- def assoc(key)
176
- super(convert_key(key))
177
- end
178
-
179
167
  # Same as <tt>Hash#fetch</tt> where the key passed as argument can be
180
168
  # either a string or a symbol:
181
169
  #
@@ -190,20 +178,18 @@ module ActiveSupport
190
178
  super(convert_key(key), *extras)
191
179
  end
192
180
 
193
- if Hash.new.respond_to?(:dig)
194
- # Same as <tt>Hash#dig</tt> where the key passed as argument can be
195
- # either a string or a symbol:
196
- #
197
- # counters = ActiveSupport::HashWithIndifferentAccess.new
198
- # counters[:foo] = { bar: 1 }
199
- #
200
- # counters.dig('foo', 'bar') # => 1
201
- # counters.dig(:foo, :bar) # => 1
202
- # counters.dig(:zoo) # => nil
203
- def dig(*args)
204
- args[0] = convert_key(args[0]) if args.size > 0
205
- super(*args)
206
- end
181
+ # Same as <tt>Hash#dig</tt> where the key passed as argument can be
182
+ # either a string or a symbol:
183
+ #
184
+ # counters = ActiveSupport::HashWithIndifferentAccess.new
185
+ # counters[:foo] = { bar: 1 }
186
+ #
187
+ # counters.dig('foo', 'bar') # => 1
188
+ # counters.dig(:foo, :bar) # => 1
189
+ # counters.dig(:zoo) # => nil
190
+ def dig(*args)
191
+ args[0] = convert_key(args[0]) if args.size > 0
192
+ super(*args)
207
193
  end
208
194
 
209
195
  # Same as <tt>Hash#default</tt> where the key passed as argument can be
@@ -241,7 +227,7 @@ module ActiveSupport
241
227
  # hash.fetch_values('a', 'c') # => KeyError: key not found: "c"
242
228
  def fetch_values(*indices, &block)
243
229
  indices.collect { |key| fetch(key, &block) }
244
- end if Hash.method_defined?(:fetch_values)
230
+ end
245
231
 
246
232
  # Returns a shallow copy of the hash.
247
233
  #
@@ -294,6 +280,8 @@ module ActiveSupport
294
280
  super(convert_key(key))
295
281
  end
296
282
 
283
+ alias_method :without, :except
284
+
297
285
  def stringify_keys!; self end
298
286
  def deep_stringify_keys!; self end
299
287
  def stringify_keys; dup end
@@ -13,3 +13,4 @@ require "active_support/lazy_load_hooks"
13
13
 
14
14
  ActiveSupport.run_load_hooks(:i18n)
15
15
  I18n.load_path << File.expand_path("locale/en.yml", __dir__)
16
+ I18n.load_path << File.expand_path("locale/en.rb", __dir__)
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support"
4
- require "active_support/file_update_checker"
5
4
  require "active_support/core_ext/array/wrap"
6
5
 
7
6
  # :enddoc:
@@ -92,6 +91,14 @@ module I18n
92
91
  end
93
92
 
94
93
  if args.empty? || args.first.is_a?(Hash)
94
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
95
+ Using I18n fallbacks with an empty `defaults` sets the defaults to
96
+ include the `default_locale`. This behavior will change in Rails 6.1.
97
+ If you desire the default locale to be included in the defaults, please
98
+ explicitly configure it with `config.i18n.fallbacks.defaults =
99
+ [I18n.default_locale]` or `config.i18n.fallbacks = [I18n.default_locale,
100
+ {...}]`
101
+ MSG
95
102
  args.unshift I18n.default_locale
96
103
  end
97
104
 
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "concurrent/map"
4
- require "active_support/core_ext/array/prepend_and_append"
5
- require "active_support/core_ext/regexp"
6
4
  require "active_support/i18n"
7
5
  require "active_support/deprecation"
8
6
 
@@ -67,8 +65,7 @@ module ActiveSupport
67
65
  @__instance__[locale] ||= new
68
66
  end
69
67
 
70
- attr_reader :plurals, :singulars, :uncountables, :humans, :acronyms, :acronym_regex
71
- deprecate :acronym_regex
68
+ attr_reader :plurals, :singulars, :uncountables, :humans, :acronyms
72
69
 
73
70
  attr_reader :acronyms_camelize_regex, :acronyms_underscore_regex # :nodoc:
74
71
 
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/inflections"
4
- require "active_support/core_ext/regexp"
5
4
 
6
5
  module ActiveSupport
7
6
  # The Inflector transforms words from singular to plural, class names to table
@@ -74,7 +73,7 @@ module ActiveSupport
74
73
  string = string.sub(inflections.acronyms_camelize_regex) { |match| match.downcase }
75
74
  end
76
75
  string.gsub!(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{inflections.acronyms[$2] || $2.capitalize}" }
77
- string.gsub!("/".freeze, "::".freeze)
76
+ string.gsub!("/", "::")
78
77
  string
79
78
  end
80
79
 
@@ -91,11 +90,11 @@ module ActiveSupport
91
90
  # camelize(underscore('SSLError')) # => "SslError"
92
91
  def underscore(camel_cased_word)
93
92
  return camel_cased_word unless /[A-Z-]|::/.match?(camel_cased_word)
94
- word = camel_cased_word.to_s.gsub("::".freeze, "/".freeze)
95
- word.gsub!(inflections.acronyms_underscore_regex) { "#{$1 && '_'.freeze }#{$2.downcase}" }
96
- word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2'.freeze)
97
- word.gsub!(/([a-z\d])([A-Z])/, '\1_\2'.freeze)
98
- word.tr!("-".freeze, "_".freeze)
93
+ word = camel_cased_word.to_s.gsub("::", "/")
94
+ word.gsub!(inflections.acronyms_underscore_regex) { "#{$1 && '_' }#{$2.downcase}" }
95
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
96
+ word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
97
+ word.tr!("-", "_")
99
98
  word.downcase!
100
99
  word
101
100
  end
@@ -131,11 +130,11 @@ module ActiveSupport
131
130
 
132
131
  inflections.humans.each { |(rule, replacement)| break if result.sub!(rule, replacement) }
133
132
 
134
- result.sub!(/\A_+/, "".freeze)
133
+ result.sub!(/\A_+/, "")
135
134
  unless keep_id_suffix
136
- result.sub!(/_id\z/, "".freeze)
135
+ result.sub!(/_id\z/, "")
137
136
  end
138
- result.tr!("_".freeze, " ".freeze)
137
+ result.tr!("_", " ")
139
138
 
140
139
  result.gsub!(/([a-z\d]*)/i) do |match|
141
140
  "#{inflections.acronyms[match.downcase] || match.downcase}"
@@ -200,14 +199,14 @@ module ActiveSupport
200
199
  # classify('calculus') # => "Calculus"
201
200
  def classify(table_name)
202
201
  # strip out any leading schema name
203
- camelize(singularize(table_name.to_s.sub(/.*\./, "".freeze)))
202
+ camelize(singularize(table_name.to_s.sub(/.*\./, "")))
204
203
  end
205
204
 
206
205
  # Replaces underscores with dashes in the string.
207
206
  #
208
207
  # dasherize('puni_puni') # => "puni-puni"
209
208
  def dasherize(underscored_word)
210
- underscored_word.tr("_".freeze, "-".freeze)
209
+ underscored_word.tr("_", "-")
211
210
  end
212
211
 
213
212
  # Removes the module part from the expression in the string.
@@ -270,7 +269,7 @@ module ActiveSupport
270
269
  # NameError is raised when the name is not in CamelCase or the constant is
271
270
  # unknown.
272
271
  def constantize(camel_cased_word)
273
- names = camel_cased_word.split("::".freeze)
272
+ names = camel_cased_word.split("::")
274
273
 
275
274
  # Trigger a built-in NameError exception including the ill-formed constant in the message.
276
275
  Object.const_get(camel_cased_word) if names.empty?
@@ -343,18 +342,7 @@ module ActiveSupport
343
342
  # ordinal(-11) # => "th"
344
343
  # ordinal(-1021) # => "st"
345
344
  def ordinal(number)
346
- abs_number = number.to_i.abs
347
-
348
- if (11..13).include?(abs_number % 100)
349
- "th"
350
- else
351
- case abs_number % 10
352
- when 1; "st"
353
- when 2; "nd"
354
- when 3; "rd"
355
- else "th"
356
- end
357
- end
345
+ I18n.translate("number.nth.ordinals", number: number)
358
346
  end
359
347
 
360
348
  # Turns a number into an ordinal string used to denote the position in an
@@ -367,7 +355,7 @@ module ActiveSupport
367
355
  # ordinalize(-11) # => "-11th"
368
356
  # ordinalize(-1021) # => "-1021st"
369
357
  def ordinalize(number)
370
- "#{number}#{ordinal(number)}"
358
+ I18n.translate("number.nth.ordinalized", number: number)
371
359
  end
372
360
 
373
361
  private
@@ -378,7 +366,7 @@ module ActiveSupport
378
366
  # const_regexp("Foo::Bar::Baz") # => "Foo(::Bar(::Baz)?)?"
379
367
  # const_regexp("::") # => "::"
380
368
  def const_regexp(camel_cased_word)
381
- parts = camel_cased_word.split("::".freeze)
369
+ parts = camel_cased_word.split("::")
382
370
 
383
371
  return Regexp.escape(camel_cased_word) if parts.blank?
384
372