mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #30782 from NickLaMuro/improve_performance_of_inflections
Cache regexps generated from acronym_regex
This commit is contained in:
commit
52483d3fa0
6 changed files with 31 additions and 10 deletions
|
@ -763,7 +763,7 @@ class RequestMethod < BaseRequestTest
|
|||
|
||||
test "post uneffected by local inflections" do
|
||||
existing_acronyms = ActiveSupport::Inflector.inflections.acronyms.dup
|
||||
existing_acronym_regex = ActiveSupport::Inflector.inflections.acronym_regex.dup
|
||||
assert_deprecated { ActiveSupport::Inflector.inflections.acronym_regex.dup }
|
||||
begin
|
||||
ActiveSupport::Inflector.inflections do |inflect|
|
||||
inflect.acronym "POS"
|
||||
|
@ -777,7 +777,7 @@ class RequestMethod < BaseRequestTest
|
|||
# Reset original acronym set
|
||||
ActiveSupport::Inflector.inflections do |inflect|
|
||||
inflect.send(:instance_variable_set, "@acronyms", existing_acronyms)
|
||||
inflect.send(:instance_variable_set, "@acronym_regex", existing_acronym_regex)
|
||||
inflect.send(:define_acronym_regex_patterns)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "active_support/inflector/methods"
|
||||
|
||||
module ActiveSupport
|
||||
class Deprecation
|
||||
# DeprecatedConstantAccessor transforms a constant into a deprecated one by
|
||||
|
@ -29,6 +27,8 @@ module ActiveSupport
|
|||
# ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"]
|
||||
module DeprecatedConstantAccessor
|
||||
def self.included(base)
|
||||
require "active_support/inflector/methods"
|
||||
|
||||
extension = Module.new do
|
||||
def const_missing(missing_const_name)
|
||||
if class_variable_defined?(:@@_deprecated_constants)
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "active_support/inflector/methods"
|
||||
require "active_support/core_ext/regexp"
|
||||
|
||||
module ActiveSupport
|
||||
|
@ -125,6 +124,8 @@ module ActiveSupport
|
|||
# ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"]
|
||||
class DeprecatedConstantProxy < DeprecationProxy
|
||||
def initialize(old_const, new_const, deprecator = ActiveSupport::Deprecation.instance, message: "#{old_const} is deprecated! Use #{new_const} instead.")
|
||||
require "active_support/inflector/methods"
|
||||
|
||||
@old_const = old_const
|
||||
@new_const = new_const
|
||||
@deprecator = deprecator
|
||||
|
|
|
@ -4,6 +4,7 @@ require "concurrent/map"
|
|||
require "active_support/core_ext/array/prepend_and_append"
|
||||
require "active_support/core_ext/regexp"
|
||||
require "active_support/i18n"
|
||||
require "active_support/deprecation"
|
||||
|
||||
module ActiveSupport
|
||||
module Inflector
|
||||
|
@ -67,16 +68,21 @@ module ActiveSupport
|
|||
end
|
||||
|
||||
attr_reader :plurals, :singulars, :uncountables, :humans, :acronyms, :acronym_regex
|
||||
deprecate :acronym_regex
|
||||
|
||||
attr_reader :acronyms_camelize_regex, :acronyms_underscore_regex # :nodoc:
|
||||
|
||||
def initialize
|
||||
@plurals, @singulars, @uncountables, @humans, @acronyms, @acronym_regex = [], [], Uncountables.new, [], {}, /(?=a)b/
|
||||
@plurals, @singulars, @uncountables, @humans, @acronyms = [], [], Uncountables.new, [], {}
|
||||
define_acronym_regex_patterns
|
||||
end
|
||||
|
||||
# Private, for the test suite.
|
||||
def initialize_dup(orig) # :nodoc:
|
||||
%w(plurals singulars uncountables humans acronyms acronym_regex).each do |scope|
|
||||
%w(plurals singulars uncountables humans acronyms).each do |scope|
|
||||
instance_variable_set("@#{scope}", orig.send(scope).dup)
|
||||
end
|
||||
define_acronym_regex_patterns
|
||||
end
|
||||
|
||||
# Specifies a new acronym. An acronym must be specified as it will appear
|
||||
|
@ -130,7 +136,7 @@ module ActiveSupport
|
|||
# camelize 'mcdonald' # => 'McDonald'
|
||||
def acronym(word)
|
||||
@acronyms[word.downcase] = word
|
||||
@acronym_regex = /#{@acronyms.values.join("|")}/
|
||||
define_acronym_regex_patterns
|
||||
end
|
||||
|
||||
# Specifies a new pluralization rule and its replacement. The rule can
|
||||
|
@ -225,6 +231,14 @@ module ActiveSupport
|
|||
instance_variable_set "@#{scope}", []
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def define_acronym_regex_patterns
|
||||
@acronym_regex = @acronyms.empty? ? /(?=a)b/ : /#{@acronyms.values.join("|")}/
|
||||
@acronyms_camelize_regex = /^(?:#{@acronym_regex}(?=\b|[A-Z_])|\w)/
|
||||
@acronyms_underscore_regex = /(?:(?<=([A-Za-z\d]))|\b)(#{@acronym_regex})(?=\b|[^a-z])/
|
||||
end
|
||||
end
|
||||
|
||||
# Yields a singleton instance of Inflector::Inflections so you can specify
|
||||
|
|
|
@ -71,7 +71,7 @@ module ActiveSupport
|
|||
if uppercase_first_letter
|
||||
string = string.sub(/^[a-z\d]*/) { |match| inflections.acronyms[match] || match.capitalize }
|
||||
else
|
||||
string = string.sub(/^(?:#{inflections.acronym_regex}(?=\b|[A-Z_])|\w)/) { |match| match.downcase }
|
||||
string = string.sub(inflections.acronyms_camelize_regex) { |match| match.downcase }
|
||||
end
|
||||
string.gsub!(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{inflections.acronyms[$2] || $2.capitalize}" }
|
||||
string.gsub!("/".freeze, "::".freeze)
|
||||
|
@ -92,7 +92,7 @@ module ActiveSupport
|
|||
def underscore(camel_cased_word)
|
||||
return camel_cased_word unless /[A-Z-]|::/.match?(camel_cased_word)
|
||||
word = camel_cased_word.to_s.gsub("::".freeze, "/".freeze)
|
||||
word.gsub!(/(?:(?<=([A-Za-z\d]))|\b)(#{inflections.acronym_regex})(?=\b|[^a-z])/) { "#{$1 && '_'.freeze }#{$2.downcase}" }
|
||||
word.gsub!(inflections.acronyms_underscore_regex) { "#{$1 && '_'.freeze }#{$2.downcase}" }
|
||||
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2'.freeze)
|
||||
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2'.freeze)
|
||||
word.tr!("-".freeze, "_".freeze)
|
||||
|
|
|
@ -224,6 +224,12 @@ class InflectorTest < ActiveSupport::TestCase
|
|||
assert_equal("json_html_api", ActiveSupport::Inflector.underscore("JSONHTMLAPI"))
|
||||
end
|
||||
|
||||
def test_acronym_regexp_is_deprecated
|
||||
assert_deprecated do
|
||||
ActiveSupport::Inflector.inflections.acronym_regex
|
||||
end
|
||||
end
|
||||
|
||||
def test_underscore
|
||||
CamelToUnderscore.each do |camel, underscore|
|
||||
assert_equal(underscore, ActiveSupport::Inflector.underscore(camel))
|
||||
|
|
Loading…
Reference in a new issue