-
Notifications
You must be signed in to change notification settings - Fork 384
Closed
Description
Maintainer edits
Overall TODO generated by huge arse discussion thread.
- Add new concepts doc on configuration, including a clearly marked hierarchy definition, and a big WARNING about how multiple files in same location w/ diff extensions are not merged.
- Make sure to clarify
.yaml, not.yml. -
Probably also needs an update to the CLI docs section re: flags and env vars (new subsection)punting on user-driven config updates that aren't env vars; env vars have their own section in config so no need to duplicate -
Re: env vars, need to figure out best way for user-driven config settings to work too, eventuallypunting -
Brief mention of concepts doc in the tutorialActually don't see an elegant way to work it in - feels best just as a standalone regular concepts doc for now - Make sure API in docs gets updated to be consistent & 'modern' - e.g.
obj['foo.bar']should turn intoobj['foo']['bar']or ideally with the option ofobj.foo.bar. - Update
concepts/contextsto adapt, possibly paring it way down or removing entirely, tl;dr it's just about explaining how contexts perform shared state.- The 'nested collection configs get merged' explanation could still live here but probably lives better in the new config page, or the namespacing page if it exists.
- Vendorize
etcaetera - Use its
Configobject in place ofContext's existing inner dicts, get tests passing again referencing it (it's dict-like).- Decide whether the current run/general/etc splits become sub-config objects or just nested namespaces within the primary config object
- Leaning towards the latter so people can override them everywhere
- Add new CLI flags for setting config options (primarily
-for whatnot for "specific config file") - Implement hierarchy re: multiple conf files + env vars +
cli flags+ in-module configs - Conf file loading of different extensions at the same 'location' is exclusive - no merging of eg
/etc/invoke.yamland/etc/invoke.json. - Debugging of conf option overrides must be easy
- either via a no-op CLI flag showing what the tree would be for a given task module (or task invocation?), or
- via regular debug output (ideally + a no-op option)
- really, those go to the same place
- If not covered in the previous point: it must be easy to troubleshoot stupid typos in config file paths.
- e.g. if you accidentally created a
/etc/invok.yaml, or fatfingered the arg toinvoke -f <path>- it should be clear when running with-dwhich config files it attempted to load and which ones failed to load. - Main problem is that for the first 3-4 levels we have 3x file paths we end up searching for, so it will be somewhat verbose :( but no obvious solution offhand, better to add it to debug output (or some other level?) than try to be clever.
- e.g. if you accidentally created a
- Update invocations to use this new setup instead of dotted names - they still technically work but are invalid for eg env var translation.
-
Contextobjects (& subclasses like Fabric2'sConnection) need a clean API for this configuration stuff - eitherContextdirectly grows all the config related methods (perhaps becoming aetcaetera.Configsubclass itself?) or it accepts some config object (again perhapsetc.Config) as an instance member.- The current driving need here is actually testing related, I need to inject a config value override or two in
Connectiontests.
- The current driving need here is actually testing related, I need to inject a config value override or two in
- Fill in any remaining skipped tests related to this feature set.
Original ticket description from sophacles
It would be nice to be able to pass context variables on the command line to invoke scripts. Something like:
> inv -X var1=val1 -Xvar2=val2 target --target1opt=val
And perhaps even allow targeting variables to specific namespaces, ala:
inv -X ns1.var1=val1 -Xvar2=val2 ns1.target target2
for those cases where target2 should use the default for var1, but ns.target1 needs the overridden value.
There are of course concerns about how command line set options override things in a call to Collection.configure... take for instance this script:
@ctask
def task1(ctx):
run("echo {val1}".format(**ctx.config))
@ctask
def task2(ctx):
run("echo {var1} and {var2}".format(**ctx.config))
ns1 = Collection(task1)
ns1.configure({"var1":"ns1var1"})
ns = Collection(ns, task2)
ns.configure({"var1":"globalvar1","var2":"globalvar2"})
Which is the right output:
option 1:
# inv -X ns1.var1=clival1 -X var2=clivar2 ns1.task1 task2
clival1
globalvar1 and clivar2
(note - because generally it's considered cli options override anything in-program)
option 2:
# inv -X ns1.var1=clival1 -X var2=clivar2 ns1.task1 task2
globalvar1
globalvar1 and clivar2
(note because of the way overrides work in invoke already)
I think everyone would agree that:
# inv -X var1=clival1 ns1.task task.2
clival1
clival1 and globalvar2
is correct.