All Projects → henrik → Progress_bar

henrik / Progress_bar

Command-line progress bars and spinners for Elixir.

Programming Languages

elixir
2628 projects

Projects that are alternatives of or similar to Progress bar

Alive Progress
A new kind of Progress Bar, with real-time throughput, ETA, and very cool animations!
Stars: ✭ 2,940 (+946.26%)
Mutual labels:  cli, terminal, progress-bar, spinner, progressbar, spinners
Spinner
Go (golang) package with 90 configurable terminal spinner/progress indicators.
Stars: ✭ 1,637 (+482.56%)
Mutual labels:  cli, terminal, spinner, progress-bar, progressbar
Mpb
multi progress bar for Go cli applications
Stars: ✭ 1,221 (+334.52%)
Mutual labels:  cli, terminal, progress-bar, spinner
Tqdm
A Fast, Extensible Progress Bar for Python and CLI
Stars: ✭ 20,632 (+7242.35%)
Mutual labels:  cli, terminal, progress-bar, progressbar
Ruby Progressbar
Ruby/ProgressBar is a text progress bar library for Ruby.
Stars: ✭ 1,378 (+390.39%)
Mutual labels:  cli, terminal, progress-bar, progressbar
Python Progressbar
Progressbar 2 - A progress bar for Python 2 and Python 3 - "pip install progressbar2"
Stars: ✭ 682 (+142.7%)
Mutual labels:  cli, terminal, progress-bar, progressbar
Yaspin
A lightweight terminal spinner for Python with safe pipes and redirects 🎁
Stars: ✭ 413 (+46.98%)
Mutual labels:  cli, terminal, spinner
React Nprogress
⌛️ A React primitive for building slim progress bars.
Stars: ✭ 173 (-38.43%)
Mutual labels:  progress-bar, spinner, progressbar
Progressbar
A really basic thread-safe progress bar for Golang applications
Stars: ✭ 2,212 (+687.19%)
Mutual labels:  terminal, progress-bar, progressbar
React Spinners Kit
A collection of loading spinners with React.js
Stars: ✭ 158 (-43.77%)
Mutual labels:  spinner, progressbar, spinners
Node.cli Progress
⌛️ easy to use progress-bar for command-line/terminal applications
Stars: ✭ 466 (+65.84%)
Mutual labels:  cli, progress-bar, progressbar
Progressbar
Terminal-based progress bar for Java / JVM
Stars: ✭ 625 (+122.42%)
Mutual labels:  cli, terminal, progressbar
Spinnercpp
Simple header only library to add a spinner / progress indicator to any terminal application.
Stars: ✭ 37 (-86.83%)
Mutual labels:  cli, terminal, spinner
Php Console Spinner
Colorful highly configurable spinner for php cli applications (suitable for async apps)
Stars: ✭ 225 (-19.93%)
Mutual labels:  cli, terminal, spinner
mp-progress
专注于小程序圆环形进度条的小工具
Stars: ✭ 72 (-74.38%)
Mutual labels:  progress-bar, progressbar
nanospinner
🌀 The simplest and tiniest terminal spinner for Node.js
Stars: ✭ 108 (-61.57%)
Mutual labels:  spinner, spinners
DownloadPorgressBar
This is a download progressbar.
Stars: ✭ 19 (-93.24%)
Mutual labels:  progress-bar, progressbar
Tty Markdown
Convert a markdown document or text into a terminal friendly output.
Stars: ✭ 275 (-2.14%)
Mutual labels:  cli, terminal
GradientProgressView
一个简单的进度条控件
Stars: ✭ 15 (-94.66%)
Mutual labels:  progress-bar, progressbar
cli-progress
⌛ easy to use progress-bar for command-line/terminal applications
Stars: ✭ 672 (+139.15%)
Mutual labels:  progress-bar, progressbar

ProgressBar for Elixir

Build Status Hex

Screenshot

Usage

You can render

Do you have a use case not listed below? Please open an issue or pull request!

Progress bars

Specify the current value and the total value, and a bar will be rendered to STDOUT.

ProgressBar.render(2, 3)

Output:

|==================================                |  67%

Call the function again and it will overwrite the previous bar with the new value:

ProgressBar.render(2, 3)
ProgressBar.render(3, 3)

Output:

|==================================================| 100%

This basically works by printing "\r[===…" each time, without a newline. The text cursor will return to the beginning of the line and overwrite the previous value.

When the bar becomes full, a newline is automatically printed, so any subsequent output gets its own line.

It's up to you to re-render the bar when something changes. Here's a trivial example of an animated progress bar:

Enum.each 1..100, fn (i) ->
  ProgressBar.render(i, 100)
  :timer.sleep 25
end

Width

The bar will automatically set its width to fit the terminal. If the terminal width can't be determined automatically, an 80 column width will be assumed.

If you really want to, you may specify an explicit terminal column width to fit inside:

ProgressBar.render(97, 100, width: 30)

Even with a wide terminal, note that the bar proper maxes out at 100 characters wide (one per percentage point) and will not go wider.

Customize format

Replace the bar, blank, left or right values.

format = [
  bar: "X",   # default: "="
  blank: ".", # default: " "
  left: "(",  # default: "|"
  right: ")", # default: "|"
]

