tabulo 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 758e3d9a0c11ce15ef23bcfc38c6e1e5dcf1e818
4
- data.tar.gz: 5ffb67d92e38efec2b4eec90beea8ea1a047fb3c
3
+ metadata.gz: 9b63d694608052e887a021c0c0e0eb4c9e77512a
4
+ data.tar.gz: e2781dc44f766676c25fa2148a867e14cf49795f
5
5
  SHA512:
6
- metadata.gz: e6ea3bb9c620c39e784949174afe15d028892af72a148159a6cfc1282f07aaf858c265d70fa41ee516c04f55fe1b34e3b21f23b684196adcb488dcf02a6f4335
7
- data.tar.gz: f68ca83f4647a7d8f21976ef838248bbbcbd6b4aba21ec6c81087c521e07dc3b8d9f0c4aee59c45c5935107ff4740d72c6c3f70287e94d27d57c3ecb94008305
6
+ metadata.gz: 33b5af849750ab1ba36c4212b835193d50592f524f7055c3236043f81dcce5b1bffb56c0770651fd9ca5e6c89df935073e4018cbe3029ac1215f7efd6e805e4f
7
+ data.tar.gz: f9563b27c2a150ea1544e3705c5fbac6c77163e2f23d9187f50310c71ac66a13b2066d04223907707cef698fa3d024112a981edc25245e6f372d2dfc29ab8c2f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.3.0
4
+
5
+ * Rename Table#header_row to Table#formatted_header
6
+ * Improve documentation, and use Yardoc instead of Tomdoc
7
+ * Remove Tabulo::Column from the publicly documented API.
8
+
3
9
  ## v0.2.2
4
10
 
5
11
  * Write documentation
data/TODO.md CHANGED
@@ -1,13 +1,8 @@
1
1
  # TODO
2
2
 
3
- * Finish Tomdoc documentation. Link to it at rubydocs from the README. In particular,
4
- make it clear which methods are part of the public API and which are internal.
5
- * Allow the option of a horizontal rule between each row?
6
3
  * Consider incorporating a linter / static analysis tool into the build.
7
4
  * Raise an ArgumentError for disallowed arguments and options (this is
8
5
  a library!)
9
6
  * Document :formatter option in README.
10
7
  * Allow default column width to be configured at level of Table.
11
- * Rename Table#header_row to Table#header to avoid confusion as it does not
12
- return a Row.
13
8
  * Column#initialize should have the same signature as Table#add_column.
data/lib/tabulo/column.rb CHANGED
@@ -1,48 +1,11 @@
1
1
  module Tabulo
2
2
 
3
+ # @!visibility private
3
4
  class Column
4
5
 
5
6
  attr_reader :label, :width
6
7
 
7
- # Public: Initializes and returns a new Column.
8
- #
9
- # options - A Hash of options:
10
- #
11
- # :label - A Symbol or String being a unique identifier for this Column.
12
- # If the :extractor option is not also provided, then the :label option
13
- # should correspond to a method to be called on each item in the table sources
14
- # to provide the content for this column.
15
- #
16
- # :header - The text to be displayed in the header for this Column.
17
- #
18
- # :align_header - Specifies the alignment of the header text. Possible values are
19
- # <tt>:left</tt>, <tt>:center</tt> (the default) and <tt>right</tt>
20
- #
21
- # :align_body - Specifies how the cell body contents will be aligned. Possible
22
- # values are <tt>:left</tt>, <tt>:center</tt>, <tt>:right</tt>
23
- # and <tt>nil</tt>. If <tt>nil</tt> is passed (the default), then
24
- # the alignment is determined by the type of the cell value,
25
- # with numbers aligned right, booleans center-aligned, and
26
- # other values left-aligned. Note header text alignment is configured
27
- # separately using the :align_header option.
28
- #
29
- # :extractor - A callable, e.g. a block or lambda, that will be passed each of the
30
- # Table sources to determine the value in each cell of this Column. If
31
- # this is not provided, then the Column label will be treated as a
32
- # method to be called on each source item to determine each cell's
33
- # value.
34
- #
35
- # :formatter - A callable (e.g. a lambda) that will be passed the calculated
36
- # value of each cell to determine how it should be displayed. This
37
- # is distinct from the extractor (see below). For
38
- # example, if the extractor for this column generates a Date, then
39
- # the formatter might format that Date in a particular way.
40
- # If no formatter is provided, then <tt>.to_s</tt> will be called on
41
- # the extracted value of each cell to determine its displayed
42
- # content.
43
- #
44
- # :width - Specifies the width of the column, not including the single character
45
- # of padding. The default is given by Table::DEFAULT_COLUMN_WIDTH.
8
+ # @!visibility private
46
9
  def initialize(options)
