class Embulk::Guess::TimeFormatGuess::GuessMatch
def array_sequence_find(array, seq)
def array_sequence_find(array, seq) (array.size - seq.size + 1).times {|i| return i if array[i, seq.size] == seq } return nil end
def format
def format format = '' @parts.size.times do |i| format << @delimiters[i-1] if i != 0 option = @part_options[i] case @parts[i] when :year format << '%Y' when :month case option when :zero format << '%m' when :blank #format << '%_m' # not supported format << '%m' when :none #format << '%-m' # not supported format << '%m' else format << '%m' end when :day case option when :zero format << '%d' when :blank format << '%e' when :none format << '%d' # not supported else format << '%d' end when :hour case option when :zero format << '%H' when :blank format << '%k' when :none format << '%k' # not supported else format << '%H' end when :minute # heading options are not supported format << '%M' when :second # heading options are not supported format << '%S' when :frac if option <= 3 format << '%L' #elsif option <= 6 # format << '%6N' #elsif option <= 6 # format << '%6N' #elsif option <= 9 # format << '%9N' #elsif option <= 12 # format << '%12N' #elsif option <= 15 # format << '%15N' #elsif option <= 18 # format << '%18N' #elsif option <= 21 # format << '%21N' #elsif option <= 24 # format << '%24N' else format << '%N' end when :zone case option when :extended format << '%:z' else # :simple, :abb # don't use %Z even with :abb: https://github.com/jruby/jruby/issues/3702 format << '%z' end else raise "Unknown part: #{@parts[i]}" end end return format end
def initialize(delimiters, parts, part_options)
def initialize(delimiters, parts, part_options) @delimiters = delimiters @parts = parts @part_options = part_options end
def merge!(another_in_group)
def merge!(another_in_group) part_options = another_in_group.part_options @part_options.size.times do |i| @part_options[i] ||= part_options[i] if @part_options[i] == nil part_options[i] elsif part_options[i] == nil @part_options[i] else [@part_options[i], part_options[i]].sort.last end end # if DMY matches, MDY is likely false match of DMY. dmy = array_sequence_find(another_in_group.parts, [:day, :month, :year]) mdy = array_sequence_find(@parts, [:month, :day, :year]) if mdy && dmy @parts[mdy, 3] = [:day, :month, :year] end end
def mergeable_group
def mergeable_group # MDY is mergible with DMY if i = array_sequence_find(@parts, [:day, :month, :year]) ps = @parts.dup ps[i, 3] = [:month, :day, :year] [@delimiters, ps] else [@delimiters, @parts] end end