term_utils 0.3.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -2
  3. data/COPYING +3 -3
  4. data/README.md +51 -16
  5. data/Rakefile +6 -0
  6. data/doc/TermUtils/AP/Article.html +57 -55
  7. data/doc/TermUtils/AP/ArticleResult.html +584 -0
  8. data/doc/TermUtils/AP/Flag.html +295 -78
  9. data/doc/TermUtils/AP/Parameter.html +891 -103
  10. data/doc/TermUtils/AP/ParameterResult.html +980 -0
  11. data/doc/TermUtils/{FF/Cursor/Context.html → AP/ParameterWalkerHooks.html} +60 -60
  12. data/doc/TermUtils/AP/ParseError.html +651 -19
  13. data/doc/TermUtils/AP/Parser.html +181 -121
  14. data/doc/TermUtils/AP/Result.html +201 -528
  15. data/doc/TermUtils/AP/Syntax.html +103 -393
  16. data/doc/TermUtils/AP/SyntaxError.html +9 -91
  17. data/doc/TermUtils/AP/Walker.html +686 -0
  18. data/doc/TermUtils/AP.html +49 -160
  19. data/doc/TermUtils/FF/Config.html +203 -35
  20. data/doc/TermUtils/FF/Context.html +585 -0
  21. data/doc/TermUtils/FF/Entry.html +626 -0
  22. data/doc/TermUtils/FF/Finder.html +850 -0
  23. data/doc/TermUtils/FF/{Cursor.html → FinderEntry.html} +473 -211
  24. data/doc/TermUtils/FF/FinderQuery.html +946 -0
  25. data/doc/TermUtils/FF/Query.html +402 -70
  26. data/doc/TermUtils/FF.html +135 -11
  27. data/doc/TermUtils/PropertyTreeNode.html +304 -190
  28. data/doc/TermUtils/Tab/Column.html +98 -96
  29. data/doc/TermUtils/Tab/Header.html +30 -30
  30. data/doc/TermUtils/Tab/Holder.html +81 -81
  31. data/doc/TermUtils/Tab/Printer.html +43 -43
  32. data/doc/TermUtils/Tab/Table.html +124 -128
  33. data/doc/TermUtils/Tab/TableError.html +7 -89
  34. data/doc/TermUtils/Tab.html +93 -86
  35. data/doc/TermUtils.html +10 -10
  36. data/doc/_index.html +62 -42
  37. data/doc/class_list.html +3 -3
  38. data/doc/css/style.css +3 -2
  39. data/doc/file.README.html +63 -26
  40. data/doc/file_list.html +2 -2
  41. data/doc/frames.html +2 -2
  42. data/doc/index.html +63 -26
  43. data/doc/js/app.js +14 -3
  44. data/doc/method_list.html +708 -236
  45. data/doc/top-level-namespace.html +7 -7
  46. data/lib/term_utils/ap/article.rb +15 -9
  47. data/lib/term_utils/ap/flag.rb +37 -20
  48. data/lib/term_utils/ap/parameter.rb +88 -19
  49. data/lib/term_utils/ap/parser.rb +143 -116
  50. data/lib/term_utils/ap/result.rb +208 -161
  51. data/lib/term_utils/ap/syntax.rb +53 -69
  52. data/lib/term_utils/ap.rb +79 -24
  53. data/lib/term_utils/ff/config.rb +22 -10
  54. data/lib/term_utils/{ap/no_such_value_error.rb → ff/entry.rb} +26 -8
  55. data/lib/term_utils/ff/finder.rb +255 -0
  56. data/lib/term_utils/ff/query.rb +94 -17
  57. data/lib/term_utils/ff.rb +12 -2
  58. data/lib/term_utils/property_tree_node.rb +47 -19
  59. data/lib/term_utils/tab.rb +106 -61
  60. data/lib/term_utils.rb +8 -1
  61. data/term_utils.gemspec +4 -4
  62. metadata +18 -17
  63. data/doc/TermUtils/AP/Element.html +0 -1025
  64. data/doc/TermUtils/AP/Level.html +0 -638
  65. data/doc/TermUtils/AP/NoSuchValueError.html +0 -217
  66. data/lib/term_utils/ap/element.rb +0 -78
  67. data/lib/term_utils/ap/level.rb +0 -57
  68. data/lib/term_utils/ap/parse_error.rb +0 -27
  69. data/lib/term_utils/ap/syntax_error.rb +0 -27
  70. data/lib/term_utils/ff/cursor.rb +0 -153