47
10
  @label, @header = options[:label], options[:header]
48
11
  @align_header = options[:align_header] || :center
@@ -52,17 +15,17 @@ module Tabulo
52
15
  @width = options[:width] || Table::DEFAULT_COLUMN_WIDTH
53
16
  end
54
17
 
55
- # Internal
18
+ # @!visibility private
56
19
  def header_cell
57
20
  align_cell_content(@header, @align_header)
58
21
  end
59
22
 
60
- # Internal
23
+ # @!visibility private
61
24
  def horizontal_rule
62
25
  Table::HORIZONTAL_RULE_CHARACTER * @width
63
26
  end
64
27
 
65
- # Internal
28
+ # @!visibility private
66
29
  def body_cell(source)
67
30
  cell_datum = body_cell_value(source)
68
31
  formatted_cell_content = @formatter.call(cell_datum)
@@ -70,14 +33,14 @@ module Tabulo
70
33
  align_cell_content(formatted_cell_content, real_alignment)
71
34
  end
72
35
 
73
- # Internal
36
+ # @!visibility private
74
37
  def body_cell_value(source)
75
38
  @extractor.call(source)
76
39
  end
77
40
 
78
41
  private
79
42
 
80
- # Internal
43
+ # @!visibility private
81
44
  def align_cell_content(content, real_alignment)
82
45
  padding = [@width - content.length, 0].max
83
46
  left_padding, right_padding =
@@ -94,7 +57,7 @@ module Tabulo
94
57
  "#{' ' * left_padding}#{content}#{' ' * right_padding}"
95
58
  end
96
59
 
97
- # Internal
60
+ # @!visibility private
98
61
  def infer_alignment(cell_datum)
99
62
  case cell_datum
100
63
  when Numeric
data/lib/tabulo/row.rb CHANGED
@@ -3,19 +3,18 @@ module Tabulo
3
3
  class Row
4
4
  include Enumerable
5
5
 
6
- # Internal
6
+ # @!visibility private
7
7
  def initialize(table, source, options = { with_header: true })
8
8
  @table = table
9
9
  @source = source
10
10
  @with_header = options[:with_header]
11
11
  end
12
12
 
13
- # Public: Calls the given block once for each cell in the Row, passing that cell as parameter.
14
- # Each "cell" is just the calculated value for its column (pre-formatting) for this Row's
13
+ # Calls the given block once for each cell in the {Row}, passing that cell as parameter.
14
+ # Each "cell" is just the calculated value for its column (pre-formatting) for this {Row}'s
15
15
  # source item.
16
16
  #
17
- # Examples
18
- #
17
+ # @example
19
18
  # table = Tabulo::Table.new([1, 10], columns: %i(itself even?))
20
19
  # row = table.first
21
20
  # row.each do |cell|
@@ -28,21 +27,20 @@ module Tabulo
28
27
  end
29
28
  end
30
29
 
31
- # Public: Returns a String being an "ASCII" graphical representation of the Row, including
32
- # any column headers that appear just above it in the Table (depending on where this Row is
33
- # in the Table and how the Table was configured with respect to header frequency).
30
+ # @return a String being an "ASCII" graphical representation of the {Row}, including
31
+ # any column headers that appear just above it in the {Table} (depending on where this Row is
32
+ # in the {Table} and how the {Table} was configured with respect to header frequency).
34
33
  def to_s
35
34
  @table.formatted_body_row(@source, with_header: @with_header)
36
35
  end
37
36
 
38
- # Public: Returns a Hash representation of the Row, with Column labels acting
39
- # as keys and the calculated cell values (before formatting) providing the values.
40
- #
41
- # Examples
37
+ # @return a Hash representation of the {Row}, with column labels acting
38
+ # as keys and the calculated cell values (before formatting) providing the values.
42
39
  #
