Class: TrueTable::Table

Inherits:
Array
  • Object
show all
Defined in:
lib/true_table/table.rb

Instance Method Summary collapse

Instance Method Details

#+(other) ⇒ Object

Combines table with other and returns a new one



4
5
6
7
8
# File 'lib/true_table/table.rb', line 4

def +(other)
  result = self.class.new
  each_row { |row, i| result << row.merge(other[i]) }
  result
end

#-(cols) ⇒ Object

Returns a new table without specified columns



11
12
13
14
15
16
# File 'lib/true_table/table.rb', line 11

def -(cols)
  keep_keys = headers - cols
  result = self.class.new
  each_row { |row, i| result << row.slice(*keep_keys) }
  result
end

#[](key) ⇒ Object Also known as: row

Returns a row or a column



19
20
21
# File 'lib/true_table/table.rb', line 19

def [](key)
  key.is_a?(Symbol) || key.is_a?(String) ? col(key.to_sym) : super
end

#[]=(key, value) ⇒ Object

Adds or updates a row or a column



24
25
26
# File 'lib/true_table/table.rb', line 24

def []=(key, value)
  key.is_a?(Symbol) || key.is_a?(String) ? add_col(key.to_sym, value) : super
end

#col(key) ⇒ Object

Returns a column as Array



29
30
31
# File 'lib/true_table/table.rb', line 29

def col(key)
  map { |row| row[key] }
end

#colsObject

Returns a hash of columns



34
35
36
37
38
# File 'lib/true_table/table.rb', line 34

def cols
  result = {}
  each_col { |col, header| result[header] = col }
  result
end

#compactObject

Returns a copy of self without rows that contain nil in any column



41
42
43
# File 'lib/true_table/table.rb', line 41

def compact
  dup.compact!
end

#compact!Object

Removes rows with nil in any column



46
47
48
# File 'lib/true_table/table.rb', line 46

def compact!
  delete_if { |row| row.values.include? nil }
end

#delete_at(index) ⇒ Object Also known as: delete_col, delete_row

Delete a row or a column in place and returns the deleted row/column



51
52
53
54
55
56
57
58
59
60
# File 'lib/true_table/table.rb', line 51

def delete_at(index)
  if index.is_a?(Symbol) || index.is_a?(String)
    result = self[index]
    return nil unless result
    each_row { |row, i| row.delete index }
    result
  else
    super
  end
end

#difference(*others) ⇒ Object

Returns a table with different rows



65
66
67
# File 'lib/true_table/table.rb', line 65

def difference(*others)
  self.class.new super
end

#dig(*indexes) ⇒ Object

Extracts nested value. Accepts row, column or column, row



70
71
72
73
74
75
76
77
# File 'lib/true_table/table.rb', line 70

def dig(*indexes)
  key = indexes.shift
  if key.is_a?(Symbol) || key.is_a?(String)
    col(key.to_sym).dig *indexes
  else
    row(key).dig *indexes
  end
end

#each_colObject

Iterates over columns



80
81
82
# File 'lib/true_table/table.rb', line 80

def each_col
  headers.each { |header| yield col(header), header }
end

#headersObject

Returns an array of column headers



88
89
90
# File 'lib/true_table/table.rb', line 88

def headers
  first.keys
end

#intersection(*others) ⇒ Object

Returns a new table with intersecting rows



93
94
95
# File 'lib/true_table/table.rb', line 93

def intersection(*others)
  self.class.new super
end

#join(row_separator = $,, col_separator = nil, with_headers: false) ⇒ Object

Returns a string with joined rows and columns



98
99
100
101
102
103
104
105
# File 'lib/true_table/table.rb', line 98

def join(row_separator = $,, col_separator = nil, with_headers: false)
  if col_separator
    result = map { |row| row.values.join col_separator }.join(row_separator)
    with_headers ? headers.join(col_separator) + row_separator + result : result
  else
    super row_separator
  end
end

#last(*args) ⇒ Object

Returns the last row or a new table with the last N rows



108
109
110
# File 'lib/true_table/table.rb', line 108

def last(*args)
  args.empty? ? super : self.class.new(super)
end

#rejectObject

Returns a new table without rejected rows



113
114
115
# File 'lib/true_table/table.rb', line 113

def reject
  self.class.new super
end

#reverseObject

Returns a reversed copy



118
119
120
# File 'lib/true_table/table.rb', line 118

def reverse
  self.class.new super
end

#selectObject Also known as: filter

Returns a new table with selected rows



126
127
128
# File 'lib/true_table/table.rb', line 126

def select
  self.class.new super
end

#sortObject

Returns a new sorted table



132
133
134
# File 'lib/true_table/table.rb', line 132

def sort
  self.class.new super
end

#sort_byObject

Returns a new sorted table



137
138
139
# File 'lib/true_table/table.rb', line 137

def sort_by
  self.class.new super
end

#to_csv(row_separator = "\n", col_separator = ",") ⇒ Object

Returns a CSV string



142
143
144
# File 'lib/true_table/table.rb', line 142

def to_csv(row_separator = "\n", col_separator = ",")
  join(row_separator, col_separator, with_headers: true)
end

#valuesObject

Returns only values, without any headers (array of arrays)



147
148
149
# File 'lib/true_table/table.rb', line 147

def values
  map { |row| row.values }
end