@@ -1,4 +1,6 @@
1
- # Copyright (C) 2019 Thomas Baron
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2023 Thomas Baron
2
4
  #
3
5
  # This file is part of term_utils.
4
6
  #
@@ -13,60 +15,65 @@
13
15
  #
14
16
  # You should have received a copy of the GNU General Public License
15
17
  # along with term_utils. If not, see <https://www.gnu.org/licenses/>.
18
+
19
+ require 'stringio'
20
+
16
21
  module TermUtils
17
22
  # The tab module provides a way to print formatted tables.
18
23
  module Tab
19
24
  # Represents a table error.
20
25
  class TableError < StandardError
21
- def initialize(msg)
22
- super
23
- end
24
26
  end
27
+
25
28
  # Creates initial column properties.
26
29
  # @return [Hash] `:offset`, `:column_separator_width`.
27
30
  def self.init_table_props
28
- {:offset => 0, :column_separator_width => 2}
31
+ { offset: 0, column_separator_width: 2 }
29
32
  end
33
+
30
34
  # Creates initial column properties.
31
35
  # @return [Hash] `:width`, `:align`, `:fixed`, `:ellipsis`, `:format`.
32
36
  def self.init_column_props
33
- {:width => 8, :align => :left, :fixed => false, :ellipsis => "?", :format => nil}
37
+ { width: 8, align: :left, fixed: false, ellipsis: '?', format: nil }
34
38
  end
39
+
35
40
  # Assigns table properties.
36
41
  # @param target [Hash]
37
42
  # @param source [Hash] `:offset`, `:column_separator_width`.
38
43
  # @return [Hash]
39
44
  def self.assign_table_props(target, source)
40
- if (source.has_key? :offset) && (source[:offset].is_a? Integer) && (source[:offset] >= 0)
45
+ if (source.key? :offset) && (source[:offset].is_a? Integer) && (source[:offset] >= 0)
41
46
  target[:offset] = source[:offset]
42
47
  end
43
- if (source.has_key? :column_separator_width) && (source[:column_separator_width].is_a? Integer) && (source[:column_separator_width] > 0)
48
+ if (source.key? :column_separator_width) && (source[:column_separator_width].is_a? Integer) && source[:column_separator_width].positive?
44
49
  target[:column_separator_width] = source[:column_separator_width]
45
50
  end
46
51
  target
47
52
  end
53
+
48
54
  # Assigns column properties.
49
55
  # @param target [Hash]
50
56
  # @param source [Hash] `:width`, `:align`, `:fixed`, `:ellipsis`, `:format`.
51
57
  # @return [Hash]
52
58
  def self.assign_column_props(target, source)
53
- if (source.has_key? :width) && (source[:width].is_a? Integer) && (source[:width] > 0)
59
+ if (source.key? :width) && (source[:width].is_a? Integer) && source[:width].positive?
54
60
  target[:width] = source[:width]
55
61
  end
56
- if (source.has_key? :align) && %i[left right].index(source[:align])
62
+ if (source.key? :align) && %i[left right].index(source[:align])
57
63
  target[:align] = source[:align]
58
64
  end
59
- if (source.has_key? :fixed) && (!!source[:fixed] == source[:fixed])
65
+ if (source.key? :fixed) && (!!source[:fixed] == source[:fixed])
60
66
  target[:fixed] = source[:fixed]
61
67
  end
62
- if (source.has_key? :ellipsis) && (source[:ellipsis].is_a? String)
68
+ if (source.key? :ellipsis) && (source[:ellipsis].is_a? String)
63
69
  target[:ellipsis] = source[:ellipsis]
64
70
  end
65
- if (source.has_key? :format) && ((source[:ellipsis] == nil) || (source[:ellipsis].is_a? Proc) || (source[:ellipsis].is_a? String))
71
+ if (source.key? :format) && (source[:ellipsis].nil? || (source[:ellipsis].is_a? Proc) || (source[:ellipsis].is_a? String))
66
72
  target[:format] = source[:format]
