@files_to_lint = regexp.is_a?(Regexp) && regexp || Regexp.new(regexp)
end
- def read_config
- config_file = File.join(repo_path, CONFIG_FILE)
- return unless File.exist?(config_file)
- config = YAML.load_file(config_file)
+ def config_options
+ @config_options ||=
+ begin
+ config_file = File.join(repo_path, CONFIG_FILE)
+ File.exist?(config_file) && YAML.load_file(config_file) || {}
+ end
+ end
- CONFIG_KEYS.each do |config_key|
- next unless config[config_key]
- send("#{config_key}=", config[config_key])
+ def read_config
+ config_options.each do |key, val|
+ next unless CONFIG_KEYS.include?(key.to_s)
+ send("#{key}=", val)
end
end
private
def repo_path
- @_repo_path ||= @patches.first.repo.path
+ @repo_path ||= @patches.first.repo.path
end
def inspect(patch)
def run_eslint(patch)
Dir.chdir(repo_path) do
- escaped_file_path = Shellwords.escape(patch.new_file_full_path.to_s)
- JSON.parse(
- `#{eslint_executable} #{escaped_file_path} -f json`
- )
+ JSON.parse `#{eslint_command_line(patch.new_file_full_path.to_s)}`
end
end
+ def eslint_command_line(path)
+ "#{eslint_executable} #{Shellwords.escape(path)} -f json"
+ end
+
def clean_up_eslint_output(output)
# 1. Filter out offences without a warning or error
# 2. Get the messages for that file
it 'is `eslint` by default' do
expect(eslint_executable).to eql('eslint')
end
+
+ context(
+ 'with different eslint executable config',
+ config: { 'eslint_executable' => 'custom_eslint' }
+ ) do
+ it 'is correct' do
+ eslint.read_config
+ expect(eslint_executable).to eql('custom_eslint')
+ end
+ end
+ end
+
+ describe '#eslint_command_line' do
+ subject(:eslint_command_line) { eslint.send(:eslint_command_line, path) }
+ let(:path) { '/some/path.rb' }
+
+ it 'adds json output flag' do
+ expect(eslint_command_line).to include('-f json')
+ end
+
+ it 'adds path' do
+ expect(eslint_command_line).to include(path)
+ end
+
+ it 'starts with eslint executable' do
+ expect(eslint_command_line).to start_with(eslint.eslint_executable)
+ end
+
+ context 'with path that should be escaped' do
+ let(:path) { '/must be/$escaped' }
+
+ it 'escapes the path correctly' do
+ expect(eslint_command_line).to include('/must\\ be/\\$escaped')
+ end
+
+ it 'does not include unescaped path' do
+ expect(eslint_command_line).not_to include(path)
+ end
+ end
end
end
end
end
RSpec.shared_context 'with config', config: true do
- requested_config = metadata[:config].to_yaml
+ requested_config = metadata[:config]
- let(:config_path) { File.join(repo.path.to_s, Pronto::ESLintNpm::CONFIG_FILE) }
-
- before(:each) { File.write(config_path, requested_config) }
- after(:each) { FileUtils.rm(config_path) }
+ before(:each) do
+ allow_any_instance_of(Pronto::ESLintNpm).to receive(:config_options).and_return(requested_config)
+ end
end