lib/monolens/command.rb in monolens-0.6.0 vs lib/monolens/command.rb in monolens-0.6.1

- old
+ new

@@ -14,42 +14,58 @@ @enclose = [] @output_format = :json @stream = false @fail_strategy = 'fail' @override = false + @execute_tests = false # @input_file = nil @use_stdin = false + # + @use_paint = true end attr_reader :argv, :stdin, :stdout, :stderr attr_reader :pretty, :stream, :override attr_reader :enclose_map, :fail_strategy attr_reader :input_file, :use_stdin + attr_reader :use_paint + alias :use_paint? :use_paint + attr_reader :execute_tests + alias :execute_tests? :execute_tests def self.call(argv, stdin = $stdin, stdout = $stdout, stderr = $stderr) new(argv, stdin, stdout, stderr).call end def call lens, @input_file = options.parse!(argv) - show_help_and_exit if lens.nil? || (@input_file.nil? && !use_stdin) + show_help_and_exit if lens.nil? || (@input_file.nil? && !use_stdin && !execute_tests?) - lens_data, input = read_file(lens), read_input - lens = build_lens(lens_data) - error_handler = ErrorHandler.new - result = lens.call(input, error_handler: error_handler) + lens = build_lens(read_file(lens)) + if execute_tests? + execute_tests!(lens) + else + input = read_input + error_handler = ErrorHandler.new + result = lens.call(input, error_handler: error_handler) - unless error_handler.empty? - stderr.puts(error_handler.report) - end + unless error_handler.empty? + stderr.puts(error_handler.report) + end - output_result(result) if result + output_result(result) if result + end rescue Monolens::LensError => ex stderr.puts("[#{ex.location.join('/')}] #{ex.message}") - do_exit(-2) + do_exit(1) end + def execute_tests!(lens) + require_relative 'command/tester' + Tester.new(self).call(lens) + end + def read_input if use_stdin JSON.parse(stdin.read) else read_file(@input_file) @@ -128,10 +144,16 @@ @output_format = :json end opts.on('--override', 'Write output back to the input file') do @override = true end + opts.on('--test', 'Execute tests embedded in the lens file') do + @execute_tests = true + end + opts.on('--[no-]paint', 'Do (not) paint error messages') do |flag| + @use_paint = flag + end end end def build_lens(lens_data) lens_data = @enclose.inject(lens_data) do |memo, lens_name| @@ -148,10 +170,10 @@ 'core.literal' => { 'defn' => memo, } } end - end + end unless execute_tests? Monolens.lens(lens_data) end def output_result(result) with_output_io do |io|