Skip to content

Commit ce195a4

Browse files
committed
Merge pull request #46 from o-lim/no-flags
Add support for --no-flags
2 parents 554bc7b + 3e6dfdc commit ce195a4

File tree

3 files changed

+165
-73
lines changed

3 files changed

+165
-73
lines changed

spec/cliargs_methods_spec.lua

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,24 @@ describe("Testing cliargs library methods/functions", function()
241241
assert.is.error(function() cli:add_arg(key, desc) end) -- this should blow up
242242
end)
243243

244+
it("tests add_flag() with a duplicate argument", function()
245+
-- takes: key, descr
246+
local key, desc, default = "--no-insert", "thedescription", nil
247+
cli:add_flag(key, desc, default)
248+
assert.are.equal(cli.optional[1].expanded_key, "no-insert") -- make sure it got added
249+
assert.is.error(function() cli:add_flag("--[no-]insert", desc) end) -- this should blow up
250+
end)
251+
252+
it("tests add_opt() with a duplicate flag", function()
253+
-- takes: key, descr
254+
local key, desc, default = "-i, --[no-]insert", "thedescription", true
255+
cli:add_flag(key, desc, default)
256+
assert.are.equal(cli.optional[1].key, "i") -- make sure it got added
257+
assert.are.equal(cli.optional[1].expanded_key, "insert") -- make sure it got added
258+
assert.is.error(function() cli:add_opt("--no-insert", desc, '') end) -- this should blow up
259+
assert.is.error(function() cli:add_opt("--insert", desc, '') end) -- this should blow up
260+
end)
261+
244262
it("tests add_opt() with a duplicate argument", function()
245263
-- takes: key, descr
246264
local key, desc, default = "-i", "thedescription", "default"

spec/cliargs_parsing_spec.lua

Lines changed: 87 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -63,45 +63,45 @@ describe("Testing cliargs library parsing commandlines", function()
6363

6464
it("tests no arguments set, nor provided", function()
6565
local args = {}
66-
result = cli:parse(args)
66+
local result = cli:parse(args)
6767
assert.are.same(result, {})
6868
end)
6969

7070
it("tests uses global arg if arguments set not passed in", function()
7171
_G.arg = { "--version" }
72-
defaults = populate_flags(cli)
72+
local defaults = populate_flags(cli)
7373
defaults.v = true
7474
defaults.version = true
75-
result = cli:parse(true --[[no print]])
75+
local result = cli:parse(true --[[no print]])
7676
assert.are.same(result, defaults)
7777
end)
7878

7979
it("tests only optionals, nothing provided", function()
8080
local args = {}
81-
defaults = populate_optionals(cli)
82-
result = cli:parse(args)
81+
local defaults = populate_optionals(cli)
82+
local result = cli:parse(args)
8383
assert.are.same(result, defaults)
8484
end)
8585

8686
it("tests only required, all provided", function()
8787
local args = { "some_file" }
8888
populate_required(cli)
89-
result = cli:parse(args)
89+
local result = cli:parse(args)
9090
assert.are.same(result, { ["INPUT"] = "some_file" })
9191
end)
9292

9393
it("tests only optionals, all provided", function()
9494
local args = { "-o", "/dev/cdrom", "--compress=lzma" }
9595
populate_optionals(cli)
96-
result = cli:parse(args)
96+
local result = cli:parse(args)
9797
assert.are.same(result, { o = "/dev/cdrom", c = "lzma", compress = "lzma" })
9898
end)
9999

100100
it("tests optionals + required, all provided", function()
101101
local args = { "-o", "/dev/cdrom", "-c", "lzma", "some_file" }
102102
populate_required(cli)
103103
populate_optionals(cli)
104-
result = cli:parse(args)
104+
local result = cli:parse(args)
105105
assert.are.same(result, {
106106
o = "/dev/cdrom",
107107
c = "lzma", compress = "lzma",
@@ -110,50 +110,87 @@ describe("Testing cliargs library parsing commandlines", function()
110110
end)
111111

112112
it("tests optional using -short-key notation", function()
113-
defaults = populate_optionals(cli)
113+
local defaults = populate_optionals(cli)
114114
defaults.c = "lzma"
115115
defaults.compress = "lzma"
116116

117-
result = cli:parse({ "-c", "lzma" })
117+
local result = cli:parse({ "-c", "lzma" })
118118
assert.are.same(result, defaults)
119119
end)
120120

121121
it("tests option using -short-key value notation", function()
122122
_G.arg = { "-out", "outfile" }
123123
cli:add_opt("-out VALUE", "output file")
124-
defaults = { out = "outfile" }
125-
result = cli:parse()
124+
local defaults = { out = "outfile" }
125+
local result = cli:parse()
126126
assert.are.same(result, defaults)
127127
end)
128128

129129
it("tests optional using --expanded-key notation, --x=VALUE", function()
130-
defaults = populate_optionals(cli)
130+
local defaults = populate_optionals(cli)
131131
defaults.c = "lzma"
132132
defaults.compress = "lzma"
133133

134-
result = cli:parse({ "--compress=lzma" })
134+
local result = cli:parse({ "--compress=lzma" })
135135

136136
assert.are.same(result, defaults)
137137
end)
138138

139139
it("tests optional using alternate --expanded-key notation, --x VALUE", function()
140-
defaults = populate_optionals(cli)
140+
local defaults = populate_optionals(cli)
141141
defaults.c = "lzma"
142142
defaults.compress = "lzma"
143143

144-
result = cli:parse({ "--compress", "lzma" })
144+
local result = cli:parse({ "--compress", "lzma" })
145145

146146
assert.are.same(result, defaults)
147147
end)
148148

149+
describe("no-flag", function()
150+
it("can set default to false for flag", function()
151+
cli:add_flag("-R, --[no-]recursive", "copy recursively", false)
152+
local expected = { R = false, recursive = false }
153+
local result = cli:parse({})
154+
assert.are.same(expected, result)
155+
end)
156+
157+
it("can set default to true for flag", function()
158+
cli:add_flag("-R, --[no-]recursive", "copy recursively", true)
159+
local expected = { R = true, recursive = true }
160+
local result = cli:parse({})
161+
assert.are.same(expected, result)
162+
end)
163+
164+
it("sets flag value to false", function()
165+
cli:add_flag("-k, --[no-]keep-going", "continue as much as possible after an error", true)
166+
local expected = { k = false, ['keep-going'] = false }
167+
local result = cli:parse({ "--no-keep-going" })
168+
assert.are.same(expected, result)
169+
end)
170+
171+
it("sets flag value true then overwrites to false", function()
172+
cli:add_flag("-k, --[no-]keep-going", "continue as much as possible after an error", true)
173+
local expected = { k = false, ['keep-going'] = false }
174+
local result = cli:parse({ "-k", "--no-keep-going" })
175+
assert.are.same(expected, result)
176+
end)
177+
178+
it("sets flag value false then overwrites to true", function()
179+
cli:add_flag("-k, --[no-]keep-going", "continue as much as possible after an error", true)
180+
local expected = { k = true, ['keep-going'] = true }
181+
local result = cli:parse({ "--no-keep-going", "--keep-going" })
182+
assert.are.same(expected, result)
183+
end)
184+
end)
185+
149186
describe("multiple values for a single key", function()
150187
it("should work for keys that explicitly permit it", function()
151188
cli:add_option("-k, --key=VALUE", "key that can be specified multiple times", {})
152189

153-
defaults = { key = {"value1", "value2", "value3"} }
190+
local defaults = { key = {"value1", "value2", "value3"} }
154191
defaults.k = defaults.key
155192

156-
result = cli:parse({ "--key", "value1", "-k", "value2", "--key=value3" })
193+
local result = cli:parse({ "--key", "value1", "-k", "value2", "--key=value3" })
157194

158195
assert.are.same(result, defaults)
159196
end)
@@ -177,32 +214,32 @@ describe("Testing cliargs library parsing commandlines", function()
177214

178215
describe("flag options", function()
179216
it("should turn them on using the -short-key notation", function()
180-
defaults = populate_flags(cli)
217+
local defaults = populate_flags(cli)
181218
defaults.v = true
182219
defaults.version = true
183-
result = cli:parse({ "-v" })
220+
local result = cli:parse({ "-v" })
184221
assert.are.same(result, defaults)
185222
end)
186223

187224
it("should turn them on using the --expanded-key notation", function()
188-
defaults = populate_flags(cli)
225+
local defaults = populate_flags(cli)
189226
defaults.v = true
190227
defaults.version = true
191-
result = cli:parse({ "--version" })
228+
local result = cli:parse({ "--version" })
192229
assert.are.same(result, defaults)
193230
end)
194231

195232
describe("given a -short-key only flag option", function()
196233
it("works", function()
197234
cli:add_flag("-d", "script will run in DEBUG mode")
198-
result = cli:parse({ "-d" })
235+
local result = cli:parse({ "-d" })
199236
assert.are.same(result, { d = true })
200237
end)
201238
end)
202239

203240
describe("given an --expanded-key only flag option", function()
204241
it("works", function()
205-
defaults = populate_flags(cli)
242+
local defaults = populate_flags(cli)
206243
defaults.verbose = true
207244
result = cli:parse({ "--verbose" })
208245
assert.are.same(result, defaults)
@@ -211,11 +248,9 @@ describe("Testing cliargs library parsing commandlines", function()
211248

212249
describe("given a value for a flag", function()
213250
it("bails", function()
214-
local err
215-
216-
defaults = populate_flags(cli)
251+
local defaults = populate_flags(cli)
217252
defaults.verbose = true
218-
result, err = cli:parse({ "--verbose=something" }, true --[[no print]])
253+
local result, err = cli:parse({ "--verbose=something" }, true --[[no print]])
219254

220255
assert(result == nil, "Adding a value to a flag must error out")
221256
assert(type(err) == "string", "Expected an error string")
@@ -226,14 +261,14 @@ describe("Testing cliargs library parsing commandlines", function()
226261
it("tests optionals + required, no optionals and to little required provided, ", function()
227262
populate_required(cli)
228263
populate_optionals(cli)
229-
result = cli:parse({}, true --[[no print]])
264+
local result = cli:parse({}, true --[[no print]])
230265
assert.is.falsy(result)
231266
end)
232267

233268
it("tests optionals + required, no optionals and too many required provided, ", function()
234269
populate_required(cli)
235270
populate_optionals(cli)
236-
result = cli:parse({ "some_file", "some_other_file" }, true --[[no print]])
271+
local result = cli:parse({ "some_file", "some_other_file" }, true --[[no print]])
237272
assert.is.falsy(result)
238273
end)
239274

@@ -250,63 +285,62 @@ describe("Testing cliargs library parsing commandlines", function()
250285

251286
it("tests bad short-key notation, -x=VALUE", function()
252287
populate_optionals(cli)
253-
result = cli:parse({ "-o=some_file" }, true --[[no print]])
288+
local result = cli:parse({ "-o=some_file" }, true --[[no print]])
254289
assert.is.falsy(result)
255290
end)
256291

257292
it("tests unknown option", function()
258293
populate_optionals(cli)
259-
result = cli:parse({ "--foo=bar" }, true --[[no print]])
294+
local result = cli:parse({ "--foo=bar" }, true --[[no print]])
260295
assert.is.falsy(result)
261296
end)
262297

263298
it("tests unknown flag", function()
264299
populate_optionals(cli)
265-
result = cli:parse({ "--foo" }, true --[[no print]])
300+
local result = cli:parse({ "--foo" }, true --[[no print]])
266301
assert.is.falsy(result)
267302
end)
268303

269304
it("tests optarg only, defaults, multiple allowed", function()
270305
defaults = populate_optarg(3)
271-
result,err = cli:parse(true --[[no print]])
306+
local result,err = cli:parse(true --[[no print]])
272307
assert.is.same(defaults, result)
273308
end)
274309

275310
it("tests optarg only, defaults, 1 allowed", function()
276311
defaults = populate_optarg(1)
277-
result = cli:parse(true --[[no print]])
312+
local result = cli:parse(true --[[no print]])
278313
assert.is.same(defaults, result)
279314
end)
280315

281316
it("tests optarg only, values, multiple allowed", function()
282317
defaults = populate_optarg(3)
283-
result = cli:parse({"/output1/", "/output2/"}, true --[[no print]])
318+
local result = cli:parse({"/output1/", "/output2/"}, true --[[no print]])
284319
assert.is.same(result, { OUTPUT = {"/output1/", "/output2/"}})
285320
end)
286321

287322
it("tests optarg only, values, 1 allowed", function()
288-
defaults = populate_optarg(1)
289-
result = cli:parse({"/output/"}, true --[[no print]])
323+
local defaults = populate_optarg(1)
324+
local result = cli:parse({"/output/"}, true --[[no print]])
290325
assert.is.same(result, { OUTPUT = "/output/" })
291326
end)
292327

293328
it("tests optarg only, too many values", function()
294-
defaults = populate_optarg(1)
295-
result = cli:parse({"/output1/", "/output2/"}, true --[[no print]])
329+
local defaults = populate_optarg(1)
330+
local result = cli:parse({"/output1/", "/output2/"}, true --[[no print]])
296331
assert.is.same(result, nil)
297332
end)
298333

299334
it("tests optarg only, too many values", function()
300335
populate_required()
301336
populate_optarg(1)
302-
result = cli:parse({"/input/", "/output/"}, true --[[no print]])
337+
local result = cli:parse({"/input/", "/output/"}, true --[[no print]])
303338
assert.is.same(result, { INPUT = "/input/", OUTPUT = "/output/" })
304339
end)
305340

306341
it("tests clearing the default of an optional", function()
307-
local err
308342
populate_optionals(cli)
309-
result, err = cli:parse({ "--compress=" }, true --[[no print]])
343+
local result, err = cli:parse({ "--compress=" }, true --[[no print]])
310344
assert.are.equal(nil,err)
311345
-- are_not.equal is not working when comparing against a nil as
312346
-- of luassert-1.2-1, using is.truthy instead for now
@@ -361,6 +395,16 @@ describe("Testing cliargs library parsing commandlines", function()
361395
assert.are.equal(nil, cb.altkey)
362396
end)
363397

398+
it("tests callback for no-flags", function()
399+
cli:add_flag("-k, --[no-]long-key", "key description", callback)
400+
local expected = { k = false, ["long-key"] = false }
401+
local result = cli:parse({ "--no-long-key" })
402+
assert.are.same(expected, result)
403+
assert.are.equal("long-key", cb.key)
404+
assert.are.equal(false, cb.value)
405+
assert.are.equal("k", cb.altkey)
406+
end)
407+
364408
it("tests callback returning error", function()
365409
cli:set_name('myapp')
366410
cli:add_option("-k, --long-key=VALUE", "key description", "", callback_fail)

0 commit comments

Comments
 (0)