40
+ # @example
43
41
  # table = Tabulo::Table.new([1, 10], columns: %i(itself even?))
44
42
  # row = table.first
45
- # row.to_h # -> { :itself => 1, :even? => false }
43
+ # row.to_h # => { :itself => 1, :even? => false }
46
44
  #
47
45
  def to_h
48
46
  @table.columns.map(&:label).zip(to_a).to_h
data/lib/tabulo/table.rb CHANGED
@@ -2,7 +2,7 @@ module Tabulo
2
2
 
3
3
  # Represents a table primarily intended for "pretty-printing" in a fixed-width font.
4
4
  #
5
- # A Table is also an Enumerable, of which each element is a Tabulo::Row.
5
+ # A Table is also an Enumerable, of which each element is a {Row}.
6
6
  class Table
7
7
  include Enumerable
8
8
 
@@ -11,45 +11,29 @@ module Tabulo
11
11
  HORIZONTAL_RULE_CHARACTER = "-"
12
12
  CORNER_CHARACTER = "+"
13
13
 
14
+ # @!visibility private
14
15
  attr_reader :columns
15
16
 
16
- # Public: Initializes and returns a new Table.
17
- #
18
- # sources - the underlying Enumerable from which the table will derive its data
19
- # options - a Hash of options providing for customization of the Table:
20
- #
21
- # :columns - An Array (default: []) specifying the initial columns (note more can be
22
- # added later using #add_column). Each element of the Array
23
- # should be either a Symbol or a Column. If it's a Symbol,
24
- # it will be used to initialize a Column whose content is
25
- # created by calling the corresponding method on each
26
- # element of sources.
27
- #
28
- # :header_frequency - Controls the display of Column headers. Possible values:
29
- #
30
- # <tt>:start</tt> (default) - show column headers at top of table only
31
- #
32
- # <tt>nil</tt> - do not show column headers.
33
- #
34
- # N (a Fixnum > 0) - show column headers at start, then repeated
35
- # every N rows.
36
- #
37
- # :wrap_header_cells_to - Controls wrapping behaviour for header cells if the content
38
- # thereof is longer than the Column's fixed width. Possible
39
- # values:
40
- #
41
- # <tt>nil</tt> - wrap content for as many rows as necessary
42
- #
43
- # N (a Fixnum > 0) - wrap content for up to N rows and
44
- # truncate thereafter
45
- #
46
- # :wrap_body_cells_to - Controls wrapping behaviour for table cells (excluding
47
- # headers). Possible values:
48
- #
49
- # <tt>nil</tt> - wrap content for as many rows as necessary
50
- #
51
- # N (a `Fixnum` > 0) - wrap content for up to N rows and
52
- # truncate thereafter
17
+ # @param [Enumerable] sources the underlying Enumerable from which the table will derive its data
18
+ # @param [Hash] options
19
+ # @option options [Array[Symbol]] :columns ([]) Specifies the initial columns.
20
+ # Each element of the Array will be used to create a column whose content is
21
+ # created by calling the corresponding method on each element of sources. Note
22
+ # the {#add_column} method is a much more flexible way to set up columns on the table.
23
+ # @option options [:start, nil, Fixnum] :header_frequency (:start) Controls the display of column headers.
24
+ # If passed <tt>:start</tt>, headers will be shown at the top of the table only. If passed <tt>nil</tt>,
25
+ # headers will not be shown. If passed a Fixnum N (> 0), headers will be shown at the top of the table,
26
+ # then repeated every N rows.
27
+ # @option options [nil, Fixnum] :wrap_header_cells_to (nil) Controls wrapping behaviour for header
28
+ # cells if the content thereof is longer than the column's fixed width. If passed <tt>nil</tt> (default),
29
+ # content will be wrapped for as many rows as required to accommodate it. If passed a Fixnum N (> 0),
30
+ # content will be wrapped up to N rows and then truncated thereafter.
31
+ # @option options [nil, Fixnum] :wrap_body_cells_to (nil) Controls wrapping behaviour for table cells (excluding
32
+ # headers), if their content is longer than the column's fixed width. If passed <tt>nil</tt>, content will
33
+ # be wrapped for as many rows as required to accommodate it. If passed a Fixnum N (> 0), content will be
34
+ # wrapped up to N rows and then truncated thereafter.
35
+ #
36
+ # @return [Table] a new Table
53
37
  def initialize(sources, options = { })
