Change Log¶
2.0.2¶
Fixes:
CLI parsing and terminal fixes: exact switch names win over abbreviations, clear errors for
--flag=valueon no-argument switches and for unknownrequires/excludesnames,Setno longer validates the unsplit CSV string,--helpallno longer corrupts later--helpoutput,ask/choose/promptno longer loop forever on closed stdin, and wide/tall images render with the right aspect (#824)Subprocess and pipeline lifecycle fixes:
bgrunkills and reaps the process when the body raises, pipeline call-time args bind to the source command, leaked pipeline pipes are closed, the async TEE handles long lines and multibyte characters and reaps on failure, equal timeout deadlines no longer kill the timeout thread, and daemon fixes (#822)Path/fs edge cases:
RemotePath.unlinkno longer removes directories recursively and handles symlinks via lstat,RemotePath.accesssupportsF_OKand requires every requested permission bit,LocalPath.chownleaves an unspecified owner/group unchanged, andAtomicFile.lockedhonorsblocking=Falsefor the in-process thread lock (#825)Don’t change the global
SIGPIPEdisposition in the CLI (#834)Keep the return code off the last line of session output (#830)
Path.parentno longer raisesIndexErroron the filesystem root (#827)Quote paths, cwd, and env names in remote shell command lines (#821)
colorlibcorrectness fixes: stdout guard,Color(0),from_ansi, bold-off (#823)
Docs:
Update terminal color support link to its permanent home (#829)
Update example output to match the code (#828)
Internal:
2.0.1¶
Fixes:
Make
SwitchInfohashable again sorequires=/excludes=work (#818)
Internal:
Drop unused
conda.recipe(#819)
2.0.0¶
Features:
More pathlib API supported (#779)
Support color string processing (#774)
Remove pywin32 dependency and replace WinAPI calls with a custom ctypes wrapper (#766)
- Full static typing
Add paramiko machine typing (#746)
Add remote typing (#744)
Add sshmachine typing (#745)
Add typing for color (#730)
Add typing for fs (#737)
Add typing for local machine (#743)
Typing paths (#733)
Adding rest of typing (#739)
Enable tc ruff check (#752)
More safe types (#741)
Should be safe types (#740)
Type only session (#742)
Types for Application (#735)
Typing for commands (#738)
Type examples too (#748)
Typing fixes from Ruff (#749)
Minor typing updates (#780)
Application instances now provide bash and fish completions out of the box (#782)
Drop use of
atexitfor color handling to avoid teardown issues (#785)
Removed:
Removed the long-deprecated path aliases
.basename,.isdir(),.isfile(), and.islink(); use.name,.is_dir(),.is_file(), and.is_symlink()instead.Removed the deprecated
SshMachine.nohup()method; use the command.nohupmodifier ordaemonic_popen()instead.
Deprecated:
Style.print_(a Python 2 era shortcut) now emits aFutureWarning; use.printinstead.
Fixes:
HTMLStyle should respect the color setting (#776)
Make cache clear abstract (#747)
Use
perf_counterinstead of datetime for Progress (#754)BrokenPipeErrorwhen piping CLI help output to head (#727)Fill out
allanddirfor modules to improve introspection (#793)Fix quoting inconsistency between standalone commands and pipelines (#792)
Only register shutdown if a timeout was requested to avoid spurious handlers (#784)
Reduce various warnings reported by linters and at runtime (#781)
Fix O(n^2) performance in
StdinDataRedirection.popen(#798)Correct async remote streaming, pipeline TEE, and command binding (#806)
Fix a sweep of pre-2.0 bugs across cli, paths, and commands (#808)
Fix assorted pre-2.0 correctness issues, including
stem, the SSH tunnel timeout, andSetcompletion (#809)Fix SSH drive-letter path handling on Windows (#762)
Tests:
Need
ImportErrorforplumbum.cmd(#769)Set
LANG=Cin pytest to fix locale-dependent test failures (#772)Support pytest 9 (#757)
pytest
log_levelis better thanlog_cli_level(#756)Increased test coverage and related test improvements (#789)
Internal:
Adding more slots (#750)
Even more slots (#751)
tid imports (#753)
Fix badge showing wrong branch (#736)
Fix links in changelog (#732)
Add
AGENTS.mdand avoid extra files (#803)Remove dead code and simplify a few spots (#811)
Tighten loose type annotations across the public API (#810)
Make module import lazy (#814)
Docs:
Converted docs and changelog formatting, moved to Furo theme and fixed local build issues and links (#787, #786)
Fixed various documentation warnings and added missing API docs (#791)
Filled out older NEWS/changes entries and added a couple of missing docs files (#790, #788)
CI:
1.10.0¶
Add Python π, drop Python 3.8 (#705)
CLI: Fix flag invoke behavior to respect
Falsevalues (#724)CLI: Allow subapplication registration under multiple subcommand names (#725)
CLI: Better support for future annotations on 3.9 (#723)
CLI: Termsize determination fixed on Linux Python 3.14, broken due to wrong struct size (#721)
Drop some unused variables (#700)
Simpler urljoin (#707)
Use SPDX license identifier (#702)
1.9.0¶
1.8.3¶
1.8.2¶
1.8.1¶
1.8.0¶
Drop Python 2.7 and 3.5 support, add 3.11 support (#573)
Lots of extended checks and fixes for problems exposed.
Color: support
NO_COLOR/FORCE_COLOR(#575)Commands: New
iter_linesbuffer_sizeparameter (#582)Commands: cache remote commands (#583)
SSH: Support reverse tunnels and dynamically allocated ports (#608)
CLI: add
Set(..., all_markers={"*", "all"})and fix support for other separators (#619)CLI: support future annotations (#621)
Color: fix the ABC (#617)
Exceptions: fix for exception pickling (#586)
Fix for StdinDataRedirection and modifiers (#605)
1.7.2¶
1.7.1¶
Paths: glob with local paths no longer expands the existing path too (#552)
Paramiko: support reverse tunnels (#562)
SSHMachine: support forwarding Unix sockets in
.tunnel()(#550)CLI: Support
COLOR_GROUP_TITLES(#553)Fix a deprecated in Python 3.10 warning (#563)
Extended testing and checking on Python 3.10 and various PyPy versions. Nox is supported for easier new-user development.
1.7.0¶
Commands: support
.with_cwd()(#513)Commands: make
iter_linesdeal with decoding errors during iteration (#525)Commands: fix handling of env-vars passed to plumbum BoundEnvCommands (#513)
Commands: fix support for win32 in
iter_lines(#500)Paths: fix incorrect
__getitem__method in Path (#506)Paths: Remote path stat had odd OSError (#505)
Paths: Fix
RemotePath.copy()(#527)Paths: missing
__fspath__added (#498)SSH: better error reporting on SshSession error (#515)
Internal: redesigned CI, major cleanup to setuptools distribution, Black formatting, style checking throughout.
1.6.9¶
1.6.8¶
Exceptions: Changed ProcessExecutionError’s formatting to be more user-friendly (#456)
Commands: support for per-line timeout with iter_lines (#454)
Commands: support for piping stdout/stderr to a logger (#454)
Paths: support composing paths using subscription operations (#455)
CLI: Improved ‘Set’ validator to allow non-string types, and CSV params (#452)
TypedEnv: Facility for modeling environment-variables into python data types (#451)
Commands: execute local/remote commands via a magic
.cmdattribute (#450)
1.6.7¶
Commands: Added
run_*methods as an alternative to modifiers (#386)CLI: Added support for
ALLOW_ABREV(#401)CLI: Added
DESCRIPTION_MORE, preserves spacing (#378)Color: Avoid throwing error in atexit in special cases (like pytest) (#393)
Including Python 3.7 in testing matrix.
Smaller bugfixes and other testing improvements.
1.6.6¶
Critical Bugfix: High-speed (English) translations could break the CLI module (#371)
Small improvement to wheels packaging
1.6.5¶
1.6.4¶
CLI: Support for localization (#339), with:
CLI: Support for
MakeDirectory(#339)Commands: Fixed unicode input/output on Python 2 (#341)
Paths: More updates for pathlib compatibility (#325)
Terminal: Changed
prompt()’s default value fortypeparameter frominttostrto match existing docs (#327)Remote: Support
~in PATH for a remote (#293)Remote: Fixes for globbing with spaces in filename on a remote server (#322)
Color: Fixes to image plots, better separation (#324)
Python 3.3 has been removed from Travis and Appveyor.
Several bugs fixed
1.6.3¶
Python 3.6 is now supported, critical bug fixed (#302)
Commands: Better handling of return codes for pipelines (#288)
Paths: Return split support (regression) (#286) - also supports dummy args for better
strcompatibilityPaths: Added support for Python 3.6 path protocol
Paths: Support Python’s
insyntaxCLI: Added Config parser (provisional) (#304)
Color: image plots with
python -m plumbum.cli.image(#304)SSH: No longer hangs for
timeoutseconds on failure (#306)Test improvements, especially on non-linux systems
1.6.2¶
CLI:
Progressnow has a clear keyword that hides the bar on completionCLI:
Progresswithout clear now starts on next line without having to manually add\n.Commands: modifiers now accept a timeout parameter (#281)
Commands:
BGmodifier now allowsstdout/stderrredirection (to screen, for example) (#258)Commands: Modifiers no longer crash on repr (see #262)
Remote:
nohupworks again, typo fixed (#261)Added better support for SunOS and other OS’s. (#260)
Colors: Context manager flushes stream now, provides more consistent results
Other smaller bugfixes, better support for Python 3.6+
1.6.1¶
CLI:
Applicationsubclasses can now be run directly, instead of calling.run(), to facilitate using as entry points (#237)CLI:
gui_openadded to allow easy opening of paths in default gui editor (#239)CLI: More control over help message (#233)
Remote:
cwdis now stashed to reduce network usage (similar to Plumbum <1.6 behavior), and absolute paths are faster, (#238)Bugfix: Pipelined return codes now give correct attribution (#243)
Bugfix:
Progressworks on Python 2.6 (#230)Bugfix: Colors now work with more terminals (#231)
Bugfix: Getting an executable no longer returns a directory (#234)
Bugfix: Iterdir now works on Python <3.5
Testing is now expanded and fully written in Pytest, with coverage reporting.
Added support for Conda ( as of 1.6.2, use the
-c conda-forgechannel)
1.6.0¶
Added support for Python 3.5, PyPy, and better Windows and Mac support, with CI testing (#218, #217, #226)
Colors: Added colors module, support for colors added to cli (#213)
Machines: Added
.get()method for checking several commands. (#205)Machines:
local.cwdnow is the current directory even if you change the directory with non-Plumbum methods (fixes unexpected behavior). (#207)SSHMachine: Better error message for SSH (#211)
SSHMachine: Support for FreeBSD remote (#220)
Paths: Now a subclass of
str, can be opened directly (#228)Paths: Improved pathlib compatibility with several additions and renames (#223)
Paths: Added globbing multiple patterns at once (#221)
Commands: added
NOHUPmodifier (#221)CLI: added positional argument validation (#225)
CLI: added
envname, which allows you specify an environment variable for aSwitchAttr(#216)CLI terminal: added
Progress, a command line progress bar for iterators and ranges (#214)Continued to clean out Python 2.5 hacks
1.5.0¶
Removed support for Python 2.5. (Travis CI does not support it anymore)
CLI: add
invoke, which allows you to programmatically run applications (#149)CLI: add
--help-alland various cosmetic fixes: (#125), (#126), (#127)CLI: add
root_appproperty (#141)Machines:
getattrnow raisesAttributeErrorinstead ofCommandNotFound(#135)Paramiko:
keep_alivesupport (#186)Paramiko: does not support piping explicitly now (#160)
Parmaiko: Added pure SFTP backend, gives STFP v4+ support (#188)
Paths: bugfix to
cwdinteraction withPath(#142)Paths: read/write now accept an optional encoding parameter (#148)
Paths: Suffix support similar to the Python 3.4 standard library
pathlib(#198)Commands: renamed
setenvtowith_env(#143)Commands: pipelines will now fail with
ProcessExecutionErrorif the source process fails (#145)Commands: added
TFandRETCODEmodifiers (#202)Experimental concurrent machine support in
experimental/parallel.pySeveral minor bug fixes, including Windows and Python 3 fixes (#199, #195)
1.4.2¶
Paramiko now supports Python 3, enabled support in Plumbum
Terminal: added
prompt(), bugfix toget_terminal_size()(#113)CLI: added
cleanup(), which is called aftermain()returnsCLI: bugfix to
CountOf(#118)Commands: Add a TEE modifier (#117)
Remote machines: bugfix to
which, bugfix to remote environment variables (#122)Path:
read()/write()now operate on bytes
1.4.1¶
1.4¶
Moved
atomicandunixutilsinto the newfspackage (file-system related utilities)Dropped
plumbum.utilslegacy shortcut in favor ofplumbum.path.utilsBugfix: the left-hand-side process of a pipe wasn’t waited on, leading to zombies (#89)
Added
RelativePath(the result ofPath.relative_to)Fixed more text alignment issues in
cli.Application.help()Introduced
ask()andchoosetocli.terminalBugfix: Path comparison operators were wrong
Added connection timeout to
RemoteMachine
1.3¶
Command.popen: a new argument,new_sessionmay be passed toCommand.popen, which runs the given in a new session (setsidon POSIX,CREATE_NEW_PROCESS_GROUPon Windows)Command.Popen: args can now also be a list (previously, it was required to be a tuple). Seelocal.daemonize: run commands as full daemons (double-fork andsetsid) on POSIX systems, or detached from their controlling console and parent (on Windows).list_processes: return a list of running process (local/remote machines)SshMachine.nohup: “daemonize” remote commands vianohup(not really a daemon, but good enough)atomic: Atomic file operations (AtomicFile,AtomicCounterFileandPidFile)copyandmove: thesrcargument can now be a list of files to move, e.g.,copy(["foo", "bar"], "/usr/bin")list local and remote processes
cli: better handling of text wrapping in the generated help message
cli: add a default
main()method that checks for unknown subcommandsterminal: initial commit (
get_terminal_size)packaging: the package was split into subpackages; it grew too big for a flat namespace. imports are not expected to be broken by this change
SshMachine: added
passwordparameter, which relies on sshpass to feed the password tossh. This is a security risk, but it’s occasionally necessary. Use this with caution!Commands now have a
machineattribute that points to the machine they run onCommands gained
setenv, which creates a command with a bound environmentRemote path: several fixes to
stat(StatRes)cli: add lazily-loaded subcommands (e.g.,
MainApp.subcommand("foo", "my.package.foo.FooApp")), which are imported on demandPaths: added relative_to and split, which (respectively) computes the difference between two paths and splits paths into lists of nodes
cli:
Predicatebecame a class decorator (it exists solely for pretty-printing anyway)PuttyMachine: bugfix
1.2¶
Path: added chmod
Path: added link and symlink
Path:
walk()now applies filter recursively (#64)Commands: added Append redirect
Commands: fix
_subprocessissue (#59)Commands: add
__file__to module hack (#66)Paramiko: add ‘username’ and ‘password’
Paramiko: add ‘timeout’ and ‘look_for_keys’
1.1¶
CLI: now with built-in support for sub-commands. See also: #43
The “import hack” has moved to the package’s
__init__.py, to make it importable directly (#45)Paths now support
chmod(on POSIX platform) (#49)The argument name of a
SwitchAttrcan now be given to it (defaults toVALUE) (#46)
1.0.1¶
Windows: path are no longer converted to lower-case, but
__eq__and__hash__operate on the lower-cased result (#38)Properly handle empty strings in the argument list (#41)
Relaxed type-checking of
LocalPathandRemotePath(#35)Added
PuttyMachinefor Windows users that relies onplinkandpscp(instead ofsshandscp) (#37)
1.0.0¶
Rename
cli.CountingAttrtocli.CountOfMoved to Travis continuous integration
Added
unixutilsAdded
chownanduid/gidLots of fixes and updates to the doc
Full list of issues
0.9.0¶
Initial release