ProgressBar.render(97, 100, format)

Output:

…XXXXXXXXX...)  97%

bar and blank don't have to be single characters. They can be any-length strings and will repeat and truncate as appropriate.

You can provide empty-string values to remove left and right entirely.

You can also provide left or right as chardata lists with IO.ANSI values:

format = [
  left: [IO.ANSI.magenta, "PROGRESS:", IO.ANSI.reset, " |"],
]

Customize color

Specify IO.ANSI values as bar_color or blank_color. Use lists for multiple values.

format = [
  bar_color: [IO.ANSI.white, IO.ANSI.green_background],
  blank_color: IO.ANSI.red_background,
]

ProgressBar.render(97, 100, format)

percent: false

Hides the percentage shown after the bar.

ProgressBar.render(1, 1, percent: false)

Output:

…============|

Instead of:

…============| 100%

suffix: :count

This option causes the values to be printed on the suffix of your progress bar.

ProgressBar.render(9_751, 10_000, suffix: :count)

Output:

…=========   |  97% (9751/10000)

suffix: :bytes

This option causes the values to be treated as bytes of data, showing those amounts next to the bar.

ProgressBar.render(2_034_237, 2_097_152, suffix: :bytes)

Output:

…=========   |  97% (1.94/2.00 MB)

The unit (KB or MB) is determined automatically.

This is great with progressive downloads.

Indeterminate progress bars

Indeterminate progress bars will animate on their own for the duration of a function you pass to it.

ProgressBar.render_indeterminate fn ->
  # Do something for an indeterminate amount of time…
  :timer.sleep 2000
end

It will alternate between four forms by default:

|=---=---=---=---=---=---=---=---=---=---=---…
|-=---=---=---=---=---=---=---=---=---=---=--…
|--=---=---=---=---=---=---=---=---=---=---=-…
|---=---=---=---=---=---=---=---=---=---=---=…

And then show as done:

|============================================…

The return value of the function is passed through, if you want it:

data = ProgressBar.render_indeterminate fn ->
  ApiClient.painstakingly_retrieve_data
end

IO.puts "Finally got the data: #{inspect data}"

Customize format

You can customize the forms it alternates between, as well as the done state, and the left and right bookends.

ProgressBar.render_indeterminate [
  bars: [ "Oo", "oO" ],
  done: "X",
  left: "",
  right: "",
], fn -> end

The bars list can be any length. Each string in that list is a "frame" in the animation. The bar will alternate between these strings, and then start over.

Each string in the list can be any length and will repeat to fit the bar.

Customize color

You can customize the color of the bar, and of the completed state.

ProgressBar.render_indeterminate [
  bars_color: IO.ANSI.yellow,
  done_color: IO.ANSI.green,
], fn -> end

You can pass multiple IO.ANSI values, just as with a regular progress bar. The indeterminate bar intentionally doesn't alternate between colors, so as not to trigger epileptic seizures…

Interval

You can customize the millisecond interval at which it alternates. The default is 500 milliseconds.

ProgressBar.render_indeterminate([interval: 10], fn -> end)

Spinners

A spinner is similar to an indeterminate progress bar. But instead of a bar, it shows a "spinning" animation next to some text.

ProgressBar.render_spinner [text: "Loading…", done: "Loaded."], fn ->
  # Do something for an indeterminate amount of time…
  :timer.sleep 2000
end

This is the default animation and text:

/ Loading…
- Loading…
\ Loading…
| Loading…

Then it shows as done:

Loaded.

You can customize some things:

format = [
  frames: ["/" , "-", "\\", "|"],  # Or an atom, see below
  text: "Loading…",
  done: "Loaded.",
  spinner_color: IO.ANSI.magenta,
  interval: 100,  # milliseconds between frames
]

ProgressBar.render_spinner format, my_function

Colors can be lists just like with other progress bars.

If you want the done state to also be some colored symbol, just use chardata lists:

format = [
  done: [IO.ANSI.green, "✓", IO.ANSI.reset, " Loaded."],
]

Or you can pass done: :remove to stop showing this line of text entirely when it completes.

As with indeterminate progress bars, the return value of the function is passed through if you want it:

data = ProgressBar.render_spinner fn ->
  ApiClient.painstakingly_retrieve_data
end

IO.puts "Finally got the data: #{inspect data}"

Predefined spinners

Instead of specifying the frames as a list, you can assign one of the predefined styles as an atom:

ProgressBar.render_spinner([frames: :braille], fn -> end)
Name Frames
:strokes (default) / - \ |
:braille ⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏
:bars ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▇ ▆ ▅ ▄ ▃

Examples

To see these bad boys in action, clone this repo and run the example scripts:

# Run all examples.
mix run examples/all.exs

# See what's available.
ls examples

# Run a single example.
mix run examples/02-color.exs

Or to see them in a real project, try Sipper.

Installation

Add the dependency to your project's mix.exs:

defp deps do
  [
    {:progress_bar, "> 0.0.0"},
  ]
end

Then fetch it:

mix deps.get

Also see

Credits and license

By Henrik Nyh and contributors 2015-09-19 under the MIT license.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].