diff --git a/CHANGELOG.md b/CHANGELOG.md index 33e653908b..6f67a11da6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ #### Features -* Your contribution here. +* [#2011](https://github.com/ruby-grape/grape/pull/2011): Reduce total retained regexes - [@ericproulx](https://github.com/ericproulx). #### Fixes diff --git a/lib/grape/router.rb b/lib/grape/router.rb index 192858cb6f..d8428e4268 100644 --- a/lib/grape/router.rb +++ b/lib/grape/router.rb @@ -8,10 +8,9 @@ class Router attr_reader :map, :compiled class Any < AttributeTranslator - attr_reader :pattern, :regexp, :index - def initialize(pattern, regexp, index, **attributes) + attr_reader :pattern, :index + def initialize(pattern, index, **attributes) @pattern = pattern - @regexp = regexp @index = index super(attributes) end @@ -39,18 +38,20 @@ def self.supported_methods def initialize @neutral_map = [] + @neutral_regexes = [] @map = Hash.new { |hash, key| hash[key] = [] } @optimized_map = Hash.new { |hash, key| hash[key] = // } end def compile! return if compiled - @union = Regexp.union(@neutral_map.map(&:regexp)) + @union = Regexp.union(@neutral_regexes) + @neutral_regexes = nil self.class.supported_methods.each do |method| routes = map[method] @optimized_map[method] = routes.map.with_index do |route, index| route.index = index - route.regexp = Regexp.new("(?<_#{index}>#{route.pattern.to_regexp})") + Regexp.new("(?<_#{index}>#{route.pattern.to_regexp})") end @optimized_map[method] = Regexp.union(@optimized_map[method]) end @@ -62,8 +63,8 @@ def append(route) end def associate_routes(pattern, **options) - regexp = Regexp.new("(?<_#{@neutral_map.length}>)#{pattern.to_regexp}") - @neutral_map << Any.new(pattern, regexp, @neutral_map.length, **options) + @neutral_regexes << Regexp.new("(?<_#{@neutral_map.length}>)#{pattern.to_regexp}") + @neutral_map << Any.new(pattern, @neutral_map.length, **options) end def call(env) diff --git a/lib/grape/router/route.rb b/lib/grape/router/route.rb index 62e4706909..66333a5ab1 100644 --- a/lib/grape/router/route.rb +++ b/lib/grape/router/route.rb @@ -12,7 +12,7 @@ class Route SOURCE_LOCATION_REGEXP = /^(.*?):(\d+?)(?::in `.+?')?$/.freeze FIXED_NAMED_CAPTURES = %w[format version].freeze - attr_accessor :pattern, :translator, :app, :index, :regexp, :options + attr_accessor :pattern, :translator, :app, :index, :options alias attributes translator