diff --git a/lib/pry/code.rb b/lib/pry/code.rb index b5066f6f..7488d6fc 100644 --- a/lib/pry/code.rb +++ b/lib/pry/code.rb @@ -33,17 +33,18 @@ class Pry # @param [String] fn The name of a file, or "(pry)". # @param [Symbol] code_type (:ruby) The type of code the file contains. # @return [Code] - def from_file(fn, code_type=:ruby) + def from_file(fn, code_type=nil) if fn == Pry.eval_path f = Pry.line_buffer.drop(1) else if File.readable?(fn) f = File.open(fn, 'r') + code_type = type_from_filename(fn) else raise CommandError, "Cannot open #{fn.inspect} for reading." end end - new(f, 1, code_type) + new(f, 1, code_type || :ruby) ensure f.close if f.respond_to?(:close) end @@ -61,6 +62,37 @@ class Pry start_line ||= meth.source_line || 1 new(meth.source, start_line, meth.source_type) end + + protected + # Guess the CodeRay type of a file from its extension, or nil if + # unknown. + # + # @param [String] filename + # @return [Symbol, nil] + def type_from_filename(filename) + map = { + %w(.c .h) => :c, + %w(.cpp .hpp .cc .h cxx) => :cpp, + %w(.rb .ru .irbrc .gemspec .pryrc) => :ruby, + %w(.py) => :python, + %w(.diff) => :diff, + %w(.css) => :css, + %w(.html) => :html, + %w(.yaml .yml) => :yaml, + %w(.xml) => :xml, + %w(.php) => :php, + %w(.js) => :javascript, + %w(.java) => :java, + %w(.rhtml) => :rhtml, + %w(.json) => :json + } + + _, type = map.find do |k, _| + k.any? { |ext| ext == File.extname(filename) } + end + + type + end end attr_accessor :code_type diff --git a/lib/pry/helpers/command_helpers.rb b/lib/pry/helpers/command_helpers.rb index 9c26ee3c..3aa9ff13 100644 --- a/lib/pry/helpers/command_helpers.rb +++ b/lib/pry/helpers/command_helpers.rb @@ -8,11 +8,11 @@ class Pry # Open a temp file and yield it to the block, closing it after # @return [String] The path of the temp file - def temp_file - file = Tempfile.new(['pry', '.rb']) + def temp_file(ext='.rb') + file = Tempfile.new(['pry', ext]) yield file ensure - file.close(true) + file.close(true) if file end def render_output(str, opts={}) @@ -61,63 +61,6 @@ class Pry header << "#{Pry::Helpers::Text.bold("Number of lines:")} #{content.each_line.count.to_s}\n" end - def file_map - { - [".c", ".h"] => :c, - [".cpp", ".hpp", ".cc", ".h", "cxx"] => :cpp, - [".rb", "Rakefile", ".irbrc", ".gemspec", ".pryrc"] => :ruby, - ".py" => :python, - ".diff" => :diff, - ".css" => :css, - ".html" => :html, - [".yaml", ".yml"] => :yaml, - ".xml" => :xml, - ".php" => :php, - ".js" => :javascript, - ".java" => :java, - ".rhtml" => :rhtml, - ".json" => :json - } - end - - def syntax_highlight_by_file_type_or_specified(contents, file_name, file_type) - if file_type - language_detected = file_type - else - _, language_detected = file_map.find do |k, v| - Array(k).any? do |matcher| - matcher == File.extname(file_name) || matcher == File.basename(file_name) - end - end - end - - if Pry.color - CodeRay.scan(contents, language_detected).term - else - contents - end - end - - # convert negative line numbers to positive by wrapping around - # last line (as per array indexing with negative numbers) - def normalized_line_number(line_number, total_lines) - line_number < 0 ? line_number + total_lines : line_number - end - - # returns the file content between the lines and the normalized - # start and end line numbers. - def read_between_the_lines(file_name, start_line, end_line) - if file_name == Pry.eval_path - content = Pry.line_buffer.drop(1).join - else - content = File.read(File.expand_path(file_name)) - end - lines_array = content.each_line.to_a - - [lines_array[start_line..end_line].join, normalized_line_number(start_line, lines_array.size), - normalized_line_number(end_line, lines_array.size)] - end - def process_rdoc(comment, code_type) comment = comment.dup comment.gsub(/(?:\s*\n)?(.*?)\s*<\/code>/m) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }. diff --git a/test/helper.rb b/test/helper.rb index 4f1d8cd0..7c8ff126 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -148,11 +148,11 @@ end # Open a temp file and yield it to the block, closing it after # @return [String] The path of the temp file -def temp_file - file = Tempfile.new('pry') +def temp_file(ext='.rb') + file = Tempfile.new(['pry', ext]) yield file ensure - file.close(true) + file.close(true) if file end diff --git a/test/test_code.rb b/test/test_code.rb index 14796dee..fb0f7133 100644 --- a/test/test_code.rb +++ b/test/test_code.rb @@ -11,6 +11,18 @@ describe Pry::Code do Pry::Code.from_file('(pry)').grep(/:hay_guys/).length.should == 1 end + it 'should default to Ruby' do + temp_file('') do |f| + Pry::Code.from_file(f.path).code_type.should == :ruby + end + end + + it 'should check the extension' do + temp_file('.c') do |f| + Pry::Code.from_file(f.path).code_type.should == :c + end + end + it 'should raise an error if the file doesn\'t exist' do proc do Pry::Code.from_file('/knalkjsdnalsd/alkjdlkq')