# Cheatsheet
## `doit` CLI invocations
| command | example | command description |
| --------------------------------- | ------------------------ | ----------------------------------------- |
| `doit` | `doit` | run all default tasks |
| `doit {task name} [task name...]` | `doit build test` | run named tasks (generally in order) |
| `doit [*]{task fragment}[*]` | `doit lint*py` | run tasks matching a pattern |
| `doit list` | `doit list --all-status` | show all top level tasks |
| `doit info {task name}` | `doit info test` | show full information about a single task |
| `doit forget {task name}` | `doit forget build` | reset a task's `run` status |
## `doit` tasks
> Put these in `doitoml.tasks.{task name}` to do things.
| field title | `doit` command | field data type | field description |
| --------------- | :------------: | ---------------------------------------------- | --------------------------------------------------------------------------------- |
| **`actions`** | `run` | list of (_string_ or _list of strings_) | the _shell_, _token_ or _function_ actions to peform |
| **`name`** | _all_ | string | identifier for `doit run`, etc. |
| **`doc`** | `list`, `info` | string | diplayed with `doit list` and `info` |
| **`file_dep`** | `run` | `run` list of strings or `Path` | file dependencies which, if changed, invalidate a task status |
| **`targets`** | `run` | list of strings or `Path` | files created by a task |
| **`title`** | `run` | string or function | extra information to print with `doit run` |
| **`task_dep`** | `run` | list of strings | other task ids which must have been run once before this task: uses `*` wildcards |
| **`uptodate`** | `run` | list of `bool` or functions | extra data which, if all false, invalidate a task status |
| **`clean`** | `clean ` | `bool` or list of strings or paths or function | files to delete with `doit clean` (true cleans all `targets`) |
| **`verbosity`** | `run` | `int` | custom verbosity: `0` only print on failures, `1` stream errors, `2` stream all |
| **`meta`** | `run` | dict | [custom metadata](#doitoml-task-metadata) for tasks |
| **`uptodate`** | `run` | list of (string, `None`, dict) | string shell commands or custom updaters indicating a task is up-to-date |
Why these fields? What about...
> The [pydoit documentation](https://pydoit.org/tasks.html) provides a number of other
> fields: many of these only make sense in a `dodo.py`, or otherwise don't lend
> themselves cleanly to declarative, portable tasks.
## `actions`
| action kind | TOML example | description |
| ----------- | --------------------------------------------------- | -------------------------------------------------- |
| _string_ | `echo 1` | passed directly to `doit` without any manipulation |
| _token_ | `["echo", "1"]` | each token expanded by the [DSL] |
| _actor_ | `{py={"shutil.copy2"={args=["a"], kwargs={b="c"}}}` | each token in `(kw)args` expanded by the [DSL] |
## `doitoml` task metadata
> Put these in your `task.{task name}.meta.doitoml` to fune-tune the behavior of tasks.
| field title | field data type | field description |
| ----------- | -------------------------- | ------------------------------------------------------------------------------------------------- |
| **`cwd`** | string or `Path` | the current working directory for _shell_, _token_, and _actor_ tasks |
| **`env`** | dictionary of strings | environment variables to overload for a specific task |
| **`skip`** | string or `bool` or dict | if _falsey_, this task will not appear in `doit list` or be included in `doit run` |
| **`log`** | (list of) string or `Path` | file(s) to capture output of actions, e.g. `task.log` or `["task.stdout.log", "task.stderr.log"]` |
## `skip` values
`skip` uses simple, normalized JSON `bool`-like values directly.
More complex behaviors can be built from dictionary-based values.
| skip kind | true TOML example | will skip if... |
| -------------- | ----------------------------------- | ---------------------------------- |
| **`any`** | `{any=[0, "TRUE"]}` | _any_ value is truthy |
| **`all`** | `{all=[1, "${A_TRUE_ENV_VAR}"]}` | _all_ values is truthy |
| **`not`** | `{not=0}` | the value is falsey |
| **`exists`** | `{exists=["::pyproject_toml"]}` | all paths exist |
| **`platform`** | `{platform={system=".*Windows.*"}}` | `platform` value (as JSON) matches |
## `doitoml` configuration
| key | default | field data type | field description |
| ------------------ | ---------------------- | --------------- | ------------------------------------------------------------------------------------------------------ |
| **`config_paths`** | `[]` | list of strings | relative paths to find more `doitoml` config sources: can use the `:get` [DSL] to extract partial data |
| **`fail_quietly`** | `true` | `bool` | try to emit short, helpful errors with context |
| **`update_env`** | `true` | `bool` | use the `env` key to update the outer running environment variables |
| **`validate`** | `true` | `bool` | use `jsonschema` to preflight tasks before `doit` |
| **`safe_paths`** | parent of first config | list of strings | paths that are considered "safe" for doitoml to work with. |
[dsl]: ../how-to/dsl.md