67
73
  end
68
74
  target
69
75
  end
76
+
70
77
  # Aligns and cuts a given string.
71
78
  # @param src [String]
72
79
  # @param align [Symbol] `:left`, `:right`.
@@ -75,32 +82,31 @@ module TermUtils
75
82
  # @param ellipsis [String] The ellipsis when not fixed.
76
83
  # @return [String]
77
84
  def self.align_cut(src, align, fixed, width, ellipsis)
78
- res = src
79
85
  if align == :left
80
86
  # Align left
81
87
  if fixed && (src.length > width)
82
88
  if ellipsis.length >= width
83
- res = ellipsis[0..(width - 1)]
89
+ ellipsis[0..(width - 1)]
84
90
  else
85
- res = "%s%s" % [src[0..(width - (ellipsis.length + 1))], ellipsis]
91
+ format '%<value>s%<ellipsis>s', value: src[0..(width - (ellipsis.length + 1))], ellipsis: ellipsis
86
92
  end
87
93
  else
88
- res = "%-*s" % [width, src]
94
+ src.ljust(width)
89
95
  end
90
96
  elsif align == :right
91
97
  # Align right
92
98
  if fixed && (src.length > width)
93
99
  if ellipsis.length >= width
94
- res = ellipsis[0..(width - 1)]
100
+ ellipsis[0..(width - 1)]
95
101
  else
96
- res = "%s%s" % [ellipsis, src[(src.length - width + ellipsis.length)..(src.length - 1)]]
102
+ format '%<ellipsis>s%<value>s', ellipsis: ellipsis, value: src[(src.length - width + ellipsis.length)..(src.length - 1)]
97
103
  end
98
104
  else
99
- res = "%*s" % [width, src]
105
+ src.rjust(width)
100
106
  end
101
107
  end
102
- res
103
108
  end
109
+
104
110
  # Represents a table.
105
111
  class Table
106
112
  # @return [Symbol]
@@ -113,6 +119,7 @@ module TermUtils
113
119
  attr_accessor :column_defaults
114
120
  # @return [Array<Tab::Column>]
115
121
  attr_accessor :columns
122
+
116
123
  # @param opts [Hash]
117
124
  # @option opts [Symbol] :id
118
125
  # @option opts [Integer] :offset
@@ -122,18 +129,16 @@ module TermUtils
122
129
  @id = opts.fetch(:id, nil)
123
130
  @offset = opts.fetch(:offset)
124
131
  @column_separator_width = opts.fetch(:column_separator_width)
125
- if opts.has_key? :column_defaults
126
- @column_defaults = opts[:column_defaults].dup
127
- else
128
- @column_defaults = TermUtils::Tab.default_column_props
129
- end
132
+ @column_defaults = opts.key?(:column_defaults) ? opts[:column_defaults].dup : TermUtils::Tab.default_column_props
130
133
  @columns = []
131
134
  end
135
+
132
136
  # Returns the properties of this one.
133
137
  # @return [Hash]
134
138
  def props
135
- {:offset => @offset, :column_separator_width => @column_separator_width}
139
+ { offset: @offset, column_separator_width: @column_separator_width }
136
140
  end
141
+
137
142
  # Sets column default properties.
138
143
  # @param opts [Hash]
139
144
  # @option opts [Integer] :width
@@ -144,6 +149,7 @@ module TermUtils
144
149
  def set_column_defaults(opts = {})
145
150
  TermUtils::Tab.assign_column_props(@column_defaults, opts)
146
151
  end
152
+
147
153
  # Defines a column.
148
154
  # @param id [Symbol]
149
155
  # @param opts [Hash]
@@ -156,24 +162,26 @@ module TermUtils
156
162
  def define_column(id, opts = {}, &block)
157
163
  col = @columns.find { |c| c.id == id }
158
164
  if col
159
- block.call(col) if block
165
+ block&.call(col)
160
166
  col.validate
161
167
  else
162
168
  opts[:id] = id
163
169
  opts[:index] = @columns.length
164
170
  col = Column.new(@column_defaults.merge(opts))
165
- block.call(col) if block
171
+ block&.call(col)
166
172
  col.validate
