mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Speed up journey missing_keys
Most routes have a `route.path.requirements[key]` of `/[-_.a-zA-Z0-9]+\/[-_.a-zA-Z0-9]+/` yet every time this method is called a new regex is generated on the fly with `/\A#{DEFAULT_INPUT}\Z/`. OBJECT ALLOCATIONS BLERG! This change uses a special module that implements `===` so it can be used in a case statement to pull out the default input. When this happens, we use a pre-generated regex. This change buys us 1,643,465 bytes of memory and 7,990 fewer objects per request.
This commit is contained in:
parent
9b8258814e
commit
097ec6fb7c
1 changed files with 15 additions and 3 deletions
|
@ -111,15 +111,27 @@ module ActionDispatch
|
|||
routes
|
||||
end
|
||||
|
||||
module RegexCaseComparator
|
||||
DEFAULT_INPUT = /[-_.a-zA-Z0-9]+\/[-_.a-zA-Z0-9]+/
|
||||
DEFAULT_REGEX = /\A#{DEFAULT_INPUT}\Z/
|
||||
|
||||
def self.===(regex)
|
||||
DEFAULT_INPUT == regex
|
||||
end
|
||||
end
|
||||
|
||||
# Returns an array populated with missing keys if any are present.
|
||||
def missing_keys(route, parts)
|
||||
missing_keys = []
|
||||
tests = route.path.requirements
|
||||
route.required_parts.each { |key|
|
||||
if tests.key?(key)
|
||||
missing_keys << key unless /\A#{tests[key]}\Z/ === parts[key]
|
||||
else
|
||||
case tests[key]
|
||||
when nil
|
||||
missing_keys << key unless parts[key]
|
||||
when RegexCaseComparator
|
||||
missing_keys << key unless RegexCaseComparator::DEFAULT_REGEX === parts[key]
|
||||
else
|
||||
missing_keys << key unless /\A#{tests[key]}\Z/ === parts[key]
|
||||
end
|
||||
}
|
||||
missing_keys
|
||||
|
|
Loading…
Reference in a new issue