Sha256: f98a1cdacb65d25454570e6e88c69037902306edc9a06e480877c9cba91d6f05

Contents?: true

Size: 1.07 KB

Versions: 1

Compression:

Stored size: 1.07 KB

Contents

class Tableware

  class Parser

    class TableWithoutHeaderError < StandardError; end

    ROW_START = /^\s*\|/
    ROW_END   = /\|\s*$/

    def arrays(input)
      make_arrays(input)
    end

    def hashes(input)
      items = make_arrays(input)
      raise TableWithoutHeaderError, 'Sorry, only text tables with headers rows can be turned into hashes' unless @headers
      items.map! { |row| @headers.zip(row).to_h }
    end

    private def make_arrays(input)
      lines = prepare_lines(input)
      lines[@data_start..-1].map { |line| parse_line(line) }
    end

    private def prepare_lines(input)
      lines = input.strip.lines

      @data_start = lines[1] =~ /^\s*[-=]+\s*$/ ? 2 : 0
      if @data_start.nonzero?
        @headers = parse_line(lines[0])
                   .map!(&:downcase)
                   .map! { |head| head.gsub(/\s+/, '_') }
                   .map!(&:to_sym)
      end

      lines
    end

    private def parse_line(line)
      line
        .sub(ROW_START, '')
        .sub(ROW_END, '')
        .split('|')
        .map!(&:strip)
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
tableware-0.1.0 lib/tableware/parser.rb