54
38
  opts = {
55
39
  columns: [],
@@ -73,62 +57,50 @@ module Tabulo
73
57
  yield self if block_given?
74
58
  end
75
59
 
76
- # Public: Initializes a Column and adds it to the Table.
77
- #
78
- # label - A Symbol or String being a unique identifier for this column, which by default will
79
- # also be used as the column header text (see also the header option). If the
80
- # extractor argument is not also provided, then the label argument should correspond to
81
- # a method to be called on each item in the table sources to provide the content
82
- # for this column.
83
- #
84
- # options - A Hash of options providing for customization of the column:
85
- #
86
- # :header - Text to be displayed in the column header. By default the column
87
- # label will also be used as its header text.
88
- #
89
- # :align_header - Specifies how the header text should be aligned. Possible values
90
- # are <tt>:left</tt>, <tt>:center</tt> and <tt>:right</tt>.
91
- #
92
- # :align_body - Specifies how the cell body contents will be aligned. Possible
93
- # values are <tt>:left</tt>, <tt>:center</tt>, <tt>:right</tt>
94
- # and <tt>nil</tt>. If <tt>nil</tt> is passed (the default), then
95
- # the alignment is determined by the type of the cell value,
96
- # with numbers aligned right, booleans center-aligned, and
97
- # other values left-aligned. Note header text alignment is
98
- # configured separately using the :align_header option.
99
- #
100
- # :width - Specifies the width of the column, not including the single
101
- # character of padding. The default is given by
102
- # Table::DEFAULT_COLUMN_WIDTH.
103
- #
104
- # :formatter - A callable (e.g. a lambda) that will be passed the calculated
105
- # value of each cell to determine how it should be displayed. This
106
- # is distinct from the extractor (see below). For
107
- # example, if the extractor for this column generates a Date, then
108
- # the formatter might format that Date in a particular way.
109
- # If no formatter is provided, then <tt>.to_s</tt> will be called on
110
- # the extracted value of each cell to determine its displayed
111
- # content.
112
- #
113
- # extractor - A callable, e.g. a block or lambda, that will be passed each of the Table
114
- # sources to determine the value in each cell of this column. If this is not
115
- # provided, then the column label will be treated as a method to be called on each
116
- # source item to determine each cell's value.
60
+ # Adds a column to the Table.
61
+ #
62
+ # @param [Symbol, String] label A unique identifier for this column, which by default will
63
+ # also be used as the column header text (see also the header option). If the
64
+ # extractor argument is not also provided, then the label argument should correspond to
65
+ # a method to be called on each item in the table sources to provide the content
66
+ # for this column.
67
+ #
68
+ # @param [Hash] options
69
+ # @option options [String] :header Text to be displayed in the column header. By default the column
70
+ # label will also be used as its header text.
71
+ # @option options [:left, :center, :right] :align_header (:center) Specifies how the header text
72
+ # should be aligned.
73
+ # @option options [:left, :center, :right, nil] :align_body (nil) Specifies how the cell body contents
74
+ # should be aligned. Possible If <tt>nil</tt> is passed, then the alignment is determined
75
+ # by the type of the cell value, with numbers aligned right, booleans center-aligned, and
76
+ # other values left-aligned. Note header text alignment is configured separately using the
77
+ # :align_header option.
78
+ # @option options [Fixnum] :width (8) Specifies the width of the
79
+ # column, excluding padding.
80
+ # @option options [#to_proc] :formatter (:to_s.to_proc) A lambda or other callable object that
81
+ # will be passed the calculated value of each cell to determine how it should be displayed. This
82
+ # is distinct from the extractor (see below). For example, if the extractor for this column
83
+ # generates a Date, then the formatter might format that Date in a particular way.
84
+ # If no formatter is provided, then <tt>.to_s</tt> will be called on
85
+ # the extracted value of each cell to determine its displayed content.
86
+ # @param [#to_proc] extractor A block or other callable
87
+ # that will be passed each of the Table sources to determine the value in each cell of this
88
+ # column. If this is not provided, then the column label will be treated as a method to be
89
+ # called on each source item to determine each cell's value.
117
90
  #
118
91
  def add_column(label, options = { }, &extractor)
119
92
  @columns << make_column(label, extractor: extractor)
120
93
  end
121
94
 
122
- # Public: Returns a String being a graphical "ASCII" representation of the Table, suitable for
123
- # display in a fixed-width font.
95
+ # @return [String] a graphical "ASCII" representation of the Table, suitable for
96
+ # display in a fixed-width font.
124
97
  def to_s
125
98
  join_lines(map(&:to_s))
126
99
  end
127
100
 
128
- # Public: Calls the given block once for each Row in the Table, passing that Row as parameter.
129
- #
130
- # Examples
101
+ # Calls the given block once for each {Row} in the Table, passing that {Row} as parameter.
131
102
  #
103
+ # @example
132
104
  # table.each do |row|
133
105
  # puts row
134
106
  # end
@@ -150,18 +122,15 @@ module Tabulo
150
122
  end
151
123
  end
152
124
 
153
- # Public: Returns a String being an "ASCII" graphical representation of the Table column
154
- # headers.
155
- def header_row
125
+ # @return [String] an "ASCII" graphical representation of the Table column headers.
126
+ def formatted_header
156
127
  format_row(true, &:header_cell)
157
128
  end
158
129
 
159
- # Public: Returns a String being an "ASCII" graphical representation of a horizontal
160
- # dividing line suitable for printing at any point in the table.
161
- #
162
- # Examples
130
+ # @return [String] an "ASCII" graphical representation of a horizontal
131
+ # dividing line suitable for printing at any point in the table.
163
132
  #
164
- # # To print a horizontal divider after every row:
133
+ # @example Print a horizontal divider after every row:
165
134
  # table.each do |row|
166
135
  # puts row
167
136
  # puts table.horizontal_rule
@@ -171,11 +140,11 @@ module Tabulo
171
140
  format_row(false, HORIZONTAL_RULE_CHARACTER, CORNER_CHARACTER, &:horizontal_rule)
172
141
  end
173
142
 
174
- # Internal
143
+ # @!visibility private
175
144
  def formatted_body_row(source, options = { with_header: false })
176
145
  inner = format_row { |column| column.body_cell(source) }
177
146
  if options[:with_header]
178
- join_lines([horizontal_rule, header_row, horizontal_rule, inner])
147
+ join_lines([horizontal_rule, formatted_header, horizontal_rule, inner])
179
148
  else
180
149
  inner
181
150
  end
@@ -183,12 +152,12 @@ module Tabulo
183
152
 
184
153
  private
185
154
 
186
- # Internal
155
+ # @!visibility private
187
156
  def body_row(source, options = { with_header: false })
188
157
  Row.new(self, source, options)
189
158
  end
190
159
 
191
- # Internal
160
+ # @!visibility private
192
161
  def format_row(header = false, padder = @padding_character, joiner = @joiner)
193
162
  # TODO Tidy this up -- or at least comment it.
194
163
  cell_stacks = @columns.map do |column|
@@ -219,12 +188,12 @@ module Tabulo
219
188
  join_lines(subrows.map { |subrow| "#{joiner}#{subrow.join(joiner)}#{joiner}" })
220
189
  end
221
190
 
222
- # Internal
191
+ # @!visibility private
223
192
  def join_lines(lines)
224
193
  lines.join($/) # join strings with cross-platform newline
225
194
  end
226
195
 
227
- # Internal
196
+ # @!visibility private
228
197
  def make_column(item, options = { })
229
198
  case item
230
199
  when Column
@@ -1,3 +1,3 @@
1
1
  module Tabulo
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  end
data/tabulo.gemspec CHANGED
@@ -28,4 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency "rspec", "~> 3.0"
29
29
  spec.add_development_dependency "simplecov"
30
30
  spec.add_development_dependency "coveralls"
31
+ spec.add_development_dependency "yard"
32
+ spec.add_development_dependency "yard-tomdoc"
31
33
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tabulo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Harvey
@@ -80,6 +80,34 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: yard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: yard-tomdoc
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  description: Enumerable ASCII table
84
112
  email:
85
113
  - software@matthewharvey.net