user-choices 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +17 -0
- data/LICENSE.txt +34 -0
- data/Manifest.txt +40 -0
- data/README.txt +1 -0
- data/Rakefile +19 -0
- data/Rakefile.hoe +24 -0
- data/examples/older/README.txt +133 -0
- data/examples/older/command-line.rb +51 -0
- data/examples/older/default-values.rb +47 -0
- data/examples/older/multiple-sources.rb +63 -0
- data/examples/older/postprocess.rb +45 -0
- data/examples/older/switches.rb +50 -0
- data/examples/older/two-args.rb +37 -0
- data/examples/older/types.rb +67 -0
- data/examples/tutorial/index.html +648 -0
- data/examples/tutorial/tutorial1.rb +48 -0
- data/examples/tutorial/tutorial2.rb +52 -0
- data/examples/tutorial/tutorial3.rb +55 -0
- data/examples/tutorial/tutorial4.rb +55 -0
- data/examples/tutorial/tutorial5.rb +42 -0
- data/examples/tutorial/tutorial6.rb +42 -0
- data/examples/tutorial/tutorial7.rb +48 -0
- data/lib/user-choices/arglist-strategies.rb +178 -0
- data/lib/user-choices/builder.rb +89 -0
- data/lib/user-choices/command-line-source.rb +220 -0
- data/lib/user-choices/command.rb +42 -0
- data/lib/user-choices/conversions.rb +154 -0
- data/lib/user-choices/ruby-extensions.rb +20 -0
- data/lib/user-choices/sources.rb +269 -0
- data/lib/user-choices/version.rb +3 -0
- data/lib/user-choices.rb +131 -0
- data/setup.rb +1585 -0
- data/test/arglist-strategy-tests.rb +42 -0
- data/test/builder-tests.rb +569 -0
- data/test/command-line-source-tests.rb +443 -0
- data/test/conversion-tests.rb +157 -0
- data/test/set-standalone-test-paths.rb +5 -0
- data/test/source-tests.rb +442 -0
- data/test/user-choices-slowtests.rb +274 -0
- data/user-choices.tmproj +575 -0
- metadata +138 -0
data/History.txt
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
Version 1.1.0
|
2
|
+
* Handles YAML files as well as XML.
|
3
|
+
* Minor, incompatible changes to the API.
|
4
|
+
* Command-line arglist handling now works with other sources the
|
5
|
+
way options do. In particular, an empty arglist can, for example,
|
6
|
+
have its value given by defaults rather than locking the value
|
7
|
+
of the choice down to the empty array.
|
8
|
+
* Command-line arglists used to have their length specified independently
|
9
|
+
of all other sources. Now there's a :length "type" that applies to all
|
10
|
+
sources, including the command line. From the user's point of view,
|
11
|
+
though, wrong-sized arglists look like they're caught by OptionParser.
|
12
|
+
* These relatively minor changes required a bigger overhaul to the
|
13
|
+
internals. They're less stupid, but I suspect they're still stupid.
|
14
|
+
* A tutorial.
|
15
|
+
|
16
|
+
Version 1.0.0
|
17
|
+
* Version from _Everyday Scripting with Ruby_
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
This software is Copyright (C) 2007 by Brian Marick <marick@exampler.com>. It is licensed according to "the Ruby license". Specifically:
|
2
|
+
|
3
|
+
You can redistribute it and/or modify it under either the terms of the GNU General Public License, version 2, <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html> or the conditions below:
|
4
|
+
|
5
|
+
1. You may make and give away verbatim copies of the source form of the
|
6
|
+
software without restriction, provided that you duplicate all of the
|
7
|
+
original copyright notices and associated disclaimers.
|
8
|
+
|
9
|
+
2. You may modify your copy of the software in any way, provided that
|
10
|
+
you do at least ONE of the following:
|
11
|
+
|
12
|
+
a) place your modifications in the Public Domain or otherwise
|
13
|
+
make them Freely Available, such as by posting said
|
14
|
+
modifications to Usenet or an equivalent medium, or by allowing
|
15
|
+
the author to include your modifications in the software.
|
16
|
+
|
17
|
+
b) use the modified software only within your corporation or
|
18
|
+
organization.
|
19
|
+
|
20
|
+
c) make other distribution arrangements with the author.
|
21
|
+
|
22
|
+
3. You may modify and include part of the software into any other
|
23
|
+
software (possibly commercial).
|
24
|
+
|
25
|
+
4. Text or files supplied as input to or produced as output from
|
26
|
+
the software do not automatically fall under the copyright of the
|
27
|
+
software, but belong to whomever generated them, and may be sold
|
28
|
+
commercially, and may be aggregated with this software.
|
29
|
+
|
30
|
+
5. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
31
|
+
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
32
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
33
|
+
PURPOSE.
|
34
|
+
|
data/Manifest.txt
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
History.txt
|
2
|
+
LICENSE.txt
|
3
|
+
Manifest.txt
|
4
|
+
README.txt
|
5
|
+
Rakefile
|
6
|
+
Rakefile.hoe
|
7
|
+
examples/older/README.txt
|
8
|
+
examples/older/command-line.rb
|
9
|
+
examples/older/default-values.rb
|
10
|
+
examples/older/multiple-sources.rb
|
11
|
+
examples/older/postprocess.rb
|
12
|
+
examples/older/switches.rb
|
13
|
+
examples/older/two-args.rb
|
14
|
+
examples/older/types.rb
|
15
|
+
examples/tutorial/index.html
|
16
|
+
examples/tutorial/tutorial1.rb
|
17
|
+
examples/tutorial/tutorial2.rb
|
18
|
+
examples/tutorial/tutorial3.rb
|
19
|
+
examples/tutorial/tutorial4.rb
|
20
|
+
examples/tutorial/tutorial5.rb
|
21
|
+
examples/tutorial/tutorial6.rb
|
22
|
+
examples/tutorial/tutorial7.rb
|
23
|
+
lib/user-choices.rb
|
24
|
+
lib/user-choices/arglist-strategies.rb
|
25
|
+
lib/user-choices/builder.rb
|
26
|
+
lib/user-choices/command-line-source.rb
|
27
|
+
lib/user-choices/command.rb
|
28
|
+
lib/user-choices/conversions.rb
|
29
|
+
lib/user-choices/ruby-extensions.rb
|
30
|
+
lib/user-choices/sources.rb
|
31
|
+
lib/user-choices/version.rb
|
32
|
+
setup.rb
|
33
|
+
test/arglist-strategy-tests.rb
|
34
|
+
test/builder-tests.rb
|
35
|
+
test/command-line-source-tests.rb
|
36
|
+
test/conversion-tests.rb
|
37
|
+
test/set-standalone-test-paths.rb
|
38
|
+
test/source-tests.rb
|
39
|
+
test/user-choices-slowtests.rb
|
40
|
+
user-choices.tmproj
|
data/README.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
The best introduction to user-choices is the tutorial[http://user-choices.rubyforge.org].
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# This is a Makefile that would live in the root folder for a package
|
2
|
+
# that follows the Scripting for Testers conventions.
|
3
|
+
|
4
|
+
$started_from_rakefile = true
|
5
|
+
|
6
|
+
PACKAGE_ROOT = Dir.pwd
|
7
|
+
$:.unshift("#{PACKAGE_ROOT}/lib")
|
8
|
+
require 's4t-utils/load-path-auto-adjuster'
|
9
|
+
|
10
|
+
require 's4t-utils'
|
11
|
+
include S4tUtils
|
12
|
+
|
13
|
+
MyFileSystemName='user-choices' # No ".rb" extension.
|
14
|
+
MyModuleName='UserChoices'
|
15
|
+
MyRdocFiles = FileList.new("lib/#{MyFileSystemName}.rb",
|
16
|
+
"lib/#{MyFileSystemName}/**/*.rb").exclude('**/third-party/**')
|
17
|
+
|
18
|
+
require 's4t-utils/rakefile-common'
|
19
|
+
|
data/Rakefile.hoe
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Created by Brian Marick on 2007-07-03.
|
4
|
+
# Copyright (c) 2007. All rights reserved.
|
5
|
+
|
6
|
+
require 'hoe'
|
7
|
+
require 'lib/user-choices/version'
|
8
|
+
|
9
|
+
Hoe.new("user-choices", UserChoices::Version) do |p|
|
10
|
+
p.rubyforge_name = "user-choices"
|
11
|
+
p.changes = "See History.txt"
|
12
|
+
p.author = "Brian Marick"
|
13
|
+
p.description = "Unified interface to command-line, environment, and configuration files."
|
14
|
+
p.summary = p.description
|
15
|
+
p.email = "marick@exampler.com"
|
16
|
+
p.extra_deps = [['xmp-simple', '>= 1.0.11'],
|
17
|
+
['s4t-utils', '>= 1.0.2'],
|
18
|
+
['extensions', '>= 0.6.0'], # for testing
|
19
|
+
['builder' '>= 2.1.2']] # for testing
|
20
|
+
p.test_globs = "test/**/*-tests.rb"
|
21
|
+
p.rdoc_pattern = %r{README.txt|History.txt|lib/user-choices.rb|lib/user-choices/.+\.rb}
|
22
|
+
p.url = "http://user-choices.rubyforge.org"
|
23
|
+
p.remote_rdoc_dir = 'rdoc'
|
24
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
Here are brief instructions for using the different scripts in this directory. The tutorial files aren't described here; instead, the tutorial (on the website) describes them.
|
2
|
+
|
3
|
+
|
4
|
+
== Command-line arguments ==
|
5
|
+
|
6
|
+
+ Help is generated for you:
|
7
|
+
|
8
|
+
prompt> ruby command-line.rb --help
|
9
|
+
|
10
|
+
+ Options are placed into a hash, as is the argument list
|
11
|
+
|
12
|
+
prompt> ruby command-line.rb --choice cho sophie paul dawn me
|
13
|
+
|
14
|
+
+ The usual variant ways of specifying options
|
15
|
+
|
16
|
+
prompt> ruby command-line.rb -c choice
|
17
|
+
prompt> ruby command-line.rb -cchoice
|
18
|
+
prompt> ruby command-line.rb --choi choice
|
19
|
+
prompt> ruby command-line.rb --choi choice -- -name1- -name2-
|
20
|
+
|
21
|
+
+ There are error messages for extra and malformed options
|
22
|
+
|
23
|
+
prompt> ruby command-line.rb --choice
|
24
|
+
prompt> ruby command-line.rb --other 3 -- choice
|
25
|
+
|
26
|
+
== Default values ==
|
27
|
+
|
28
|
+
+ You can specify default values when you define choices.
|
29
|
+
|
30
|
+
prompt> ruby default-values.rb --choice specific
|
31
|
+
prompt> ruby default-values.rb
|
32
|
+
|
33
|
+
+ Note: defaulting behavior applies to other sources of choices, not
|
34
|
+
just command lines.
|
35
|
+
|
36
|
+
== Optional arguments ==
|
37
|
+
|
38
|
+
+ When single optional arguments are required, the result is not a
|
39
|
+
list - it's either the value or nothing.
|
40
|
+
|
41
|
+
prompt> ruby default-values.rb only-arg
|
42
|
+
|
43
|
+
== Type checks and conversions
|
44
|
+
|
45
|
+
+ There are ways to describe what kind of thing an argument
|
46
|
+
is. (Currently limited.)
|
47
|
+
|
48
|
+
prompt> ruby types.rb --a-or-b not-a argument
|
49
|
+
prompt> ruby types.rb --must-be-integer 1d argument
|
50
|
+
prompt> ruby types.rb --option-list first,second argument
|
51
|
+
|
52
|
+
+ Integer-valued options are converted into integers, not left as
|
53
|
+
strings:
|
54
|
+
|
55
|
+
prompt> ruby types.rb --must-be-integer 3 argument
|
56
|
+
|
57
|
+
+ Type-checking and type conversions apply to all sources, not just
|
58
|
+
command lines.
|
59
|
+
|
60
|
+
== Required Arguments ==
|
61
|
+
|
62
|
+
+ You can require exactly one argument:
|
63
|
+
|
64
|
+
prompt> ruby types.rb
|
65
|
+
prompt> ruby types.rb argument extra-argument
|
66
|
+
|
67
|
+
== Switches (values without arguments) ==
|
68
|
+
|
69
|
+
+ Switches can also be specified. Typically, their values are either
|
70
|
+
true or false (rather than strings or numbers).
|
71
|
+
|
72
|
+
+ How they are given on the command line may be unfamiliar to you:
|
73
|
+
|
74
|
+
prompt> ruby switches.rb --help
|
75
|
+
|
76
|
+
+ Examples of use:
|
77
|
+
|
78
|
+
prompt> ruby switches.rb 1 2
|
79
|
+
prompt> ruby switches.rb --switch 1 2
|
80
|
+
prompt> ruby switches.rb -s 2 1
|
81
|
+
prompt> ruby switches.rb --no-switch 1 2
|
82
|
+
|
83
|
+
== A range of arguments ==
|
84
|
+
|
85
|
+
+ You can require that the number of arguments be in a range. In this
|
86
|
+
case, it's 2-4:
|
87
|
+
|
88
|
+
prompt> ruby switches.rb 1
|
89
|
+
prompt> ruby switches.rb 1 2
|
90
|
+
prompt> ruby switches.rb 1 2 3 4
|
91
|
+
prompt> ruby switches.rb 1 2 3 4 5
|
92
|
+
|
93
|
+
+ You can also require any particular exact number of arguments:
|
94
|
+
|
95
|
+
prompt> ruby two-args.rb 1
|
96
|
+
prompt> ruby two-args.rb 1 2
|
97
|
+
prompt> ruby two-args.rb 1 2 3
|
98
|
+
|
99
|
+
== Postprocessing ==
|
100
|
+
|
101
|
+
+ You can also postprocess choices into a form more convenient for the
|
102
|
+
rest of the program.
|
103
|
+
|
104
|
+
prompt> ruby postprocess.rb 1 2
|
105
|
+
|
106
|
+
== Multiple Sources ==
|
107
|
+
|
108
|
+
+ First see what happens when no arguments are given.
|
109
|
+
|
110
|
+
prompt> ruby command-line.rb
|
111
|
+
|
112
|
+
+ Create a file named ms-config.xml in your home / login folder, and
|
113
|
+
put the following in it. (Note the underscore in "ordinary_choice" -
|
114
|
+
this is the name of the choice, not the representation of that choice
|
115
|
+
on the command line.)
|
116
|
+
|
117
|
+
<config>
|
118
|
+
<ordinary_choice>greetings</ordinary_choice>
|
119
|
+
</config>
|
120
|
+
|
121
|
+
prompt> ruby multiple-sources.rb
|
122
|
+
|
123
|
+
Set an environment variable ms_ordinary_choice with value 'hi'.
|
124
|
+
|
125
|
+
prompt> ruby multiple-sources.rb
|
126
|
+
|
127
|
+
Which takes precedence, the environment or the configuration file?
|
128
|
+
(This is configurable.)
|
129
|
+
|
130
|
+
The command line arguments have highest precedence of all:
|
131
|
+
|
132
|
+
prompt> ruby multiple-sources.rb --ordinary-choice hello
|
133
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
### The following adjusts the load path so that the correct version of
|
2
|
+
### a self-contained package is found, no matter where the script is
|
3
|
+
### run from.
|
4
|
+
require 'pathname'
|
5
|
+
$:.unshift((Pathname.new(__FILE__).parent.parent.parent + 'lib').to_s)
|
6
|
+
require 's4t-utils/load-path-auto-adjuster'
|
7
|
+
|
8
|
+
require 'pp'
|
9
|
+
require 'user-choices'
|
10
|
+
|
11
|
+
class CommandLineExample < UserChoices::Command
|
12
|
+
|
13
|
+
# The _sources_ are the various places in which the user can
|
14
|
+
# describe her choices to the program. In this case, there's
|
15
|
+
# only the command line.
|
16
|
+
|
17
|
+
def add_sources(builder)
|
18
|
+
builder.add_source(UserChoices::CommandLineSource, :usage,
|
19
|
+
"Usage: ruby #{$0} [options] names...")
|
20
|
+
end
|
21
|
+
|
22
|
+
# Each individual choice is named with a symbol. The block
|
23
|
+
# describes the command line options corresponding to the choice, plus
|
24
|
+
# any help text for that option. The arguments to uses_options are passed
|
25
|
+
# on to OptionParser.
|
26
|
+
|
27
|
+
def add_choices(builder)
|
28
|
+
builder.add_choice(:choice) { | command_line |
|
29
|
+
command_line.uses_option("-c", "--choice CHOICE",
|
30
|
+
"CHOICE can be any string.")
|
31
|
+
}
|
32
|
+
|
33
|
+
# The argument list to the command is interpreted as another
|
34
|
+
# option. In this case, it's a list of strings.
|
35
|
+
builder.add_choice(:names) { | command_line |
|
36
|
+
command_line.uses_arglist
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
# Perform the command.
|
41
|
+
def execute
|
42
|
+
pp @user_choices
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
if $0 == __FILE__
|
48
|
+
S4tUtils.with_pleasant_exceptions do
|
49
|
+
CommandLineExample.new.execute
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
### The following adjusts the load path so that the correct version of
|
2
|
+
### a self-contained package is found, no matter where the script is
|
3
|
+
### run from.
|
4
|
+
require 'pathname'
|
5
|
+
$:.unshift((Pathname.new(__FILE__).parent.parent.parent + 'lib').to_s)
|
6
|
+
require 's4t-utils/load-path-auto-adjuster'
|
7
|
+
|
8
|
+
|
9
|
+
require 'pp'
|
10
|
+
require 'user-choices'
|
11
|
+
|
12
|
+
class ArgNotingCommand < UserChoices::Command
|
13
|
+
|
14
|
+
def add_sources(builder)
|
15
|
+
builder.add_source(UserChoices::CommandLineSource, :usage,
|
16
|
+
"Usage: ruby #{$0} [options] [name]")
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_choices(builder)
|
20
|
+
# This example shows how you can specify a default value for an
|
21
|
+
# option.
|
22
|
+
builder.add_choice(:choice,
|
23
|
+
:default => 'default') { | command_line |
|
24
|
+
command_line.uses_option("-c", "--choice CHOICE",
|
25
|
+
"CHOICE can be any string.")
|
26
|
+
}
|
27
|
+
|
28
|
+
# uses_optional_arg allows either zero or one arguments. If an
|
29
|
+
# argument is given, it is directly the value of user_choices[key]
|
30
|
+
# (rather than being stored as a single-element array).
|
31
|
+
builder.add_choice(:name) { | command_line |
|
32
|
+
command_line.uses_optional_arg
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
# Perform the command.
|
37
|
+
def execute
|
38
|
+
pp @user_choices
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
if $0 == __FILE__
|
44
|
+
S4tUtils.with_pleasant_exceptions do
|
45
|
+
ArgNotingCommand.new.execute
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
### The following adjusts the load path so that the correct version of
|
2
|
+
### a self-contained package is found, no matter where the script is
|
3
|
+
### run from.
|
4
|
+
require 'pathname'
|
5
|
+
$:.unshift((Pathname.new(__FILE__).parent.parent.parent + 'lib').to_s)
|
6
|
+
require 's4t-utils/load-path-auto-adjuster'
|
7
|
+
|
8
|
+
require 'pp'
|
9
|
+
require 'user-choices'
|
10
|
+
|
11
|
+
class MultipleSourcesExample < UserChoices::Command
|
12
|
+
include UserChoices
|
13
|
+
|
14
|
+
# Here are the four sources currently available.
|
15
|
+
#
|
16
|
+
# EnvironmentSource is initialized with a prefix. If a choice is
|
17
|
+
# named "foo" and the prefix is "ms_", then the value of
|
18
|
+
# ENV["ms_foo"] initializes user_choices[:foo].
|
19
|
+
#
|
20
|
+
# YamlConfigFileSource reads from a given YAML file. The choices in the
|
21
|
+
# config file have the same spelling as the choice name (without the
|
22
|
+
# colon that makes the choice name a symbol).
|
23
|
+
#
|
24
|
+
# XmlConfigFileSource reads from a given XML file. The choices in the
|
25
|
+
# config file have the same spelling as the choice name (without the
|
26
|
+
# colon that makes the choice name a symbol).
|
27
|
+
#
|
28
|
+
# CommandLineSource uses the command line (including the argument list).
|
29
|
+
# Much of the initialization is done with a block attached to add_choice.
|
30
|
+
#
|
31
|
+
# Sources are added in descending order of precedence.
|
32
|
+
|
33
|
+
def add_sources(builder)
|
34
|
+
builder.add_source(CommandLineSource, :usage,
|
35
|
+
"Usage: ruby #{$0} [options] names...")
|
36
|
+
builder.add_source(EnvironmentSource, :with_prefix, "ms_")
|
37
|
+
builder.add_source(YamlConfigFileSource, :from_file, "ms-config.yml")
|
38
|
+
builder.add_source(XmlConfigFileSource, :from_file, "ms-config.xml")
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_choices(builder)
|
42
|
+
builder.add_choice(:ordinary_choice,
|
43
|
+
:default => 'default') { | command_line |
|
44
|
+
command_line.uses_option("-o", "--ordinary-choice CHOICE",
|
45
|
+
"CHOICE can be any string.")
|
46
|
+
}
|
47
|
+
|
48
|
+
builder.add_choice(:names) { | command_line |
|
49
|
+
command_line.uses_arglist
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def execute
|
54
|
+
pp @user_choices
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
if $0 == __FILE__
|
60
|
+
S4tUtils.with_pleasant_exceptions do
|
61
|
+
MultipleSourcesExample.new.execute
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
### The following adjusts the load path so that the correct version of
|
2
|
+
### a self-contained package is found, no matter where the script is
|
3
|
+
### run from.
|
4
|
+
require 'pathname'
|
5
|
+
$:.unshift((Pathname.new(__FILE__).parent.parent.parent + 'lib').to_s)
|
6
|
+
require 's4t-utils/load-path-auto-adjuster'
|
7
|
+
|
8
|
+
|
9
|
+
require 'pp'
|
10
|
+
require 'user-choices'
|
11
|
+
|
12
|
+
class ArgNotingCommand < UserChoices::Command
|
13
|
+
|
14
|
+
def add_sources(builder)
|
15
|
+
builder.add_source(UserChoices::CommandLineSource, :usage,
|
16
|
+
"Usage: ruby #{$0} [options] infile outfile")
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_choices(builder)
|
21
|
+
builder.add_choice(:args, :length => 2) { | command_line |
|
22
|
+
command_line.uses_arglist
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
# postprocess_user_choices gives the program the opportunity to
|
27
|
+
# do something about choices immediately after they are made. This method
|
28
|
+
# runs only once per invocation, whereas the execute() method can
|
29
|
+
# execute several times. This method will often set instance variables.
|
30
|
+
def postprocess_user_choices
|
31
|
+
@user_choices[:infile] = @user_choices[:args][0]
|
32
|
+
@user_choices[:outfile] = @user_choices[:args][1]
|
33
|
+
end
|
34
|
+
|
35
|
+
def execute
|
36
|
+
pp @user_choices
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
if $0 == __FILE__
|
42
|
+
S4tUtils.with_pleasant_exceptions do
|
43
|
+
ArgNotingCommand.new.execute
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
### The following adjusts the load path so that the correct version of
|
2
|
+
### a self-contained package is found, no matter where the script is
|
3
|
+
### run from.
|
4
|
+
require 'pathname'
|
5
|
+
$:.unshift((Pathname.new(__FILE__).parent.parent.parent + 'lib').to_s)
|
6
|
+
require 's4t-utils/load-path-auto-adjuster'
|
7
|
+
|
8
|
+
|
9
|
+
require 'pp'
|
10
|
+
require 'user-choices'
|
11
|
+
|
12
|
+
class SwitchExample < UserChoices::Command
|
13
|
+
|
14
|
+
def add_sources(builder)
|
15
|
+
builder.add_source(UserChoices::CommandLineSource, :usage,
|
16
|
+
"Usage: ruby #{$0} [options] args...",
|
17
|
+
"There may be 2-4 arguments.")
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
# Switches are slightly different than options. (The difference is
|
22
|
+
# in how they're invoked, as either --switch or --no-switch.) Almost
|
23
|
+
# certainly, you want the switch to be of type :boolean and have a
|
24
|
+
# default.
|
25
|
+
def add_choices(builder)
|
26
|
+
builder.add_choice(:switch,
|
27
|
+
:default => false,
|
28
|
+
:type => :boolean) { | command_line |
|
29
|
+
command_line.uses_switch("--switch", "-s")
|
30
|
+
}
|
31
|
+
|
32
|
+
# You control the allowable length of a choice with the :length
|
33
|
+
# keyword argument. It applies to command-line arglists, lists given
|
34
|
+
# in configuration files, and the like.
|
35
|
+
builder.add_choice(:args, :length => 2..4) { | command_line |
|
36
|
+
command_line.uses_arglist
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
def execute
|
41
|
+
pp @user_choices
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
if $0 == __FILE__
|
47
|
+
S4tUtils.with_pleasant_exceptions do
|
48
|
+
SwitchExample.new.execute
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
### The following adjusts the load path so that the correct version of
|
2
|
+
### a self-contained package is found, no matter where the script is
|
3
|
+
### run from.
|
4
|
+
require 'pathname'
|
5
|
+
$:.unshift((Pathname.new(__FILE__).parent.parent.parent + 'lib').to_s)
|
6
|
+
require 's4t-utils/load-path-auto-adjuster'
|
7
|
+
|
8
|
+
|
9
|
+
require 'pp'
|
10
|
+
require 'user-choices'
|
11
|
+
|
12
|
+
class TwoArgExample < UserChoices::Command
|
13
|
+
|
14
|
+
def add_sources(builder)
|
15
|
+
builder.add_source(UserChoices::CommandLineSource, :usage,
|
16
|
+
"Usage: ruby #{$0} [options] infile outfile")
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_choices(builder)
|
21
|
+
# You can specify an exact number of array elements required.
|
22
|
+
builder.add_choice(:args, :length => 2) { | command_line |
|
23
|
+
command_line.uses_arglist
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def execute
|
28
|
+
pp @user_choices
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
if $0 == __FILE__
|
34
|
+
S4tUtils.with_pleasant_exceptions do
|
35
|
+
TwoArgExample.new.execute
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
### The following adjusts the load path so that the correct version of
|
2
|
+
### a self-contained package is found, no matter where the script is
|
3
|
+
### run from.
|
4
|
+
require 'pathname'
|
5
|
+
$:.unshift((Pathname.new(__FILE__).parent.parent.parent + 'lib').to_s)
|
6
|
+
require 's4t-utils/load-path-auto-adjuster'
|
7
|
+
|
8
|
+
|
9
|
+
require 'pp'
|
10
|
+
require 'user-choices'
|
11
|
+
include UserChoices
|
12
|
+
|
13
|
+
class TypesExample < Command
|
14
|
+
|
15
|
+
def add_sources(builder)
|
16
|
+
builder.add_source(CommandLineSource, :usage,
|
17
|
+
"Usage: ruby #{$0} [options] arg")
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_choices(builder)
|
21
|
+
# This is how you restrict an option argument to one of a list of
|
22
|
+
# strings.
|
23
|
+
builder.add_choice(:a_or_b,
|
24
|
+
:type => ['a', 'b']) { | command_line |
|
25
|
+
command_line.uses_option("--a-or-b CHOICE",
|
26
|
+
"CHOICE is either 'a' or 'b'")
|
27
|
+
}
|
28
|
+
|
29
|
+
# This is how you insist that an option argument be an integer
|
30
|
+
# (in string form). If correctly formatted, the string is turned
|
31
|
+
# into an integer. Note that the default value can be either a
|
32
|
+
# string or an integer.
|
33
|
+
builder.add_choice(:must_be_integer,
|
34
|
+
:default => 0,
|
35
|
+
:type => :integer) { | command_line |
|
36
|
+
command_line.uses_option("--must-be-integer INT")
|
37
|
+
}
|
38
|
+
|
39
|
+
# This is how to tell the builder that the argument is a
|
40
|
+
# comma-separated list of options. The declaration is not required
|
41
|
+
# for command lines, or lists in a configuration file. Those are
|
42
|
+
# already broken out into their constituent elements in the source
|
43
|
+
# text, so the builder doesn't have to split a string at comma
|
44
|
+
# boundaries. You can declare the type if you want, though.
|
45
|
+
|
46
|
+
builder.add_choice(:option_list, :type => [:string], :length => 2) { | command_line |
|
47
|
+
command_line.uses_option("--option-list OPT,OPT",
|
48
|
+
"Comma-separated list of exactly two options.")
|
49
|
+
}
|
50
|
+
|
51
|
+
|
52
|
+
builder.add_choice(:arg) { | command_line |
|
53
|
+
command_line.uses_arg
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def execute
|
58
|
+
pp @user_choices
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
if $0 == __FILE__
|
64
|
+
S4tUtils.with_pleasant_exceptions do
|
65
|
+
TypesExample.new.execute
|
66
|
+
end
|
67
|
+
end
|