Last active
August 29, 2015 14:26
-
-
Save JasonMadeSomething/9bf1e8804dfc4835753b to your computer and use it in GitHub Desktop.
Reek says feature envy.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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