mirror of
https://github.com/discourse/discourse.git
synced 2024-11-26 18:13:39 +08:00
inflector backport
This commit is contained in:
parent
a0665105ec
commit
0b76166ad1
62
lib/freedom_patches/inflector_backport.rb
Normal file
62
lib/freedom_patches/inflector_backport.rb
Normal file
|
@ -0,0 +1,62 @@
|
|||
# review per rails release, this speeds up the inflector, we are not inflecting too much at the moment, except in dev
|
||||
#
|
||||
# note: I am working with the rails team on including this in official rails
|
||||
|
||||
module ActiveSupport
|
||||
module Inflector
|
||||
|
||||
LRU_CACHE_SIZE = 200
|
||||
LRU_CACHES = []
|
||||
|
||||
def self.clear_memoize!
|
||||
LRU_CACHES.each(&:clear)
|
||||
end
|
||||
|
||||
def self.memoize(*args)
|
||||
args.each do |method_name|
|
||||
cache = LruRedux::ThreadSafeCache.new(LRU_CACHE_SIZE)
|
||||
LRU_CACHES << cache
|
||||
|
||||
uncached = "#{method_name}_without_cache"
|
||||
alias_method uncached, method_name
|
||||
|
||||
define_method(method_name) do |*args|
|
||||
# this avoids recursive locks
|
||||
found = true
|
||||
data = cache.fetch(args){found = false}
|
||||
unless found
|
||||
cache[args] = data = send(uncached, *args)
|
||||
end
|
||||
data
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
memoize :pluralize, :singularize, :camelize, :underscore, :humanize,
|
||||
:titleize, :tableize, :classify, :foreign_key
|
||||
end
|
||||
end
|
||||
|
||||
module ActiveSupport
|
||||
module Inflector
|
||||
class Inflections
|
||||
def self.clear_memoize(*args)
|
||||
args.each do |method_name|
|
||||
orig = "#{method_name}_without_clear_memoize"
|
||||
alias_method orig, method_name
|
||||
define_method(method_name) do |*args|
|
||||
ActiveSupport::Inflector.clear_memoize!
|
||||
send(orig, *args)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
clear_memoize :acronym, :plural, :singular, :irregular, :uncountable, :human, :clear
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user