bin/cvg in cvg-0.1.0 vs bin/cvg in cvg-0.1.1

- old
+ new

@@ -153,52 +153,109 @@ registry << hash end end end - class DetectMissing + class Flag + attr_reader :parent + def initialize(parent) + @parent = parent + end + def mode + nil + end + def per_row_pre_test? + nil + end + def per_row_passed_test? + nil + end + def final? + nil + end + end + + class DetectMissing < Flag MISSING = %w{ N/A n/a NULL null - #DIV/0 #REF! #NAME? NIL nil NA na #VALUE! #NULL! NaN #N/A #NUM! ? } def apply!(row) row.each do |k, v| if v.is_a?(::String) and MISSING.include?(v) row[k] = nil end end end + def per_row_pre_test? + true + end end + class Count < Flag + attr_reader :num + def initialize(*) + super + @num = 0 + end + def apply!(row) + @num += 1 + end + def finalize + parent.output_f.puts "Count: #{num}" + end + def mode + :dont_write_rows + end + def per_row_passed_test? + true + end + def final? + true + end + end + TESTS = [Present, Missing, Match, GreaterOrLesser, Dedup] FLAGS = { 'detect-missing' => DetectMissing, + 'count' => Count, } attr_reader :options attr_reader :input_paths def initialize(argv) @flags, @input_paths, @options = Cvg.parse argv end def perform - write_headers + if write_rows? + write_headers + end each_input_row do |row| if tests.all? { |t| t.pass?(row) } - write_row row + per_row_passed_test_flags.each { |flag| flag.apply! row } + if write_rows? + write_row row + end end end + final_flags.each { |flag| flag.finalize } + close_output end + def output_f + @output_f ||= $stdout + end + private def each_input_row input_paths.each do |path| CSV.foreach(path, headers: :first_row) do |row| row = row.to_hash - flags.each { |flag| flag.apply! row } + per_row_pre_test_flags.each { |flag| flag.apply! row } yield row end end end @@ -214,27 +271,44 @@ end memo end end + def write_rows? + return @write_rows_query if defined?(@write_rows_query) + @write_rows_query = !modes.include?(:dont_write_rows) + end + + def modes + @modes ||= flags.map(&:mode).flatten.compact + end + + def per_row_pre_test_flags + @per_row_pre_test_flags ||= flags.select { |flag| flag.per_row_pre_test? } + end + + def per_row_passed_test_flags + @per_row_passed_test_flags ||= flags.select { |flag| flag.per_row_passed_test? } + end + + def final_flags + @final_flags ||= flags.select { |flag| flag.final? } + end + def flags @_flags ||= begin @flags.map do |flag| - FLAGS.fetch(flag).new + FLAGS.fetch(flag).new(self) end end end def write_row(row) output_f.puts row.values_at(*fields).to_csv end def write_headers output_f.puts fields.to_csv - end - - def output_f - @output_f ||= $stdout end def close_output output_f.close end