167
173
  @columns << col
168
174
  end
169
175
  col
170
176
  end
177
+
171
178
  # Finds a column.
172
179
  # @param id [Symbol]
173
180
  # @return [Tab::Column, nil]
174
181
  def find_column(id)
175
182
  @columns.find { |c| c.id == id }
176
183
  end
184
+
177
185
  # Creates a new table printer.
178
186
  # @param io [#puts]
179
187
  # @param opts [Hash]
@@ -182,9 +190,10 @@ module TermUtils
182
190
  # @return [Tab::Printer]
183
191
  def printer(io, opts = {}, &block)
184
192
  ptr = Printer.new(self, io, props.merge(opts))
185
- block.call(ptr) if block
193
+ block&.call(ptr)
186
194
  ptr
187
195
  end
196
+
188
197
  # Prints a header row.
189
198
  # @param io [#puts]
190
199
  # @param values [Array<Object>, Hash<Symbol, Object>]
@@ -203,17 +212,19 @@ module TermUtils
203
212
  vals << values[col.id]
204
213
  end
205
214
  end
206
- raise TermUtils::Tab::TableError, "wrong values (not array)" unless vals.is_a? Array
215
+ raise TermUtils::Tab::TableError, 'wrong values (not array)' unless vals.is_a? Array
216
+
207
217
  offset = opts.fetch(:offset)
208
218
  column_separator_width = opts.fetch(:column_separator_width)
209
219
  sb = StringIO.new
210
- sb << " " * offset if offset > 0
220
+ sb << (' ' * offset) if offset.positive?
211
221
  @columns.each do |col|
212
- sb << " " * column_separator_width if col.index > 0
222
+ sb << (' ' * column_separator_width) if col.index.positive?
213
223
  sb << col.render_header(vals[col.index])
214
224
  end
215
225
  io.puts sb.string
216
226
  end
227
+
217
228
  # Prints a data row.
218
229
  # @param io [#puts]
219
230
  # @param values [Array<Object>, Hash<Symbol, Object>]
@@ -230,17 +241,19 @@ module TermUtils
230
241
  vals << values[col.id]
231
242
  end
232
243
  end
233
- raise TermUtils::Tab::TableError, "wrong values (not array)" unless vals.is_a? Array
244
+ raise TermUtils::Tab::TableError, 'wrong values (not array)' unless vals.is_a? Array
245
+
234
246
  offset = opts.fetch(:offset)
235
247
  column_separator_width = opts.fetch(:column_separator_width)
236
248
  sb = StringIO.new
237
- sb << " " * offset if offset > 0
249
+ sb << (' ' * offset) if offset.positive?
238
250
  @columns.each do |col|
239
- sb << " " * column_separator_width if col.index > 0
251
+ sb << (' ' * column_separator_width) if col.index.positive?
240
252
  sb << col.render_data(vals[col.index])
241
253
  end
242
254
  io.puts sb.string
243
255
  end
256
+
244
257
  # Prints a separator row.
245
258
  # @param io [#puts]
246
259
  # @param opts [Hash]
@@ -251,13 +264,14 @@ module TermUtils
251
264
  offset = opts.fetch(:offset)
252
265
  column_separator_width = opts.fetch(:column_separator_width)
253
266
  sb = StringIO.new
254
- sb << " " * offset if offset > 0
267
+ sb << (' ' * offset) if offset.positive?
255
268
  @columns.each do |col|
256
- sb << " " * column_separator_width if col.index > 0
257
- sb << "-" * col.width
269
+ sb << (' ' * column_separator_width) if col.index.positive?
270
+ sb << ('-' * col.width)
258
271
  end
259
272
  io.puts sb.string
260
273
  end
274
+
261
275
  # Returns column titles.
262
276
  # @return [Hash<Symbol, String>]
263
277
  def titles
@@ -268,6 +282,7 @@ module TermUtils
268
282
  h
269
283
  end
270
284
  end
285
+
271
286
  # Represents a table column.
272
287
  class Column
273
288
  # @return [Symbol]
@@ -286,6 +301,7 @@ module TermUtils
286
301
  attr_accessor :format
287
302
  # @return [TermUtils::Tab::Header]
288
303
  attr_accessor :header
