Skip to content

Instantly share code, notes, and snippets.

@JasonMadeSomething
Last active August 29, 2015 14:26
Show Gist options
  • Save JasonMadeSomething/9bf1e8804dfc4835753b to your computer and use it in GitHub Desktop.
Save JasonMadeSomething/9bf1e8804dfc4835753b to your computer and use it in GitHub Desktop.
Reek says feature envy.
module IPDUtils
# Class to handle outputting to console and collecting user data
class Collector
def starting_wo_number
print 'Enter first workorder in sequence: '
gets.chomp
end
def dealer_pin
print 'Enter dealer PIN: '
gets.chomp
end
def dealer_purl
print 'Enter mailing PURL: '
purl = gets.chomp
purl[0] != '.' ? ".#{purl}" : purl
end
def job_po
print 'Enter PO#: '
gets.chomp
end
# Refers to entry more than self....(feature envy)..not sure how to fix
# Also, while rubocop is ok with the number of lines, reek says too many statements
def drop_sizes
drops = []
entry = -1
puts 'Enter Drop Quantities (enter x to stop)'
while entry != 'x'
print "Enter Drop #{drops.size + 1} size: "
entry = gets.chomp
# This line may not be needed (nil.to_i == 0 ?)
entry = 'Y' unless entry
drops << entry.to_i if entry != 'x' && entry != 'Y' && entry.to_i > 0
end
drops
end
# Output depends on external state, this is probably bad
def input_csv
arr = Dir.glob('*.csv')
arr.delete_if { |file| /880\d\d\d\d-\d\d\d ?(for import)?/ =~ file }
arr.at(0)
end
end
end
module IPDUtils
# Class to track and coordinate progress of processing
class Coordinator
def initialize
collector = Collector.new
@current_wo_number = collector.starting_wo_number
find_start_and_source(collector)
collect_job_info(collector)
initialize_trackers
@bar = ProgressBar.create(title: 'Progress', total: @drops.inject(:+),
format: '%e %t: %%%p |%b%i|%c of %C ',
progress_mark: '=', remainder_mark: '-',
length: 120)
end
def process
CSV.foreach(@source_file, headers: true).each_with_index do |row, i|
@starting_new_drop ? prep_drop : @pin_sequence += 1
@writer.write_row(@operator.transform_row(row, @pin_sequence))
@bar.increment
if i == @count_to
finish_drop
break unless @drops[@current_drop]
end
end
end
private
def prep_drop
@current_wo_number = @nav.nav_to_next_folder unless @current_drop == 0
@pin_sequence = 100_100 * (@current_drop + 1)
@writer.set_dest_to(@current_wo_number)
@writer.write_row(@operator.header)
@count_to += @drops[@current_drop]
@starting_new_drop = false
end
def finish_drop
@seeder.seed(@writer, @current_wo_number, @pin_sequence)
@starting_new_drop = true
@current_drop += 1
# TODO: Make pallet flag generator operational
# @flag_maker.create_ipd_pallet_flag(@current_wo_number, @nav.job_title(File.basename(Dir.pwd)))
end
def find_start_and_source(collector)
@nav = Navigator.new(@current_wo_number)
@nav.nav_to_start_folder
@source_file = collector.input_csv
end
def collect_job_info(collector)
@writer = Writer.new
@flag_maker = FlagGenerator.new(collector.job_po)
dealer_purl = collector.dealer_purl
dealer_pin = collector.dealer_pin
@drops = collector.drop_sizes
@operator = RowOperator.new(@source_file, dealer_purl, dealer_pin)
@seeder = Seeder.new(@operator.header, dealer_pin, dealer_purl)
end
def initialize_trackers
@count_to = -1
@current_drop = 0
@starting_new_drop = true
end
end
end
module IPDUtils
# Class responsible for taking in source rows and converting them
# to the output format
class RowOperator
attr_reader :header
def initialize(source, purl, dealer_pin)
@dealer_pin = dealer_pin
@purl = purl
header_to_ipd_header(source)
end
def transform_row(row, pin_seq)
if row[@fname_i]
first = row[@fname_i].capitalize.gsub(/\s+/, '')
else
first = ''
end
if row[@lname_i]
last = row[@lname_i].capitalize.gsub(/\s+/, '')
else
last = ''
end
row[@lname_i] = full_name(first, last, row[@mi_i], row[@sfx_i])
row[@mi_i] = salutation(first, last, row[@sfx_i])
row[@fname_i] = first
full_purl = "#{first}#{last}#{@purl}".downcase
if @address2_i
address = "#{row[(@address2_i - 1)]} #{row[@address2_i]}"
row[@address2_i - 1] = address
row.delete(@address2_i)
end
row << "#{@dealer_pin}-#{pin_seq}"
row << full_purl
row.delete_if { |h| col_blacklist?(h[0]) }
row
end
private
def header_to_ipd_header(source)
old_headers = CSV.parse_line(File.open(source, &:gets))
old_headers.delete_if { |header| col_blacklist?(header) }
old_header_indicies(old_headers)
old_headers[@mi_i] = 'Salutation'
old_headers[@lname_i] = 'Full Name'
old_headers << 'Pin'
old_headers << 'PURL'
@header = old_headers
end
def old_header_indicies(old_header)
@lname_i = old_header.find_index { |header| /lname.*|last.*/i =~ header }
@mi_i = old_header.find_index { |header| /mname.*|mi.*/i =~ header }
@fname_i = old_header.find_index { |header| /fname.*|first.*/i=~ header }
@sfx_i = old_header.find_index { |header| /sfx.*|suffix.*|sufx.*/i =~ header }
@address2_i = old_header.find_index { |header| /add.*2/i =~ header }
end
def col_blacklist?(head)
blacklist_regex = 'dpc|crrt|listid|level|fico|pobox_flag|segment|income'
blacklist_regex << '|ORDERRECORDID|cd|crid|dpbc|s.*x|add.*2'
/#{blacklist_regex}/i =~ head ? true : false
end
def full_name(first, last, mi, suffix)
if mi && mi != '' && mi != ' '
name = "#{first} #{mi} #{last}"
else
name = "#{first} #{last}"
end
name << "-#{suffix}" if suffix && suffix != ''
name
end
def salutation(first, last, suffix)
name = "#{first} #{last}"
name << "-#{suffix}" if suffix && suffix != ''
name
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment