tty 0.0.9 → 0.0.10
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.
- data/.rspec +2 -1
- data/.travis.yml +3 -6
- data/README.md +232 -134
- data/lib/tty/plugins/plugin.rb +56 -0
- data/lib/tty/plugins.rb +75 -0
- data/lib/tty/shell/suggestion.rb +102 -0
- data/lib/tty/shell.rb +41 -14
- data/lib/tty/system/editor.rb +111 -0
- data/lib/tty/system/which.rb +13 -1
- data/lib/tty/system.rb +44 -28
- data/lib/tty/table/border/null.rb +0 -9
- data/lib/tty/table/border/row_line.rb +21 -0
- data/lib/tty/table/border.rb +63 -32
- data/lib/tty/table/border_dsl.rb +1 -1
- data/lib/tty/table/column_set.rb +16 -17
- data/lib/tty/table/field.rb +27 -7
- data/lib/tty/table/header.rb +18 -9
- data/lib/tty/table/operation/alignment_set.rb +20 -25
- data/lib/tty/table/operation/escape.rb +30 -0
- data/lib/tty/table/operation/filter.rb +36 -0
- data/lib/tty/table/operation/truncation.rb +22 -11
- data/lib/tty/table/operation/wrapped.rb +21 -10
- data/lib/tty/table/operations.rb +10 -8
- data/lib/tty/table/orientation/horizontal.rb +1 -1
- data/lib/tty/table/renderer/ascii.rb +3 -3
- data/lib/tty/table/renderer/basic.rb +135 -65
- data/lib/tty/table/renderer/color.rb +1 -4
- data/lib/tty/table/renderer/unicode.rb +3 -3
- data/lib/tty/table/renderer.rb +48 -61
- data/lib/tty/table/row.rb +30 -3
- data/lib/tty/table/transformation.rb +38 -0
- data/lib/tty/table/validatable.rb +7 -5
- data/lib/tty/table.rb +78 -99
- data/lib/tty/terminal/color.rb +2 -2
- data/lib/tty/terminal/echo.rb +1 -1
- data/lib/tty/terminal/pager/basic.rb +52 -0
- data/lib/tty/terminal/pager/system.rb +39 -0
- data/lib/tty/terminal/pager.rb +95 -0
- data/lib/tty/terminal.rb +30 -1
- data/lib/tty/version.rb +1 -1
- data/lib/tty.rb +41 -1
- data/spec/spec_helper.rb +20 -0
- data/spec/tty/plugins/find_spec.rb +28 -0
- data/spec/tty/plugins/load_spec.rb +20 -0
- data/spec/tty/plugins/plugin/load_spec.rb +30 -0
- data/spec/tty/plugins/plugin/new_spec.rb +18 -0
- data/spec/tty/shell/suggest_spec.rb +50 -0
- data/spec/tty/support/conversion_spec.rb +3 -3
- data/spec/tty/support/delegatable_spec.rb +1 -1
- data/spec/tty/support/equatable_spec.rb +6 -9
- data/spec/tty/system/editor/available_spec.rb +40 -0
- data/spec/tty/system/editor/build_spec.rb +40 -0
- data/spec/tty/system/editor/command_spec.rb +16 -0
- data/spec/tty/system/editor/executables_spec.rb +13 -0
- data/spec/tty/system/editor/invoke_spec.rb +38 -0
- data/spec/tty/system/editor/open_spec.rb +27 -0
- data/spec/tty/system/platform_spec.rb +4 -6
- data/spec/tty/system/which/which_spec.rb +48 -0
- data/spec/tty/system/which_spec.rb +8 -34
- data/spec/tty/table/border/ascii/rendering_spec.rb +19 -5
- data/spec/tty/table/border/new_spec.rb +1 -1
- data/spec/tty/table/border/null/rendering_spec.rb +24 -8
- data/spec/tty/table/border/unicode/rendering_spec.rb +19 -5
- data/spec/tty/table/column_set/extract_widths_spec.rb +4 -15
- data/spec/tty/table/column_set/total_width_spec.rb +15 -0
- data/spec/tty/table/data_spec.rb +14 -0
- data/spec/tty/table/each_spec.rb +17 -4
- data/spec/tty/table/each_with_index_spec.rb +34 -6
- data/spec/tty/table/field/length_spec.rb +21 -0
- data/spec/tty/table/field/lines_spec.rb +21 -0
- data/spec/tty/table/filter_spec.rb +23 -0
- data/spec/tty/table/header/call_spec.rb +1 -1
- data/spec/tty/table/header/height_spec.rb +27 -0
- data/spec/tty/table/initialize_spec.rb +6 -6
- data/spec/tty/table/operation/alignment_set/call_spec.rb +39 -0
- data/spec/tty/table/operation/escape/call_spec.rb +16 -0
- data/spec/tty/table/operation/filter/call_spec.rb +17 -0
- data/spec/tty/table/operation/truncation/call_spec.rb +15 -10
- data/spec/tty/table/operation/truncation/truncate_spec.rb +1 -1
- data/spec/tty/table/operation/wrapped/call_spec.rb +15 -10
- data/spec/tty/table/operation/wrapped/wrap_spec.rb +1 -1
- data/spec/tty/table/operations/new_spec.rb +4 -4
- data/spec/tty/table/options_spec.rb +0 -28
- data/spec/tty/table/orientation_spec.rb +5 -6
- data/spec/tty/table/properties_spec.rb +1 -4
- data/spec/tty/table/render_spec.rb +57 -0
- data/spec/tty/table/{renders_with_spec.rb → render_with_spec.rb} +29 -10
- data/spec/tty/table/renderer/ascii/render_spec.rb +68 -0
- data/spec/tty/table/renderer/ascii/separator_spec.rb +28 -0
- data/spec/tty/table/renderer/basic/alignment_spec.rb +18 -16
- data/spec/tty/table/renderer/basic/extract_column_widths_spec.rb +17 -12
- data/spec/tty/table/renderer/basic/filter_spec.rb +53 -0
- data/spec/tty/table/renderer/basic/multiline_content_spec.rb +135 -0
- data/spec/tty/table/renderer/basic/new_spec.rb +13 -2
- data/spec/tty/table/renderer/basic/options_spec.rb +48 -0
- data/spec/tty/table/renderer/basic/render_spec.rb +19 -121
- data/spec/tty/table/renderer/basic/separator_spec.rb +14 -48
- data/spec/tty/table/renderer/basic/truncation_spec.rb +35 -0
- data/spec/tty/table/renderer/basic/wrapping_spec.rb +40 -0
- data/spec/tty/table/{border_spec.rb → renderer/border_spec.rb} +17 -20
- data/spec/tty/table/renderer/select_spec.rb +22 -0
- data/spec/tty/table/{border → renderer}/style_spec.rb +13 -14
- data/spec/tty/table/renderer/unicode/render_spec.rb +68 -0
- data/spec/tty/table/renderer/unicode/separator_spec.rb +26 -0
- data/spec/tty/table/rotate_spec.rb +2 -3
- data/spec/tty/table/row/call_spec.rb +1 -1
- data/spec/tty/table/row/each_spec.rb +31 -0
- data/spec/tty/table/row/height_spec.rb +27 -0
- data/spec/tty/table/to_s_spec.rb +3 -3
- data/spec/tty/table/transformation/extract_tuples_spec.rb +35 -0
- data/spec/tty/table/validatable/validate_options_spec.rb +1 -2
- data/spec/tty/terminal/home_spec.rb +3 -3
- data/spec/tty/terminal/page_spec.rb +13 -0
- data/spec/tty/terminal/pager/available_spec.rb +40 -0
- data/spec/tty/terminal/pager/basic/page_spec.rb +54 -0
- data/spec/tty/terminal/pager/command_spec.rb +16 -0
- data/spec/tty/terminal/pager/executables_spec.rb +13 -0
- data/spec/tty/terminal/pager/page_spec.rb +47 -0
- data/spec/tty/terminal/pager/system/page_spec.rb +29 -0
- data/spec/tty/text/distance/distance_spec.rb +12 -0
- data/tty.gemspec +7 -3
- metadata +160 -27
- data/spec/tty/table/operation/alignment_set/align_rows_spec.rb +0 -53
- data/spec/tty/table/renderer/pick_renderer_spec.rb +0 -25
- data/spec/tty/table/renderer_spec.rb +0 -49
data/.rspec
CHANGED
data/.travis.yml
CHANGED
@@ -2,18 +2,15 @@ language: ruby
|
|
2
2
|
before_install:
|
3
3
|
- gem install bundler
|
4
4
|
rvm:
|
5
|
-
- 1.8.7
|
6
|
-
- 1.9.2
|
7
5
|
- 1.9.3
|
6
|
+
- 2.0.0
|
8
7
|
- ruby-head
|
9
|
-
- jruby-18mode
|
10
8
|
- jruby-19mode
|
11
|
-
- rbx-18mode
|
12
9
|
- rbx-19mode
|
13
|
-
- ree
|
14
10
|
- jruby-head
|
11
|
+
- rbx-head
|
15
12
|
matrix:
|
16
13
|
allow_failures:
|
17
14
|
- rvm: ruby-head
|
18
15
|
- rvm: jruby-head
|
19
|
-
- rvm: rbx-
|
16
|
+
- rvm: rbx-head
|
data/README.md
CHANGED
@@ -2,10 +2,12 @@
|
|
2
2
|
[][gem]
|
3
3
|
[][travis]
|
4
4
|
[][codeclimate]
|
5
|
+
[][coveralls]
|
5
6
|
|
6
7
|
[gem]: http://badge.fury.io/rb/tty
|
7
8
|
[travis]: http://travis-ci.org/peter-murach/tty
|
8
9
|
[codeclimate]: https://codeclimate.com/github/peter-murach/tty
|
10
|
+
[coveralls]: https://coveralls.io/r/peter-murach/tty
|
9
11
|
|
10
12
|
Toolbox for developing CLI clients in Ruby. This library provides a fluid interface for working with terminals.
|
11
13
|
|
@@ -13,9 +15,9 @@ Toolbox for developing CLI clients in Ruby. This library provides a fluid interf
|
|
13
15
|
|
14
16
|
Jump-start development of your command line app:
|
15
17
|
|
16
|
-
* Table rendering with an easy-to-use API
|
17
|
-
* Terminal output colorization.
|
18
|
-
*
|
18
|
+
* Table rendering with an easy-to-use API. [status: In Progress]
|
19
|
+
* Terminal output colorization, paging. [status: ✔ ]
|
20
|
+
* System & command detection utilities. [status: In Progress]
|
19
21
|
* Text manipulation(wrapping/truncation) [status: In Progress]
|
20
22
|
* Shell user interface. [status: In Progress]
|
21
23
|
* File diffs. [status: TODO]
|
@@ -47,75 +49,112 @@ Or install it yourself as:
|
|
47
49
|
To instantiate table pass 2-dimensional array:
|
48
50
|
|
49
51
|
```ruby
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
table = TTY::Table[['a1', 'a2'], ['b1', 'b2']]
|
53
|
+
table = TTY::Table.new [['a1', 'a2'], ['b1', 'b2']]
|
54
|
+
table = TTY::Table.new rows: [['a1', 'a2'], ['b1', 'b2']]
|
55
|
+
table = TTY::Table.new ['h1', 'h2'], [['a1', 'a2'], ['b1', 'b2']]
|
56
|
+
table = TTY::Table.new header: ['h1', 'h2'], rows: [['a1', 'a2'], ['b1', 'b2']]
|
55
57
|
```
|
56
58
|
|
57
59
|
or cross header with rows inside a hash like so
|
58
60
|
|
59
61
|
```ruby
|
60
|
-
|
62
|
+
table = TTY::Table.new [{'h1' => ['a1', 'a2'], 'h2' => ['b1', 'b2']}]
|
61
63
|
```
|
62
64
|
|
63
|
-
|
65
|
+
Table behaves like an Array so `<<`, `each` and familiar methods can be used
|
64
66
|
|
65
67
|
```ruby
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
68
|
+
table << ['a1', 'a2', 'a3']
|
69
|
+
table << ['b1', 'b2', 'b3']
|
70
|
+
table << ['a1', 'a2'] << ['b1', 'b2'] # chain rows assignment
|
71
|
+
|
72
|
+
table.each { |row| ... } # iterate over rows
|
73
|
+
table.each_with_index # iterate over each element with row and column index
|
74
|
+
table[i, j] # return element at row(i) and column(j)
|
75
|
+
table.row(i) { ... } # return array for row(i)
|
76
|
+
table.column(j) { ... } # return array for column(j)
|
77
|
+
table.column(name) # return array for column(name), name of header
|
78
|
+
table.row_size # return row size
|
79
|
+
table.column_size # return column size
|
80
|
+
table.size # return an array of [row_size, column_size]
|
81
|
+
table.border # specify border properties
|
72
82
|
```
|
73
83
|
|
74
|
-
|
84
|
+
or pass your rows in a block
|
75
85
|
|
76
86
|
```ruby
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
table.each { |row| ... } # iterate over rows
|
82
|
-
table.each_with_index # iterate over each element with row and column index
|
83
|
-
table[i, j] # return element at row(i) and column(j)
|
84
|
-
table.row(i) { ... } # return array for row(i)
|
85
|
-
table.column(j) { ... } # return array for column(j)
|
86
|
-
table.column(name) # return array for column(name), name of header
|
87
|
-
table.row_size # return row size
|
88
|
-
table.column_size # return column size
|
89
|
-
table.size # return an array of [row_size, column_size]
|
90
|
-
table.border # specify border properties
|
87
|
+
table = TTY::Table.new do |t|
|
88
|
+
t << ['a1', 'a2', 'a3']
|
89
|
+
t << ['b1', 'b2', 'b3']
|
90
|
+
end
|
91
91
|
```
|
92
92
|
|
93
|
-
|
93
|
+
#### Rendering
|
94
|
+
|
95
|
+
Once you have an instance of `TTY::Table` you can print it out to the stdout by doing:
|
94
96
|
|
95
97
|
```ruby
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
98
|
+
table.to_s
|
99
|
+
|
100
|
+
a1 a2 a3
|
101
|
+
b1 b2 b3
|
100
102
|
```
|
101
103
|
|
102
|
-
|
104
|
+
This will use so called `basic` renderer with default options.
|
105
|
+
|
106
|
+
However, you can include other customization options such as
|
103
107
|
|
104
108
|
```ruby
|
105
|
-
|
109
|
+
column_widths # array of maximum columns widths
|
110
|
+
column_aligns # array of cell alignments out of :left, :center and :right, default :left
|
111
|
+
width # constrain the table total width, otherwise dynamically calculated based on content and terminal size
|
112
|
+
renderer # enforce display type out of :basic, :color, :unicode, :ascii
|
113
|
+
border # hash of border properties out of :characters, :style, :separator keys
|
114
|
+
border_class # a type of border to use
|
115
|
+
multiline # if true will wrap text at new line or column width, when false will escape special characters
|
116
|
+
filter # a proc object that is applied to every field in a row
|
117
|
+
orientation # either :horizontal or :vertical
|
118
|
+
```
|
119
|
+
|
120
|
+
#### Multiline
|
121
|
+
|
122
|
+
Renderer options may include `multiline` parameter. The `true` value will cause the table fields wrap at their natural line breaks or in case when the column widths are set the content will wrap.
|
106
123
|
|
107
|
-
|
108
|
-
|
124
|
+
```
|
125
|
+
table = TTY::Table.new [ ["First", '1'], ["Multi\nLine\nContent", '2'], ["Third", '3']]
|
126
|
+
table.render :ascii, multiline: true
|
127
|
+
# =>
|
128
|
+
+-------+-+
|
129
|
+
|First |1|
|
130
|
+
|Multi |2|
|
131
|
+
|Line | |
|
132
|
+
|Content| |
|
133
|
+
|Third |3|
|
134
|
+
+-------+-+
|
135
|
+
```
|
136
|
+
|
137
|
+
When the `false` option is specified all the special characters will be escaped and if the column widths are set the content will be truncated like so
|
138
|
+
|
139
|
+
```ruby
|
140
|
+
table = TTY::Table.new [ ["First", '1'], ["Multiline\nContent", '2'], ["Third", '3']]
|
141
|
+
table.render :ascii, multiline: false
|
142
|
+
# =>
|
143
|
+
+------------------+-+
|
144
|
+
|First |1|
|
145
|
+
|Multiline\nContent|2|
|
146
|
+
|Third |3|
|
147
|
+
+------------------+-+
|
109
148
|
```
|
110
149
|
|
111
150
|
#### Border
|
112
151
|
|
113
152
|
To print border around data table you need to specify `renderer` type out of `basic`, `ascii`, `unicode`. By default `basic` is used. For instance, to output unicode border:
|
114
153
|
|
115
|
-
```
|
116
|
-
|
117
|
-
|
118
|
-
|
154
|
+
```ruby
|
155
|
+
table = TTY::Table.new ['header1', 'header2'], [['a1', 'a2'], ['b1', 'b2']
|
156
|
+
table.render :unicode
|
157
|
+
# =>
|
119
158
|
┌───────┬───────┐
|
120
159
|
│header1│header2│
|
121
160
|
├───────┼───────┤
|
@@ -127,25 +166,24 @@ To print border around data table you need to specify `renderer` type out of `ba
|
|
127
166
|
You can also create your own custom border by subclassing `TTY::Table::Border` and implementing the `def_border` method using internal DSL methods like so:
|
128
167
|
|
129
168
|
```ruby
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
end
|
169
|
+
class MyBorder < TTY::Table::Border
|
170
|
+
def_border do
|
171
|
+
left '$'
|
172
|
+
center '$'
|
173
|
+
right '$'
|
174
|
+
bottom ' '
|
175
|
+
bottom_mid '*'
|
176
|
+
bottom_left '*'
|
177
|
+
bottom_right '*'
|
140
178
|
end
|
179
|
+
end
|
141
180
|
```
|
142
181
|
|
143
|
-
Next pass the border class to your
|
182
|
+
Next pass the border class to your table instance `render_with` method
|
144
183
|
|
145
184
|
```ruby
|
146
|
-
|
147
|
-
|
148
|
-
table.to_s
|
185
|
+
table = TTY::Table.new ['header1', 'header2'], [['a1', 'a2'], ['b1', 'b2']
|
186
|
+
table.render_with MyBorder
|
149
187
|
|
150
188
|
$header1$header2$
|
151
189
|
$a1 $a2 $
|
@@ -155,13 +193,13 @@ Next pass the border class to your instantiated table
|
|
155
193
|
Finally, if you want to introduce slight modifications to the predefined border types, you can use table `border` helper like so
|
156
194
|
|
157
195
|
```ruby
|
158
|
-
|
159
|
-
|
196
|
+
table = TTY::Table.new ['header1', 'header2'], [['a1', 'a2'], ['b1', 'b2']
|
197
|
+
table.render do |renderer|
|
198
|
+
renderer.border do
|
160
199
|
mid '='
|
161
200
|
mid_mid ' '
|
162
201
|
end
|
163
|
-
|
164
|
-
table.to_s
|
202
|
+
end
|
165
203
|
|
166
204
|
header1 header2
|
167
205
|
======= =======
|
@@ -172,9 +210,10 @@ Finally, if you want to introduce slight modifications to the predefined border
|
|
172
210
|
In addition to specifying border characters you can force table to render separator line on each row like:
|
173
211
|
|
174
212
|
```ruby
|
175
|
-
|
176
|
-
|
177
|
-
|
213
|
+
table = TTY::Table.new ['header1', 'header2'], [['a1', 'a2'], ['b1', 'b2']]
|
214
|
+
table.render do |renderer|
|
215
|
+
renderer.border.separator = :each_row
|
216
|
+
end
|
178
217
|
|
179
218
|
+-------+-------+
|
180
219
|
|header1|header2|
|
@@ -188,7 +227,9 @@ In addition to specifying border characters you can force table to render separa
|
|
188
227
|
Also to change the display color of your border do:
|
189
228
|
|
190
229
|
```ruby
|
191
|
-
|
230
|
+
table.render do |renderer|
|
231
|
+
renderer.border.style = :red
|
232
|
+
end
|
192
233
|
```
|
193
234
|
|
194
235
|
#### Alignment
|
@@ -196,24 +237,25 @@ Also to change the display color of your border do:
|
|
196
237
|
All columns are left aligned by default. You can enforce per column alignment by passing `column_aligns` option like so
|
197
238
|
|
198
239
|
```ruby
|
199
|
-
|
200
|
-
|
240
|
+
rows = [['a1', 'a2'], ['b1', 'b2']
|
241
|
+
table = TTY::Table.new rows: rows
|
242
|
+
table.render column_aligns: [:center, :right]
|
201
243
|
```
|
202
244
|
|
203
245
|
To align a single column do
|
204
246
|
|
205
247
|
```ruby
|
206
|
-
|
248
|
+
table.align_column(1, :right)
|
207
249
|
```
|
208
250
|
|
209
251
|
If you require a more granular alignment you can align individual fields in a row by passing `align` option
|
210
252
|
|
211
253
|
```ruby
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
254
|
+
table = TTY::Table.new do |t|
|
255
|
+
t << ['a1', 'a2', 'a3']
|
256
|
+
t << ['b1', {:value => 'b2', :align => :right}, 'b3']
|
257
|
+
t << ['c1', 'c2', {:value => 'c3', :align => :center}]
|
258
|
+
end
|
217
259
|
```
|
218
260
|
|
219
261
|
#### Style
|
@@ -221,7 +263,8 @@ If you require a more granular alignment you can align individual fields in a ro
|
|
221
263
|
To format individual fields/cells do
|
222
264
|
|
223
265
|
```ruby
|
224
|
-
|
266
|
+
table = TTY::Table.new rows: rows
|
267
|
+
table.render width: 40
|
225
268
|
```
|
226
269
|
|
227
270
|
#### Filter
|
@@ -229,13 +272,16 @@ To format individual fields/cells do
|
|
229
272
|
You can define filters that will modify individual table fields value before they are rendered. A filter can be a callable such as proc. Here's an example that formats
|
230
273
|
|
231
274
|
```ruby
|
232
|
-
|
233
|
-
|
275
|
+
table = TTY::Table.new ['header1', 'header2'], [['a1', 'a2'], ['b1', 'b2']
|
276
|
+
table.render do |renderer|
|
277
|
+
renderer.filter = Proc.new do |val, row_index, col_index|
|
234
278
|
if col_index == 1 and !(row_index == 0)
|
235
279
|
val.capitalize
|
280
|
+
else
|
281
|
+
val
|
236
282
|
end
|
237
283
|
end
|
238
|
-
|
284
|
+
end
|
239
285
|
|
240
286
|
+-------+-------+
|
241
287
|
|header1|header2|
|
@@ -244,12 +290,17 @@ You can define filters that will modify individual table fields value before the
|
|
244
290
|
+-------+-------+
|
245
291
|
|b1 |B2 |
|
246
292
|
+-------+-------+
|
247
|
-
|
248
293
|
```
|
249
294
|
|
250
295
|
To add background color to even fields do
|
251
296
|
|
252
297
|
```ruby
|
298
|
+
table.render do |renderer|
|
299
|
+
renderer.filter = Proc.new do |val, row_index, col_index|
|
300
|
+
if col_index % 2 == 1
|
301
|
+
TTY.color.set val, :red, :on_green
|
302
|
+
end
|
303
|
+
end
|
253
304
|
```
|
254
305
|
|
255
306
|
### Terminal
|
@@ -257,19 +308,41 @@ To add background color to even fields do
|
|
257
308
|
To read general terminal properties you can use on of the helpers
|
258
309
|
|
259
310
|
```ruby
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
311
|
+
term = TTY::Terminal.new
|
312
|
+
term.width # => 140
|
313
|
+
term.height # => 60
|
314
|
+
term.color? # => true or false
|
315
|
+
term.echo(false) { } # switch off echo for the block
|
316
|
+
term.page # page terminal output, on non unix systems falls back to ruby implementation
|
265
317
|
```
|
266
318
|
|
267
319
|
To colorize your output do
|
268
320
|
|
269
321
|
```ruby
|
270
|
-
|
271
|
-
|
272
|
-
|
322
|
+
term.color.set 'text...', :bold, :red, :on_green # => red bold text on green background
|
323
|
+
term.color.remove 'text...' # strips off ansi escape sequences
|
324
|
+
term.color.code :red # ansi escape code for the supplied color
|
325
|
+
```
|
326
|
+
|
327
|
+
Available colors are:
|
328
|
+
|
329
|
+
```ruby
|
330
|
+
black
|
331
|
+
red
|
332
|
+
green
|
333
|
+
yellow
|
334
|
+
blue
|
335
|
+
magenta
|
336
|
+
cyan
|
337
|
+
white
|
338
|
+
```
|
339
|
+
|
340
|
+
To supply background color simply prefix it with `on_`. For example a green background would be `on_green`.
|
341
|
+
|
342
|
+
To page your output do
|
343
|
+
|
344
|
+
```ruby
|
345
|
+
term.page 'long text...'
|
273
346
|
```
|
274
347
|
|
275
348
|
### Shell
|
@@ -279,88 +352,113 @@ Main responsibility is to interact with the prompt and provide convenience metho
|
|
279
352
|
Available methods are
|
280
353
|
|
281
354
|
```ruby
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
355
|
+
shell = TTY::Shell.new
|
356
|
+
shell.ask # print question
|
357
|
+
shell.read # read from stdin
|
358
|
+
shell.say # print message to stdout
|
359
|
+
shell.confirm # print message(s) in green
|
360
|
+
shell.warn # print message(s) in yellow
|
361
|
+
shell.error # print message(s) in red
|
362
|
+
shell.suggest # print suggestion message based on possible matches
|
363
|
+
shell.print_table # print table to stdout
|
290
364
|
```
|
291
365
|
|
292
366
|
In order to ask question and parse answers:
|
293
367
|
|
294
368
|
```ruby
|
295
|
-
|
296
|
-
|
369
|
+
shell = TTY::Shell.new
|
370
|
+
answer = shell.ask("What is your name?").read_string
|
297
371
|
```
|
298
372
|
|
299
373
|
The library provides small DSL to help with parsing and asking precise questions
|
300
374
|
|
301
375
|
```ruby
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
376
|
+
argument # :required or :optional
|
377
|
+
character # turn character based input, otherwise line (default: false)
|
378
|
+
clean # reset question
|
379
|
+
default # default value used if none is provided
|
380
|
+
echo # turn echo on and off (default: true)
|
381
|
+
mask # mask characters i.e '****' (default: false)
|
382
|
+
modify # apply answer modification :upcase, :downcase, :trim, :chomp etc..
|
383
|
+
range # specify range '0-9', '0..9', '0...9' or negative '-1..-9'
|
384
|
+
validate # regex against which stdin input is checked
|
385
|
+
valid # a list of expected valid options
|
312
386
|
```
|
313
387
|
|
314
388
|
You can chain question methods or configure them inside a block
|
315
389
|
|
316
390
|
```ruby
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
391
|
+
shell.ask("What is your name?").argument(:required).default('Piotr').validate(/\w+\s\w+/).read_string
|
392
|
+
|
393
|
+
shell.ask "What is your name?" do
|
394
|
+
argument :required
|
395
|
+
default 'Piotr'
|
396
|
+
validate /\w+\s\w+/
|
397
|
+
valid ['Piotr', 'Piotrek']
|
398
|
+
modify :capitalize
|
399
|
+
end.read_string
|
326
400
|
```
|
327
401
|
|
328
402
|
Reading answers and converting them into required types can be done with custom readers
|
329
403
|
|
330
404
|
```ruby
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
405
|
+
read_bool # return true or false for strings such as "Yes", "No"
|
406
|
+
read_date # return date type
|
407
|
+
read_datetime # return datetime type
|
408
|
+
read_email # validate answer against email regex
|
409
|
+
read_float # return decimal or error if cannot convert
|
410
|
+
read_int # return integer or error if cannot convert
|
411
|
+
read_multiple # return multiple line string
|
412
|
+
read_password # return string with echo turned off
|
413
|
+
read_range # return range type
|
414
|
+
read_string # return string
|
341
415
|
```
|
342
416
|
|
343
417
|
For example, if we wanted to ask a user for a single digit in given range
|
344
418
|
|
345
419
|
```ruby
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
420
|
+
ask("Provide number in range: 0-9") do
|
421
|
+
range '0-9'
|
422
|
+
on_error :retry
|
423
|
+
end.read_int
|
350
424
|
```
|
351
425
|
|
352
426
|
on the other hand, if we are interested in range answer then
|
353
427
|
|
354
428
|
```ruby
|
355
|
-
|
429
|
+
ask("Provide range of numbers?").read_range
|
430
|
+
```
|
431
|
+
|
432
|
+
To suggest possible matches for the user input use `suggest` method like so
|
433
|
+
|
434
|
+
```ruby
|
435
|
+
shell.suggest('sta', ['stage', 'stash', 'commit', 'branch'])
|
436
|
+
# =>
|
437
|
+
Did you mean one of these?
|
438
|
+
stage
|
439
|
+
stash
|
356
440
|
```
|
357
441
|
|
358
442
|
### System
|
359
443
|
|
360
444
|
```ruby
|
361
|
-
|
362
|
-
|
363
|
-
|
445
|
+
TTY::System.unix? # check if unix platform
|
446
|
+
TTY::System.windows? # check if windows platform
|
447
|
+
TTY::System.which(cmd) # full path to executable if found, nil otherwise
|
448
|
+
TTY::System.exists?(cmd) # check if command is available
|
449
|
+
TTY::System.editor # provides access to system editor
|
450
|
+
```
|
451
|
+
|
452
|
+
To set preferred editor you can either use shell environment variables such as `EDITOR` and `VISUAL` or set the command(s) manually like so
|
453
|
+
|
454
|
+
```ruby
|
455
|
+
TTY::System.editor.command('vim')
|
456
|
+
```
|
457
|
+
|
458
|
+
To open a file in your editor of choice do
|
459
|
+
|
460
|
+
```ruby
|
461
|
+
TTY::System.editor.open('file path...')
|
364
462
|
```
|
365
463
|
|
366
464
|
## Contributing
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module TTY
|
4
|
+
|
5
|
+
# A class responsible for plugin loading
|
6
|
+
class Plugin
|
7
|
+
|
8
|
+
attr_reader :name
|
9
|
+
|
10
|
+
attr_reader :gem
|
11
|
+
|
12
|
+
attr_reader :gem_name
|
13
|
+
|
14
|
+
attr_accessor :enabled
|
15
|
+
|
16
|
+
# Initialize a Plugin
|
17
|
+
#
|
18
|
+
# @param [String] name
|
19
|
+
# the plugin name
|
20
|
+
#
|
21
|
+
# @param [Gem::Specification] gem
|
22
|
+
# the rubygems gem
|
23
|
+
#
|
24
|
+
# @api public
|
25
|
+
def initialize(name, gem)
|
26
|
+
@name = name
|
27
|
+
@gem = gem
|
28
|
+
@gem_name = "tty-#{name}"
|
29
|
+
@enabled = false
|
30
|
+
end
|
31
|
+
|
32
|
+
# Check if this plugin has been enabled
|
33
|
+
#
|
34
|
+
# @return [Boolean]
|
35
|
+
#
|
36
|
+
# @api public
|
37
|
+
def enabled?
|
38
|
+
!!enabled
|
39
|
+
end
|
40
|
+
|
41
|
+
# Load the plugin (require the gem)
|
42
|
+
#
|
43
|
+
# @api public
|
44
|
+
def load!
|
45
|
+
begin
|
46
|
+
require gem_name unless enabled?
|
47
|
+
rescue LoadError => error
|
48
|
+
TTY.shell.error("Unable to load plugin #{gem_name}.")
|
49
|
+
rescue => error
|
50
|
+
TTY.shell.error("require '#{gem_name}' failed with #{error}")
|
51
|
+
end
|
52
|
+
self.enabled = true
|
53
|
+
end
|
54
|
+
|
55
|
+
end # Plugin
|
56
|
+
end # TTY
|