304
+
289
305
  # @param opts [Hash]
290
306
  # @option opts [Symbol] :id
291
307
  # @option opts [Integer] :index
@@ -300,31 +316,35 @@ module TermUtils
300
316
  @width = opts.fetch(:width, 8)
301
317
  @align = opts.fetch(:align, :left)
302
318
  @fixed = opts.fetch(:fixed, false)
303
- @ellipsis = opts.fetch(:ellipsis, "?")
319
+ @ellipsis = opts.fetch(:ellipsis, '?')
304
320
  @format = opts.fetch(:format, nil)
305
- @header = TermUtils::Tab::Header.new(:title => @id.to_s, :align => @align)
321
+ @header = TermUtils::Tab::Header.new(title: @id.to_s, align: @align)
306
322
  end
323
+
307
324
  # Validates the column represented by this one.
308
325
  # @return [nil]
309
326
  # @raise [TermUtils::Tab::TableError]
310
327
  def validate
311
- raise TermUtils::Tab::TableError, "missing column id (nil)" if @id.nil?
312
- raise TermUtils::Tab::TableError, "missing column index (nil)" if @index.nil?
313
- raise TermUtils::Tab::TableError, "wrong column index (not integer)" unless @index.is_a? Integer
314
- raise TermUtils::Tab::TableError, "wrong column index (not >= 0)" if @index < 0
315
- raise TermUtils::Tab::TableError, "missing column width (nil)" if @width.nil?
316
- raise TermUtils::Tab::TableError, "wrong column width (not integer)" unless @width.is_a? Integer
317
- raise TermUtils::Tab::TableError, "wrong column width (not > 0)" if @width <= 0
318
- raise TermUtils::Tab::TableError, "wrong column align (not :left or :right)" unless %i[left right].index(@align)
328
+ raise TermUtils::Tab::TableError, 'missing column id (nil)' if @id.nil?
329
+ raise TermUtils::Tab::TableError, 'missing column index (nil)' if @index.nil?
330
+ raise TermUtils::Tab::TableError, 'wrong column index (not integer)' unless @index.is_a? Integer
331
+ raise TermUtils::Tab::TableError, 'wrong column index (not >= 0)' if @index.negative?
332
+ raise TermUtils::Tab::TableError, 'missing column width (nil)' if @width.nil?
333
+ raise TermUtils::Tab::TableError, 'wrong column width (not integer)' unless @width.is_a? Integer
334
+ raise TermUtils::Tab::TableError, 'wrong column width (not > 0)' if @width <= 0
335
+ raise TermUtils::Tab::TableError, 'wrong column align (not :left or :right)' unless %i[left right].index(@align)
336
+
319
337
  @header.validate
320
338
  end
339
+
321
340
  # Renders a given header.
322
341
  # @param val [Object]
323
342
  # return [String]
324
343
  def render_header(val)
325
- src = (val.is_a? String) ? val : val.to_s
344
+ src = val.is_a?(String) ? val : val.to_s
326
345
  TermUtils::Tab.align_cut(src, @header.align, @fixed, @width, @ellipsis)
327
346
  end
347
+
328
348
  # Renders a given value.
329
349
  # @param val [Object]
330
350
  # return [String]
@@ -337,16 +357,18 @@ module TermUtils
337
357
  src = @format % val
338
358
  end
339
359
  end
340
- src = (src.is_a? String) ? src : src.to_s
360
+ src = src.to_s unless src.is_a?(String)
341
361
  TermUtils::Tab.align_cut(src, @align, @fixed, @width, @ellipsis)
342
362
  end
343
363
  end
364
+
344
365
  # Represents a column header.
345
366
  class Header
346
367
  # @return [String]
347
368
  attr_accessor :title
348
369
  # @return [Symbol] `:left`, `:right`.
349
370
  attr_accessor :align
371
+
350
372
  # Constructs a new Header.
351
373
  # @param opts [Hash]
352
374
  # @option opts [String] :title
@@ -355,14 +377,16 @@ module TermUtils
355
377
  @title = opts.fetch(:title)
356
378
  @align = opts.fetch(:align, :left)
357
379
  end
380
+
358
381
  # Validates the column represented by this one.
359
382
  # @return [nil]
