From 28d9de17f54c68db81aa3bfa6b5e77db5a528c24 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:23:02 +0200 Subject: [PATCH 01/17] perf: regex only on windows consistent strings --- lib/sprockets/uri_utils.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/sprockets/uri_utils.rb b/lib/sprockets/uri_utils.rb index 3ff51c38d..90297965f 100644 --- a/lib/sprockets/uri_utils.rb +++ b/lib/sprockets/uri_utils.rb @@ -48,7 +48,7 @@ def split_file_uri(uri) path.force_encoding(Encoding::UTF_8) # Hack for parsing Windows "file:///C:/Users/IEUser" paths - path.gsub!(/^\/([a-zA-Z]:)/, '\1'.freeze) + path.gsub!(/^\/([a-zA-Z]:)/, '\1'.freeze) if File::ALT_SEPARATOR [scheme, host, path, query] end @@ -59,7 +59,7 @@ def split_file_uri(uri) def join_file_uri(scheme, host, path, query) str = "#{scheme}://" str << host if host - path = "/#{path}" unless path.start_with?("/") + path = "/#{path}" unless path.start_with?('/'.freeze) str << URI::Generic::DEFAULT_PARSER.escape(path) str << "?#{query}" if query str @@ -72,7 +72,7 @@ def join_file_uri(scheme, host, path, query) # Returns true or false. def valid_asset_uri?(str) # Quick prefix check before attempting a full parse - str.start_with?("file://") && parse_asset_uri(str) ? true : false + str.start_with?('file://'.freeze) && parse_asset_uri(str) ? true : false rescue URI::InvalidURIError false end @@ -109,7 +109,7 @@ def parse_asset_uri(uri) # # Returns String URI. def build_asset_uri(path, params = {}) - join_file_uri("file", nil, path, encode_uri_query_params(params)) + join_file_uri('file', nil, path, encode_uri_query_params(params)) end # Internal: Parse file-digest dependency URI. From bc5167e50c9e3a4b29847088a4ef59d55b8ef01d Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:24:25 +0200 Subject: [PATCH 02/17] perf: provide self.fast_compress, saves object inst and method_call consistent strings --- lib/sprockets/uri_tar.rb | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/lib/sprockets/uri_tar.rb b/lib/sprockets/uri_tar.rb index eae0aad85..b580541a9 100644 --- a/lib/sprockets/uri_tar.rb +++ b/lib/sprockets/uri_tar.rb @@ -13,11 +13,11 @@ def initialize(uri, env) @root = env.root @env = env uri = uri.to_s - if uri.include?("://".freeze) - @scheme, _, @path = uri.partition("://".freeze) - @scheme << "://".freeze + if uri.include?('://'.freeze) + @scheme, _, @path = uri.partition('://'.freeze) + @scheme << '://'.freeze else - @scheme = "".freeze + @scheme = ''.freeze @path = uri end end @@ -35,6 +35,21 @@ def compress scheme + compressed_path end + def self.fast_compress(uri, root) + if uri.include?('://'.freeze) + scheme, _, path = uri.partition('://'.freeze) + scheme << '://'.freeze + else + scheme = ''.freeze + path = uri + end + if compressed_path = PathUtils.split_subpath(root, path) + scheme + compressed_path + else + scheme + path + end + end + # Internal: Tells us if we are using an absolute path # # Nix* systems start with a `/` like /Users/schneems. @@ -66,7 +81,7 @@ def expand else # We always want to return an absolute uri, # make sure the path starts with a slash. - scheme + File.join("/".freeze, root, path) + scheme + File.join('/'.freeze, root, path) end end end @@ -82,8 +97,8 @@ def expand # Returns String def compressed_path # windows - if !@root.start_with?("/".freeze) && path.start_with?("/".freeze) - consistent_root = "/".freeze + @root + if !@root.start_with?('/'.freeze) && path.start_with?('/'.freeze) + consistent_root = '/'.freeze + @root else consistent_root = @root end From 72589068c01a86e0c249b40e7a31454caca29f10 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:25:00 +0200 Subject: [PATCH 03/17] match tests to regexp only on windows --- test/test_uri_utils.rb | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/test/test_uri_utils.rb b/test/test_uri_utils.rb index 2c43f0a7e..fd0269269 100644 --- a/test/test_uri_utils.rb +++ b/test/test_uri_utils.rb @@ -45,15 +45,16 @@ def test_split_file_uri parts = split_file_uri("file:///usr/local/var/github/app/assets/javascripts/application.js") assert_equal ['file', nil, '/usr/local/var/github/app/assets/javascripts/application.js', nil], parts + if DOSISH + parts = split_file_uri("file:///C:/Documents%20and%20Settings/davris/FileSchemeURIs.doc") + assert_equal ['file', nil, 'C:/Documents and Settings/davris/FileSchemeURIs.doc', nil], parts - parts = split_file_uri("file:///C:/Documents%20and%20Settings/davris/FileSchemeURIs.doc") - assert_equal ['file', nil, 'C:/Documents and Settings/davris/FileSchemeURIs.doc', nil], parts + parts = split_file_uri("file:///D:/Program%20Files/Viewer/startup.htm") + assert_equal ['file', nil, 'D:/Program Files/Viewer/startup.htm', nil], parts - parts = split_file_uri("file:///D:/Program%20Files/Viewer/startup.htm") - assert_equal ['file', nil, 'D:/Program Files/Viewer/startup.htm', nil], parts - - parts = split_file_uri("file:///C:/Program%20Files/Music/Web%20Sys/main.html?REQUEST=RADIO") - assert_equal ['file', nil, 'C:/Program Files/Music/Web Sys/main.html', 'REQUEST=RADIO'], parts + parts = split_file_uri("file:///C:/Program%20Files/Music/Web%20Sys/main.html?REQUEST=RADIO") + assert_equal ['file', nil, 'C:/Program Files/Music/Web Sys/main.html', 'REQUEST=RADIO'], parts + end end def test_join_uri_path @@ -98,8 +99,10 @@ def test_parse_file_paths parse_asset_uri("file:///usr/local/var/github/app/assets/javascripts/application.js") assert_equal ["/usr/local/var/github/app/assets/javascripts/foo bar.js", {}], parse_asset_uri("file:///usr/local/var/github/app/assets/javascripts/foo%20bar.js") - assert_equal ["C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js", {}], - parse_asset_uri("file:///C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js") + if DOSISH + assert_equal ["C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js", {}], + parse_asset_uri("file:///C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js") + end end def test_parse_query_params @@ -152,8 +155,10 @@ def test_parse_file_digest_uri parse_file_digest_uri("file-digest:///usr/local/var/github/app/assets/javascripts/application.js") assert_equal "/usr/local/var/github/app/assets/javascripts/foo bar.js", parse_file_digest_uri("file-digest:///usr/local/var/github/app/assets/javascripts/foo%20bar.js") - assert_equal "C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js", - parse_file_digest_uri("file-digest:///C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js") + if DOSISH + assert_equal "C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js", + parse_file_digest_uri("file-digest:///C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js") + end end def test_build_file_digest_uri From 2ddd7691a5b4782224da350de839eda63da24dba Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:25:28 +0200 Subject: [PATCH 04/17] perf: to much work for nothing, no more --- lib/sprockets/http_utils.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/sprockets/http_utils.rb b/lib/sprockets/http_utils.rb index 18b7d535c..7733fb7e4 100644 --- a/lib/sprockets/http_utils.rb +++ b/lib/sprockets/http_utils.rb @@ -56,6 +56,7 @@ def parse_q_values(values) # # Returns Array of matched Strings from available Array or []. def find_q_matches(q_values, available, &matcher) + return [] if available == [] matcher ||= lambda { |a, b| a == b } matches = [] From 627675390c4f461f1bfad4b0d8571e86fa66a328 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:26:24 +0200 Subject: [PATCH 05/17] case is faster then .call_ing on a hash --- lib/sprockets/digest_utils.rb | 37 +++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/lib/sprockets/digest_utils.rb b/lib/sprockets/digest_utils.rb index 7dbcd976f..19349d81f 100644 --- a/lib/sprockets/digest_utils.rb +++ b/lib/sprockets/digest_utils.rb @@ -84,6 +84,39 @@ def detect_digest_class(bytes) } private_constant :ADD_VALUE_TO_DIGEST + def a_v_t_d(c, v, d) + case c + when 'String'.freeze then d << v + when 'FalseClass'.freeze then d << 'FalseClass'.freeze + when 'TrueClass'.freeze then d << 'TrueClass'.freeze + when 'NilClass'.freeze then d << 'NilClass'.freeze + when 'Symbol'.freeze + d << 'Symbol'.freeze + d << v.to_s + when 'Integer'.freeze + d << 'Integer'.freeze + d << v.to_s + when 'Array'.freeze + d << 'Array'.freeze + v.each { |element| a_v_t_d(element.class.name, element, d) } + when 'Hash'.freeze + d << 'Hash'.freeze + v.sort.each { |array| a_v_t_d('Array', array, d) } + when 'Set'.freeze + d << 'Set'.freeze + a_v_t_d('Array',v.to_a, d) + when 'Encoding'.freeze + d << 'Encoding'.freeze + d << v.name + when 'Fixnum'.freeze + d << 'Integer'.freeze + d << v.to_s + when 'Bignum'.freeze + d << 'Integer'.freeze + d << v.to_s + else raise TypeError, "couldn't digest #{c} - #{c.class} -- #{v}" + end + end # Internal: Generate a hexdigest for a nested JSON serializable object. # # This is used for generating cache keys, so its pretty important its @@ -94,8 +127,8 @@ def detect_digest_class(bytes) # Returns a String digest of the object. def digest(obj) digest = digest_class.new - - ADD_VALUE_TO_DIGEST[obj.class].call(obj, digest) + a_v_t_d(obj.class.name, obj, digest) + # ADD_VALUE_TO_DIGEST[obj.class].call(obj, digest) digest.digest end From 54056d7c5e5af85128fb5c2449441a278e37b7eb Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:26:44 +0200 Subject: [PATCH 06/17] use fast_compress --- lib/sprockets/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sprockets/base.rb b/lib/sprockets/base.rb index e5b61d7c9..8ecd20d03 100644 --- a/lib/sprockets/base.rb +++ b/lib/sprockets/base.rb @@ -100,7 +100,7 @@ def inspect end def compress_from_root(uri) - URITar.new(uri, self).compress + URITar.fast_compress(uri, self.root) end def expand_from_root(uri) From 05a6c9ae2f2c0fe25529a69564de1e3c17437c1c Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:39:17 +0200 Subject: [PATCH 07/17] use caches for expensive paths --- lib/sprockets/loader.rb | 19 ++++++++++++++++--- lib/sprockets/path_utils.rb | 18 +++++++++++++++--- lib/sprockets/resolve.rb | 20 ++++++++++++++++++-- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/lib/sprockets/loader.rb b/lib/sprockets/loader.rb index d39e0c7f4..a39eec79c 100644 --- a/lib/sprockets/loader.rb +++ b/lib/sprockets/loader.rb @@ -30,6 +30,9 @@ module Loader # # Returns Asset. def load(uri) + @@gorilla_ass_cache ||= {} + # TODO + app_root = '/' unloaded = UnloadedAsset.new(uri, self) if unloaded.params.key?(:id) unless asset = asset_from_cache(unloaded.asset_key) @@ -52,9 +55,19 @@ def load(uri) # will confusingly be called again with `paths` set to nil where the asset will be # loaded from disk. if paths - digest = DigestUtils.digest(resolve_dependencies(paths)) - if uri_from_cache = cache.get(unloaded.digest_key(digest), true) - asset_from_cache(UnloadedAsset.new(uri_from_cache, self).asset_key) + if uri[7..(app_root.length+6)] != app_root + unless @@gorilla_ass_cache.has_key?(uri) + digest = DigestUtils.digest(resolve_dependencies(paths)) + if uri_from_cache = cache.get(unloaded.digest_key(digest), true) + @@gorilla_ass_cache[uri] = asset_from_cache(UnloadedAsset.new(uri_from_cache, self).asset_key) + end + end + @@gorilla_ass_cache[uri] + else + digest = DigestUtils.digest(resolve_dependencies(paths)) + if uri_from_cache = cache.get(unloaded.digest_key(digest), true) + asset_from_cache(UnloadedAsset.new(uri_from_cache, self).asset_key) + end end else load_from_unloaded(unloaded) diff --git a/lib/sprockets/path_utils.rb b/lib/sprockets/path_utils.rb index f6427fac3..3ca0968d9 100644 --- a/lib/sprockets/path_utils.rb +++ b/lib/sprockets/path_utils.rb @@ -12,10 +12,22 @@ module PathUtils # # Returns nil if the file does not exist. def stat(path) - if File.exist?(path) - File.stat(path.to_s) + # TODO + root = '/' + if (path[0...root.length] != root) + @@gorilla_patch_cached_stats ||= {} + return @@gorilla_patch_cached_stats[path] if @@gorilla_patch_cached_stats.has_key?(path) + @@gorilla_patch_cached_stats[path] = if File.exist?(path) + File.stat(path) + else + nil + end else - nil + if File.exist?(path) + File.stat(path) + else + nil + end end end diff --git a/lib/sprockets/resolve.rb b/lib/sprockets/resolve.rb index 9ae14fb3e..4c54c8906 100644 --- a/lib/sprockets/resolve.rb +++ b/lib/sprockets/resolve.rb @@ -153,6 +153,13 @@ def parse_accept_options(mime_type, types) end def path_matches(load_path, logical_name, logical_basename) + @@gorilla_djungle_banana_cache ||= {} + # TODO + app_dir = '/' + is_in_app = load_path[0...app_dir.size] == app_dir + if !is_in_app && @@gorilla_djungle_banana_cache.has_key?([load_path, logical_name, logical_basename]) + return @@gorilla_djungle_banana_cache[[load_path, logical_name, logical_basename]] + end dirname = File.dirname(File.join(load_path, logical_name)) candidates = dirname_matches(dirname, logical_basename) deps = file_digest_dependency_set(dirname) @@ -170,11 +177,19 @@ def path_matches(load_path, logical_name, logical_basename) end deps.merge(file_digest_dependency_set(dirname)) - - return candidates.select { |fn, _| file?(fn) }, deps + result = candidates.select { |fn, _| file?(fn) }, deps + @@gorilla_djungle_banana_cache[[load_path, logical_name, logical_basename]] = result if !is_in_app + result end def dirname_matches(dirname, basename) + @@gorilla_djungle_banana_tree_cache ||= {} + # TODO + app_dir = '/' + is_in_app = dirname[0...app_dir.size] == app_dir + if !is_in_app && @@gorilla_djungle_banana_tree_cache.has_key?([dirname, basename]) + return @@gorilla_djungle_banana_cache[[dirname, basename]] + end candidates = [] entries = self.entries(dirname) entries.each do |entry| @@ -184,6 +199,7 @@ def dirname_matches(dirname, basename) candidates << [File.join(dirname, entry), type] end end + @@gorilla_djungle_banana_tree_cache[[dirname, basename]] = candidates if !is_in_app candidates end From 7edd51f782d2ef0a0d5e9a1205231b322c7abac0 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:42:20 +0200 Subject: [PATCH 08/17] fix for test case --- lib/sprockets/loader.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sprockets/loader.rb b/lib/sprockets/loader.rb index a39eec79c..2fbcf75b6 100644 --- a/lib/sprockets/loader.rb +++ b/lib/sprockets/loader.rb @@ -55,7 +55,7 @@ def load(uri) # will confusingly be called again with `paths` set to nil where the asset will be # loaded from disk. if paths - if uri[7..(app_root.length+6)] != app_root + if uri.to_s[7..(app_root.length+6)] != app_root unless @@gorilla_ass_cache.has_key?(uri) digest = DigestUtils.digest(resolve_dependencies(paths)) if uri_from_cache = cache.get(unloaded.digest_key(digest), true) From 3c666b4fe2452927829f77962598afe636749dd6 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 23:23:16 +0200 Subject: [PATCH 09/17] fix --- lib/sprockets/uri_utils.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sprockets/uri_utils.rb b/lib/sprockets/uri_utils.rb index 90297965f..8123e74bc 100644 --- a/lib/sprockets/uri_utils.rb +++ b/lib/sprockets/uri_utils.rb @@ -48,7 +48,7 @@ def split_file_uri(uri) path.force_encoding(Encoding::UTF_8) # Hack for parsing Windows "file:///C:/Users/IEUser" paths - path.gsub!(/^\/([a-zA-Z]:)/, '\1'.freeze) if File::ALT_SEPARATOR + path = path[1..-1] if File::ALT_SEPARATOR [scheme, host, path, query] end From 7f85cd3a5b0b3fe1b05d7e7259b8e40ab7842208 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sun, 15 Oct 2017 00:19:14 +0200 Subject: [PATCH 10/17] fix --- lib/sprockets/uri_utils.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sprockets/uri_utils.rb b/lib/sprockets/uri_utils.rb index 90297965f..8123e74bc 100644 --- a/lib/sprockets/uri_utils.rb +++ b/lib/sprockets/uri_utils.rb @@ -48,7 +48,7 @@ def split_file_uri(uri) path.force_encoding(Encoding::UTF_8) # Hack for parsing Windows "file:///C:/Users/IEUser" paths - path.gsub!(/^\/([a-zA-Z]:)/, '\1'.freeze) if File::ALT_SEPARATOR + path = path[1..-1] if File::ALT_SEPARATOR [scheme, host, path, query] end From 3d03b3f0bb1f5f4865d1bfd2c645b3722af58a3d Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sun, 15 Oct 2017 00:25:21 +0200 Subject: [PATCH 11/17] add check_modified_root --- lib/sprockets/paths.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/sprockets/paths.rb b/lib/sprockets/paths.rb index 29b5382c5..235877c28 100644 --- a/lib/sprockets/paths.rb +++ b/lib/sprockets/paths.rb @@ -23,6 +23,16 @@ def root=(path) end private :root= + # requests outside of check_modified_root will be cached + def check_modified_root + config[:check_modified_root] + end + def check_modified_root=(path) + self.config = hash_reassoc(config, :check_modified_root) do + File.expand_path(path) + end + end + # Returns an `Array` of path `String`s. # # These paths will be used for asset logical path lookups. From 4a24c4daeaeb65597a45e733935d674803c7cbba Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sun, 15 Oct 2017 00:37:17 +0200 Subject: [PATCH 12/17] use check_modified_root --- lib/sprockets/loader.rb | 3 +-- lib/sprockets/path_utils.rb | 5 ++--- lib/sprockets/resolve.rb | 10 ++++------ 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/lib/sprockets/loader.rb b/lib/sprockets/loader.rb index 2fbcf75b6..db53bdf0b 100644 --- a/lib/sprockets/loader.rb +++ b/lib/sprockets/loader.rb @@ -31,8 +31,7 @@ module Loader # Returns Asset. def load(uri) @@gorilla_ass_cache ||= {} - # TODO - app_root = '/' + app_root = Sprockets.check_modified_root unloaded = UnloadedAsset.new(uri, self) if unloaded.params.key?(:id) unless asset = asset_from_cache(unloaded.asset_key) diff --git a/lib/sprockets/path_utils.rb b/lib/sprockets/path_utils.rb index 3ca0968d9..fc2d57088 100644 --- a/lib/sprockets/path_utils.rb +++ b/lib/sprockets/path_utils.rb @@ -12,9 +12,8 @@ module PathUtils # # Returns nil if the file does not exist. def stat(path) - # TODO - root = '/' - if (path[0...root.length] != root) + app_root = Sprockets.check_modified_root + if (path[0...app_root.length] != app_root) @@gorilla_patch_cached_stats ||= {} return @@gorilla_patch_cached_stats[path] if @@gorilla_patch_cached_stats.has_key?(path) @@gorilla_patch_cached_stats[path] = if File.exist?(path) diff --git a/lib/sprockets/resolve.rb b/lib/sprockets/resolve.rb index 4c54c8906..5199b808f 100644 --- a/lib/sprockets/resolve.rb +++ b/lib/sprockets/resolve.rb @@ -154,9 +154,8 @@ def parse_accept_options(mime_type, types) def path_matches(load_path, logical_name, logical_basename) @@gorilla_djungle_banana_cache ||= {} - # TODO - app_dir = '/' - is_in_app = load_path[0...app_dir.size] == app_dir + app_root = Sprockets.check_modified_root + is_in_app = load_path[0...app_root.size] == app_root if !is_in_app && @@gorilla_djungle_banana_cache.has_key?([load_path, logical_name, logical_basename]) return @@gorilla_djungle_banana_cache[[load_path, logical_name, logical_basename]] end @@ -184,9 +183,8 @@ def path_matches(load_path, logical_name, logical_basename) def dirname_matches(dirname, basename) @@gorilla_djungle_banana_tree_cache ||= {} - # TODO - app_dir = '/' - is_in_app = dirname[0...app_dir.size] == app_dir + app_root = Sprockets.check_modified_root + is_in_app = dirname[0...app_root.size] == app_root if !is_in_app && @@gorilla_djungle_banana_tree_cache.has_key?([dirname, basename]) return @@gorilla_djungle_banana_cache[[dirname, basename]] end From 83db3e3d0bff25971504d8f3bab42124ab265fd6 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sun, 15 Oct 2017 11:52:43 +0200 Subject: [PATCH 13/17] increase default cache use default cache size for new caches --- lib/sprockets/cache.rb | 2 +- lib/sprockets/cache/memory_store.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/sprockets/cache.rb b/lib/sprockets/cache.rb index 5958f6415..94925b23d 100644 --- a/lib/sprockets/cache.rb +++ b/lib/sprockets/cache.rb @@ -60,7 +60,7 @@ def self.default_logger # cache - A compatible backend cache store instance. def initialize(cache = nil, logger = self.class.default_logger) @cache_wrapper = get_cache_wrapper(cache) - @fetch_cache = Cache::MemoryStore.new(1024) + @fetch_cache = Cache::MemoryStore.new @logger = logger end diff --git a/lib/sprockets/cache/memory_store.rb b/lib/sprockets/cache/memory_store.rb index 0efe72822..35f38bb05 100644 --- a/lib/sprockets/cache/memory_store.rb +++ b/lib/sprockets/cache/memory_store.rb @@ -12,7 +12,7 @@ class Cache # class MemoryStore # Internal: Default key limit for store. - DEFAULT_MAX_SIZE = 1000 + DEFAULT_MAX_SIZE = 10000 # Public: Initialize the cache store. # From b847bafbde7b69023337efb46b70e9624945f2f2 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Wed, 18 Oct 2017 16:24:28 +0200 Subject: [PATCH 14/17] optimize split_split_file_uri --- lib/sprockets/uri_utils.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/sprockets/uri_utils.rb b/lib/sprockets/uri_utils.rb index 3ff51c38d..7685de532 100644 --- a/lib/sprockets/uri_utils.rb +++ b/lib/sprockets/uri_utils.rb @@ -47,8 +47,8 @@ def split_file_uri(uri) path = URI::Generic::DEFAULT_PARSER.unescape(path) path.force_encoding(Encoding::UTF_8) - # Hack for parsing Windows "file:///C:/Users/IEUser" paths - path.gsub!(/^\/([a-zA-Z]:)/, '\1'.freeze) + # Hack for parsing Windows "/C:/Users/IEUser" paths + path = path[1..-1] if File::ALT_SEPARATOR [scheme, host, path, query] end From 6e66d69a45e0f7413f9a554d322b9bfbbeb33a41 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Wed, 18 Oct 2017 16:25:31 +0200 Subject: [PATCH 15/17] Automatically adjust MemoryStore cache size for a FileStore --- lib/sprockets/cache.rb | 3 ++- lib/sprockets/cache/file_store.rb | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/sprockets/cache.rb b/lib/sprockets/cache.rb index 5958f6415..0a54a4385 100644 --- a/lib/sprockets/cache.rb +++ b/lib/sprockets/cache.rb @@ -60,7 +60,8 @@ def self.default_logger # cache - A compatible backend cache store instance. def initialize(cache = nil, logger = self.class.default_logger) @cache_wrapper = get_cache_wrapper(cache) - @fetch_cache = Cache::MemoryStore.new(1024) + fetch_cache_size = cache.respond_to?(:max_size) ? cache.max_size / 1000 : 1024 + @fetch_cache = Cache::MemoryStore.new(fetch_cache_size) @logger = logger end diff --git a/lib/sprockets/cache/file_store.rb b/lib/sprockets/cache/file_store.rb index 98e777a5d..b5f01d8b3 100644 --- a/lib/sprockets/cache/file_store.rb +++ b/lib/sprockets/cache/file_store.rb @@ -19,6 +19,7 @@ class Cache class FileStore # Internal: Default key limit for store. DEFAULT_MAX_SIZE = 25 * 1024 * 1024 + attr_reader :max_size # Internal: Default standard error fatal logger. # From 7432e83b17aa579e647f3e0603e394f671cbd822 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Thu, 19 Oct 2017 19:52:22 +0200 Subject: [PATCH 16/17] Automatically adjust MemoryStore size for FileStore --- lib/sprockets/resolve.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sprockets/resolve.rb b/lib/sprockets/resolve.rb index 5199b808f..3fa3847e6 100644 --- a/lib/sprockets/resolve.rb +++ b/lib/sprockets/resolve.rb @@ -155,7 +155,7 @@ def parse_accept_options(mime_type, types) def path_matches(load_path, logical_name, logical_basename) @@gorilla_djungle_banana_cache ||= {} app_root = Sprockets.check_modified_root - is_in_app = load_path[0...app_root.size] == app_root + is_in_app = load_path.start_with?(app_root.to_s) if !is_in_app && @@gorilla_djungle_banana_cache.has_key?([load_path, logical_name, logical_basename]) return @@gorilla_djungle_banana_cache[[load_path, logical_name, logical_basename]] end From 2bbba2d10a516fd872dc3d432cedad5e5e019594 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Fri, 20 Oct 2017 21:29:39 +0200 Subject: [PATCH 17/17] fix --- lib/sprockets/resolve.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sprockets/resolve.rb b/lib/sprockets/resolve.rb index 3fa3847e6..e66715633 100644 --- a/lib/sprockets/resolve.rb +++ b/lib/sprockets/resolve.rb @@ -186,7 +186,7 @@ def dirname_matches(dirname, basename) app_root = Sprockets.check_modified_root is_in_app = dirname[0...app_root.size] == app_root if !is_in_app && @@gorilla_djungle_banana_tree_cache.has_key?([dirname, basename]) - return @@gorilla_djungle_banana_cache[[dirname, basename]] + return @@gorilla_djungle_banana_tree_cache[[dirname, basename]] end candidates = [] entries = self.entries(dirname)