class Reading::Csv::Parse::ParseLine::ParseExperiences
using Util::Blank
Public Instance Methods
call(_name = nil, columns)
click to toggle source
# File lib/reading/csv/parse_experiences.rb, line 13 def call(_name = nil, columns) started, finished = dates_split(columns) if config.fetch(:csv).fetch(:reverse_dates) started, finished = started.reverse, finished.reverse end using_dates = started.map.with_index do |entry, i| { date_added: date_added(entry) || template[:date_added], date_started: date_started(entry) || template[:date_started], date_finished: date_finished(finished, i) || template[:date_finished], progress: progress(entry) || progress(columns[:name], ignore_if_no_dnf: i < started.count - 1) || template[:progress], group: group(entry) || template[:group], variant_index: variant_index(entry) || template[:variant_index] } end.presence if using_dates return using_dates else if prog = progress(columns[:name]) return [template.merge(progress: prog)] else return [] end end end
date_added(date_entry)
click to toggle source
# File lib/reading/csv/parse_experiences.rb, line 58 def date_added(date_entry) date_entry.match(config.fetch(:csv).fetch(:regex).fetch(:date_added))&.captures&.first end
date_finished(dates_finished, date_index)
click to toggle source
# File lib/reading/csv/parse_experiences.rb, line 66 def date_finished(dates_finished, date_index) return nil if dates_finished.nil? dates_finished[date_index]&.strip&.presence end
date_started(date_entry)
click to toggle source
# File lib/reading/csv/parse_experiences.rb, line 62 def date_started(date_entry) date_entry.match(config.fetch(:csv).fetch(:regex).fetch(:date_started))&.captures&.first end
dates_split(columns)
click to toggle source
# File lib/reading/csv/parse_experiences.rb, line 43 def dates_split(columns) dates_finished = columns[:dates_finished]&.presence &.split(config.fetch(:csv).fetch(:separator)) || [] # don't use #has_key? because simply checking for nil covers the # case where dates_started is the last column and omitted. started_column_exists = columns[:dates_started]&.presence dates_started = if started_column_exists columns[:dates_started]&.presence&.split(config.fetch(:csv).fetch(:separator)) else [""] * dates_finished.count end [dates_started, dates_finished] end
group(entry)
click to toggle source
# File lib/reading/csv/parse_experiences.rb, line 89 def group(entry) entry.match(config.fetch(:csv).fetch(:regex).fetch(:group_experience))&.captures&.first end
progress(str, ignore_if_no_dnf: false)
click to toggle source
# File lib/reading/csv/parse_experiences.rb, line 71 def progress(str, ignore_if_no_dnf: false) dnf = str.match(config.fetch(:csv).fetch(:regex).fetch(:dnf))&.captures&.first if dnf || !ignore_if_no_dnf captures = str.match(config.fetch(:csv).fetch(:regex).fetch(:progress))&.captures if captures if prog_percent = captures[1]&.to_i return prog_percent / 100.0 elsif prog_time = captures[2] return prog_time elsif prog_pages = captures[3]&.to_i return prog_pages end end end return 0 if dnf nil end
template()
click to toggle source
# File lib/reading/csv/parse_experiences.rb, line 39 def template @template ||= config.fetch(:item).fetch(:template).fetch(:experiences).first end
variant_index(date_entry)
click to toggle source
# File lib/reading/csv/parse_experiences.rb, line 93 def variant_index(date_entry) match = date_entry.match(config.fetch(:csv).fetch(:regex).fetch(:variant_index)) (match&.captures&.first&.to_i || 1) - 1 end