diff --git a/README.md b/README.md index 07e2fab..7977ede 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,15 @@ Select your editor on the extension options page: chrome://extensions. Following * Atom * RubyMine +## Meta Request Configuration + +If the ActiveRecord caller locations are including files you don't want, you can exclude those files by adding them to the configuration in config/meta_request.yml. Files in the backtrace that match a regex in the ingore paths list will be skipped. + +```yaml +:ignore_paths: +- .*/directory/exclude_this_file +``` + ## Compatibility Warnings If you're using [LiveReload](http://livereload.com/) or diff --git a/meta_request/lib/meta_request.rb b/meta_request/lib/meta_request.rb index 3a0c960..542189e 100644 --- a/meta_request/lib/meta_request.rb +++ b/meta_request/lib/meta_request.rb @@ -6,6 +6,7 @@ module MetaRequest autoload :Middlewares, "meta_request/middlewares" autoload :LogInterceptor, "meta_request/log_interceptor" autoload :AppNotifications, "meta_request/app_notifications" + autoload :Config, "meta_request/config" def self.logger @@logger ||= Logger.new(File.join(Rails.root, 'log', 'meta_request.log')) diff --git a/meta_request/lib/meta_request/app_notifications.rb b/meta_request/lib/meta_request/app_notifications.rb index cdb32d8..a5988b2 100644 --- a/meta_request/lib/meta_request/app_notifications.rb +++ b/meta_request/lib/meta_request/app_notifications.rb @@ -24,7 +24,7 @@ class AppNotifications payload[:options][k] = payload.delete(k) unless k.in? CACHE_KEY_COLUMNS end - dev_caller = caller.detect { |c| c.include? MetaRequest.rails_root } + dev_caller = caller.detect { |c| is_dev_caller(c) } if dev_caller c = Callsite.parse(dev_caller) payload.merge!(:line => c.line, :filename => c.filename, :method => c.method) @@ -39,7 +39,7 @@ def self.subscribe subscribe("meta_request.log"). subscribe("sql.active_record") do |*args| name, start, ending, transaction_id, payload = args - dev_caller = caller.detect { |c| c.include? MetaRequest.rails_root } + dev_caller = caller.detect { |c| is_dev_caller(c) } if dev_caller c = Callsite.parse(dev_caller) payload.merge!(:line => c.line, :filename => c.filename, :method => c.method) @@ -71,6 +71,10 @@ def subscribe(event_name) self end - end + private + def self.is_dev_caller(file_path) + file_path.include?(MetaRequest.rails_root) && !Config.ignored_path?(file_path) + end + end end diff --git a/meta_request/lib/meta_request/config.rb b/meta_request/lib/meta_request/config.rb new file mode 100644 index 0000000..80b834d --- /dev/null +++ b/meta_request/lib/meta_request/config.rb @@ -0,0 +1,34 @@ +require 'yaml' + +module MetaRequest + module Config + def self.ignored_path?(file_path) + ingore_paths.any? { |ignore_path| ignore_path.match(file_path) } + end + + private + + def self.ingore_paths + config_file[:ignore_paths] + end + + def self.config_file + @@config_file ||= load_and_parse_config_file + end + + def self.load_and_parse_config_file + @@config_file = load_config_file + @@config_file[:ignore_paths] ||= [] + @@config_file[:ignore_paths].map! do |ignore_path| + Regexp.new(ignore_path) + end + @@config_file.freeze + end + + def self.load_config_file + YAML.load_file("#{MetaRequest.rails_root}/config/meta_request.yml") || {} + rescue Errno::ENOENT + {} + end + end +end diff --git a/meta_request/lib/meta_request/version.rb b/meta_request/lib/meta_request/version.rb index b58b923..7dab732 100644 --- a/meta_request/lib/meta_request/version.rb +++ b/meta_request/lib/meta_request/version.rb @@ -1,3 +1,3 @@ module MetaRequest - VERSION = '0.4.2' + VERSION = '0.4.3' end diff --git a/meta_request/test/unit/meta_request/config_test.rb b/meta_request/test/unit/meta_request/config_test.rb new file mode 100644 index 0000000..e2ef7c1 --- /dev/null +++ b/meta_request/test/unit/meta_request/config_test.rb @@ -0,0 +1,44 @@ +require 'test_helper' +require 'tempfile' +require 'fileutils' + +describe MetaRequest::Config do + CONFIG_DIRECTORY = "#{MetaRequest.rails_root}/config" + CONFIG_FILE_PATH = "#{CONFIG_DIRECTORY}/meta_request.yml" + + def write_config_file(config) + file = File.new(CONFIG_FILE_PATH, "w") + file.write(config.to_yaml) + file.close + end + + describe 'config_file' do + before(:each) do + FileUtils.mkdir_p(CONFIG_DIRECTORY) + end + + after(:each) do + FileUtils.remove_dir(CONFIG_DIRECTORY, force: true) + MetaRequest::Config.class_variable_set(:@@config_file, nil) + end + + it 'provides default config when config file is not present' do + assert_equal [], MetaRequest::Config.config_file[:ignore_paths] + end + + it 'provides default config when config file is empty' do + write_config_file(nil) + assert_equal [], MetaRequest::Config.config_file[:ignore_paths] + end + + it 'converts ignore paths array to regexs' do + config = { + ignore_paths: ['.*files', 'notaregex'] + } + expected_ignore_paths = config[:ignore_paths].map { |p| Regexp.new(p) } + write_config_file(config) + assert_equal expected_ignore_paths, MetaRequest::Config.config_file[:ignore_paths] + end + end +end +