require 'user-choices/arglist-strategies' require 'user-choices/builder' require 'user-choices/command' require 'user-choices/command-line-source' require "user-choices/conversions" require "user-choices/ruby-extensions" require 'user-choices/sources' require 'user-choices/version' =begin rdoc UserChoices provides a unified interface to more than one source of user choices: the command line, environment variables, configuration files, and the choice to use program defaults. A typical usage defines allowable choices within the framework of a Command object: class Example < Command # The sources are the various places in which the user can # describe her choices to the program. def add_sources(builder) builder.add_source(...) ... end # Each individual choice is named with a symbol that is common # to all sources. def add_choices(builder) builder.add_choice(:choice, ...) { | command_line | ... } end # Immediately after recording the choices, the program can # add new (derived ones) or do any other once-per-program # initialization. def postprocess_user_choices ... @user_choices ... end # Perform the command. def execute ... end end ... CommandLineExample.new.execute ... = Describing sources Sources are described by ChoicesBuilder#add_source. EnvironmentSource describes the use of environment variables as sources. The following says that all environment variables beginning with "amazon_" are choices about this program. builder.add_source(EnvironmentSource, :with_prefix, "amazon_") XmlConfigFileSource points to a configuration file with choices. builder.add_source(XmlConfigFileSource, :from_file, "ms-config.xml") CommandLineSource uses the command line options and arguments as a source of choices. The following gives the usage line for the script: builder.add_source(CommandLineSource, :usage, "Usage ruby #{$0} [options] names...") = Describing choices The end result of the process is a hash mapping choices to chosen values. Choices are named by symbols. They are described by ChoicesBuilder#add_choice. Here are simple examples that don't involve the command line. The first just names a choice. builder.add_choice(:ordinary_choice) The second gives a default value: builder.add_choice(:ordinary_choice, :default => "eaargh") The second gives a default value and a type. The type is used to check the value and, if appropriate, to convert the value away from a string. Note that the default is always a string regardless of the type. builder.add_choice(:on, :default => "false", :type => :boolean) = Command line options ChoicesBuilder#add_choice passes a CommandLineSource object to a block. That can be used to describe the command line. The syntax is the same as OptionParser. In the following, ordinary_choice can be specified with either the -o or --ordinary-choice options. The strings also appear in help messages (automatically produced from ruby script --help). builder.add_choice(:ordinary_choice, :default => 'default') { | command_line | command_line.uses_option("-o", "--ordinary-choice CHOICE", "CHOICE can be any string.") } The command line's argument list (everything that's not an option) can be bundled up into another choice. Here, the arguments become an array named by :names: builder.add_choice(:names) { | command_line | command_line.uses_arglist } = Using choices Most often, choices are used within the context of a Command object. They are stored in a hash named by instance variable @user_choices (or accessor +user_choices+). class AffinityTripCommand < Command ... def execute starting_url = @strategy.url_for(self.user_choices[:isbn]) take_trip(starting_url, self.user_choices[:trip_steps]) end You can construct the hash directly with ChoicesBuilder#build. That's not needed or used when using the Command object. =end module UserChoices end