Dev UI

Dev UI is a small framework who's only responsibility is to print pretty to the terminal

Installation

gem install dev-ui

or add the following to your Gemfile:

gem 'dev-ui'

In your code, simply add a require 'dev/ui'. Most options assume Dev::UI::StdoutRouter.enable has been called.

Features

This may not be an exhaustive list. Please check our documentation for more information.


Nested framing

To handle content flow (see example below)

Dev::UI::StdoutRouter.enable
Dev::UI::Frame.open('Frame 1') do
  Dev::UI::Frame.open('Frame 2') { puts "inside frame 2" }
  puts "inside frame 1" 
end

Nested Framing


Interactive Prompts

Prompt user with options and ask them to choose. Can answer using arrow keys, numbers, or vim bindings (or y/n for yes/no questions)

Dev::UI.ask('What language/framework do you use?', options: %w(rails go ruby python))

Interactive Prompt


Free form text prompts

Dev::UI.ask('Is Dev UI Awesome?', default: 'It is great!')

Free form text prompt


Spinner groups

Handle many multi-threaded processes while suppressing output unless there is an issue. Can update title to show state.

spin_group = Dev::UI::SpinGroup.new
spin_group.add('Title')   { |spinner| sleep 3.0 }
spin_group.add('Title 2') { |spinner| sleep 3.0; spinner.update_title('New Title'); sleep 3.0 }
spin_group.wait

Spinner Group


Text Color formatting

e.g. {{red:Red}} {{green:Green}}

puts Dev::UI.fmt "{{red:Red}} {{green:Green}}"

Text Format


Symbol/Glyph Formatting

e.g. {{*}} => a yellow ⭑

puts Dev::UI.fmt "{{*}} {{x}} {{?}} {{v}}"

Symbol Formatting


Progress Bar

Show progress of a process or operation.

Dev::UI::Progress.progress do |bar|
  100.times do
    bar.tick
  end
end

Progress Bar


Example Usage

The following code makes use of nested-framing, multi-threaded spinners, formatted text, and more.

require 'dev/ui'

Dev::UI::StdoutRouter.enable

Dev::UI::Frame.open('{{*}} {{bold:a}}', color: :green) do
  Dev::UI::Frame.open('{{i}} b', color: :magenta) do
    Dev::UI::Frame.open('{{?}} c', color: :cyan) do
      sg = Dev::UI::SpinGroup.new
      sg.add('wow') do |spinner|
        sleep(2.5)
        spinner.update_title('second round!')
        sleep (1.0)
      end
      sg.add('such spin') { sleep(1.6) }
      sg.add('many glyph') { sleep(2.0) }
      sg.wait
    end
  end
  Dev::UI::Frame.divider('{{v}} lol')
  puts Dev::UI.fmt '{{info:words}} {{red:oh no!}} {{green:success!}}'
  sg = Dev::UI::SpinGroup.new
  sg.add('more spins') { sleep(0.5) ; raise 'oh no' }
  sg.wait
end

Output:

Example Output

Development

  • Run tests using bundle exec rake test. All code should be tested.
  • No code, outside of development and tests needs, should use dependencies. This is a self contained library

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/Shopify/dev-ui.

License

The code is available as open source under the terms of the MIT License.