README.md in cri-2.0b1 vs README.md in cri-2.0rc1
- old
+ new
@@ -1,8 +1,122 @@
Cri
===
-Cri is a library for building easy-to-use commandline tools.
+Cri is a library for building easy-to-use commandline tools with support for
+nested commands.
+
+Usage
+-----
+
+The central concept in Cri is the _command_, which has option definitions as
+well as code for actually executing itself. In Cri, the commandline tool
+itself is a command as well.
+
+Here’s a sample command definition:
+
+ command = Cri::Command.define do
+ name 'dostuff'
+ usage 'dostuff [options]'
+ aliases :ds, :stuff
+ summary 'does stuff'
+ description 'This command does a lot of stuff. I really mean a lot.'
+
+ flag :h, :help, 'show help for this command' do |value, cmd|
+ puts cmd.help
+ exit 0
+ end
+ flag :m, :more, 'do even more stuff'
+ option :s, :stuff, 'specify stuff to do', :argument => :required
+
+ run do |opts, args, cmd|
+ stuff = opts[:stuff] || 'generic stuff'
+ puts "Doing #{stuff}!"
+
+ if opts[:more]
+ puts 'Doing it even more!'
+ end
+ end
+ end
+
+To run this command, invoke the `#run` method with the raw arguments. For
+example, for a root command (the commandline tool itself), the command could
+be called like this:
+
+ command.run(ARGS)
+
+Each command has automatically generated help. This help can be printed using
+{Cri::Command#help}; something like this will be shown:
+
+ usage: dostuff [options]
+
+ does stuff
+
+ This command does a lot of stuff. I really mean a lot.
+
+ options:
+
+ -h --help show help for this command
+ -m --more do even more stuff
+ -s --stuff specify stuff to do
+
+Let’s disect the command definition and start with the first five lines:
+
+ name 'dostuff'
+ usage 'dostuff [options]'
+ aliases :ds, :stuff
+ summary 'does stuff'
+ description 'This command does a lot of stuff. I really mean a lot.'
+
+These lines of the command definition specify the name of the command (or the
+commandline tool, if the command is the root command), the usage, a list of
+aliases that can be used to call this command, a one-line summary and a (long)
+description. The usage should not include a “usage:” prefix nor the name of
+the supercommand, because the latter will be automatically prepended.
+
+Aliases don’t make sense for root commands, but for subcommands they do.
+
+The next few lines contain the command’s option definitions:
+
+ flag :h, :help, 'show help for this command' do |value, cmd|
+ puts cmd.help
+ exit 0
+ end
+ flag :m, :more, 'do even more stuff'
+ option :s, :stuff, 'specify stuff to do', :argument => :required
+
+Options can be defined using the following methods:
+
+* {Cri::CommandDSL#option} or {Cri::CommandDSL#opt}
+* {Cri::CommandDSL#flag} (implies forbidden argument)
+* {Cri::CommandDSL#required} (implies required argument)
+* {Cri::CommandDSL#optional} (implies optional argument)
+
+Each of the above methods also take a block, which will be executed when the
+option is found. The argument to the block are the option value (`true` in
+case the option does not have an argument) and the command.
+
+The last part of the command defines the execution itself:
+
+ run do |opts, args, cmd|
+ stuff = opts[:stuff] || 'generic stuff'
+ puts "Doing #{stuff}!"
+
+ if opts[:more]
+ puts 'Doing it even more!'
+ end
+ end
+
+The {Cri::CommandDSL#run} method takes a block with the actual code to
+execute. This block takes three arguments: the options, any arguments passed
+to the command, and the command itself.
+
+Commands can have subcommands. For example, the `git` commandline tool would be represented by a command that has subcommands named `commit`, `add`, and so on. Commands with subcommands do not use a run block; execution will always be dispatched to a subcommand (or none, if no subcommand is found).
+
+To add a command as a subcommand to another command, use the {Cri::Command#add_command} method, like this:
+
+ root_cmd.add_command cmd_add
+ root_cmd.add_command cmd_commit
+ root.cmd.add_command cmd_init
Contributors
------------
(In alphabetical order)