├── .gitignore ├── .travis.yml ├── Gemfile ├── MIT-LICENSE ├── README.md ├── Rakefile ├── bin ├── console └── setup ├── lib ├── more_optimized_resolver.rb └── more_optimized_resolver │ └── version.rb ├── more_optimized_resolver.gemspec └── test ├── more_optimized_resolver_test.rb └── test_helper.rb /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /.yardoc 3 | /Gemfile.lock 4 | /_yardoc/ 5 | /coverage/ 6 | /doc/ 7 | /pkg/ 8 | /spec/reports/ 9 | /tmp/ 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: ruby 3 | rvm: 4 | - 2.4.0 5 | before_install: gem install bundler -v 1.12.1 6 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # Specify your gem's dependencies in more_optimized_resolver.gemspec 4 | gemspec 5 | -------------------------------------------------------------------------------- /MIT-LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Akira Matsuda 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MoreOptimizedResolver 2 | 3 | Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/more_optimized_resolver`. To experiment with that code, run `bin/console` for an interactive prompt. 4 | 5 | TODO: Delete this and the text above, and describe your gem 6 | 7 | ## Installation 8 | 9 | Add this line to your application's Gemfile: 10 | 11 | ```ruby 12 | gem 'more_optimized_resolver' 13 | ``` 14 | 15 | And then execute: 16 | 17 | $ bundle 18 | 19 | Or install it yourself as: 20 | 21 | $ gem install more_optimized_resolver 22 | 23 | ## Usage 24 | 25 | TODO: Write usage instructions here 26 | 27 | ## Development 28 | 29 | After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. 30 | 31 | To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). 32 | 33 | ## Contributing 34 | 35 | Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/more_optimized_resolver. 36 | 37 | 38 | ## License 39 | 40 | The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). 41 | 42 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/gem_tasks" 2 | require "rake/testtask" 3 | 4 | Rake::TestTask.new(:test) do |t| 5 | t.libs << "test" 6 | t.libs << "lib" 7 | t.test_files = FileList['test/**/*_test.rb'] 8 | end 9 | 10 | task :default => :test 11 | -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "bundler/setup" 4 | require "more_optimized_resolver" 5 | 6 | # You can add fixtures and/or initialization code here to make experimenting 7 | # with your gem easier. You can also use a different console, if you like. 8 | 9 | # (If you use this, don't forget to add pry to your Gemfile!) 10 | # require "pry" 11 | # Pry.start 12 | 13 | require "irb" 14 | IRB.start 15 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euo pipefail 3 | IFS=$'\n\t' 4 | set -vx 5 | 6 | bundle install 7 | 8 | # Do any other automated setup that you need to do here 9 | -------------------------------------------------------------------------------- /lib/more_optimized_resolver.rb: -------------------------------------------------------------------------------- 1 | require "more_optimized_resolver/version" 2 | require 'action_view' 3 | require 'action_view/template/resolver' 4 | 5 | module MoreOptimizedResolver 6 | module Methods 7 | def initialize(*) 8 | super 9 | @filenames_cache = [] 10 | end 11 | 12 | def find_template_paths(queries) 13 | query, query2 = queries 14 | return super(query) if @path.nil? || (!File.directory?(@path)) || (@path == '/') || !query2 15 | 16 | if @filenames_cache.empty? 17 | @filenames_cache = Dir[@path + '/**/*.*'].reject {|fn| File.directory? fn} 18 | end 19 | 20 | #NOTE this doesn't support case-insensitive file systems. 21 | path, exts = query2 22 | 23 | exts_pattern = exts.map {|ext| "(#{ext.map {|e| "(#{Regexp.escape(e)})"}.join('|')})?"}.join 24 | 25 | pattern = Regexp.new("#{path}#{exts_pattern}$") 26 | filenames = @filenames_cache.grep(pattern) 27 | filenames.sort_by! do |fn| 28 | exts.map do |e| 29 | e.index {|ext| fn.include? ext} || e.size 30 | end 31 | end 32 | end 33 | 34 | def build_query(path, details) 35 | query1 = super 36 | 37 | query = escape_entry(File.join(@path, path)) 38 | exts2 = ActionView::PathResolver::EXTENSIONS.map do |ext, prefix| 39 | details[ext].compact.uniq.map {|e| "#{prefix}#{e}"} 40 | end 41 | 42 | [query1, [query, exts2]] 43 | end 44 | end 45 | end 46 | 47 | ::ActionView::OptimizedFileSystemResolver.prepend MoreOptimizedResolver::Methods 48 | -------------------------------------------------------------------------------- /lib/more_optimized_resolver/version.rb: -------------------------------------------------------------------------------- 1 | module MoreOptimizedResolver 2 | VERSION = "0.1.0" 3 | end 4 | -------------------------------------------------------------------------------- /more_optimized_resolver.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | lib = File.expand_path('../lib', __FILE__) 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | require 'more_optimized_resolver/version' 5 | 6 | Gem::Specification.new do |spec| 7 | spec.name = "more_optimized_resolver" 8 | spec.version = MoreOptimizedResolver::VERSION 9 | spec.authors = ["Akira Matsuda"] 10 | spec.email = ["ronnie@dio.jp"] 11 | 12 | spec.summary = 'More optimized action_view template resolver' 13 | spec.description = 'More optimized action_view template resolver' 14 | spec.homepage = 'https://github.com/amatsuda/more_optimized_resolver' 15 | spec.license = "MIT" 16 | 17 | spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } 18 | spec.bindir = "exe" 19 | spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } 20 | spec.require_paths = ["lib"] 21 | 22 | spec.add_dependency 'actionview' 23 | 24 | spec.add_development_dependency "rake", "~> 10.0" 25 | spec.add_development_dependency "minitest", "~> 5.0" 26 | end 27 | -------------------------------------------------------------------------------- /test/more_optimized_resolver_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class MoreOptimizedResolverTest < Minitest::Test 4 | def test_that_it_has_a_version_number 5 | refute_nil ::MoreOptimizedResolver::VERSION 6 | end 7 | 8 | def test_it_does_something_useful 9 | assert false 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /test/test_helper.rb: -------------------------------------------------------------------------------- 1 | $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) 2 | require 'more_optimized_resolver' 3 | 4 | require 'minitest/autorun' 5 | --------------------------------------------------------------------------------