module Rpr

Rpr searchs config file h from ./.rpr, ~/.config/rpr

Constants

VERSION

Public Class Methods

find_formatter(name) click to toggle source

@param [Symbol] name @return [Module]

# File lib/rpr.rb, line 42
def find_formatter(name)
  require "rpr/formatter/#{name}"
  Formatter.const_get(:"#{name[0].upcase}#{name[1..-1]}")
rescue LoadError
  raise UnknownFormatter, "#{name} is unknown formatter. It supports #{self.formatters.join('|')}"
end
find_parser(name) click to toggle source

@param [Symbol] name @return [Module]

# File lib/rpr.rb, line 56
def find_parser(name)
  require "rpr/parser/#{name}"
  Parser.const_get(:"#{name[0].upcase}#{name[1..-1]}")
rescue LoadError
  raise UnknownParser, "#{name} is unknown parser. It supports #{self.parsers.join('|')}"
end
formatters() click to toggle source
# File lib/rpr.rb, line 49
def formatters
  Dir.glob(File.join(__dir__, 'rpr/formatter/*.rb'))
    .map { |fname| File.basename(fname, '.rb')}
end
parse_args(args) click to toggle source

@param [Array<String>] args

# File lib/rpr.rb, line 69
def parse_args(args)
  res = {
    formatter: :pp,
    version: false,
    parser: :rubocop,
    expression: nil,
  }

  opt = OptionParser.new

  opt.on('-f=FORMATTER', '--formatter=FORMATTER', self.formatters.join('|')){|v| res[:formatter] = v.to_sym}
  opt.on('-o=FILE', '--out=FILE'){|v| $stdout = File.new(v, 'w')}
  opt.on('-p=PARSER', '--parser=PARSER', self.parsers.join('|')){|v| res[:parser] = v.to_sym}
  opt.on('-e=CODE'){|v| res[:expression] = v}
  opt.on('-v', '--version'){|v| res[:version] = v}

  opt.parse!(args)

  res
end
parsers() click to toggle source
# File lib/rpr.rb, line 63
def parsers
  Dir.glob(File.join(__dir__, 'rpr/parser/*.rb'))
    .map { |fname| File.basename(fname, '.rb')}
end
run(args) click to toggle source

@param [Array<String>] args

# File lib/rpr.rb, line 14
def run(args)
  options = parse_args(args)

  if options[:version]
    require 'rpr/version'
    puts VERSION
  end

  parser = find_parser(options[:parser])
  formatter = find_formatter(options[:formatter])

  if options[:expression]
    res = parser.parse(options[:expression])
    formatter.print(res)
  else
    args.each do |fname|
      code = File.read(fname)
      res = parser.parse(code)

      formatter.print(res)
    end
  end
ensure
  $stdout.close unless $stdout.tty?
end