austb-tty-spinner 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 22b8d9983b313e81df5d868d8f795882535a36a5
4
+ data.tar.gz: e1f0abb9a072ba253db4b945114a3527c8268355
5
+ SHA512:
6
+ metadata.gz: 85d61253e2de6234fafc27c540085d5cfb2fb34df77001ebef21a19893274436cbb1bbb4f0bb6bf7fad6e83ec2322a6b99a46666d6d93e133eda4dc5030d2572
7
+ data.tar.gz: 4894459f658facb838c3182a41a6a2f41f8480d7b261af37ce0af58a9693330ee0e09578573b810caa05a6bcb2c016c6ae2d176e1fa7d0b9ef894cc8cd09ffd1
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Piotr Murach
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,475 @@
1
+ # TTY::Spinner [![Gitter](https://badges.gitter.im/Join%20Chat.svg)][gitter]
2
+ [![Gem Version](https://badge.fury.io/rb/tty-spinner.svg)][gem]
3
+ [![Build Status](https://secure.travis-ci.org/piotrmurach/tty-spinner.svg?branch=master)][travis]
4
+ [![Build status](https://ci.appveyor.com/api/projects/status/2i5lx3tvyi5l8x3j?svg=true)][appveyor]
5
+ [![Code Climate](https://codeclimate.com/github/piotrmurach/tty-spinner/badges/gpa.png)][codeclimate]
6
+ [![Coverage Status](https://coveralls.io/repos/piotrmurach/tty-spinner/badge.svg)][coverage]
7
+ [![Inline docs](http://inch-ci.org/github/piotrmurach/tty-spinner.svg?branch=master)][inchpages]
8
+
9
+ [gitter]: https://gitter.im/piotrmurach/tty
10
+ [gem]: http://badge.fury.io/rb/tty-spinner
11
+ [travis]: http://travis-ci.org/piotrmurach/tty-spinner
12
+ [appveyor]: https://ci.appveyor.com/project/piotrmurach/tty-spinner
13
+ [codeclimate]: https://codeclimate.com/github/piotrmurach/tty-spinner
14
+ [coverage]: https://coveralls.io/r/piotrmurach/tty-spinner
15
+ [inchpages]: http://inch-ci.org/github/piotrmurach/tty-spinner
16
+
17
+ > A terminal spinner for tasks that have non-deterministic time frame.
18
+
19
+ **TTY::Spinner** provides independent spinner component for [TTY](https://github.com/piotrmurach/tty) toolkit.
20
+
21
+ ![](demo.gif)
22
+
23
+ ## Installation
24
+
25
+ Add this line to your application's Gemfile:
26
+
27
+ ```ruby
28
+ gem 'tty-spinner'
29
+ ```
30
+
31
+ And then execute:
32
+
33
+ $ bundle
34
+
35
+ Or install it yourself as:
36
+
37
+ $ gem install tty-spinner
38
+
39
+ ## Contents
40
+
41
+ * [1. Usage](#1-usage)
42
+ * [2. TTY::Spinner API](#2-ttyspinner-api)
43
+ * [2.1 spin](#21-spin)
44
+ * [2.2 auto_spin](#22-auto_spin)
45
+ * [2.3 run](#23-run)
46
+ * [2.4 start](#24-start)
47
+ * [2.5 stop](#25-stop)
48
+ * [2.5.1 success](#251-success)
49
+ * [2.5.2 error](#252-error)
50
+ * [2.6 update](#26-update)
51
+ * [2.7 reset](#27-reset)
52
+ * [2.8 join](#28-join)
53
+ * [3. Configuration](#3-configuration)
54
+ * [3.1 :format](#31-format)
55
+ * [3.2 :frames](#32-frames)
56
+ * [3.3 :interval](#33-interval)
57
+ * [3.4 :hide_cursor](#34-hide_cursor)
58
+ * [3.5 :clear](#35-clear)
59
+ * [3.6 :success_mark](#36-success_mark)
60
+ * [3.7 :error_mark](#37-error_mark)
61
+ * [3.8 :output](#38-output)
62
+ * [4. Events](#4-events)
63
+ * [4.1 done](#41-done)
64
+ * [4.2 success](#42-success)
65
+ * [4.3 error](#43-error)
66
+ * [5. TTY::Spinner::Multi API](#5-ttyspinnermulti-api)
67
+ * [5.1 reigster](#51-register)
68
+ * [5.2 auto_spin](#52-auto_spin)
69
+ * [5.2.1 async tasks](#521-async-tasks)
70
+ * [5.3 stop](#53-stop)
71
+ * [5.3.1 success](#531-success)
72
+ * [5.3.2 error](#532-error)
73
+ * [5.4 :style](#54-style)
74
+
75
+ ## 1. Usage
76
+
77
+ **TTY::Spinner** by default uses `:classic` type of formatter and requires no paramters:
78
+
79
+ ```ruby
80
+ spinner = TTY::Spinner.new
81
+ ```
82
+
83
+ In addition you can provide a message with `:spinner` token and format type you would like for the spinning display:
84
+
85
+ ```ruby
86
+ spinner = TTY::Spinner.new("[:spinner] Loading ...", format: :pulse_2)
87
+
88
+ spinner.auto_spin # Automatic animation with default interval
89
+
90
+ sleep(2) # Perform task
91
+
92
+ spinner.stop('Done!') # Stop animation
93
+ ```
94
+
95
+ This would produce animation in your terminal:
96
+
97
+ ```ruby
98
+ ⎺ Loading ...
99
+ ```
100
+
101
+ and when finished output:
102
+
103
+ ```ruby
104
+ _ Loading ... Done!
105
+ ```
106
+
107
+ Use **TTY::Spinner::Multi** to synchornize multiple spinners:
108
+
109
+ ```ruby
110
+ spinners = TTY::Spinner::Multi.new("[:spinner] top")
111
+
112
+ sp1 = spinners.register "[:spinner] one"
113
+ sp2 = spinners.register "[:spinner] two"
114
+
115
+ sp1.auto_spin
116
+ sp2.auto_spin
117
+
118
+ sleep(2) # Perform work
119
+
120
+ sp1.success
121
+ sp2.success
122
+ ```
123
+
124
+ which when done will display:
125
+
126
+ ```ruby
127
+ ┌[✔]] top
128
+ ├──[✔] one
129
+ └──[✔] two
130
+ ```
131
+
132
+ For more usage examples please see [examples directory](https://github.com/piotrmurach/tty-spinner/tree/master/examples)
133
+
134
+ ## 2. TTY::Spinner API
135
+
136
+ ### 2.1 spin
137
+
138
+ The main workhorse of the spinner is the `spin` method.
139
+
140
+ Looping over `spin` method will animate a given spinner.
141
+
142
+ ```ruby
143
+ loop do
144
+ spinner.spin
145
+ end
146
+ ```
147
+
148
+ ### 2.2 auto_spin
149
+
150
+ To perform automatic spinning animation use `auto_spin` method like so:
151
+
152
+ ```ruby
153
+ spinner.auto_spin
154
+ ```
155
+
156
+ The speed with which the spinning happens is determined by the `:interval` parameter. All the spinner formats have their default intervals specified ([see](https://github.com/piotrmurach/tty-spinner/blob/master/lib/tty/spinner/formats.rb)).
157
+
158
+ ### 2.3 run
159
+
160
+ Use `run` with a code block that will automatically display spinning animation while the block executes and finish animation when the block terminates. Optionally you can provide a stop message to display when animation is finished.
161
+
162
+ ```ruby
163
+ spinner.run('Done!') { ... }
164
+ ```
165
+
166
+ ### 2.4 start
167
+
168
+ In order to set start time or reuse the same spinner after it has stopped, call `start` method:
169
+
170
+ ```ruby
171
+ spinner.start
172
+ ```
173
+
174
+ ### 2.5 stop
175
+
176
+ In order to stop the spinner call `stop`. This will finish drawing the spinning animation and return to new line.
177
+
178
+ ```ruby
179
+ spinner.stop
180
+ ```
181
+
182
+ You can further pass a message to print when animation is finished.
183
+
184
+ ```ruby
185
+ spinner.stop('Done!')
186
+ ```
187
+
188
+ #### 2.5.1 success
189
+
190
+ Use `success` call to stop the spinning animation and replace the spinning symbol with checkmark character to indicate successful completion.
191
+
192
+ ```ruby
193
+ spinner = TTY::Spinner.new("[:spinner] Task name")
194
+ spinner.success('(successful)')
195
+ ```
196
+
197
+ This will produce:
198
+
199
+ ```
200
+ [✔] Task name (successful)
201
+ ```
202
+
203
+ #### 2.5.2 error
204
+
205
+ Use `error` call to stop the spining animation and replace the spinning symbol with cross character to indicate error completion.
206
+
207
+ ```ruby
208
+ spinner = TTY::Spinner.new("[:spinner] Task name")
209
+ spinner.error('(error)')
210
+ ```
211
+
212
+ This will produce:
213
+
214
+ ```ruby
215
+ [✖] Task name (error)
216
+ ```
217
+
218
+
219
+ ### 2.6 update
220
+
221
+ Use `update` call to dynamically change label name(s).
222
+
223
+ Provide an arbitrary token name(s) in the message string, such as `:title`
224
+
225
+ ```ruby
226
+ spinner = TTY::Spinner.new("[:spinner] :title")
227
+ ```
228
+
229
+ and then pass token name and value:
230
+
231
+ ```ruby
232
+ spinner.update(title: 'Downloading file1')
233
+ ```
234
+
235
+ next start animation:
236
+
237
+ ```ruby
238
+ spinner.run { ... }
239
+ # => | Downloading file1
240
+ ```
241
+
242
+ Once animation finishes you can kick start another one with a different name:
243
+
244
+ ```ruby
245
+ spinner.update(title: 'Downloading file2')
246
+ spinner.run { ... }
247
+ ```
248
+
249
+ ### 2.7 reset
250
+
251
+ In order to reset the spinner to its initial frame do:
252
+
253
+ ```ruby
254
+ spinner.reset
255
+ ```
256
+
257
+ ### 2.8 join
258
+
259
+ One way to wait while the spinning animates is to join the thread started with `start` method:
260
+
261
+ ```ruby
262
+ spinner.join
263
+ ```
264
+
265
+ Optionally you can provide timeout:
266
+
267
+ ```ruby
268
+ spinner.join(0.5)
269
+ ```
270
+
271
+ ## 3. Configuration
272
+
273
+ There are number of configuration options that can be provided to customise the behaviour of a spinner.
274
+
275
+ ### 3.1 :format
276
+
277
+ Use one of the predefined spinner styles by passing the formatting token `:format`
278
+
279
+ ```ruby
280
+ spinner = TTY::Spinner.new(format: :pulse_2)
281
+ ```
282
+
283
+ All spinner formats that **TTY::Spinner** accepts are defined in [/lib/tty/spinner/formats.rb](https://github.com/piotrmurach/tty-spinner/blob/master/lib/tty/spinner/formats.rb)
284
+
285
+ If you wish to see all available formats in action run the `formats.rb` file in examples folder like so:
286
+
287
+ ```ruby
288
+ bundle exec ruby examples/formats.rb
289
+ ```
290
+
291
+ ### 3.2 :frames
292
+
293
+ If you wish to use custom formatting use the `:frames` option with either `array` or `string` of characters.
294
+
295
+ ```ruby
296
+ spinner = TTY::Spinner.new(frames: [".", "o", "0", "@", "*"])
297
+ ```
298
+
299
+ ### 3.3 :interval
300
+
301
+ The `:interval` option accepts `integer` representing number of `Hz` units, for instance, frequency of 10 will mean that the spinning animation will be displayed 10 times per second.
302
+
303
+ ```ruby
304
+ spinner = TTY::Spinner.new(interval: 20) # 20 Hz (20 times per second)
305
+ ```
306
+
307
+ ### 3.4 :hide_cursor
308
+
309
+ Hides cursor when spinning animation performs. Defaults to `false`.
310
+
311
+ ```ruby
312
+ spinner = TTY::Spinner.new(hide_cursor: true)
313
+ ```
314
+
315
+ ### 3.5 :clear
316
+
317
+ After spinner is finished clears its output. Defaults to `false`.
318
+
319
+ ```ruby
320
+ spinner = TTY::Spinner.new(clear: true)
321
+ ```
322
+
323
+ ### 3.6 :success_mark
324
+
325
+ To change marker indicating successful completion use the `:success_mark` option:
326
+
327
+ ```ruby
328
+ spinner = TTY::Spinner.new(success_mark: '+')
329
+ ```
330
+
331
+ ### 3.7 :error_mark
332
+
333
+ To change marker indicating error completion use the `:error_mark` option:
334
+
335
+ ```ruby
336
+ spinner = TTY::Spinner.new(error_mark: 'x')
337
+ ```
338
+
339
+ ### 3.8 :output
340
+
341
+ To change where data is streamed use `:output` option like so:
342
+
343
+ ```
344
+ spinner = TTY::Spinner.new(output: $stdout)
345
+ ```
346
+
347
+ The output stream defaults to `stderr`.
348
+
349
+ ## 4. Events
350
+
351
+ **TTY::Spinner** emits `:done`, `:success` and `:error` event types when spinner is stopped.
352
+
353
+ ### 4.1 done
354
+
355
+ This event is emitted irrespective of the completion method. In order to listen for this event you need to register callback:
356
+
357
+ ```ruby
358
+ spinner.on(:done) { ... }
359
+ ```
360
+
361
+ ### 4.2 success
362
+
363
+ This event is fired when `success` call is made. In order to respond to the event, you need to register callback:
364
+
365
+ ```ruby
366
+ spinner.on(:success) { ... }
367
+ ```
368
+
369
+ ### 4.3 error
370
+
371
+ This event is fired when `error` completion is called. In order to respond to the event, you need to register callback:
372
+
373
+ ```ruby
374
+ spinner.on(:error) { ... }
375
+ ```
376
+
377
+ ## 5. TTY::Spinner::Multi API
378
+
379
+ ### 5.1 register
380
+
381
+ Create and register a `TTY::Spinner` under the multispinner
382
+
383
+ ```ruby
384
+ new_spinner = multi_spinner.register("[:spinner] Task 1 name", options)
385
+ ```
386
+
387
+ If no options are given it will use the options given to the multi_spinner when it was initialized to create the new spinner.
388
+ If options are passed, they will override any options given to the multi spinner.
389
+
390
+ ### 5.2 auto_spin
391
+
392
+ The multispinner has to have been given a message on initialization.
393
+ To perform automatic spinning animation use `auto_spin` method like so:
394
+
395
+ ```ruby
396
+ multi_spinner = TTY::Spinner::Multi.new("[:spinner] Top level spinner")
397
+ multi_spinner.auto_spin
398
+ ```
399
+
400
+ If you register spinners without any tasks then you will have to manually control when the `multi_spinner` finishes by calling `stop`, `success` or `error`. Alternatively you can register spinners with tasks (see [async tasks](#521-async-tasks))
401
+
402
+ The speed with which the spinning happens is determined by the `:interval` parameter. All the spinner formats have their default intervals specified ([see](https://github.com/piotrmurach/tty-spinner/blob/master/lib/tty/spinner/formats.rb)).
403
+
404
+ #### 5.2.1 async tasks
405
+
406
+ In case when you wish to execute async tasks and update individual spinners automatically, in any order, about their task status use `#register` and pass additional block parameter with the job to be executed.
407
+
408
+ For example, create a multi spinner that will track status of all registered spinners:
409
+
410
+ ```ruby
411
+ spinners = TTY::Spinner::Multi.new("[:spinner] top")
412
+ ```
413
+
414
+ and then register spinners with their respective tasks:
415
+
416
+ ```ruby
417
+ spinners.register("[:spinner] one") { |sp| sleep(2); sp.success('yes 2') }
418
+ spinners.register("[:spinner] two") { |sp| sleep(3); sp.error('no 2') }
419
+ ```
420
+
421
+ Finally, call `#auto_spin` to kick things off:
422
+
423
+ ```ruby
424
+ spinners.auto_spin
425
+ ```
426
+
427
+ ### 5.3 stop
428
+
429
+ In order to stop the multi spinner call `stop`. This will stop the top level spinner, if it exists, and any sub-spinners still spinning.
430
+
431
+ ```ruby
432
+ multi_spinner.stop
433
+ ```
434
+
435
+ #### 5.3.1 success
436
+
437
+ Use `success` call to stop the spinning animation and replace the spinning symbol with checkmark character to indicate successful completion.
438
+ This will also call `#success` on any sub-spinners that are still spinning.
439
+
440
+ ```ruby
441
+ multi_spinner.success
442
+ ```
443
+
444
+ #### 5.3.2 error
445
+
446
+ Use `error` call to stop the spining animation and replace the spinning symbol with cross character to indicate error completion.
447
+ This will also call `#error` on any sub-spinners that are still spinning.
448
+
449
+ ```ruby
450
+ multi_spinner.error
451
+ ```
452
+
453
+ ### 5.4 :style
454
+
455
+ In addition to all [configuration options](#3-configuration) you can style multi spinner like so:
456
+
457
+ ```ruby
458
+ multi_spinner = TTY::Spinner::Multi.new("[:spinner] parent", style: {
459
+ top: '. '
460
+ middle: '|-> '
461
+ bottom: '|__ '
462
+ })
463
+ ```
464
+
465
+ ## Contributing
466
+
467
+ 1. Fork it ( https://github.com/piotrmurach/tty-spinner/fork )
468
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
469
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
470
+ 4. Push to the branch (`git push origin my-new-feature`)
471
+ 5. Create a new Pull Request
472
+
473
+ ## Copyright
474
+
475
+ Copyright (c) 2014-2017 Piotr Murach. See LICENSE for further details.