README.md in whirly-0.1.1 vs README.md in whirly-0.2.0
- old
+ new
@@ -1,11 +1,20 @@
# Whirly [![[version]](https://badge.fury.io/rb/whirly.svg)](http://badge.fury.io/rb/whirly) [![[travis]](https://travis-ci.org/janlelis/whirly.png)](https://travis-ci.org/janlelis/whirly)
-Whirly terminal spinner for Ruby, influenced by [ora](https://github.com/sindresorhus/ora), includes [cli-spinners](https://github.com/sindresorhus/cli-spinners).
+A simple, colorful and customizable terminal spinner library for Ruby. It comes with 17 custom spinners and also includes those from the [cli-spinners](https://github.com/sindresorhus/cli-spinners) project.
-ALPHA RELEASE FOR EURUKO
+## Demonstration
+### Bundled Whirly Spinners
+[Play on asciinema](https://asciinema.org/a/88198?size=big)
+
+### Bundled Spinners from CLI Spinners
+
+![](https://raw.githubusercontent.com/sindresorhus/cli-spinners/master/screenshot.gif)
+
+[Play on asciinema](https://asciinema.org/a/9mlcoussb137m32swwuqtb2p1?size=big)
+
## Setup
Add to your `Gemfile`:
```ruby
@@ -15,55 +24,228 @@
## Usage
### Basic Usage
+The spinner is shown while the block executes:
+
```ruby
Whirly.start do
- Whirly.status = "Working on it…"
+ # do the heavy work here
+ sleep 5
+end
+```
+
+You can update the spinner text from inside the block:
+
+```ruby
+Whirly.start do
+ Whirly.status = "Set some text to display alongside the spinner symbol"
sleep 3
- Whirly.status = "Almoste done…"
+ Whirly.status = "Update it"
sleep 2
end
```
-### Non-Block Syntax, World Spinner
+If you want to avoid the block syntax, you can also stop it manually:
```ruby
-Whirly.start spinner: "world"
-Whirly.status = "Working on it…"
-sleep 3
-Whirly.status = "Almoste done…"
+Whirly.start
+sleep 5
Whirly.stop
```
-### No Colors, Pong Spinner, Initial Status
+The `start` method takes a lot of options, like which spinner to use or an initial status. See further below for the full description of available options.
```ruby
Whirly.start spinner: "pong", use_color: false, status: "The Game of Pong" do
sleep 10
end
```
-### Slower Interval, Don't Hide Cursor
+### Configuring Whirly
+You can pass the same options you would pass to `.start` to `.configure` instead to create a persistent configuration that will be used by `.start`:
+
```ruby
-Whirly.start spinner: "clock", interval: 1000, hide_cursor: false do
- sleep 5
+Whirly.configure spinner: "dots"
+
+Whirly.start do
+ sleep 3 # will use dots
end
+
+Whirly.start do
+ sleep 3 # will use dots again
+end
```
-## Included Spinners & Custom Spinners
+Call `.reset` to restore unconfigured behaviour:
-- See `data/cursors.json`
-- Spinners are either an Array of frames or an enumerator [...]
-- Extra fun spinners :random_character, :random_emoticon (SOON)
+```ruby
+Whirly.configure spinner: "dots"
+Whirly.reset
+
+Whirly.start do
+ sleep 3 # will use default spinner
+end
+```
+
+## Spinners
+
+### Included Spinners
+
+See [`data/whirly-static-spinnes.json`](https://github.com/janlelis/whirly/blob/master/data/whirly-static-spinners.json), [`lib/whirly/spinners/whirly.rb`](https://github.com/janlelis/whirly/blob/master/lib/whirly/spinners/whirly.rb) and [cli-spinners](https://github.com/sindresorhus/cli-spinners). You can get a demonstration of all bundled spinners by running the [`examples/all_spinners.rb`](https://github.com/janlelis/whirly/blob/master/examples/all_spinners.rb) script.
+
+## All `Whirly.start` / `Whirly.configure` Configuration Options
+
+### Main Options
+
+#### `spinner:`
+
+You have multiple ways of telling *Whirly* which spinner should be used. You can pass the following to the `spinner:` option:
+
+*Default:* `"whirly"`
+
+- The name of a bundled spinner
+- An array of spinner frames to use
+- A proc which generates the frames dynamically
+- A full spinner hash object ([explained below](https://github.com/janlelis/whirly#full-spinner-hash-format))
+
+#### `status:`
+
+*Default:* None
+
+Allows you to directly set the first status text to display alongside the spinner icon.
+
+#### `interval:`
+
+*Default:* `100`
+
+The number of milliseconds between changing to the next spinner icon frame.
+
+### Advanced Options
+
+#### `ambiguous_characters_width:`
+
+*Default:* `1`
+
+If set to `2`, ambiguous Unicode charatcers will be treated as 2 colums wide. See [unicode-display_width](https://github.com/janlelis/unicode-display_width) for more details.
+
+#### `ansi_escape_mode:`
+
+*Default:* `"restore"`
+
+Can be set to `"line"` to use an different way of producing ANSI escape sequences (experimental)
+
+#### `append_newline:`
+
+*Default:* `true`
+
+When the Whirly block is over (or `.stop` was called), a `"\n"` will be outputted. Change to `false` to prevent this.
+
+#### `color:`
+
+*Default:* `!!defined?(Paint)`
+
+This option is responsible for displaying the spinner icon in random colors. Set to `false` if you do not want this. Related option `:color_change_rate`.
+
+#### `color_change_rate:`
+
+*Default:* `30`
+
+A value which describes how fast the color of the spinner icon changes.
+
+#### `hide_cursor:`
+
+*Default:* `true`
+
+By default, the terminal cursor gets hidden while displaying the spinner. This also registers an `at_exit` callback, which always restores the cursor when exitting the program. If you do not want to hide the cursor, change this option to `false`.
+
+#### `mode:`
+
+*Default:* `"linear"`
+
+Instructs Whirly to play the frames in a different order. Possible values: `"linear"`, `"reverse"`, `"swing"`, and `"random"`. See spinner format section for more details.
+
+#### `non_tty:`
+
+*Default:* `false`
+
+Whirly only gets activated if the current process appears to be a real terminal. If you want to activate it for non-terimnals, set this option to `true`.
+
+#### `position:`
+
+*Default:* `"normal"`
+
+You can set this to `"below"` to let Whirly appear one line below its normal position.
+
+#### `remove_after_stop:`
+
+*Default:* `"false"`
+
+Causes the last frame to be removed after the spinner stopped.
+
+#### `stop:`
+
+*Default:* None
+
+You can pass a custom frame to be used to end the animation, for example:
+
+```ruby
+Whirly.start spinner: "clock", interval: 1000, stop: "⏰" do
+ sleep 12
+end
+```
+
+#### `spinner_packs:`
+
+*Default:* `[:whirly, :cli]`
+
+Whirly comes with spinners from different sources. This options defines which sources to consider (the value refers to an uppercased child constant of `Whirly::Spinners`) and in which order.
+
+#### `stream:`
+
+*Default:* `$stdout`
+
+You can pass in an [IO](https://ruby-doc.org/core-2.3.1/IO.html)-like object, if you want to display *Whirly* on an other stream than `$stdout`.
+
+## Full Spinner Hash Format
+
+A full spinner is defined by a hash which can have the following key-value pairs. Please note that in order to keep the format more portable, all keys are strings and not Ruby symbols. Except for `"frames"` and `"proc"`, all options are overwritable when starting/configuring Whirly. See the included spinners for example definitions of spinners.
+
+### `"frames"`
+
+An [Array](https://ruby-doc.org/core-2.3.1/Array.html) or [Enumerable](https://ruby-doc.org/core-2.3.1/Enumerable.html) of strings that will be used as the spinner icon.
+
+### `"proc"`
+
+Instead of using `"frames"`: A proc which will generate the next frame with each call.
+
+### `"interval"`
+
+The number of milliseconds between changing to the next spinner icon frame.
+
+### `"mode"`
+
+The order in which frames should be played. It can be one of the following:
+
+- `"linear"`: Cycle through all frames in normal order
+- `"reverse"`: Cycle through all frames in reverse order
+- `"swing"`: Cycle through all frames in normal order, and then in reverse order, but only play first and last frame once each round
+- `"random"`: Play random frames
+
+Please note: While `"linear"` also works with frames that are just an [Enumerable](https://ruby-doc.org/core-2.3.1/Enumerable.html), all other frame modes require the object to be representable as an [Array](https://ruby-doc.org/core-2.3.1/Array.html).
+
+### `"stop"`
+
+A frame to be used to end the spinner icon animation.
+
## Remarks, Troubleshooting, Caveats
- Interval is milliseconds, but don't rely on exact timing
-- Will not do anything if stream is not a real console
-- Colors not working? Be sure to include the [paint](https://github.com/janlelis/paint/) gem
+- Will not do anything if stream is not a real console (or `non_tty: true` is passed)
+- Colors not working? Be sure to include the [paint](https://github.com/janlelis/paint/) gem in your Gemfile
- Don't set very short intervals (or it might affect performance substantly)
## MIT License
- Copyright (C) 2016 Jan Lelis <http://janlelis.com>. Released under the MIT license.