We are currently working on porting this changelog to the specifications in Keep a Changelog. This project adheres to Semantic Versioning.
with_textual now defaults to False everywhere it had defaulted to
'auto': Queue.monitor, TMUXMultiQueue.run / .monitor,
SerialQueue.monitor, SlurmQueue.monitor, the cmd_queue monitor CLI, and
both CMDQueueConfig and CmdQueueConfigMixin.
'auto' meant "textual whenever the package imports", so a transitive
dependency decided which monitor you got. Most queues are driven
non-interactively -- piped to a log, over ssh, inside docker, under an agent --
and there a full-screen app fills the log with escape sequences and redrawn
frames instead of job output, and can block on a keypress nobody is there to
press. The rich monitor degrades gracefully in all of those.
Only defaults moved. with_textual='auto' still resolves as before, and
--with_textual=1 opts in.
other_session_handler now defaults to auto (was ask), and auto asks
only when a terminal is attached. It previously keyed off has_stdin(), which
is true under nohup, under cron with </dev/null, behind a pipe, and inside
a detached tmux -- i.e. true for exactly the unattended runs that cannot
answer. An overnight job would sit on a y/n prompt forever having done nothing.
Conflicts are also now judged by whether a session is doing work.
session_is_busy() inspects the panes: a finished worker sits back at its
shell, so that session is inert and is reclaimed silently. Only a session with
a live foreground process prompts -- and the message prints tmux attach next
to tmux kill-session, because looking is usually what you want. Panes that
cannot be read count as busy: the safe error is to leave a session alone.
New --non_interactive declares that nobody is present, resolving auto to
kill and skipping every prompt.
rich.live.Live only animates when its console is a terminal. With stdout
piped -- which it is whenever a runner tees output to a log -- Live degraded to
printing a single frame at context exit, so a long queue showed nothing while
it ran. The textual monitor never hit this because it drives the terminal
directly, which is why defaulting to the rich monitor looked like the status
display had been removed. It had not; it was being written to a pipe.
The live display now renders to /dev/tty when stdout is not a terminal, so
the log keeps the ordinary output and the operator keeps a live view. With no
controlling terminal at all (CI, pytest, nohup) it falls back to the previous
behaviour.
CmdQueueConfigMixin, a :mod:kwconf-based equivalent ofCMDQueueConfigcarrying the same fields and the samecreate_queue/run_queueAPI. Use it for new code.- A headless mode for the slurm backend's
monitor(): it polls until every job is terminal without rendering a live table, and still prints per-job pass/fail/skip lines. - Nine ordered planning documents under
docs/planning/, from a full-repo audit: hygiene, shell-quoting hardening, core/tmux/slurm/airflow correctness, the test suite, packaging/CI/docs, and dead-code cleanup.
-
The internal CLIs (
main.py,slurmify.py) are now kwconf-based. kwconf does not auto-split comma strings, so--dependsand--gpususeparser='csv'to preserve the documented comma-separated behavior.For downstream CLIs: kwconf's
cli()takesargv=rather thancmdline=, and its sys.argv toggle is aboolrather than scriptconfig'sint-- somain(argv=1)becomesmain(argv=True). -
Job.dependsis typedList[Job]rather thanOptional[Iterable[Job]], which is what constructors actually receive: string references are resolved at the queue level before construction. A newbase_queue.JobDependsalias andcoerce_job_depends()helper normalize it, andQueue._register_named_job()narrows optional job names. This replaced blankettype: ignorecomments with structural fixes. -
TMUXMultiQueue.kill_other_queuesno longer requires theparsepackage, which was imported but declared in no requirements file -- so the tmux backend raisedModuleNotFoundErroron any install that did not happen to have it.
CMDQueueConfig, the scriptconfig-based boilerplate base. Subclassing it now emits aDeprecationWarningnamingCmdQueueConfigMixinas the replacement. (The 0.3.2 migration documented this warning but never raised one.) The warning fires on subclassing rather than on import, because importingcli_boilerplateis also how a caller reaches the kwconf class.scriptconfigremains a dependency for as long as this class exists.
- serial/tmux: every job after a
cwdjob ran in the wrong directory. The cwd restore was rendered as[["$CHDIR_OK" == "1"]]-- no space after[[, which bash resolves as an unknown command -- sopopdnever ran. - serial/tmux: a teardown could be skipped on
tmux kill-session. The teardown subshell now trapsHUPexplicitly rather than relying on bash's undocumented run-the-EXIT-trap-on-unhandled-group-HUP behavior, which the release-on-kill path was riding on. - slurm: boolean
sbatchflags rendered with a stray trailing quote (--hold"), malforming the sbatch line for any boolean inSLURM_SBATCH_FLAGS. - slurm: the monitor crashed on purged or unknown jobs.
scontrol show jobreturns noJobStateonce a job is pastMinJobAge, soinfo['JobState']raisedKeyErrorwhen re-attaching after a run. The final state is now recovered from accounting viasacct, all fields are read with.get(), andTIMEOUT/OUT_OF_MEMORY/NODE_FAILand friends are treated as terminal-failed rather than'unknown', which used to hang the completion check. - slurm:
parse_scontrol_outputraised on some slurm versions. It assumed every whitespace token waskey=value; a space-containing value for a non-special key yielded a bare token and "not enough values to unpack". Bare tokens are now skipped. - slurm:
run(block=True, monitor='none')did not block. It printed "Queue running detached" and returned immediately, so a scripted run could act on results before any job finished -- contradicting both the tmux backend and this backend's own docstring.block=Falseis now the genuinely non-blocking case, and carries the reattach hint. --run=0executed the queue.runwas declaredrun: bool = kw.Flag(False, ...), and the: boolannotation made kwconf coerce withbool(), so'0'becameTrue. Dropping the annotation restores--run=0falsy,--run=1truthy, bare--runtrue.monitor='none'was smartcast toNoneby scriptconfig inCMDQueueConfig.kill_other_queuescould offer to kill an unrelated queue's sessions. It matched session ids with a non-greedy{name}_{rootid}template, so a queue namedmy_queueparsed asmy: it missed its own sessions, and a queue actually namedmymatchedmy_queue's. Session ownership is now decided by the full<prefix><name>_prefix.
-
First-class job
setup/teardownlifecycle onBashJob(serial/tmux) andSlurmJob.setupis a gating precondition (shares the preamble'sPREAMBLE_OKgating; a failing setup skips the command and marks the job failed).teardownalways runs after the command — on success, failure, and SIGINT/SIGTERM — provided setup succeeded. It is rendered as a per-job, signal-safe cleanup (a scoped subshell trap for serial/tmux so it cannot leak across the many jobs in one script; an in---wraptrap for slurm). The main command's exit code stays authoritative (a teardown failure does not flip the job result). A hard SIGKILL cannot be trapped — an out-of-band reclaim (e.g. a lease TTL) is the only backstop for that. This is the job-level try/finally for bracketing an external resource (e.g. acquire/release a GPU lease). -
Backend execution tests (
tests/test_backend_execution.py) that actually run a queue — simple DAGs and thesetup/teardownlifecycle — on the serial backend, and on tmux/slurm when those backends report themselves available (skipped otherwise).
- A list-valued
preamblepassed toSlurmJob(e.g.submit(..., preamble=['a', 'b'])) no longer crashes script construction; list steps are now flattened into the&&chain instead of being appended as a single element. - Corrected the inverted
is_available()guard in twoSlurmQueue--rundoctests (they readif not self.is_available(): self.run(), which would only submit when slurm was unavailable).
- generalized the monitor so it can be launched in an independent process and reports errors better.
- New
monitor='hybrid'mode (now the default for tmux and slurmrun()): renders the live status table inline in the current shell and also spawns a detachedcmd_queue monitortmux session. Press[a]from the inline UI to attach (orswitch-clientwhen already inside tmux),[q]to stop watching while the queue keeps running. The side session is killed when the inline monitor exits.
monitorkwarg accepted values are now'hybrid' | 'inline' | 'tmux' | 'none'.'inline'reverts to its original pure-current-shell meaning; the'hybrid'mode covers the inline+tmux combination. The default is'hybrid', so a no-argrun()now spawns an attachable tmux side session whenever tmux is available.
- cwd will now handle failures if the directory doesnt exist in the bash queue
- general improvements to bash script construction with per-job preamble commands
- slurm now correctly respects header/preamble commands
- deprecate
header_commandsforpreamble - Dropped support for 3.8 and 3.9
- Transition from stubs to type annotations.
- Issue with slurm 21.x
- Experimental feature to automatically handle activating virtual environments, currently disabled by default set
--virtualenv_cmd=autoto use with cmdqueue boilerplate scripts. - Experimental airflow backend now has minimal functionality.
- Add initial support for monitoring passed and failed jobs in slurm.
- Fixed compatibility issues with Slurm v23
- Slurmify helper script
- Better slurm support
- fix
SlurmQueue.is_availablewith slurm version 19.x
- Add "gpus" as a CLI option
- Made pint an optional requirement
- Drop support for 3.6 and 3.7
- Fixed issue with single-argv commands in the bash interface
- CLI Boilerplate run-queue can now pass kwargs to the run method.
- Change the CLI to be modal
- Added experimental
vertical_chainsargument to draw-network-text
- Add yes argument to CLI
- Added more options to the serial queue
runmethod.
- allow workaround gres issue with slurm by explicitly specifying it.
- consolidated print commands code, all backends use the same logic now.
- Issue with
slurm_options
- the
cli_boilerplatesubmodule for help writing consistent scriptconfig + cmdqueue CLIs - util yaml
- Support for more sbatch options in slurm backend
- Bugs in slurm backend
- New experimental CLI-queue feature. Create a pipeline in bash using the CLI. Very basic atm.
- The log option to submit now default to False (due to non-obvious tee issues)
- The serial queue now correctly reorders jobs into a topological order when necessary.
- Experimental CLI to help cleanup dangling tmux jobs
- Deprecate
rprintin favor ofprint_commands. - Deprecate
use_richinprint_commandsin favor ofstyle='rich'.
- Tweaked text output
- Demo in the readme with better record demo scripts
- new
other_session_handlerarg to run, which can be ask, kill, ignore, or auto.
- Textual monitor will now restart if you decide not to quit.
- tmux queue is condensed when size=1
- UnknownBackendError and DuplicateJobError
- Add
tagsproperty to Jobs andexclude_tagstorprint.
-
The kill-other-session logic now only asks to kill sessions with the same name.
-
The serial / tmux queue now output stdout/stderr of each process to a log file and write a status indicating when a command has started to run.
-
Slurm is available check now looks to see if any node exists that is not down.
- Bug in serial queue when a dependency was None
- Improved textual monitor for tmux queue
- Keep track of skipped jobs in tmux / serial queue
- The tmux queue can now clean up other existing sessions if you start fresh
- Basic airflow queue.
- Job dependencies can now be given by name.
- Bug where serial queue would execute jobs if any dependency passed.
- Minor dependency issues
- Initial version