360
383
  # @raise [TermUtils::Tab::TableError]
361
384
  def validate
362
- raise TermUtils::Tab::TableError, "missing header title (nil)" if @title.nil?
363
- raise TermUtils::Tab::TableError, "wrong header align (not :left or :right)" unless %i[left right].index(@align)
385
+ raise TermUtils::Tab::TableError, 'missing header title (nil)' if @title.nil?
386
+ raise TermUtils::Tab::TableError, 'wrong header align (not :left or :right)' unless %i[left right].index(@align)
364
387
  end
365
388
  end
389
+
366
390
  # Represents a table printer.
367
391
  class Printer
368
392
  # @return [Tab::Table]
@@ -371,6 +395,7 @@ module TermUtils
371
395
  attr_accessor :io
372
396
  # @return [Hash]
373
397
  attr_accessor :options
398
+
374
399
  # @param table [Tab::Table]
375
400
  # @param io [IO]
376
401
  # @param options [Hash]
@@ -379,10 +404,12 @@ module TermUtils
379
404
  @io = io
380
405
  @options = options
381
406
  end
407
+
382
408
  # Prints an empty line.
383
409
  def line
384
- @io.puts ""
410
+ @io.puts
385
411
  end
412
+
386
413
  # Prints a header row.
387
414
  # @param values [Array<Object>, Hash<Symbol, Object>]
388
415
  # @param opts [Hash]
@@ -392,6 +419,7 @@ module TermUtils
392
419
  def header(values = nil, opts = nil)
393
420
  @table.print_header(@io, values, opts ? @options.merge(opts) : @options)
394
421
  end
422
+
395
423
  # Prints a data row.
396
424
  # @param values [Array<Object>, Hash<Symbol, Object>]
397
425
  # @param opts [Hash]
@@ -401,6 +429,7 @@ module TermUtils
401
429
  def data(values, opts = nil)
402
430
  @table.print_data(@io, values, opts ? @options.merge(opts) : @options)
403
431
  end
432
+
404
433
  # Prints a separator.
405
434
  # @param opts [Hash]
406
435
  # @option opts [Integer] :offset
@@ -410,7 +439,8 @@ module TermUtils
410
439
  @table.print_separator(@io, opts ? @options.merge(opts) : @options)
411
440
  end
412
441
  end
413
- # Represents a holder of tables.
442
+
443
+ # Represents a Holder of Table(s).
414
444
  class Holder
415
445
  # @return [Hash] `:offset`, `:column_separator_width`.
416
446
  attr_accessor :table_defaults
@@ -418,11 +448,14 @@ module TermUtils
418
448
  attr_accessor :column_defaults
419
449
  # @return [Hash<Symbol, Tab::Table>]
420
450
  attr_accessor :tables
421
- def initialize(opts = {})
451
+
452
+ # Creates a new Holder.
453
+ def initialize
422
454
  @table_defaults = TermUtils::Tab.init_table_props
423
455
  @column_defaults = TermUtils::Tab.init_column_props
424
456
  @tables = {}
425
457
  end
458
+
426
459
  # Sets table default properties.
427
460
  # @param opts [Hash]
428
461
  # @option opts [Integer] :offset
@@ -430,6 +463,7 @@ module TermUtils
430
463
  def set_table_defaults(opts = {})
431
464
  TermUtils::Tab.assign_table_props(@table_defaults, opts)
432
465
  end
466
+
433
467
  # Sets column default properties.
434
468
  # @param opts [Hash]
435
469
  # @option opts [Integer] :width
@@ -440,6 +474,7 @@ module TermUtils
440
474
  def set_column_defaults(opts = {})
441
475
  TermUtils::Tab.assign_column_props(@column_defaults, opts)
442
476
  end
477
+
443
478
  # Creates a new table, using default properties, without registering it.
444
479
  # @param opts [Hash]
445
480
  # @return [Tab::Table]
@@ -448,33 +483,36 @@ module TermUtils
448
483
  opts[:column_separator_width] = @table_defaults.fetch(:column_separator_width)
449
484
  opts[:column_defaults] = @column_defaults.dup
450
485
  new_tab = Table.new(opts)
451
- block.call(new_tab) if block
486
+ block&.call(new_tab)
452
487
  new_tab
