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