class ReVIEW::Repository
Public Class Methods
new(param)
click to toggle source
# File lib/review/preprocessor.rb, line 324 def initialize(param) @repository = {} @config = param @logger = ReVIEW.logger end
Public Instance Methods
fetch(file, type, name)
click to toggle source
# File lib/review/preprocessor.rb, line 338 def fetch(file, type, name) table = file_descripter(file)[type] or return nil table[name] end
fetch_file(file)
click to toggle source
# File lib/review/preprocessor.rb, line 330 def fetch_file(file) file_descripter(file)['file'] end
fetch_range(file, name)
click to toggle source
# File lib/review/preprocessor.rb, line 334 def fetch_range(file, name) fetch(file, 'range', name) end
Private Instance Methods
_parse_file(f)
click to toggle source
# File lib/review/preprocessor.rb, line 370 def _parse_file(f) whole = [] repo = { 'file' => whole } curr = { 'WHOLE' => whole } lineno = 1 yacchack = false # remove ';'-only lines. opened = [['(not opened)', '(not opened)']] * 3 f.each do |line| case line when /(?:\A\#@|\#@@)([a-z]+)_(begin|end)\((.*)\)/ type = check_type($1) direction = $2 spec = check_spec($3) case direction when 'begin' key = "#{type}/#{spec}" if curr[key] error "begin x2: #{key}" end (repo[type] ||= {})[spec] = curr[key] = [] when 'end' curr.delete("#{type}/#{spec}") or error "end before begin: #{type}/#{spec}" else raise 'must not happen' end when %r{(?:\A\#@|\#@@)([a-z]+)/(\w+)\{} type = check_type($1) spec = check_spec($2) key = "#{type}/#{spec}" if curr[key] error "begin x2: #{key}" end (repo[type] ||= {})[spec] = curr[key] = [] opened.push [type, spec] when %r{(?:\A\#@|\#@@)([a-z]+)/(\w+)\}} type = check_type($1) spec = check_spec($2) curr.delete("#{type}/#{spec}") or error "end before begin: #{type}/#{spec}" opened.delete "#{type}/#{spec}" when /(?:\A\#@|\#@@)\}/ type, spec = opened.last curr.delete("#{type}/#{spec}") or error "closed before open: #{type}/#{spec}" opened.pop when /(?:\A\#@|\#@@)yacchack/ yacchack = true when /\A\#@-/ # does not increment line number. line = canonical($') curr.each_value { |list| list.push Line.new(nil, line) } else next if yacchack and line.strip == ';' line = canonical(line) curr.each_value { |list| list.push Line.new(lineno, line) } lineno += 1 end end if curr.size > 1 curr.delete 'WHOLE' curr.each { |range, lines| @logger.warn "#{filename}: unclosed range: #{range} (begin @#{lines.first.number})" } raise ApplicationError, 'ERROR' end repo end
canonical(line)
click to toggle source
# File lib/review/preprocessor.rb, line 444 def canonical(line) if @leave_content return line end tabwidth = @config['tabwidth'] || 8 if tabwidth > 0 detab(line, tabwidth).rstrip + "\n" else line end end
check_spec(spec)
click to toggle source
# File lib/review/preprocessor.rb, line 462 def check_spec(spec) error "wrong spec: #{spec.inspect}" unless /\A\w+\z/ =~ spec spec end
check_type(type)
click to toggle source
# File lib/review/preprocessor.rb, line 457 def check_type(type) error "wrong type: #{type.inspect}" unless Preprocessor::TYPES.index(type) type end
file_descripter(fname)
click to toggle source
# File lib/review/preprocessor.rb, line 345 def file_descripter(fname) @leave_content = File.extname(fname) == '.re' return @repository[fname] if @repository[fname] @repository[fname] = git?(fname) ? parse_git_blob(fname) : parse_file(fname) end
git?(fname)
click to toggle source
# File lib/review/preprocessor.rb, line 352 def git?(fname) fname.start_with?('git|') end
parse_file(fname)
click to toggle source
# File lib/review/preprocessor.rb, line 363 def parse_file(fname) File.open(fname, 'r:BOM|utf-8') do |f| init_errorutils f return _parse_file(f) end end
parse_git_blob(g_obj)
click to toggle source
# File lib/review/preprocessor.rb, line 356 def parse_git_blob(g_obj) IO.popen('git show ' + g_obj.sub(/\Agit\|/, ''), 'r') do |f| init_errorutils f return _parse_file(f) end end