cmd-utils 1.0.6

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/lib/cmd-utils.rb ADDED
@@ -0,0 +1,187 @@
1
+ # cmd-utils.rb -- simple utilities for ruby command line tools
2
+ #
3
+ # Alan K. Stebbens <aks@stebbens.org>
4
+ #
5
+ #
6
+ # require 'cmd-utils'
7
+ #
8
+ # Utilities for output, and running commands.
9
+ #
10
+ # The output and run methods rely on some external variables:
11
+ #
12
+ # $verbose -- causes certain commands to talk more
13
+ # $norun -- causes the "run" command to print its argument, but not actually run it.
14
+ # $quiet -- causes certain commands to talk less
15
+ #
16
+ # These routines provide conditional output. The arguments can be given as part of the
17
+ # the function calls, or, can be provided as the return value of a block. The advantage
18
+ # of using a block is that the block is not evaluated unless the conditions requiring
19
+ # output are met. So, if the expression to compute a value that _might_ be printed is
20
+ # expensive, do the computation inside a block.
21
+ #
22
+ ##
23
+ # talk - Print msg on STDERR unless `$quiet` is set
24
+ #
25
+ # :call-seq:
26
+ # talk msg
27
+ # talk { msg }
28
+ # talkf fmt, args ...
29
+ # talkf fmt { [ args ... ] }
30
+
31
+ def talk msg=nil
32
+ if !$quiet && (msg || block_given?)
33
+ $stderr.puts(msg || yield)
34
+ end
35
+ end
36
+
37
+ def talkf fmt='%s', *args
38
+ args = yield if args.size == 0 && block_given?
39
+ talk { sprintf(fmt, *args) }
40
+ end
41
+
42
+ ##
43
+ # qtalk - Print msg on STDERR only if `$quiet` is set
44
+ #
45
+ # :call-seq:
46
+ # qtalk msg
47
+ # qtalk { msg }
48
+ # qtalkf fmt, args ..
49
+ # qtalkf fmt { [ args .. ] }
50
+
51
+ def qtalk msg=nil
52
+ if $quiet && (msg || block_given?)
53
+ $stderr.puts(msg || yield)
54
+ end
55
+ end
56
+
57
+ def qtalkf fmt='%s', *args
58
+ args = yield if args.size == 0 && block_given?
59
+ qtalk { sprintf(fmt, *args) }
60
+ end
61
+
62
+ ##
63
+ # vtalk -- Print msg on STDERR if `$verbose` is set
64
+ #
65
+ # :call-seq:
66
+ # vtalk msg
67
+ # vtalk { msg }
68
+ # vtalkf fmt, args ..
69
+ # vtalkf fmt { args .. }
70
+
71
+ def vtalk msg=nil
72
+ if $verbose && (msg || block_given?)
73
+ $stderr.puts(msg || yield)
74
+ end
75
+ end
76
+
77
+ def vtalkf fmt='%s', *args
78
+ args = yield if args.size == 0 && block_given?
79
+ vtalk { sprintf(fmt, *args) }
80
+ end
81
+
82
+ ##
83
+ # nvtalk -- Print msg on STDERR unless `$verbose` is set
84
+ #
85
+ # :call-seq:
86
+ # nvtalk msg
87
+ # nvtalk { msg }
88
+
89
+ def nvtalk msg=nil
90
+ unless $verbose && (msg || block_given?)
91
+ $stderr.puts(msg || yield)
92
+ end
93
+ end
94
+
95
+ def nvtalkf fmt='%s', *args
96
+ args = yield if args.size == 0 && block_given?
97
+ nvtalk { sprintf(fmt, *args) }
98
+ end
99
+
100
+ ##
101
+ # nrtalk -- Print msg on STDERR only if `$norun` is set
102
+ #
103
+ # :call-seq:
104
+ # nrtalk msg
105
+ # nrtalk { msg }
106
+ # nrtalkf fmt, msg
107
+ # nrtalkf fmt { msg }
108
+
109
+ def nrtalk msg=nil
110
+ if $norun
111
+ $stderr.puts(msg || yield)
112
+ end
113
+ end
114
+
115
+ def nrtalkf *args
116
+ args = yield if args.size == 0 && block_given?
117
+ nrtalk { sprintf(*args) }
118
+ end
119
+
120
+ ##
121
+ # error -- print an error message on STDERR, and then exit.
122
+ # :call-seq:
123
+ # error [code], msg
124
+ # errof [code], fmt, args
125
+ #
126
+ # Code defaults to 1 if not given.
127
+
128
+ def error *args
129
+ args = yield if args.size == 0 && block_given?
130
+ code = args.size > 0 && args[0].class == Fixnum ? args.shift : 1
131
+ $stderr.puts(*args)
132
+ $stderr.flush
133
+ exit code
134
+ end
135
+
136
+ def errorf *args
137
+ args = yield if args.size == 0 && block_given?
138
+ code = args.size > 0 && args[0].class == Fixnum ? args.shift : 1
139
+ $stderr.printf(*args)
140
+ $stderr.flush
141
+ exit code
142
+ end
143
+
144
+ ##
145
+ # run -- run a command with support for testing, diagnostics and verbosity
146
+ # safe_run -- run a command with support for diagnostics and verbosity
147
+ #
148
+ # :call-seq:
149
+ # run cmd
150
+ # run { cmd }
151
+ # safe_run cmd
152
+ # safe_run { cmd }
153
+ #
154
+ # if `$norun` is set, print `(norun) ` followed by `cmd` on `STDERR`, and
155
+ # return.
156
+ #
157
+ # if `$verbose` is set, print `>> ` followed by `cmd` on `STDERR`.
158
+ #
159
+ # Invoke the `cmd` with the `system()` call.
160
+ #
161
+ # If there is an error, show the command (preceded by `>> `) if `$verbose` is
162
+ # not set, then show the error code.
163
+ #
164
+ # The `cmd` can be given either as an argument, or as the returned value from a
165
+ # block.
166
+
167
+ def run cmd=nil
168
+ cmd ||= block_given? && yield
169
+ if $norun
170
+ $stderr.printf "(norun) %s\n", cmd
171
+ else
172
+ safe_run cmd
173
+ end
174
+ end
175
+
176
+ def safe_run cmd=nil
177
+ cmd ||= block_given? && yield
178
+ vtalkf { [ ">> %s\n", cmd ] }
179
+ system cmd
180
+ if $? > 0
181
+ qtalkf { [ ">> %s\n", cmd ] }
182
+ errorf $?, "Command failed with code %d!\n", $?
183
+ end
184
+ end
185
+
186
+ # end of cmd-utils.sh
187
+ # vim: set ai sw=2
data/lib/lookup.rb ADDED
@@ -0,0 +1,71 @@
1
+ # lookup.rb -- simple keyword lookup routine
2
+ #
3
+ # Alan K. Stebbens <aks@stebbens.org>
4
+ #
5
+ # require 'lookup'
6
+ #
7
+ # lookup - lookup a keyword in a list, in a case-insensitive, disambiguous way
8
+ #
9
+ # :call-seq:
10
+ # result = lookup list, key, err_notfound="%s not found", err_ambig="% is ambiguous"
11
+ # result = list.lookup( key, err_notfound, err_ambig )
12
+ # result = list.lookup( key, err_notfound )
13
+ # result = list.lookup( key )
14
+ #
15
+ # Lookup key in list, which can be an array or a hash. Return the one that
16
+ # matches exactly, or matches using case-insensitive, unambiguous matches, or
17
+ # raise a LookupError with a message.
18
+ #
19
+ # LookupError is a subclass of StandardError.
20
+ #
21
+ # LookupNotFoundError, a subclass of LookupError, is raised when a keyword is
22
+ # not found, and only if `err_notfound` is not nil.
23
+ #
24
+ # LookupAmbigError, a subsclass of LookupError, is raised when a keyword search
25
+ # matches multiple entries from the list, and only if `err_ambig` is not nil.
26
+ #
27
+ # If err_notfound is nil, do not raise a LookupNotFoundError error, and return
28
+ # nil.
29
+ #
30
+ # If err_ambigmsg is nil, do not raise a LookupAmbigError, and return the list
31
+ # of possible results.
32
+
33
+ class LookupError < StandardError ; end
34
+ class LookupNotFoundError < LookupError ; end
35
+ class LookupAmbigError < LookupError ; end
36
+
37
+ def key_lookup list, key, err_notfound="%s not found\n", err_ambig="%s is ambiguous\n"
38
+ keylist = list.is_a?(Hash) ? list.keys : list
39
+ if exact = keylist.grep(/^#{key}$/i) # exact match?
40
+ return exact.shift if exact && exact.size == 1
41
+ end
42
+ keys = keylist.grep(/^#{key}/i)
43
+ case keys.size
44
+ when 0
45
+ unless err_notfound.nil?
46
+ raise LookupNotFoundError, sprintf(err_notfound, key)
47
+ end
48
+ return nil
49
+ when 1
50
+ return keys[0]
51
+ else
52
+ unless err_ambig.nil?
53
+ raise LookupAmbigError, sprintf(err_ambig, key)
54
+ end
55
+ return keys
56
+ end
57
+ end
58
+
59
+ alias lookup key_lookup
60
+
61
+ class Array
62
+ def lookup key, err_notfound="%s not found\n", err_ambig="%s is ambiguous\n"
63
+ key_lookup self, key, err_notfound, err_ambig
64
+ end
65
+ end
66
+
67
+ class Hash
68
+ def lookup key, err_notfound="%s not found\n", err_ambig="%s is ambiguous\n"
69
+ self.keys.lookup(key, err_notfound, err_ambig)
70
+ end
71
+ end
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/env ruby
2
+ # test-cmd-utils.rb -- simple tester for cmd-utils
3
+ #
4
+ require 'rubygems'
5
+ require 'minitest'
6
+ require 'minitest/autorun'
7
+ require 'cmd-utils'
8
+
9
+ # these routines produce output on STDERR depending on $norun, $verbose, and $quiet.
10
+
11
+ class TestCmdUtils < MiniTest::Test
12
+
13
+ def gen_test name, norun, verbose, quiet, output
14
+ $norun = norun > 0
15
+ $verbose = verbose > 0
16
+ $quiet = quiet > 0
17
+ out, err = capture_io { yield }
18
+ assert_empty(out, "#{name} $stdout should be empty")
19
+ case output
20
+ when TrueClass
21
+ refute_empty(err, "#{name} $stderr should not be empty")
22
+ when FalseClass
23
+ assert_empty(err, "#{name} $stderr should be empty")
24
+ when String
25
+ assert_match(out, output, "#{name} $stderr should match #{output}")
26
+ end
27
+ true
28
+ end
29
+
30
+
31
+ def test_talk_arg
32
+ # nr, verb, quiet, output?
33
+ gen_test('talk_arg', 0, 0, 0, true) { talk "hello" }
34
+ gen_test('talk_arg', 0, 0, 1, false) { talk "hello" }
35
+ gen_test('talk_arg', 0, 1, 0, true) { talk "hello" }
36
+ gen_test('talk_arg', 0, 1, 1, false) { talk "hello" }
37
+ gen_test('talk_arg', 1, 0, 0, true) { talk "hello" }
38
+ gen_test('talk_arg', 1, 0, 1, false) { talk "hello" }
39
+ gen_test('talk_arg', 1, 1, 0, true) { talk "hello" }
40
+ gen_test('talk_arg', 1, 1, 1, false) { talk "hello" }
41
+ end
42
+
43
+ def test_talk_content
44
+ gen_test('talk_content', 0, 0, 0, "hello") { talk "hello" }
45
+ gen_test('talk_content_block', 0, 0, 0, "hello") { talk { "hello" } }
46
+ end
47
+
48
+ def test_talk_block
49
+ # nr, verb, quiet, output?
50
+ gen_test('talk', 0, 0, 0, true) { talk { "hello" } }
51
+ gen_test('talk', 0, 0, 1, false) { talk { "hello" } }
52
+ gen_test('talk', 0, 1, 0, true) { talk { "hello" } }
53
+ gen_test('talk', 0, 1, 1, false) { talk { "hello" } }
54
+ gen_test('talk', 1, 0, 0, true) { talk { "hello" } }
55
+ gen_test('talk', 1, 0, 1, false) { talk { "hello" } }
56
+ gen_test('talk', 1, 1, 0, true) { talk { "hello" } }
57
+ gen_test('talk', 1, 1, 1, false) { talk { "hello" } }
58
+ end
59
+
60
+ def test_talkf_arg
61
+ # nr, verb, quiet, output?
62
+ gen_test('talkf_arg', 0, 0, 0, true) { talkf "%s", "hello" }
63
+ gen_test('talkf_arg', 0, 0, 1, false) { talkf "%s", "hello" }
64
+ gen_test('talkf_arg', 0, 1, 0, true) { talkf "%s", "hello" }
65
+ gen_test('talkf_arg', 0, 1, 1, false) { talkf "%s", "hello" }
66
+ gen_test('talkf_arg', 1, 0, 0, true) { talkf "%s", "hello" }
67
+ gen_test('talkf_arg', 1, 0, 1, false) { talkf "%s", "hello" }
68
+ gen_test('talkf_arg', 1, 1, 0, true) { talkf "%s", "hello" }
69
+ gen_test('talkf_arg', 1, 1, 1, false) { talkf "%s", "hello" }
70
+ end
71
+
72
+ def test_talkf_block
73
+ # nr, verb, quiet, output?
74
+ gen_test('talkf_block', 0, 0, 0, true) { talkf("%s") { "hello" } }
75
+ gen_test('talkf_block', 0, 0, 1, false) { talkf("%s") { "hello" } }
76
+ gen_test('talkf_block', 0, 1, 0, true) { talkf("%s") { "hello" } }
77
+ gen_test('talkf_block', 0, 1, 1, false) { talkf("%s") { "hello" } }
78
+ gen_test('talkf_block', 1, 0, 0, true) { talkf("%s") { "hello" } }
79
+ gen_test('talkf_block', 1, 0, 1, false) { talkf("%s") { "hello" } }
80
+ gen_test('talkf_block', 1, 1, 0, true) { talkf("%s") { "hello" } }
81
+ gen_test('talkf_block', 1, 1, 1, false) { talkf("%s") { "hello" } }
82
+ end
83
+
84
+ def test_talkf_content
85
+ gen_test('talkf_content', 0, 0, 0, "-hello-") { talkf "-%s-", "hello" }
86
+ gen_test('talkf_content', 0, 0, 0, "-hello-") { talkf("-%s-") { "hello" } }
87
+ gen_test('talkf_default_content', 0, 0, 0, 'hello') { talkf "hello" }
88
+ gen_test('talkf_default_content', 0, 0, 0, 'hello') { talkf { "hello" } }
89
+ end
90
+
91
+ def test_qtalk_arg
92
+ # nr,vrb,q, out?
93
+ gen_test('qtalk', 0, 0, 0, false) { qtalk "hello" }
94
+ gen_test('qtalk', 0, 0, 1, true) { qtalk "hello" }
95
+ gen_test('qtalk', 0, 1, 0, false) { qtalk "hello" }
96
+ gen_test('qtalk', 0, 1, 1, true) { qtalk "hello" }
97
+ gen_test('qtalk', 1, 0, 0, false) { qtalk "hello" }
98
+ gen_test('qtalk', 1, 0, 1, true) { qtalk "hello" }
99
+ gen_test('qtalk', 1, 1, 0, false) { qtalk "hello" }
100
+ gen_test('qtalk', 1, 1, 1, true) { qtalk "hello" }
101
+ end
102
+
103
+ def test_qtalk_block
104
+ # nr, verb, quiet, output?
105
+ gen_test('qtalk', 0, 0, 0, false) { qtalk { "hello" } }
106
+ gen_test('qtalk', 0, 0, 1, true) { qtalk { "hello" } }
107
+ gen_test('qtalk', 0, 1, 0, false) { qtalk { "hello" } }
108
+ gen_test('qtalk', 0, 1, 1, true) { qtalk { "hello" } }
109
+ gen_test('qtalk', 1, 0, 0, false) { qtalk { "hello" } }
110
+ gen_test('qtalk', 1, 0, 1, true) { qtalk { "hello" } }
111
+ gen_test('qtalk', 1, 1, 0, false) { qtalk { "hello" } }
112
+ gen_test('qtalk', 1, 1, 1, true) { qtalk { "hello" } }
113
+ end
114
+
115
+ def test_qtalk_content
116
+ gen_test('qtalk_content', 0, 0, 1, "-hello-") { qtalk "hello" }
117
+ gen_test('qtalk_content', 0, 0, 1, "-hello-") { qtalk { "hello" } }
118
+ end
119
+
120
+ def test_qtalkf_content
121
+ gen_test('qtalkf_content', 0, 0, 1, "-hello-") { qtalkf "-%s-", "hello" }
122
+ gen_test('qtalkf_content', 0, 0, 1, "-hello-") { qtalkf("-%s-") { "hello" } }
123
+ gen_test('qtalkf_default_content', 0, 0, 1, "-hello-") { qtalkf "hello" }
124
+ gen_test('qtalkf_default_content', 0, 0, 1, "-hello-") { qtalkf { "hello" } }
125
+ end
126
+
127
+ def test_vtalk_arg
128
+ # nr, verb, quiet, output?
129
+ gen_test('vtalk_arg', 0, 0, 0, false) { vtalk "hello" }
130
+ gen_test('vtalk_arg', 0, 0, 1, false) { vtalk "hello" }
131
+ gen_test('vtalk_arg', 0, 1, 0, true) { vtalk "hello" }
132
+ gen_test('vtalk_arg', 0, 1, 1, true) { vtalk "hello" }
133
+ gen_test('vtalk_arg', 1, 0, 0, false) { vtalk "hello" }
134
+ gen_test('vtalk_arg', 1, 0, 1, false) { vtalk "hello" }
135
+ gen_test('vtalk_arg', 1, 1, 0, true) { vtalk "hello" }
136
+ gen_test('vtalk_arg', 1, 1, 1, true) { vtalk "hello" }
137
+ end
138
+
139
+ def test_vtalk_block
140
+ # nr, verb, quiet, output?
141
+ gen_test('vtalk_block', 0, 0, 0, false) { vtalk { "hello" } }
142
+ gen_test('vtalk_block', 0, 0, 1, false) { vtalk { "hello" } }
143
+ gen_test('vtalk_block', 0, 1, 0, true) { vtalk { "hello" } }
144
+ gen_test('vtalk_block', 0, 1, 1, true) { vtalk { "hello" } }
145
+ gen_test('vtalk_block', 1, 0, 0, false) { vtalk { "hello" } }
146
+ gen_test('vtalk_block', 1, 0, 1, false) { vtalk { "hello" } }
147
+ gen_test('vtalk_block', 1, 1, 0, true) { vtalk { "hello" } }
148
+ gen_test('vtalk_block', 1, 1, 1, true) { vtalk { "hello" } }
149
+ end
150
+
151
+ def test_nvtalk_arg
152
+ # nr, verb, quiet, output?
153
+ gen_test('nvtalk_arg', 0, 0, 0, true) { nvtalk "hello" }
154
+ gen_test('nvtalk_arg', 0, 0, 1, true) { nvtalk "hello" }
155
+ gen_test('nvtalk_arg', 0, 1, 0, false) { nvtalk "hello" }
156
+ gen_test('nvtalk_arg', 0, 1, 1, false) { nvtalk "hello" }
157
+ gen_test('nvtalk_arg', 1, 0, 0, true) { nvtalk "hello" }
158
+ gen_test('nvtalk_arg', 1, 0, 1, true) { nvtalk "hello" }
159
+ gen_test('nvtalk_arg', 1, 1, 0, false) { nvtalk "hello" }
160
+ gen_test('nvtalk_arg', 1, 1, 1, false) { nvtalk "hello" }
161
+ end
162
+
163
+ def test_nvtalk_block
164
+ # nr, verb, quiet, output?
165
+ gen_test('nvtalk_block', 0, 0, 0, true) { nvtalk { "hello" } }
166
+ gen_test('nvtalk_block', 0, 0, 1, true) { nvtalk { "hello" } }
167
+ gen_test('nvtalk_block', 0, 1, 0, false) { nvtalk { "hello" } }
168
+ gen_test('nvtalk_block', 0, 1, 1, false) { nvtalk { "hello" } }
169
+ gen_test('nvtalk_block', 1, 0, 0, true) { nvtalk { "hello" } }
170
+ gen_test('nvtalk_block', 1, 0, 1, true) { nvtalk { "hello" } }
171
+ gen_test('nvtalk_block', 1, 1, 0, false) { nvtalk { "hello" } }
172
+ gen_test('nvtalk_block', 1, 1, 1, false) { nvtalk { "hello" } }
173
+ end
174
+
175
+ def test_nrtalk_arg
176
+ # nr, verb, quiet, output?
177
+ gen_test('nrtalk_arg', 0, 0, 0, false) { nrtalk "hello" }
178
+ gen_test('nrtalk_arg', 0, 0, 1, false) { nrtalk "hello" }
179
+ gen_test('nrtalk_arg', 0, 1, 0, false) { nrtalk "hello" }
180
+ gen_test('nrtalk_arg', 0, 1, 1, false) { nrtalk "hello" }
181
+ gen_test('nrtalk_arg', 1, 0, 0, true) { nrtalk "hello" }
182
+ gen_test('nrtalk_arg', 1, 0, 1, true) { nrtalk "hello" }
183
+ gen_test('nrtalk_arg', 1, 1, 0, true) { nrtalk "hello" }
184
+ gen_test('nrtalk_arg', 1, 1, 1, true) { nrtalk "hello" }
185
+ end
186
+
187
+ def test_nrtalk_block
188
+ # nr, verb, quiet, output?
189
+ gen_test('nrtalk_block', 0, 0, 0, false) { nrtalk { "hello" } }
190
+ gen_test('nrtalk_block', 0, 0, 1, false) { nrtalk { "hello" } }
191
+ gen_test('nrtalk_block', 0, 1, 0, false) { nrtalk { "hello" } }
192
+ gen_test('nrtalk_block', 0, 1, 1, false) { nrtalk { "hello" } }
193
+ gen_test('nrtalk_block', 1, 0, 0, true) { nrtalk { "hello" } }
194
+ gen_test('nrtalk_block', 1, 0, 1, true) { nrtalk { "hello" } }
195
+ gen_test('nrtalk_block', 1, 1, 0, true) { nrtalk { "hello" } }
196
+ gen_test('nrtalk_block', 1, 1, 1, true) { nrtalk { "hello" } }
197
+ end
198
+
199
+ def test_nrtalkf_content
200
+ gen_test('nrtalkf_content', 0, 0, 1, "-hello-") { nrtalkf "-%s-", "hello" }
201
+ gen_test('nrtalkf_content', 0, 0, 1, "-hello-") { nrtalkf("-%s-") { "hello" } }
202
+ gen_test('nrtalkf_default_content', 0, 0, 1, "-hello-") { nrtalkf "hello" }
203
+ gen_test('nrtalkf_default_content', 0, 0, 1, "-hello-") { nrtalkf { "hello" } }
204
+ end
205
+
206
+ end
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+ # test-cmd-utils.rb -- simple tester for cmd-utils
3
+ #
4
+ require 'rubygems'
5
+ gem 'minitest'
6
+ require 'minitest/autorun'
7
+ require 'lookup'
8
+
9
+ class NilClass ; def to_s ; '' ; end ; end
10
+
11
+ class TestLookup < MiniTest::Test
12
+
13
+ # do_lookup input-text, output-text, true-if-notfound, true-if-ambiguous
14
+
15
+ def do_lookup input, output, notfound=nil, ambig=nil
16
+ found = nil
17
+ if notfound
18
+ assert_raises(LookupNotFoundError) {
19
+ found = lookup(@keywords, input)
20
+ }
21
+ elsif ambig
22
+ assert_raises(LookupAmbigError) {
23
+ found = lookup(@keywords, input)
24
+ }
25
+ else
26
+ found = lookup(@keywords, input)
27
+ #found = found.first if found && found.size == 1
28
+ assert_equal found, output, "Input = #{input}\nOutput = #{output}\n"
29
+ end
30
+ end
31
+
32
+ def test_lookup_many
33
+ @keywords = %w( set get show edit reset delete count )
34
+ do_lookup 'se', 'set'
35
+ do_lookup 'set', 'set'
36
+ do_lookup 'SET', 'set'
37
+ do_lookup 'show', 'show'
38
+ do_lookup 'showme', nil, true
39
+ do_lookup 'sh', 'show'
40
+ do_lookup 'e', 'edit'
41
+ do_lookup 'ed', 'edit'
42
+ do_lookup 's', [%w( set show )], nil, true
43
+ end
44
+
45
+ def test_lookup_exact
46
+ @keywords = %w( email emails reason reasons )
47
+ do_lookup 'email', 'email'
48
+ do_lookup 'emails', 'emails'
49
+ do_lookup 'emai', 'email', nil, true
50
+ do_lookup 'rea', 'reason', nil, true
51
+ do_lookup 'reason', 'reason'
52
+ do_lookup 'reasons', 'reasons'
53
+ end
54
+
55
+ end
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cmd-utils
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.6
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Alan K. Stebbens
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-08-19 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Some handy utilities for writing command line scripts in ruby.
15
+ email: aks@stebbens.org
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/cmd-utils.rb
21
+ - lib/lookup.rb
22
+ - tests/test-cmd-utils.rb
23
+ - tests/test-lookup.rb
24
+ homepage: http://github.com/aks/cmd-utils
25
+ licenses:
26
+ - GPL-2
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ none: false
33
+ requirements:
34
+ - - ! '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project:
45
+ rubygems_version: 1.8.23
46
+ signing_key:
47
+ specification_version: 3
48
+ summary: Utilities for ruby command line scripts
49
+ test_files:
50
+ - tests/test-cmd-utils.rb
51
+ - tests/test-lookup.rb