453
488
  end
489
+
454
490
  # Defines a table, using default properties.
455
491
  # @param id [Symbol]
456
492
  # @param opts [Hash]
457
493
  # @return [Tab::Table]
458
494
  def define_table(id, opts = {}, &block)
459
- if @tables.has_key? id
460
- block.call(@tables[id]) if block
495
+ if @tables.key? id
496
+ block&.call(@tables[id])
461
497
  else
462
498
  opts[:id] = id
463
499
  opts[:offset] = @table_defaults.fetch(:offset)
464
500
  opts[:column_separator_width] = @table_defaults.fetch(:column_separator_width)
465
501
  opts[:column_defaults] = @column_defaults.dup
466
502
  new_tab = Table.new(opts)
467
- block.call(new_tab) if block
503
+ block&.call(new_tab)
468
504
  @tables[id] = new_tab
469
505
  end
470
506
  @tables[id]
471
507
  end
508
+
472
509
  # Finds a table.
473
510
  # @param id [Symbol]
474
511
  # @return [Tab::Table, nil]
475
512
  def find_table(id)
476
513
  @tables[id]
477
514
  end
515
+
478
516
  # Creates a new table printer.
479
517
  # @param id [Symbol]
480
518
  # @param io [IO]
@@ -486,7 +524,9 @@ module TermUtils
486
524
  find_table(id).printer(io, opts, &block)
487
525
  end
488
526
  end
489
- @@default_holder = Holder.new
527
+
528
+ @@default_holder = Holder.new # rubocop:disable Style/ClassVars
529
+
490
530
  # Sets table default properties.
491
531
  # @param opts [Hash]
492
532
  # @option opts [Integer] :offset
@@ -494,6 +534,7 @@ module TermUtils
494
534
  def self.set_table_defaults(opts = {})
495
535
  @@default_holder.set_table_defaults(opts)
496
536
  end
537
+
497
538
  # Sets column default properties.
498
539
  # @param opts [Hash]
499
540
  # @option opts [Integer] :width
@@ -504,12 +545,14 @@ module TermUtils
504
545
  def self.set_column_defaults(opts = {})
505
546
  @@default_holder.set_column_defaults(opts)
506
547
  end
548
+
507
549
  # Creates a new Table, using default properties, without registering it.
508
550
  # @param opts [Hash]
509
551
  # @return [Tab::Table]
510
552
  def self.create_table(opts = {}, &block)
511
553
  @@default_holder.create_table(opts, &block)
512
554
  end
555
+
513
556
  # Defines a new Table, using default properties, and registers it.
514
557
  # @param id [Symbol]
515
558
  # @param opts [Hash]
@@ -517,12 +560,14 @@ module TermUtils
517
560
  def self.define_table(id, opts = {}, &block)
518
561
  @@default_holder.define_table(id, opts, &block)
519
562
  end
563
+
520
564
  # Finds a registered table.
521
565
  # @param id [Symbol]
522
566
  # @return [Tab::Table, nil]
523
567
  def self.find_table(id)
524
568
  @@default_holder.find_table(id)
525
569
  end
570
+
526
571
  # Creates a new Printer for a registered Table.
527
572
  # @param id [Symbol]
528
573
  # @param io [IO]
data/lib/term_utils.rb CHANGED
@@ -1,4 +1,6 @@
1
- # Copyright (C) 2019 Thomas Baron
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2023 Thomas Baron
2
4
  #
3
5
  # This file is part of term_utils.
4
6
  #
@@ -13,6 +15,11 @@
13
15
  #
14
16
  # You should have received a copy of the GNU General Public License
15
17
  # along with term_utils. If not, see <https://www.gnu.org/licenses/>.
18
+
19
+ # Utilities for terminal application.
20
+ module TermUtils
21
+ end
22
+
16
23
  require 'term_utils/ap'
17
24
  require 'term_utils/ff'
18
25
  require 'term_utils/tab'
data/term_utils.gemspec CHANGED
@@ -1,10 +1,10 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "term_utils"
3
- s.version = "0.3.2"
4
- s.date = "2020-02-07"
5
- s.summary = "Terminal utilities."
3
+ s.version = "0.5.0"
4
+ s.date = "2023-08-09"
5
+ s.summary = "Utilities for terminal application."
6
6
  s.description = <<-EOS
