Change Log¶
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