Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

A lightweight layer above Thor to quickly create beautiful command-line interfaces.

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 bin
Octocat-spinner-32 lib
Octocat-spinner-32 templates
Octocat-spinner-32 .gitignore
Octocat-spinner-32 .rvmrc
Octocat-spinner-32 Gemfile
Octocat-spinner-32 Gemfile.lock
Octocat-spinner-32 LICENSE
Octocat-spinner-32 README.md
Octocat-spinner-32 Rakefile
Octocat-spinner-32 prometheus.gemspec
README.md

Prometheus

Prometheus is a lightweight, modular framework built on Thor to quickly create beautiful command-line interfaces for your gems. It provides a standardized layout with generators, smart configuration, and an interactive console to work with your tasks.

Getting Started

Install the gem and run it to enter interactive mode

$ gem install prometheus

Creating a new application

You can use the app generator to create a new application in your working directory.

$ prometheus app new my_app
  create  my_app
  create  my_app/my_app.gemspec
  create  my_app/.gitignore
  create  my_app/Gemfile
  create  my_app/README.md
  create  my_app/Rakefile
  create  my_app/bin/my_app
  create  my_app/lib/my_app.rb
  create  my_app/lib/my_app/version.rb
  create  my_app/templates/default_config.yml
   chmod  my_app/bin/my_app
$

Automatic Configuration

The first time you run a Prometheus app, it will create a config file in your $HOME

$ cd my_app
$ bin/my_app
Welcome to MyApp! You must be new, since you don't have a configuration file :-)
Okay to create at /home/ldk/.my_app/config? (Y/N)
  create  /home/ldk/.my_app/config
Prometheus Shell
  Project root [~/hack]> 

Configuration saved!
$

Your plugins can specify configurables that will be added to this file. Your app will ensure that all the necessary values are set before running any tasks, even if you add more later.

Interactive Mode

If you do not pass a task to run, a Prometheus application will open an interactive console in the namespace you specify. You can use the application this way, jumping into and out of namespaces as you please.

$ prometheus 
Prometheus - Interactive mode, try 'exit' or 'help' for usage
Prometheus:commands> plugin
Manage Plugins - Interactive mode, try 'exit' or 'help' for usage
Prometheus:plugin> exit
Prometheus:commands> exit
$

You can also execute system or Ruby commands with the !! and !! operators.

"! cmd" - Execute a system command
"!! cmd" - Execute a line of Ruby
"!!" - Toggle "debug mode", an interactive ruby REPL in the current process.

Adding Plugins

Now that you have a barebones application, you can start implementing your own functionality by way of plugins. Let's create one now.

$ cd my_app
$ prometheus plugin new say_hello
    create  lib/my_app/plugins/say_hello
    create  lib/my_app/plugins/say_hello/say_hello_commands.rb
    create  lib/my_app/plugins/say_hello/README
New plugin adding to application at /home/ldk/Dropbox/home/hack/oss/prometheus/my_app/lib/my_app/plugins/say_hello
Remember, this plugin will not be active until registered in your Prometheus::Commands subclass
$

If you open up lib/my_app/plugins/say_hello/say_hello_commands.rb, you will see something like this

module PrometheusApp
  class SayHello < Prometheus::Base

    full_name 'say_hello'
    namespace :say_hello
    readme File.read(File.expand_path('../README', __FILE__))

    desc 'new_task', 'A newly generated plugin task'
    def new_task
    end
  end
end

Remove the boilerplate new_task and add your own greeting. Then jump out into lib/my_app.rb and register your new plugin.

  [...]

  class Commands < Prometheus::Commands
    readme File.read(File.expand_path('../../README.md', __FILE__))
    register SayHello, 'hello', 'hello', 'Display a greeting'
  end
end

That's all there is to it. From here on out, it's just regular Thor.

License

Released under the MIT License. See the LICENSE file for further details.

Something went wrong with that request. Please try again.