7
- Provides terminal utilities like table formatting.
7
+ Utilities for terminal application like argument parsing, table formatting and file finding.
8
8
  EOS
9
9
  s.authors = ["Thomas Baron"]
10
10
  s.email = "tvbaron at gmail dot com"
metadata CHANGED
@@ -1,18 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: term_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Baron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-07 00:00:00.000000000 Z
11
+ date: 2023-08-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: 'Provides terminal utilities like table formatting.
13
+ description: 'Utilities for terminal application like argument parsing, table formatting
14
+ and file finding.
14
15
 
15
- '
16
+ '
16
17
  email: tvbaron at gmail dot com
17
18
  executables: []
18
19
  extensions: []
@@ -26,20 +27,24 @@ files:
26
27
  - doc/TermUtils.html
27
28
  - doc/TermUtils/AP.html
28
29
  - doc/TermUtils/AP/Article.html
29
- - doc/TermUtils/AP/Element.html
30
+ - doc/TermUtils/AP/ArticleResult.html
30
31
  - doc/TermUtils/AP/Flag.html
31
- - doc/TermUtils/AP/Level.html
32
- - doc/TermUtils/AP/NoSuchValueError.html
33
32
  - doc/TermUtils/AP/Parameter.html
33
+ - doc/TermUtils/AP/ParameterResult.html
34
+ - doc/TermUtils/AP/ParameterWalkerHooks.html
34
35
  - doc/TermUtils/AP/ParseError.html
35
36
  - doc/TermUtils/AP/Parser.html
36
37
  - doc/TermUtils/AP/Result.html
37
38
  - doc/TermUtils/AP/Syntax.html
38
39
  - doc/TermUtils/AP/SyntaxError.html
40
+ - doc/TermUtils/AP/Walker.html
39
41
  - doc/TermUtils/FF.html
40
42
  - doc/TermUtils/FF/Config.html
41
- - doc/TermUtils/FF/Cursor.html
42
- - doc/TermUtils/FF/Cursor/Context.html
43
+ - doc/TermUtils/FF/Context.html
44
+ - doc/TermUtils/FF/Entry.html
45
+ - doc/TermUtils/FF/Finder.html
46
+ - doc/TermUtils/FF/FinderEntry.html
47
+ - doc/TermUtils/FF/FinderQuery.html
43
48
  - doc/TermUtils/FF/Query.html
44
49
  - doc/TermUtils/PropertyTreeNode.html
45
50
  - doc/TermUtils/Tab.html
@@ -66,19 +71,15 @@ files:
66
71
  - lib/term_utils.rb
67
72
  - lib/term_utils/ap.rb
68
73
  - lib/term_utils/ap/article.rb
69
- - lib/term_utils/ap/element.rb
70
74
  - lib/term_utils/ap/flag.rb
71
- - lib/term_utils/ap/level.rb
72
- - lib/term_utils/ap/no_such_value_error.rb
73
75
  - lib/term_utils/ap/parameter.rb
74
- - lib/term_utils/ap/parse_error.rb
75
76
  - lib/term_utils/ap/parser.rb
76
77
  - lib/term_utils/ap/result.rb
77
78
  - lib/term_utils/ap/syntax.rb
78
- - lib/term_utils/ap/syntax_error.rb
79
79
  - lib/term_utils/ff.rb
80
80
  - lib/term_utils/ff/config.rb
81
- - lib/term_utils/ff/cursor.rb
81
+ - lib/term_utils/ff/entry.rb
82
+ - lib/term_utils/ff/finder.rb
82
83
  - lib/term_utils/ff/query.rb
83
84
  - lib/term_utils/property_tree_node.rb
84
85
  - lib/term_utils/tab.rb
@@ -103,8 +104,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
104
  - !ruby/object:Gem::Version
104
105
  version: '0'
105
106
  requirements: []
106
- rubygems_version: 3.0.3
107
+ rubygems_version: 3.4.18
107
108
  signing_key:
108
109
  specification_version: 4
109
- summary: Terminal utilities.
110
+ summary: Utilities for terminal application.
110
111
  test_files: []