Class: HoneyFormat::Matrix

Inherits:
Object
  • Object
show all
Defined in:
lib/honey_format/matrix/matrix.rb

Overview

Represents Matrix.

Direct Known Subclasses

CSV

Instance Method Summary collapse

Constructor Details

#initialize(matrix, header: nil, header_converter: HoneyFormat.header_converter, header_deduplicator: HoneyFormat.config.header_deduplicator, row_builder: nil, type_map: {}) ⇒ Matrix

Instantiate Matrix.

Examples:

matrix = HoneyFormat::Matrix.new([%w[name id], %w[jacob 1]])
matrix.columns # => [:name, :id]
matrix.rows.to_a # => [#<Row name="jacob", id="1">]

With custom header converter

converter = proc { |v| v == 'name' ? 'first_name' : v }
matrix = HoneyFormat::Matrix.new([%w[name id]], header_converter: converter)
matrix.columns # => [:first_name, :id]

Handle errors

begin
  matrix = HoneyFormat::Matrix.new([%w[name id]])
rescue HoneyFormat::HeaderError => e
  puts "header error: #{e.class}, #{e.message}"
rescue HoneyFormat::RowError => e
  puts "row error: #{e.class}, #{e.message}"
end

Parameters:

  • matrix (Array<Array<String, nil>>)
  • header (Array<String>) (defaults to: nil)

    header optional argument that represents header, required if the matrix lacks a header row.

  • header_converter (#call) (defaults to: HoneyFormat.header_converter)

    converts header columns.

  • header_deduplicator (#call) (defaults to: HoneyFormat.config.header_deduplicator)

    deduplicates header columns.

  • row_builder (#call) (defaults to: nil)

    will be called for each parsed row.

  • type_map (Hash) (defaults to: {})

    map of column_name => type conversion to perform.

Raises:

See Also:



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/honey_format/matrix/matrix.rb', line 40

def initialize(
  matrix,
  header: nil,
  header_converter: HoneyFormat.header_converter,
  header_deduplicator: HoneyFormat.config.header_deduplicator,
  row_builder: nil,
  type_map: {}
)
  header_row = header || matrix.shift
  @header = Header.new(
    header_row,
    converter: header_converter,
    deduplicator: header_deduplicator
  )
  @type_map = type_map.select { |key, _v| @header.columns.include?(key) }.to_h
  @rows = Rows.new(matrix, columns, builder: row_builder, type_map: @type_map)
end

Instance Method Details

#columnsArray<Symbol>

Matrix columns converted from the original Matrix header

Returns:

  • (Array<Symbol>)

    of column identifiers.



66
67
68
# File 'lib/honey_format/matrix/matrix.rb', line 66

def columns
  @header.to_a
end

#each_row {|row| ... } ⇒ Enumerator

Itereate over each row

Yields:

  • (row)

    The given block will be passed for every row.

Yield Parameters:

  • row (Row)

    in the matrix.

Returns:

  • (Enumerator)

    If no block is given, an enumerator object will be returned.



86
87
88
89
90
# File 'lib/honey_format/matrix/matrix.rb', line 86

def each_row
  return rows.each unless block_given?

  rows.each { |row| yield(row) }
end

#headerHeader

Original matrix header

Returns:

  • (Header)

    object representing the matrix header.



60
61
62
# File 'lib/honey_format/matrix/matrix.rb', line 60

def header
  @header
end

#rowsRows

Return rows

Returns:



78
79
80
# File 'lib/honey_format/matrix/matrix.rb', line 78

def rows
  @rows
end

#to_csv(columns: nil) {|row| ... } ⇒ String

Convert matrix to CSV-string.

Examples:

with selected columns

matrix.to_csv(columns: [:id, :country])

with selected rows

matrix.to_csv { |row| row.country == 'Sweden' }

with both selected columns and rows

matrix.to_csv(columns: [:id, :country]) { |row| row.country == 'Sweden' }

Parameters:

  • columns (Array<Symbol>, Set<Symbol>, NilClass) (defaults to: nil)

    the columns to output, nil means all columns (default: nil)

Yields:

  • (row)

    The given block will be passed for every row - return truthy if you want the row to be included in the output

Yield Parameters:

Returns:

  • (String)

    CSV-string representation.



106
107
108
109
# File 'lib/honey_format/matrix/matrix.rb', line 106

def to_csv(columns: nil, &block)
  columns = columns&.map(&:to_sym)
  @header.to_csv(columns: columns) + @rows.to_csv(columns: columns, &block)
end

#type_mapHash<Symbol, Symbol>

Matrix type map used

Returns:

  • (Hash<Symbol, Symbol>)

    the type map used.



72
73
74
# File 'lib/honey_format/matrix/matrix.rb', line 72

def type_map
  @type_map
end