1<!DOCTYPE html> 2 3<html lang="en" data-content_root="./"> 4 <head> 5 <meta charset="utf-8" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> 7 8 <title>Changelog — Invoke documentation</title> 9 <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=6625fa76" /> 10 <link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=cb25574f" /> 11
11<script src="_static/documentation_options.js?v=5929fcd5"></script>
11 12
12<script src="_static/doctools.js?v=888ff710"></script>
12 13
13<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
13 14 <link rel="index" title="Index" href="genindex.html" /> 15 <link rel="search" title="Search" href="search.html" /> 16 <link rel="next" title="Frequently asked questions" href="faq.html" /> 17 <link rel="prev" title="Welcome to Invoke!" href="index.html" /> 18 19 <link rel="stylesheet" href="_static/custom.css" type="text/css" /> 20 21 22 <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> 23 24
24<script async type="text/javascript" src="/_/static/javascript/readthedocs-addons.js"></script>
24<meta name="readthedocs-project-slug" content="invoke-www" /><meta name="readthedocs-version-slug" content="latest" /><meta name="readthedocs-resolver-filename" content="/changelog.html" /><meta name="readthedocs-http-status" content="200" /></head><body> 25 26 27 <div class="document"> 28 <div class="documentwrapper"> 29 <div class="bodywrapper"> 30 31 32 <div class="body" role="main"> 33 34 <section id="changelog"> 35<h1>Changelog<a class="headerlink" href="#changelog" title="Link to this heading">¶</a></h1> 36<section id="Next 3.x feature release"> 37<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/master">Next 3.x feature release</a></h2><ul class="simple"> 38<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Minor tweaks to documentation and type 39hints/inheritance (mostly around <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Promise" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Promise</span></code></a>).</p></li> 40<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Make the return value type hint for <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">@task</span></code></a> more specific; as-is it would trigger typecheck errors 41when handing regular, decorated task functions as inputs to 42<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection.add_task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">add_task</span></code></a> and similar methods.</p></li> 43<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Reverted the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">@task</span></code></a> return value type hint change; it actually just makes 44things worse. Taking this one back to the drawing table for later.</p></li> 45</ul> 46</section> 47<section id="Next 2.x feature release"> 48<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/master">Next 2.x feature release</a></h2><ul> 49<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/1011">#1011</a><span>:</span>: <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>âs <code class="docutils literal notranslate"><span class="pre">shell</span></code> argument/config 50option originally defaulted to <code class="docutils literal notranslate"><span class="pre">/bin/bash</span></code>, which unsurprisingly causes a 51hard fail on systems where this path is not present (eg, NixOS, embedded 52systems, etc).</p> 53<p>As of this release, we now use <code class="docutils literal notranslate"><span class="pre">execvpe</span></code> to leverage <code class="docutils literal notranslate"><span class="pre">$PATH</span></code> binary 54search, and changed the <code class="docutils literal notranslate"><span class="pre">run.shell</span></code> config optionâs value to just 55<code class="docutils literal notranslate"><span class="pre">bash</span></code>. This should be backwards compatible in nearly all cases, and 56provides a much more robust default.</p> 57<p>Props to Lou Lecrivain for the patch, and to Jorge Araya Navarro for the 58original report,</p> 59</li> 60</ul> 61</section> 62<section id="Next 1.x feature release"> 63<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/master">Next 1.x feature release</a></h2><ul class="simple"> 64<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Fix a non-fatal bug in our setup.py 65<code class="docutils literal notranslate"><span class="pre">long_description</span></code> generation causing 1.7.0-1.7.2 to have malformed 66description text on PyPI.</p></li> 67</ul> 68</section> 69<section id="3.0.3"> 70<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/3.0.3">3.0.3</a> <span style="font-size: 75%;">2026-04-07</span></h2><ul class="simple"> 71<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Reverted the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">@task</span></code></a> return value type hint change; it actually just makes 72things worse. Taking this one back to the drawing table for later.</p></li> 73</ul> 74</section> 75<section id="3.0.2"> 76<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/3.0.2">3.0.2</a> <span style="font-size: 75%;">2026-04-06</span></h2><ul class="simple"> 77<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/742">#742</a><span>:</span> Define a custom <code class="docutils literal notranslate"><span class="pre">__repr__</span></code> for <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Promise" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Promise</span></code></a> so it 78can be displayed in interactive sessions or other debug contexts, without 79running afoul of <code class="docutils literal notranslate"><span class="pre">AttributeError</span></code>. Thanks to Leonid Shvechikov for the 80original bug report.</p></li> 81<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Make the return value type hint for <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">@task</span></code></a> more specific; as-is it would trigger typecheck errors 82when handing regular, decorated task functions as inputs to 83<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection.add_task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">add_task</span></code></a> and similar methods.</p></li> 84</ul> 85</section> 86<section id="3.0.1"> 87<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/3.0.1">3.0.1</a> <span style="font-size: 75%;">2026-04-06</span></h2><ul class="simple"> 88<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Minor tweaks to documentation and type 89hints/inheritance (mostly around <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Promise" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Promise</span></code></a>).</p></li> 90</ul> 91</section> 92<section id="3.0.0"> 93<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/3.0.0">3.0.0</a> <span style="font-size: 75%;">2026-04-05</span></h2><ul> 94<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/250">#250</a><span>:</span> Add access to the core CLI parserâs <a class="reference external" href="https://docs.pyinvoke.org/en/latest/invoke.html#remainder" title="(in Invoke)"><span class="xref std std-ref">remainder</span></a> value, via <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.remainder" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context.remainder</span></code></a> - this allows for more elegant 95<a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#wrapper-tasks" title="(in Invoke)"><span class="xref std std-ref">wrapper tasks</span></a>.</p> 96<div class="admonition warning"> 97<p class="admonition-title">Warning</p> 98<p>This change is technically backwards incompatible, but only if you were 99overriding the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Call.make_context" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">tasks.Call.make_context</span></code></a> 100method. Updating such code to work with this version of Invoke is 101straightforward; see <a class="reference external" href="https://github.com/fabric/fabric/commit/7fa309db9dd5dac69079c1fb83b6f579555f7d53">this Fabric commit</a> 102for an example.</p> 103</div> 104</li> 105<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/947">#947</a><span>:</span> Update the return value, and type hint, of <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> and 106friends to be <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> instead of <code class="docutils literal notranslate"><span class="pre">Optional[Result]</span></code>. 107Specifically:</p> 108<blockquote> 109<div><ul class="simple"> 110<li><p>The only scenario where the return value was <a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">None</span></code></a> was when 111<code class="docutils literal notranslate"><span class="pre">disown=True</span></code>, but with hindsight (and a few years of working with 112typed Python) itâs clear we should have done what we did for 113<code class="docutils literal notranslate"><span class="pre">asynchronous=True</span></code> and still returned <em>some</em> Result-y object, even if 114it wouldnât have all the normal fields populated.</p></li> 115<li><p>We determined that the behavior of <code class="docutils literal notranslate"><span class="pre">disowned</span></code> is such that it can live 116within regular <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> without too many headaches (i.e. 117no need for a subclass like <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Promise" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Promise</span></code></a>) and have gone that 118route, with option to expand the class tree in a future 119backwards-incompatible release. 120<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>âs docstring has been updated to reflect what 121this variant of <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> looks like.</p></li> 122<li><p>While this change is technically <strong>backwards incompatible</strong>, <code class="docutils literal notranslate"><span class="pre">disown</span></code> 123is a very niche use case, and this type of change (going from a largely 124unusable value to a usable one) seems worth the turbulence, especially 125sinceâ¦</p></li> 126<li><p>The main driver for this change (besides <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/779">#779</a> elsewhere in this 127release) was that the previous return value of <code class="docutils literal notranslate"><span class="pre">Optional[Result]</span></code> 128causes frustrating static analysis âbugâ (analyzers canât assume you have 129a <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> in hand even though itâs the vastly more 130common case).</p></li> 131</ul> 132</div></blockquote> 133<div class="admonition warning"> 134<p class="admonition-title">Warning</p> 135<p>As noted above, this change is backwards incompatible <strong>if</strong> you were 136relying on this methodâs return value to be <code class="docutils literal notranslate"><span class="pre">None</span></code> when <code class="docutils literal notranslate"><span class="pre">disown=True</span></code>. 137It is backwards compatible in all other situations.</p> 138</div> 139</li> 140<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/779">#779</a><span>:</span> <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> now includes local subprocess 141PIDs in <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> objects (as <code class="docutils literal notranslate"><span class="pre">.pid</span></code>), via the new 142<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.get_pid" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Runner.get_pid</span></code></a> method. This may be 143generally useful for auditing or similar tasks, but is primarily intended for 144users of <code class="docutils literal notranslate"><span class="pre">disown=True</span></code> who want to perform their own subprocess management. 145Thanks to Matt J Williams for the feature request.</p></li> 146<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Fix a grab bagâs worth of Sphinx doc render problems, among 147which were some class attributes (eg <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.command_cwds" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context.command_cwds</span></code></a>) that had silently disappeared from 148the classâ autodoc output after our 2.0 release.</p></li> 149<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Expanded mypy type hint checking to more of the codebase & 150generally touched up some type hints here and there. More of this is planned 151to occur as we go.</p></li> 152<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span>
152 Dropped support for Python versions <3.9. Thatâs right, weâve 153caught up to Pythonâs own EOL regimeâ¦as of late 2024! As part of this 154change, we also switched over to using <code class="docutils literal notranslate"><span class="pre">pyproject.toml</span></code> for packaging 155metadata.</p></li> 156</ul> 157</section> 158<section id="2.2.1"> 159<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/2.2.1">2.2.1</a> <span style="font-size: 75%;">2025-10-10</span></h2><ul> 160<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/1038">#1038</a><span>:</span> (fixed in <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/1040">#1040</a>) Python 3.14 tweaked the behavior of 161<a class="reference external" href="https://docs.python.org/3/library/fcntl.html#module-fcntl" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">fcntl</span></code></a> to raise <a class="reference external" href="https://docs.python.org/3/library/exceptions.html#SystemError" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">SystemError</span></code></a> on buffer overflows, which our interpretation 162of <a class="reference external" href="https://docs.python.org/3/library/termios.html#module-termios" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">termios.TIOCGWINSZ</span></code></a> technically was (we care only about the 163first two fields in what is technically a four-field struct with half the 164fields unused). This has been fixed by unpacking all 4 fields and then 165discarding the unused fields during processing.</p> 166<p>Thanks to <code class="docutils literal notranslate"><span class="pre">@kasium</span></code> for the original bug report and to <code class="docutils literal notranslate"><span class="pre">@rathann</span></code> and 167<code class="docutils literal notranslate"><span class="pre">@BradleyKirton</span></code> for workshopping the patch into its final shape.</p> 168</li> 169</ul> 170</section> 171<section id="2.1.4"> 172<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/2.1.4">2.1.4</a> <span style="font-size: 75%;">2025-10-10</span></h2><ul> 173<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/1038">#1038</a><span>:</span> (fixed in <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/1040">#1040</a>) Python 3.14 tweaked the behavior of 174<a class="reference external" href="https://docs.python.org/3/library/fcntl.html#module-fcntl" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">fcntl</span></code></a> to raise <a class="reference external" href="https://docs.python.org/3/library/exceptions.html#SystemError" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">SystemError</span></code></a> on buffer overflows, which our interpretation 175of <a class="reference external" href="https://docs.python.org/3/library/termios.html#module-termios" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">termios.TIOCGWINSZ</span></code></a> technically was (we care only about the 176first two fields in what is technically a four-field struct with half the 177fields unused). This has been fixed by unpacking all 4 fields and then 178discarding the unused fields during processing.</p> 179<p>Thanks to <code class="docutils literal notranslate"><span class="pre">@kasium</span></code> for the original bug report and to <code class="docutils literal notranslate"><span class="pre">@rathann</span></code> and 180<code class="docutils literal notranslate"><span class="pre">@BradleyKirton</span></code> for workshopping the patch into its final shape.</p> 181</li> 182</ul> 183</section> 184<section id="2.2.0"> 185<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/2.2.0">2.2.0</a> <span style="font-size: 75%;">2023-07-12</span></h2><ul class="simple"> 186<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Remove the somewhat inaccurate subclass requirement around 187<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a>âs <code class="docutils literal notranslate"><span class="pre">.clone(into=...)</span></code> constructor call. It was 188broken for certain use cases (such as trying to clone one subclass into a 189sibling subclass, which would yield a <code class="docutils literal notranslate"><span class="pre">TypeError</span></code>) and is irrelevant if one 190is using the new type annotations.</p></li> 191<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/936">#936</a><span>:</span> Make sure <code class="docutils literal notranslate"><span class="pre">py.typed</span></code> is in our packaging 192manifest; without it, users working from a regular installation 193canât perform type checks. Thanks to Nikita Sobolev for catch & patch.</p></li> 194</ul> 195</section> 196<section id="2.1.3"> 197<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/2.1.3">2.1.3</a> <span style="font-size: 75%;">2023-06-14</span></h2><ul class="simple"> 198<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/944">#944</a><span>:</span> After the release of 2.1, package-style task modules started 199looking in the wrong place for project-level config files (inside oneâs eg 200<code class="docutils literal notranslate"><span class="pre">tasks/</span></code> dir, instead of <em>next to</em> that dir) due to a subtlety in the new 201import/discovery mechanism used. This has been fixed. Thanks to Arnaud V. and 202Hunter Kelly for the reports and to Jesse P. Johnson for initial 203debugging/diagnosis.</p></li> 204</ul> 205</section> 206<section id="2.1.2"> 207<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/2.1.2">2.1.2</a> <span style="font-size: 75%;">2023-05-15</span></h2><ul class="simple"> 208<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/936">#936</a><span>:</span> Make sure <code class="docutils literal notranslate"><span class="pre">py.typed</span></code> is in our packaging 209manifest; without it, users working from a regular installation 210canât perform type checks. Thanks to Nikita Sobolev for catch & patch.</p></li> 211</ul> 212</section> 213<section id="2.1.1"> 214<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/2.1.1">2.1.1</a> <span style="font-size: 75%;">2023-05-01</span></h2><ul class="simple"> 215<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/910">#910</a><span>:</span> Add more rigor around subprocess/runner shutdown to avoid spurious 216exceptions & also fix downstream issues in libraries like Fabric. Reported by 217Orlando RodrÃguez.</p></li> 218<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/934">#934</a><span>:</span> The <a class="reference external" href="https://docs.python.org/3/library/importlib.html#module-importlib" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">importlib</span></code></a> upgrade in 2.1 had a corner case bug (regarding 219<code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">.</span> <span class="pre">
219import</span> <span class="pre"><submodule></span></code> functionality within package-like task trees) 220which in turn exposed a false-pass in our test suite. Both have now been 221fixed. Thanks to Greg Meyer and Robert J. Berger for the bug reports.</p></li> 222</ul> 223</section> 224<section id="2.0.1"> 225<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/2.0.1">2.0.1</a> <span style="font-size: 75%;">2023-04-29</span></h2><ul class="simple"> 226<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/910">#910</a><span>:</span> Add more rigor around subprocess/runner shutdown to avoid spurious 227exceptions & also fix downstream issues in libraries like Fabric. Reported by 228Orlando RodrÃguez.</p></li> 229<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/901">#901</a><span>:</span> (via <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/903">#903</a>) Tweak test suite <code class="docutils literal notranslate"><span class="pre">setup</span></code> 230methods to be named <code class="docutils literal notranslate"><span class="pre">setup_method</span></code> so pytest stops whining about it. Patch 231via Jesse P. Johnson.</p></li> 232</ul> 233</section> 234<section id="2.1.0"> 235<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/2.1.0">2.1.0</a> <span style="font-size: 75%;">2023-04-28</span></h2><ul class="simple"> 236<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/376">#376</a><span>:</span> Resolve equality comparison bug for non-collections. Patch 237via Jesse P. Johnson</p></li> 238<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/901">#901</a><span>:</span> (via <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/903">#903</a>) Tweak test suite <code class="docutils literal notranslate"><span class="pre">setup</span></code> 239methods to be named <code class="docutils literal notranslate"><span class="pre">setup_method</span></code> so pytest stops whining about it. Patch 240via Jesse P. Johnson.</p></li> 241<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/906">#906</a><span>:</span> Implement type hints and type checking tests with mypy to 242reduce errors and impove code documentation. Patches by Jesse P. Johnson and 243review by Sam Bull.</p></li> 244<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/675">#675</a><span>:</span> Implement <a class="reference external" href="https://docs.python.org/3/library/importlib.html#module-importlib" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">importlib</span></code></a> and deprecate <a class="reference external" href="https://docs.python.org/3/library/imp.html#module-imp" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">imp</span></code></a> module. Patches 245provided by Jesse P. Johnson</p></li> 246</ul> 247</section> 248<section id="2.0.0"> 249<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/2.0.0">2.0.0</a> <span style="font-size: 75%;">2023-01-16</span></h2><ul> 250<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Task.argspec" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Task.argspec</span></code></a> has changed its 251return value; it now returns an <a class="reference external" href="https://docs.python.org/3/library/inspect.html#inspect.Signature" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">inspect.Signature</span></code></a> derived from that of the 252taskâs body callable.</p> 253<div class="admonition warning"> 254<p class="admonition-title">Warning</p> 255<p>This change is backwards incompatible if you were using this method 256directly.</p> 257</div> 258</li> 259<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span>
259 Remove support for, and imports related to, all Python versions 260less than 3.6 - including Python 2. This also includes updates to vendored 261packages, such as removing <code class="docutils literal notranslate"><span class="pre">six</span></code> and upgrading <code class="docutils literal notranslate"><span class="pre">lexicon</span></code> to the latest 262version; and also treatment of things like <code class="docutils literal notranslate"><span class="pre">Mock</span></code> use within 263<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.MockContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">invoke.context.MockContext</span></code></a> (which now expects stdlibâs <code class="docutils literal notranslate"><span class="pre">unittest.mock</span></code> 264instead of hunting for the old standalone <code class="docutils literal notranslate"><span class="pre">mock</span></code> library).</p> 265<p>Thanks to various folks for patches related to some of this work, including 266Jesse P. Johnson who supplied multiple PRs whose commits made it in.</p> 267<div class="admonition warning"> 268<p class="admonition-title">Warning</p> 269<p>This change is backwards incompatible in the following scenarios:</p> 270<ul class="simple"> 271<li><p>You use Python <3.6. Shouldnât be an issue as we now specify 272<code class="docutils literal notranslate"><span class="pre">python_requires</span></code> in packaging metadata.</p></li> 273<li><p>You call <code class="docutils literal notranslate"><span class="pre">invoke.util.encode_output</span></code> manually for some reason. (This 274became a noop under Python 3, so justâ¦remove it!)</p></li> 275<li><p>You use <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.MockContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">invoke.context.MockContext</span></code></a>; its <code class="docutils literal notranslate"><span class="pre">repeat</span></code> init kwarg changed 276its default value from <code class="docutils literal notranslate"><span class="pre">False</span></code> to <code class="docutils literal notranslate"><span class="pre">True</span></code>. This probably wonât bite 277you, but we mention it just in case you somehow relied upon the legacy 278behavior.</p></li> 279<li><p>You subclass <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">invoke.runners.Runner</span></code></a> and/or have had to interact with its 280<code class="docutils literal notranslate"><span class="pre">stop</span></code> or <code class="docutils literal notranslate"><span class="pre">stop_timer</span></code> methods. The latter has been merged into the 281former, and if you are overriding <code class="docutils literal notranslate"><span class="pre">stop</span></code>, youâll want to make sure you 282now call <code class="docutils literal notranslate"><span class="pre">super()</span></code> somewhere if you were not already.</p></li> 283</ul> 284</div> 285</li> 286</ul> 287</section> 288<section id="1.7.3"> 289<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.7.3">1.7.3</a> <span style="font-size: 75%;">2022-09-30</span></h2><ul class="simple"> 290<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Fix a non-fatal bug in our setup.py 291<code class="docutils literal notranslate"><span class="pre">long_description</span></code> generation causing 1.7.0-1.7.2 to have malformed 292description text on PyPI.</p></li> 293</ul> 294</section> 295<section id="1.7.2"> 296<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.7.2">1.7.2</a> <span style="font-size: 75%;">2022-09-30</span></h2><ul class="simple"> 297<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Fix errors thrown when comparing <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Task</span></code></a> objects to 298non-Task objects; such comparisons are now always false.</p></li> 299<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/876">#876</a><span>:</span> Refactor CLI parser instantiation such that the 300<code class="docutils literal notranslate"><span class="pre">tasks.ignore_unknown_help</span></code> feature (added in 1.7) works when Invoke is run 301in <code class="docutils literal notranslate"><span class="pre">--complete</span></code> mode, i.e. in tab-completion scripts.</p></li> 302</ul> 303</section> 304<section id="1.7.1"> 305<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.7.1">1.7.1</a> <span style="font-size: 75%;">2022-05-11</span></h2><ul class="simple"> 306<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/659">#659</a><span>:</span> Improve behavior under <code class="docutils literal notranslate"><span class="pre">nohup</span></code>, which causes stdin to become an 307undetectably-unreadable (but otherwise legit) file descriptor. Previously 308this led to <a class="reference external" href="https://docs.python.org/3/library/exceptions.html#OSError" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">OSError</span></code></a> even if you werenât expecting anything on stdin; we now
309trap this specific case and silently ignore it, allowing execution to 310continue. Thanks to <code class="docutils literal notranslate"><span class="pre">@kingkisskill</span></code> for initial report and to Ryan Stoner 311for followup and workshopping.</p></li> 312</ul> 313</section> 314<section id="1.7.0"> 315<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.7.0">1.7.0</a> <span style="font-size: 75%;">2022-03-18</span></h2><ul> 316<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/845">#845</a><span>:</span> Env vars explicitly supplied to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.sudo" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">sudo</span></code></a> 317(via its <code class="docutils literal notranslate"><span class="pre">env</span></code> kwarg) are now explicitly preserved via <code class="docutils literal notranslate"><span class="pre">sudo</span></code>âs 318<code class="docutils literal notranslate"><span class="pre">--preserve-env</span></code> argument. Patch courtesy of Benno Rice.</p></li> 319<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/793">#793</a><span>:</span> Add a new <code class="docutils literal notranslate"><span class="pre">tasks.ignore_unknown_help</span></code> config option for 320users who hand their tasks centrally-defined argument help dictionaries; it 321defaults to <code class="docutils literal notranslate"><span class="pre">False</span></code> but such users may set it to <code class="docutils literal notranslate"><span class="pre">True</span></code> to avoid 322exceptions. Thanks to <code class="docutils literal notranslate"><span class="pre">@Allu2</span></code> for the report.</p></li> 323<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Switch our continuous integration service from Travis-CI to 324Circle-CI, plus related and necessary updates to various administrative 325config files, management tasks and metadata. Including but not limited to:</p> 326<ul class="simple"> 327<li><p>Enhanced PyPI-level metadata/links</p></li> 328<li><p>Split out tool config data from <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code></p></li> 329<li><p>Enhance execution & coverage of unit vs integration tests under CI</p></li> 330</ul> 331<div class="admonition warning"> 332<p class="admonition-title">Warning</p> 333<p>Due to various factors, this release will <strong>not</strong> include a Python 3342-compatible wheel archive. Users of Python 2 can still install from the 335sdist, and are strongly encouraged to check <a class="reference external" href="https://bitprophet.org/projects/#roadmap">the roadmap</a> as the next release will 336likely be the one that removes Python 2 entirely!</p> 337</div> 338</li> 339<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/803">#803</a><span>:</span> Upgrade our vendored PyYAML from 3.11 to 5.4.1; this should 340both supply a number of security fixes, and address problems loading 341project-level YAML config files under Python 3.10. Fix via Andreas Rammhold.</p></li> 342<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Switch to using <code class="docutils literal notranslate"><span class="pre">yaml.safe_load</span></code> for loading config files. 343This avoids some warnings under newer PyYAML versions and is also, in a 344shocking twist, more secure.</p></li> 345</ul> 346</section> 347<section id="1.6.0"> 348<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.6.0">1.6.0</a> <span style="font-size: 75%;">2021-07-09</span></h2><ul class="simple"> 349<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/791">#791</a><span>:</span> Add a new <code class="docutils literal notranslate"><span class="pre">run.echo_format</span></code> configuration option allowing 350control over the format of echoed commands. It defaults to the previously 351hardcoded value (wrap in ANSI bold) and is thus backwards compatible. Thanks 352to David JM Emmett for the patch.</p></li> 353<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Document the <code class="docutils literal notranslate"><span class="pre">dry</span></code> keyword argument to <code class="docutils literal notranslate"><span class="pre">run</span></code>, 354which had been added in version 1.3 but only documented as a CLI flag; it 355does also work as a kwarg (and as a config option).</p></li> 356<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> (Mostly) alphabetize the list of <code class="docutils literal notranslate"><span class="pre">run()</span></code> params in 357the runners API docs. Previously they were an unordered mess.</p></li> 358</ul> 359</section> 360<section id="1.5.1"> 361<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.5.1">1.5.1</a> <span style="font-size: 75%;">2021-07-09</span></h2><ul class="simple"> 362<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/751">#751</a><span>:</span> Donât explode on empty-but-for-whitespace task docstrings. Thanks 363to Matt Hayden for the report & initial patches.</p></li> 364<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Document the <code class="docutils literal notranslate"><span class="pre">dry</span></code> keyword argument to <code class="docutils literal notranslate"><span class="pre">run</span></code>, 365which had been added in version 1.3 but only documented as a CLI flag; it 366does also work as a kwarg (and as a config option).</p></li> 367<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> (Mostly) alphabetize the list of <code class="docutils literal notranslate"><span class="pre">run()</span></code> params in 368the runners API docs. Previously they were an unordered mess.</p></li> 369</ul> 370</section> 371<section id="1.5.0"> 372<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.5.0">1.5.0</a> <span style="font-size: 75%;">2020-12-30</span></h2><ul> 373<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Upgrade <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.MockContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">MockContext</span></code></a> to wrap its methods in 374<code class="docutils literal notranslate"><span class="pre">Mock</span></code> objects if the <code class="docutils literal notranslate"><span class="pre">(unittest.)mock</span></code> library is importable. This makes
375testing Invoke-using codebases even easier.</p></li> 376<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/700">#700</a><span>:</span> Automatically populate the <code class="docutils literal notranslate"><span class="pre">command</span></code> attribute of 377<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> objects returned by <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.MockContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">MockContext</span></code></a> 378methods, with the command string triggering that result. Previously users had 379to do this by hand or otherwise suffered inaccurate result objects. Thanks to 380<code class="docutils literal notranslate"><span class="pre">@SwampFalc</span></code> for the report & initial patch.</p></li> 381<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/441">#441</a><span>:</span> Add a new <code class="docutils literal notranslate"><span class="pre">repeat</span></code> kwarg to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.MockContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">MockContext</span></code></a> 382which, when True (default: False) causes stored results for its methods to be 383yielded repeatedly instead of consumed. Feature request courtesy of 384<code class="docutils literal notranslate"><span class="pre">@SwampFalc</span></code>.</p></li> 385<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.MockContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">MockContext</span></code></a> now accepts a few quality-of-life 386shortcuts as keys and values in its <code class="docutils literal notranslate"><span class="pre">run</span></code>/<code class="docutils literal notranslate"><span class="pre">sudo</span></code> arguments:</p> 387<blockquote> 388<div><ul class="simple"> 389<li><p>Keys may be compiled regular expression objects, as well as strings, and 390will match any calls whose commands match the regex.</p></li> 391<li><p>Values may be <code class="docutils literal notranslate"><span class="pre">True</span></code> or <code class="docutils literal notranslate"><span class="pre">False</span></code> as shorthand for otherwise empty 392<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> objects with exit codes of <code class="docutils literal notranslate"><span class="pre">0</span></code> or <code class="docutils literal notranslate"><span class="pre">1</span></code> 393respectively.</p></li> 394<li><p>Values may also be strings, as shorthand for otherwise empty 395<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> objects with those strings given as the 396<code class="docutils literal notranslate"><span class="pre">stdout</span></code> argument.</p></li> 397</ul> 398</div></blockquote> 399</li> 400<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.MockContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">MockContext</span></code></a> now populates its 401<code class="docutils literal notranslate"><span class="pre">NotImplementedError</span></code> exception instances (typically raised when a command 402is executed which had no pre-prepared result) with the command string that 403triggered them; this makes it much easier to tell what exactly in a test 404caused the error.</p></li> 405<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/197">#197</a><span>:</span> Allow subcollections to act as the default âtasksâ of their 406parent collections (via the new <code class="docutils literal notranslate"><span class="pre">default</span></code> kwarg to 407<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection.add_collection" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">add_collection</span></code></a>). This means that nontrivial 408task trees can specify eg âuse my test subcollectionâs default task as the 409global default taskâ and similar. Thanks to Tye Wang for the request and 410initial patch.</p></li> 411<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/454">#454</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/577">#577</a>/<a class="reference external" href="https://github.com/pyinvoke/invoke/issues/658">
411#658</a>, via 412<a class="reference external" href="https://github.com/pyinvoke/invoke/issues/583">#583</a>/<a class="reference external" href="https://github.com/pyinvoke/invoke/issues/681">#681</a>/<a class="reference external" href="https://github.com/pyinvoke/invoke/issues/607">#607</a>) Allow any string-compatible object to 413be passed to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.cd" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context.cd</span></code></a>, enabling use of eg 414<code class="docutils literal notranslate"><span class="pre">pathlib.Path</span></code> instances. Thanks to Jimm Domingo for the original report 415and Ludovico Bianchi, Mario César, and Floris Lambrechts for patches.</p></li> 416<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Immutable iterable result values handed to 417<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.MockContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">MockContext</span></code></a> would yield errors (due to the use of 418<code class="docutils literal notranslate"><span class="pre">pop()</span></code>). The offending logic has been retooled to be more iterator-focused 419and now works for tuples and etc.</p></li> 420<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/398">#398</a><span>:</span> (via <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/611">#611</a>/<a class="reference external" href="https://github.com/pyinvoke/invoke/issues/580">#580</a>) Donât silently ignore task 421help specifiers which donât actually map to the decorated taskâs arguments 422(eg <code class="docutils literal notranslate"><span class="pre">@task(help={"foo":</span> <span class="pre">"help</span> <span class="pre">for</span> <span class="pre">foo"})</span></code> wrapping a task without a <code class="docutils literal notranslate"><span class="pre">foo</span></code> 423argument). Reported by Sohaib Farooqi, with original patches by Hayden 424Flinner and Floris Lambrechts.</p></li> 425<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/409">#409</a><span>:</span> (via <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/611">#611</a>/<a class="reference external" href="https://github.com/pyinvoke/invoke/issues/580">#580</a>) Donât silently discard help 426text for task arguments whose names happen to contain underscores. Reported 427by <code class="docutils literal notranslate"><span class="pre">@iago1460</span></code>, original patches by Hayden Flinner and Floris Lambrechts.</p></li> 428<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/586">#586</a><span>:</span> Explicitly strip out <code class="docutils literal notranslate"><span class="pre">__pycache__</span></code> (and for good 429measure, <code class="docutils literal notranslate"><span class="pre">.py[co]</span></code>, which previously we only stripped from the <code class="docutils literal notranslate"><span class="pre">tests/</span></code> 430folder) in our <code class="docutils literal notranslate"><span class="pre">MANIFEST.in</span></code>, since at least some earlier releases 431erroneously included such. Credit to Martijn Pieters for the report and 432Floris Lambrechts for the patch.</p></li> 433<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Update the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/testing.html#testing-user-code" title="(in Invoke)"><span class="xref std std-ref">testing documentation</span></a> a 434bit: cleaned up existing examples and added new sections for the other 435updates in the 1.5 release.</p></li> 436<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span>
436 Enhanced test coverage in a handful of modules whose coverage 437was under 90%.</p></li> 438</ul> 439</section> 440<section id="1.4.1"> 441<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.4.1">1.4.1</a> <span style="font-size: 75%;">2020-01-29</span></h2><ul class="simple"> 442<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/518">#518</a><span>:</span> Close pseudoterminals opened by the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Local" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Local</span></code></a> class 443during <code class="docutils literal notranslate"><span class="pre">run(...,</span> <span class="pre">pty=True)</span></code>. Previously, these were only closed 444incidentally at process shutdown, causing file descriptor leakage in 445long-running processes. Thanks to Jonathan Paulson for the report.</p></li> 446<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/660">#660</a><span>:</span> Fix an issue with <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> & friends having intermittent 447problems at exit time (symptom was typically about the exit code value being 448<code class="docutils literal notranslate"><span class="pre">None</span></code> instead of an integer; often with an exception trace). Thanks to 449Frank Lazzarini for the report and to the numerous others who provided 450reproduction cases.</p></li> 451<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/586">#586</a><span>:</span> Explicitly strip out <code class="docutils literal notranslate"><span class="pre">__pycache__</span></code> (and for good 452measure, <code class="docutils literal notranslate"><span class="pre">.py[co]</span></code>, which previously we only stripped from the <code class="docutils literal notranslate"><span class="pre">tests/</span></code> 453folder) in our <code class="docutils literal notranslate"><span class="pre">MANIFEST.in</span></code>, since at least some earlier releases 454erroneously included such. Credit to Martijn Pieters for the report and 455Floris Lambrechts for the patch.</p></li> 456</ul> 457</section> 458<section id="1.3.1"> 459<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.3.1">1.3.1</a> <span style="font-size: 75%;">2020-01-29</span></h2><ul class="simple"> 460<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/518">#518</a><span>:</span> Close pseudoterminals opened by the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Local" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Local</span></code></a> class 461during <code class="docutils literal notranslate"><span class="pre">run(...,</span> <span class="pre">pty=True)</span></code>. Previously, these were only closed 462incidentally at process shutdown, causing file descriptor leakage in 463long-running processes. Thanks to Jonathan Paulson for the report.</p></li> 464<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/660">#660</a><span>:</span> Fix an issue with <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> & friends having intermittent 465problems at exit time (symptom was typically about the exit code value being 466<code class="docutils literal notranslate"><span class="pre">None</span></code> instead of an integer; often with an exception trace). Thanks to 467Frank Lazzarini for the report and to the numerous others who provided 468reproduction cases.</p></li> 469<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/586">#586</a><span>:</span> Explicitly strip out <code class="docutils literal notranslate"><span class="pre">__pycache__</span></code> (and for good 470measure, <code class="docutils literal notranslate"><span class="pre">.py[co]</span></code>, which previously we only stripped from the <code class="docutils literal notranslate"><span class="pre">tests/</span></code> 471folder) in our <code class="docutils literal notranslate"><span class="pre">MANIFEST.in</span></code>, since at least some earlier releases
472erroneously included such. Credit to Martijn Pieters for the report and 473Floris Lambrechts for the patch.</p></li> 474</ul> 475</section> 476<section id="1.4.0"> 477<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.4.0">1.4.0</a> <span style="font-size: 75%;">2020-01-03</span></h2><ul> 478<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Never accompanied the top-level singleton <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> (which 479simply wraps an anonymous <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context</span></code></a>âs <code class="docutils literal notranslate"><span class="pre">run</span></code> method) with 480its logical sibling, <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.sudo" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">sudo</span></code></a> - this has been remedied.</p></li> 481<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/682">#682</a><span>:</span> (originally reported as <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/194">#194</a>) Add asynchronous 482behavior to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>:</p> 483<ul class="simple"> 484<li><p>Basic asynchronicity, where the method returns as soon as the subprocess 485has started running, and that return value is an object with methods 486allowing access to the final result.</p></li> 487<li><p>âDisowningâ subprocesses entirely, which not only returns immediately but 488also omits background threading, allowing the subprocesses to outlive 489Invokeâs own process.</p></li> 490</ul> 491<p>See the updated API docs for the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Runner</span></code></a> for details on the 492new <code class="docutils literal notranslate"><span class="pre">asynchronous</span></code> and <code class="docutils literal notranslate"><span class="pre">disown</span></code> kwargs enabling this behavior. Thanks to 493<code class="docutils literal notranslate"><span class="pre">@MinchinWeb</span></code> for the original report.</p> 494</li> 495<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> As part of feature work on <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/682">#682</a>, we noticed that the 496<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> return value from <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> was 497inconsistent between dry-run and regular modes; for example, the dry-run 498version of the object lacked updated values for <code class="docutils literal notranslate"><span class="pre">hide</span></code>, <code class="docutils literal notranslate"><span class="pre">encoding</span></code> and 499<code class="docutils literal notranslate"><span class="pre">env</span></code>. This has been fixed.</p></li> 500<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/637">#637</a><span>:</span> A corner case in <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> caused 501overridden streams to be unused if those streams were also set to be hidden 502(eg <code class="docutils literal notranslate"><span class="pre">run(command,</span> <span class="pre">hide=True,</span> <span class="pre">out_stream=StringIO())</span></code> would result in no 503writes to the <code class="docutils literal notranslate"><span class="pre">StringIO</span></code> object).</p> 504<p>This has been fixed - hiding for a given stream is now ignored if that stream 505has been set to some non-<code class="docutils literal notranslate"><span class="pre">None</span></code> (and in the case of <code class="docutils literal notranslate"><span class="pre">in_stream</span></code>, 506non-<code class="docutils literal notranslate"><span class="pre">False</span></code>) value.</p> 507</li> 508</ul> 509</section> 510<section id="1.3.0"> 511<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.3.0">1.3.0</a> <span style="font-size: 75%;">2019-08-06</span></h2><ul> 512<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Allow the configuration system to override which 513<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/executor.html#invoke.executor.Executor" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Executor</span></code></a> subclass to use when executing tasks (via an 514import-oriented string).</p> 515<p>Specifically, itâs now possible to alter execution by distributing such a 516subclass alongside, for example, a repository-local config file which sets 517<code class="docutils literal notranslate"><span class="pre">tasks.executor_class</span></code>; previously, this sort of thing required use of 518<a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/library.html#reusing-as-a-binary" title="(in Invoke)"><span class="xref std std-ref">custom binaries</span></a>.</p> 519</li> 520<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/539">#539</a><span>:</span> (via <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/645">#645</a>) Add support for command timeouts, i.e. the 521ability to add an upper bound on how long a call to 522<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> may take to execute. Specifically:</p> 523<ul class="simple"> 524<li><p>A <code class="docutils literal notranslate"><span class="pre">timeout</span></code> argument to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>.</p></li> 525<li><p>The <code class="docutils literal notranslate"><span class="pre">timeouts.command</span></code> config setting mapping to that argument.</p></li> 526<li><p>The <a class="reference external" href="https://docs.pyinvoke.org/en/latest/invoke.html#cmdoption-T" title="(in Invoke)"><code class="xref std std-option docutils literal notranslate"><span class="pre">-T/--command-timeout</span></code></a> CLI flag.</p></li> 527</ul> 528<p>Thanks to Israel Fruchter for the request & an early version of the patchset.</p> 529</li> 530<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/324">#324</a><span>:</span> Add basic dry-run support, in the form of a new 531<a class="reference external" href="https://docs.pyinvoke.org/en/latest/invoke.html#cmdoption-dry" title="(in Invoke)"><code class="xref std std-option docutils literal notranslate"><span class="pre">--dry</span></code></a> CLI option and matching <code class="docutils literal notranslate"><span class="pre">run.dry</span></code> config setting, which 532causes command runners (eg <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>, <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context.run</span></code></a>) to:</p> 533<ul class="simple"> 534<li><p>Act as if the <code class="docutils literal notranslate"><span class="pre">echo</span></code> option has been turned on, printing the 535command-to-be-run to stdout;</p></li> 536<li><p>Skip actual subprocess invocation (returning before any of that machinery 537starts running);</p></li> 538<li><p>Return a dummy <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> object with âblankâ values (empty 539stdout/err strings, <code class="docutils literal notranslate"><span class="pre">0</span></code> exit code, etc).</p></li> 540</ul> 541<p>This allows quickly seeing what a given task or series of tasks might do, 542without actually running any shell commands (though naturally, any 543state-modifying Python code will still run).</p> 544<p>Thanks to Monty Hindman for the feature request and <code class="docutils literal notranslate"><span class="pre">@thebjorn</span></code> for the 545initial patch.</p> 546</li> 547<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/466">#466</a><span>:</span> Update the parsing and CLI-program mechanisms so that all 548core arguments may be given within task CLI contexts; previously this
549functionality only worked for the <code class="docutils literal notranslate"><span class="pre">--help</span></code> flag, and other core arguments 550given after task names (such as <code class="docutils literal notranslate"><span class="pre">--echo</span></code>) were silently ignored.</p></li> 551<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/557">#557</a><span>:</span> (with assist from <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/640">#640</a>) Fix the 552<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.cd" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">cd</span></code></a> and <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.prefix" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">prefix</span></code></a> context 553managers so that <code class="docutils literal notranslate"><span class="pre">with</span> <span class="pre">cd</span></code> and <code class="docutils literal notranslate"><span class="pre">with</span> <span class="pre">prefix</span></code> correctly revert their state 554manipulations after they exit, when exceptions occur. Thanks to Jon Walsh and 555Artur Puzio for their respective patches.</p></li> 556<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/552">#552</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/553">#553</a>) Add a new <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Runner</span></code></a> 557method, <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.close_proc_stdin" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">close_proc_stdin</span></code></a>, and call it when standard 558input processing detects an EOF. Without this, subprocesses that read their 559stdin until EOF would block forever, hanging the program. Thanks to 560<code class="docutils literal notranslate"><span class="pre">@plockc</span></code> for the report & initial patch.</p> 561<div class="admonition note"> 562<p class="admonition-title">Note</p> 563<p>This fix only applies when <code class="docutils literal notranslate"><span class="pre">pty=False</span></code> (the default); PTYs complicate the 564situation greatly (but also mean the issue is less likely to occur).</p> 565</div> 566</li> 567<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/384">#384</a><span>:</span> (via <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/653">#653</a>) Modify config file loading so it detects 568missing-file IOErrors via their <code class="docutils literal notranslate"><span class="pre">errno</span></code> attribute instead of their string 569rendering (eg <code class="docutils literal notranslate"><span class="pre">"No</span> <span class="pre">such</span> <span class="pre">file"</span></code>). This should improve compatibility for 570non-English locales. Thanks to Patrick Massot for the report and Github user 571<code class="docutils literal notranslate"><span class="pre">@cybiere</span></code> for the patch.</p></li> 572</ul> 573</section> 574<section id="1.2.0"> 575<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.2.0">1.2.0</a> <span style="font-size: 75%;">2018-09-13</span></h2><ul class="simple"> 576<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/301">#301</a><span>:</span> (via <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/414">#414</a>) Overhaul tab completion mechanisms so users 577can <a class="reference external" href="https://docs.pyinvoke.org/en/latest/invoke.html#print-completion-script" title="(in Invoke)"><span class="xref std std-ref">print a completion script</span></a> which 578automatically matches the emitting binaryâs configured names (compared to the
579previous hardcoded scripts, which only worked for <code class="docutils literal notranslate"><span class="pre">inv</span></code>/<code class="docutils literal notranslate"><span class="pre">invoke</span></code> by 580default). Thanks to Nicolas Höning for the foundational patchset.</p></li> 581</ul> 582</section> 583<section id="1.1.1"> 584<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.1.1">1.1.1</a> <span style="font-size: 75%;">2018-07-31</span></h2><ul> 585<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/559">#559</a><span>:</span> (also <a class="reference external" href="https://github.com/fabric/fabric/issues/1812">fabric/fabric#1812</a>) Modify how 586<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Runner</span></code></a> performs stdin terminal mode changes, to avoid 587incorrect terminal state restoration when run concurrently (which could lead 588to things like terminal echo becoming disabled after the Python process 589exits).</p> 590<p>Thanks to Adam Jensen and Nick Timkovich for the detailed bug reports & 591reproduction assistance.</p> 592</li> 593<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/556">#556</a><span>:</span> (also <a class="reference external" href="https://github.com/fabric/fabric/issues/1823">fabric/fabric#1823</a>) Pre-emptively check for an 594error condition involving an unpicklable config file value (Python config 595files and imported module objects) and raise a useful exception instead of 596allowing a confusing <code class="docutils literal notranslate"><span class="pre">TypeError</span></code> to bubble up later. Reported by Pham Cong 597Dinh.</p></li> 598</ul> 599</section> 600<section id="1.0.2"> 601<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.0.2">1.0.2</a> <span style="font-size: 75%;">2018-07-31</span></h2><ul> 602<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/559">#559</a><span>:</span> (also <a class="reference external" href="https://github.com/fabric/fabric/issues/1812">fabric/fabric#1812</a>) Modify how 603<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Runner</span></code></a> performs stdin terminal mode changes, to avoid 604incorrect terminal state restoration when run concurrently (which could lead 605to things like terminal echo becoming disabled after the Python process 606exits).</p> 607<p>Thanks to Adam Jensen and Nick Timkovich for the detailed bug reports & 608reproduction assistance.</p> 609</li> 610<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/556">#556</a><span>:</span> (also <a class="reference external" href="https://github.com/fabric/fabric/issues/1823">fabric/fabric#1823</a>) Pre-emptively check for an 611error condition involving an unpicklable config file value (Python config 612files and imported module objects) and raise a useful exception instead of 613allowing a confusing <code class="docutils literal notranslate"><span class="pre">TypeError</span></code> to bubble up later. Reported by Pham Cong 614Dinh.</p></li> 615</ul> 616</section> 617<section id="1.1.0"> 618<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.1.0">1.1.0</a> <span style="font-size: 75%;">2018-07-12</span></h2><ul class="simple"> 619<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/543">#543</a><span>:</span> Implemented support for using <code class="docutils literal notranslate"><span class="pre">INVOKE_RUNTIME_CONFIG</span></code> env 620var as an alternate method of supplying a runtime configuration file path 621(effectively, an env var based version of using the <code class="docutils literal notranslate"><span class="pre">-f</span></code>/<code class="docutils literal notranslate"><span class="pre">--config</span></code> 622option). Feature request via Kevin J. Qiu.</p></li> 623<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Add a <code class="docutils literal notranslate"><span class="pre">klass</span></code> kwarg to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">@task</span></code></a> to allow
624extending codebases the ability to create their own variants on 625<code class="docutils literal notranslate"><span class="pre">@task</span></code>/<code class="docutils literal notranslate"><span class="pre">Task</span></code>.</p></li> 626<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Remove overzealous argument checking in <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">@task</span></code></a>, instead just handing any extra kwargs into the task 627class constructor. The high level behavior for truly invalid kwargs is the 628same (<code class="docutils literal notranslate"><span class="pre">TypeError</span></code>) but now extending codebases can add kwargs to their 629versions of <code class="docutils literal notranslate"><span class="pre">@task</span></code> without issue.</p></li> 630<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Refactor <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Call" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Call</span></code></a> internals slightly, exposing some 631previously internal logic as the <code class="docutils literal notranslate"><span class="pre">clone_data</span></code> method; this is useful for 632client codebases when extending <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Call" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Call</span></code></a> and friends.</p></li> 633<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Enhance <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Call" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Call</span></code></a> with a new method 634(<code class="docutils literal notranslate"><span class="pre">clone_data</span></code>) and new kwarg to an existing method (<code class="docutils literal notranslate"><span class="pre">clone</span></code> grew 635<code class="docutils literal notranslate"><span class="pre">with_</span></code>) to assist subclassers when extending.</p></li> 636<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Implemented some minor missing tests, such as testing 637the <code class="docutils literal notranslate"><span class="pre">INVOKE_DEBUG</span></code> low-level env var.</p></li> 638<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Fix some test-suite-only failures preventing 639successful testing on Python 3.7 and PyPy3, and move them out of the âallowed 640failuresâ test matrix quarantine now that they pass.</p></li> 641<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Apply the <a class="reference external" href="https://black.readthedocs.io/">black</a> 642code formatter to our codebase and our CI configuration.</p></li> 643<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Fixed some inaccuracies in the API docs around 644<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/executor.html#invoke.executor.Executor" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Executor</span></code></a> and its <code class="docutils literal notranslate"><span class="pre">core</span></code> kwarg (was erroneously referring 645to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/parser.html#invoke.parser.context.ParserContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ParserContext</span></code></a> instead of 646<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/parser.html#invoke.parser.parser.ParseResult" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ParseResult</span></code></a>). Includes related cleaning-up of 647docstrings and tests.</p></li> 648</ul> 649</section> 650<section id="1.0.1"> 651<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.0.1">1.0.1</a> <span style="font-size: 75%;">2018-07-12</span></h2><ul class="simple"> 652<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> As part of solving <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/528">#528</a> we found a related bug, where 653unnamed subcollections also caused issues with <code class="docutils literal notranslate"><span class="pre">inv</span> <span class="pre">--list</span> 654<span class="pre">--list-format=json</span></code>
654. Specifically, <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection.serialized" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Collection.serialized</span></code></a> sorts subcollections by name, 655which is problematic when that name is <code class="docutils literal notranslate"><span class="pre">None</span></code>. This is now fixed.</p></li> 656<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/528">#528</a><span>:</span> Around Invoke 0.23 we broke the ability to weave in subcollections 657via keyword arguments to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Collection</span></code></a>, though it primarily 658manifests as <code class="docutils literal notranslate"><span class="pre">NoneType</span></code> related errors during <code class="docutils literal notranslate"><span class="pre">inv</span> <span class="pre">--list</span></code>. This was 659unintentional and has been fixed. Report submitted by Tuukka Mustonen.</p></li> 660<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Fix up the <code class="docutils literal notranslate"><span class="pre">__repr__</span></code> of <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Call" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Call</span></code></a> to reference dynamic 661class name instead of hardcoding <code class="docutils literal notranslate"><span class="pre">"Call"</span></code>; this allows subclassesâ 662<code class="docutils literal notranslate"><span class="pre">__repr__</span></code> output to be correct instead of confusing.</p></li> 663<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/270">#270</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/551">#551</a>) <code class="docutils literal notranslate"><span class="pre">None</span></code> values in config levels (most 664commonly caused by empty configuration files) would raise <code class="docutils literal notranslate"><span class="pre">AttributeError</span></code> 665when <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.merge_dicts" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">merge_dicts</span></code></a> was used to merge config levels together. 666This has been fixed. Thanks to Tyler Hoffman and Vlad Frolov for the reports.</p></li> 667<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Implemented some minor missing tests, such as testing 668the <code class="docutils literal notranslate"><span class="pre">INVOKE_DEBUG</span></code> low-level env var.</p></li> 669<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Fix some test-suite-only failures preventing 670successful testing on Python 3.7 and PyPy3, and move them out of the âallowed 671failuresâ test matrix quarantine now that they pass.</p></li> 672<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Apply the <a class="reference external" href="https://black.readthedocs.io/">black</a> 673code formatter to our codebase and our CI configuration.</p></li> 674<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Fixed some inaccuracies in the API docs around 675<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/executor.html#invoke.executor.Executor" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Executor</span></code></a> and its <code class="docutils literal notranslate"><span class="pre">core</span></code> kwarg (was erroneously referring 676to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/parser.html#invoke.parser.context.ParserContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ParserContext</span></code></a> instead of 677<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/parser.html#invoke.parser.parser.ParseResult" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ParseResult</span></code></a>). Includes related cleaning-up of 678docstrings and tests.</p></li> 679</ul> 680</section> 681<section id="1.0.0"> 682<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/1.0.0">1.0.0</a> <span style="font-size: 75%;">2018-05-09</span></h2><ul> 683<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Updated <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Task</span></code></a> to mimic the wrapped functionâs 684<code class="docutils literal notranslate"><span class="pre">__module__</span></code> attribute, allowing for better interaction with things like 685Sphinx autodoc that attempt to filter out imported objects from a module.</p></li> 686<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Added the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/invoke.html#prompt-for-sudo-password" title="(in Invoke)"><span class="xref std std-ref">âprompt-for-sudo-password</span></a> CLI option for getpass-based up-front prompting 687of a sensitive configuration value.</p></li> 688<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Tweaked the innards of 689<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a>/<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.DataProxy" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">DataProxy</span></code></a> to prevent accessing 690properties & other attributesâ values during <code class="docutils literal notranslate"><span class="pre">__setattr__</span></code> (the code in 691question only needed the names). This should have no noticeable effect on 692user code (besides a marginal speed increase) but fixed some minor test 693coverage issues.</p></li> 694<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Removed an old, unused and untested (but, regrettably, 695documented and public) method that doesnât seem to be much use: 696<code class="docutils literal notranslate"><span class="pre">invoke.config.Config.paths</span></code>. Please reach out if you were actually using 697it and we may consider adding some form of it back.</p> 698<div class="admonition warning"> 699<p class="admonition-title">Warning</p> 700<p>This is a backwards incompatible change if you were using <code class="docutils literal notranslate"><span class="pre">Config.paths</span></code>.</p> 701</div> 702</li> 703</ul> 704</section> 705<section id="0.23.0"> 706<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.23.0">0.23.0</a> <span style="font-size: 75%;">2018-04-29</span></h2><ul> 707<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/33">#33</a><span>:</span> Overhaul task listing (formerly just a simple, boolean 708<code class="docutils literal notranslate"><span class="pre">--list</span></code>) to make life easier for users with nontrivial task trees:</p> 709<ul class="simple"> 710<li><p>Limit display to a specific namespace by giving an optional argument to 711<code class="docutils literal notranslate"><span class="pre">--list</span></code>, e.g. <code class="docutils literal notranslate"><span class="pre">--list</span> <span class="pre">build</span></code>;</p></li> 712<li><p>Additional output formats besides the default (now known as <code class="docutils literal notranslate"><span class="pre">flat</span></code>) such 713as a nested view with <code class="docutils literal notranslate"><span class="pre">--list-format</span> <span class="pre">nested</span></code> or script-friendly output 714with <code class="docutils literal notranslate"><span class="pre">--list-format</span> <span class="pre">json</span></code>.</p></li> 715<li><p>The default <code class="docutils literal notranslate"><span class="pre">flat</span></code> format now sorts a bit differently - the previous 716algorithm would break up trees of tasks.</p></li> 717<li><p>Limit listing depth, so itâs easier to view only the first level or two 718(i.e. the overall namespaces) of a large tree, e.g. <code class="docutils literal notranslate"><span class="pre">--list</span> <span class="pre">--list-depth</span> 719<span class="pre">1</span></code>;</p></li> 720</ul> 721<p>Thanks to the many users who submitted various requests under this ticketâs 722umbrella, and to Dave Burkholder in particular for detailed use case analysis 723& feedback.</p> 724</li> 725<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> (partially re: <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/449">#449</a>) Update error message around 726missing positional arguments so it actually lists them. Includes a minor 727tweak to the API of <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/parser.html#invoke.parser.context.ParserContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ParserContext</span></code></a>, namely changing 728<code class="docutils literal notranslate"><span class="pre">needs_positional_arguments</span></code> (bool) to <code class="docutils literal notranslate"><span class="pre">missing_positional_arguments</span></code> 729(list).</p></li> 730<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/516">#516</a><span>:</span> Remove the CLI parser ambiguity rule regarding flag-like 731tokens which are seen after an optional-value flag (e.g. <code class="docutils literal notranslate"><span class="pre">inv</span> <span class="pre">task</span> 732<span class="pre">--optionally-takes-a-value</span> <span class="pre">--some-other-flag</span></code>.) Previously, any flag-like 733value in such a spot was considered ambiguous and raised a 734<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/exceptions.html#invoke.exceptions.ParseError" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ParseError</span></code></a>. Now, the surrounding parse context is used 735to resolve the ambiguity, and no error is raised.</p> 736<div class="admonition warning"> 737<p class="admonition-title">Warning</p> 738<p>This behavior is backwards incompatible, but only if you had the minority 739case where users frequently <em>and erroneously</em> give otherwise-legitimate 740flag-like values to optional-value arguments, and you rely on the parse 741errors to notify them of their mistake. (If you donât understand what this 742means, donât worry, you almost certainly donât need to care!)</p> 743</div> 744</li> 745<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Integer-type CLI arguments were not displaying placeholder 746text in <code class="docutils literal notranslate"><span class="pre">--help</span></code> output (i.e. they appeared as <code class="docutils literal notranslate"><span class="pre">--myint</span></code> instead of 747<code class="docutils literal notranslate"><span class="pre">--myint=INT</span></code>.) This has been fixed.</p></li> 748<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Collection</span></code></a> had some minor bugs or 749oversights in how it responds to things like <code class="docutils literal notranslate"><span class="pre">repr()</span></code>, <code class="docutils literal notranslate"><span class="pre">==</span></code>; boolean 750behavior; how docstrings appear when created from a Python module; etc. All 751are now fixed. If youâre not sure whether this affects you, it does not :)</p></li> 752<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span>
752 Previously, some error conditions (such as invalid task or 753collection names being supplied by the user) printed to standard output, 754instead of standard error. Standard error seems more appropriate here, so 755this has been fixed.</p> 756<div class="admonition warning"> 757<p class="admonition-title">Warning</p> 758<p>This is backwards incompatible if you were explicitly checking the standard 759output of the <code class="docutils literal notranslate"><span class="pre">inv[oke]</span></code> program for some of these error messages.</p> 760</div> 761<div class="admonition warning"> 762<p class="admonition-title">Warning</p> 763<p>If your code is manually raising or introspecting instances of 764<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/exceptions.html#invoke.exceptions.Exit" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Exit</span></code></a>, note that its signature has changed from 765<code class="docutils literal notranslate"><span class="pre">Exit(code=0)</span></code> to <code class="docutils literal notranslate"><span class="pre">
765Exit(message=None,</span> <span class="pre">code=None)</span></code>. (Thus, this will 766only impact you if you were calling its constructor instead of raising the 767class object itself.)</p> 768</div> 769</li> 770<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/469">#469</a><span>:</span> Fix up the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/library.html#customizing-config-defaults" title="(in Invoke)"><span class="xref std std-ref">doc/example</span></a> re: subclassing <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a>. 771Credit: <code class="docutils literal notranslate"><span class="pre">@Aiky30</span></code>.</p></li> 772<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/433">#433</a><span>:</span> Add -dev and -nightly style Python versions to our 773Travis builds. Thanks to <code class="docutils literal notranslate"><span class="pre">@SylvainDe</span></code> for the contribution.</p></li> 774<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Rename <code class="docutils literal notranslate"><span class="pre">invoke.platform</span></code> to <code class="docutils literal notranslate"><span class="pre">invoke.terminals</span></code>; it was 775inadvertently shadowing the <code class="docutils literal notranslate"><span class="pre">platform</span></code> standard library builtin module. 776This was not causing any bugs we are aware of, but it is still poor hygiene.</p> 777<div class="admonition warning"> 778<p class="admonition-title">Warning</p> 779<p>This change is technically backwards incompatible. We donât expect many 780users import <code class="docutils literal notranslate"><span class="pre">invoke.platform</span></code> directly, but if you are, take note.</p> 781</div> 782</li> 783<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/515">#515</a><span>:</span> Ported the test suite from <a class="reference external" href="https://github.com/bitprophet/spec">spec</a> (<a class="reference external" href="https://nose.readthedocs.io">nose</a>) to <a class="reference external" href="https://github.com/bitprophet/pytest-relaxed">pytest-relaxed</a> (<a class="reference external" href="https://pytest.org">pytest</a>) as pytest basically won the test-runner war against 784nose & has greater mindshare, more shiny toys, etc.</p></li> 785<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> (partially re: <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/33">#33</a>) Renamed the <code class="docutils literal notranslate"><span class="pre">--root</span></code> CLI flag to 786<code class="docutils literal notranslate"><span class="pre">--search-root</span></code>, partly for clarity (<a class="reference external" href="https://github.com/pyinvoke/invoke/issues/33">#33</a> will be adding namespace 787display-root related flags, which would make <code class="docutils literal notranslate"><span class="pre">--root</span></code> ambiguous) and partly 788for consistency with the config option, which was already named 789<code class="docutils literal notranslate"><span class="pre">search_root</span></code>. (The short version of the flag, <code class="docutils literal notranslate"><span class="pre">-r</span></code>, is unchanged.)</p> 790<div class="admonition warning"> 791<p class="admonition-title">Warning</p> 792<p>This is a backwards incompatible change. To fix, simply use 793<code class="docutils literal notranslate"><span class="pre">--search-root</span></code> anywhere you were previously using <code class="docutils literal notranslate"><span class="pre">--root</span></code>.</p> 794</div> 795</li> 796</ul> 797</section> 798<section id="0.22.1"> 799<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.22.1">0.22.1</a> <span style="font-size: 75%;">2018-01-29</span></h2><ul class="simple"> 800<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/488">#488</a><span>:</span> Account for additional I/O related <code class="docutils literal notranslate"><span class="pre">OSError</span></code> error strings
801when attempting to capture only this specific subtype of error. This should 802fix some issues with less common libc implementations such as <code class="docutils literal notranslate"><span class="pre">musl</span></code> (as 803found on e.g. Alpine Linux.) Thanks to Rajitha Perera for the report.</p></li> 804<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/437">#437</a><span>:</span> When merging configuration levels together (which uses 805<a class="reference external" href="https://docs.python.org/3/library/copy.html#copy.copy" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">copy.copy</span></code></a> by default), pass file objects by reference so they donât get 806closed. Catch & patch by Paul Healy.</p></li> 807<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/342">#342</a><span>:</span> Accidentally hardcoded <code class="docutils literal notranslate"><span class="pre">Collection</span></code> instead of <code class="docutils literal notranslate"><span class="pre">cls</span></code> in 808<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection.from_module" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Collection.from_module</span></code></a> (an 809alternate constructor and therefore a classmethod.) This made it rather hard 810to properly subclass <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Collection</span></code></a>. Report and initial 811patch courtesy of Luc Saffre.</p></li> 812<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/469">#469</a><span>:</span> Fix up the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/library.html#customizing-config-defaults" title="(in Invoke)"><span class="xref std std-ref">doc/example</span></a> re: subclassing <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a>. 813Credit: <code class="docutils literal notranslate"><span class="pre">@Aiky30</span></code>.</p></li> 814<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/433">#433</a><span>:</span> Add -dev and -nightly style Python versions to our 815Travis builds. Thanks to <code class="docutils literal notranslate"><span class="pre">@SylvainDe</span></code> for the contribution.</p></li> 816</ul> 817</section> 818<section id="0.22.0"> 819<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.22.0">0.22.0</a> <span style="font-size: 75%;">2017-11-29</span></h2><ul> 820<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Iterable-type CLI args were actually still somewhat broken & 821were âeatingâ values after themselves in the parser stream (thus e.g. 822preventing parsing of subsequent tasks or flags.) This has been fixed.</p></li> 823<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/407">#407</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/494">#494</a>, <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/67">#67</a>) Update the default value of 824the <code class="docutils literal notranslate"><span class="pre">run.shell</span></code> config value so that it reflects a Windows-appropriate 825value (specifically, the <code class="docutils literal notranslate"><span class="pre">COMSPEC</span></code> env var or a fallback of <code class="docutils literal notranslate"><span class="pre">cmd.exe</span></code>) on 826Windows platforms. This prevents Windows users from being forced to always 827ship around configuration-level overrides.</p> 828<p>Thanks to Maciej âmaQâ Kusz for the original patchset, and to <code class="docutils literal notranslate"><span class="pre">@thebjorn</span></code> 829and Garrett Jenkins for providing lots of feedback.</p> 830</li> 831<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/364">#364</a><span>:</span> Drop Python 2.6 and Python 3.3 support, as these versions now 832account for only very low percentages of the userbase and are unsupported (or 833about to be unsupported) by the rest of the ecosystem, including <code class="docutils literal notranslate"><span class="pre">pip</span></code>.</p> 834<p>This includes updating documentation & packaging metadata as well as taking
835advantage of basic syntax additions like set literals/comprehensions (<code class="docutils literal notranslate"><span class="pre">{1,</span> 836<span class="pre">2,</span> <span class="pre">3}</span></code> instead of <code class="docutils literal notranslate"><span class="pre">set([1,</span> <span class="pre">2,</span> <span class="pre">3])</span></code>) and removing positional string 837argument specifiers (<code class="docutils literal notranslate"><span class="pre">"{}".format(val)</span></code> instead of <code class="docutils literal notranslate"><span class="pre">"{0}".format(val)</span></code>).</p> 838</li> 839</ul> 840</section> 841<section id="0.21.0"> 842<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.21.0">0.21.0</a> <span style="font-size: 75%;">2017-09-18</span></h2><ul class="simple"> 843<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/132">#132</a><span>:</span> Implement âiterableâ and âincrementableâ CLI flags, allowing 844for invocations like <code class="docutils literal notranslate"><span class="pre">inv</span> <span class="pre">mytask</span> <span class="pre">--listy</span> <span class="pre">foo</span> <span class="pre">--listy</span> <span class="pre">bar</span></code> (resulting in a 845call like <code class="docutils literal notranslate"><span class="pre">mytask(listy=['foo',</span> <span class="pre">'bar'])</span></code>) or <code class="docutils literal notranslate"><span class="pre">inv</span> <span class="pre">mytask</span> <span class="pre">-vvv</span></code> (resulting 846in e.g. <code class="docutils literal notranslate"><span class="pre">mytask(verbose=3)</span></code>. Specifically, these require use of the new 847<a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#iterable-flag-values" title="(in Invoke)"><span class="xref std std-ref">iterable</span></a> and <a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#incrementable-flag-values" title="(in Invoke)"><span class="xref std std-ref">incrementable</span></a> arguments to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">@task</span></code></a> - see 848those links to the conceptual docs for details.</p></li> 849</ul> 850</section> 851<section id="0.20.4"> 852<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.20.4">0.20.4</a> <span style="font-size: 75%;">2017-08-14</span></h2><ul class="simple"> 853<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> The behavior of <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a> when <code class="docutils literal notranslate"><span class="pre">lazy=True</span></code> 854didnât match that described in the API docs, after the recent updates to its 855lifecycle. (Specifically, any config data given to the constructor was not 856visible in the resulting instance until <code class="docutils literal notranslate"><span class="pre">merge()</span></code> was explicitly called.) 857This has been fixed, along with other related minor issues.</p></li> 858</ul> 859</section> 860<section id="0.20.3"> 861<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.20.3">0.20.3</a> <span style="font-size: 75%;">2017-08-04</span></h2><ul> 862<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/467">#467</a><span>:</span> (Arguably also a feature, but since it enables behavior users 863clearly found intuitive, weâre considering it a bug.) Split up the parsing 864machinery of <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/program.html#invoke.program.Program" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Program</span></code></a> and pushed the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Collection</span></code></a>-making out of <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/loader.html#invoke.loader.Loader" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Loader</span></code></a>. Combined, this allows us to honor the project-level 865config file <em>before</em> the second (task-oriented) CLI parsing step, instead of 866after.</p> 867<p>For example, this means you can turn off <code class="docutils literal notranslate"><span class="pre">auto_dash_names</span></code> in your 868per-project configs and not only in your system or user configs.</p> 869<p>Report again courtesy of Luke Orland.</p> 870<div class="admonition warning"> 871<p class="admonition-title">Warning</p> 872<p>This is a backwards incompatible change <em>if</em> you were subclassing and 873overriding any of the affected methods in the <code class="docutils literal notranslate"><span class="pre">Program</span></code> or <code class="docutils literal notranslate"><span class="pre">Loader</span></code>
874classes.</p> 875</div> 876</li> 877</ul> 878</section> 879<section id="0.20.2"> 880<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.20.2">0.20.2</a> <span style="font-size: 75%;">2017-08-02</span></h2><ul class="simple"> 881<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/465">#465</a><span>:</span> The <code class="docutils literal notranslate"><span class="pre">tasks.auto_dash_names</span></code> config option added in <code class="docutils literal notranslate"><span class="pre">0.20.0</span></code> 882wasnât being fully honored when set to <code class="docutils literal notranslate"><span class="pre">False</span></code>; this has been fixed. Thanks 883to Luke Orland for the report.</p></li> 884</ul> 885</section> 886<section id="0.20.1"> 887<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.20.1">0.20.1</a> <span style="font-size: 75%;">2017-07-27</span></h2><ul> 888<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Fix a broken <code class="docutils literal notranslate"><span class="pre">six.moves</span></code> import within <code class="docutils literal notranslate"><span class="pre">invoke.util</span></code>; was 889causing <code class="docutils literal notranslate"><span class="pre">ImportError</span></code> in environments without an external copy of <code class="docutils literal notranslate"><span class="pre">six</span></code> 890installed.</p> 891<p>The dangers of oneâs local and CI environments all pulling down packages that 892use <code class="docutils literal notranslate"><span class="pre">six</span></code>! Itâs everywhere!</p> 893</li> 894</ul> 895</section> 896<section id="0.20.0"> 897<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.20.0">0.20.0</a> <span style="font-size: 75%;">2017-07-27</span></h2><ul> 898<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/322">#322</a><span>:</span> Allow users to completely disable mirroring of stdin to 899subprocesses, by specifying <code class="docutils literal notranslate"><span class="pre">False</span></code> for the <code class="docutils literal notranslate"><span class="pre">run.in_stream</span></code> config 900setting and/or keyword argument.</p> 901<p>This can help prevent problems when running Invoke under systems that have no 902useful standard input and which otherwise defeat our pty/fileno related 903detection.</p> 904</li> 905<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/329">#329</a><span>:</span> All task and collection names now have underscores turned into 906dashes automatically, as task parameters have been for some time. This 907impacts <code class="docutils literal notranslate"><span class="pre">--list</span></code>, <code class="docutils literal notranslate"><span class="pre">--help</span></code>, and of course the parser. For details, see 908<a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/namespaces.html#dashes-vs-underscores" title="(in Invoke)"><span>Dashes vs underscores</span></a>.</p> 909<p>This behavior is controlled by a new config setting, 910<code class="docutils literal notranslate"><span class="pre">tasks.auto_dash_names</span></code>, which can be set to <code class="docutils literal notranslate"><span class="pre">False</span></code> to go back to the 911classic behavior.</p> 912<p>Thanks to Alexander Artemenko for the initial feature request.</p> 913</li> 914<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/310">#310</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/455">#455</a>, <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/291">#291</a>) Allow configuring collection 915root directory & module name via configuration files (previously, they were 916only configurable via CLI flags or generating a custom 917<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/program.html#invoke.program.Program" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Program</span></code></a>.)</p></li> 918<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> (required to support <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/310">#310</a> and <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/329">#329</a>) Break up the 919<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a> lifecycle some more, allowing it to gradually load 920configuration vectors; this allows the CLI machinery 921(<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/executor.html#invoke.executor.Executor" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Executor</span></code></a>) to honor configuration settings from config 922files which impact how CLI parsing and task loading behaves.</p> 923<p>Specifically, this adds more public <code class="docutils literal notranslate"><span class="pre">Config.load_*</span></code> methods, which in 924tandem with the <code class="docutils literal notranslate"><span class="pre">lazy</span></code> kwarg to <code class="docutils literal notranslate"><span class="pre">__init__</span></code> (formerly <code class="docutils literal notranslate"><span class="pre">defer_post_init</span></code>, 925see below) allow full control over exactly when each config level is loaded.</p> 926<div class="admonition warning"> 927<p class="admonition-title">Warning</p> 928<p>This change may be backwards incompatible if you were using or subclassing 929the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a> class in any of the following ways:</p> 930<ul> 931<li><p>If you were passing <code class="docutils literal notranslate"><span class="pre">__init__</span></code> kwargs such as <code class="docutils literal notranslate"><span class="pre">project_home</span></code> or 932<code class="docutils literal notranslate"><span class="pre">runtime_path</span></code> and expecting those files to auto-load, they no longer 933do; you must explicitly call <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config.load_project" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">load_project</span></code></a> and/or 934<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config.load_runtime" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">load_runtime</span></code></a> explicitly.</p></li> 935<li><p>The <code class="docutils literal notranslate"><span class="pre">defer_post_init</span></code> keyword argument to <code class="docutils literal notranslate"><span class="pre">Config.__init__</span></code> has been 936renamed to <code class="docutils literal notranslate"><span class="pre">lazy</span></code>, and controls whether system/user config files are 937auto-loaded.</p></li> 938<li><p><code class="docutils literal notranslate"><span class="pre">Config.post_init</span></code> has been removed, in favor of explicit/granular use 939of the <code class="docutils literal notranslate"><span class="pre">load_*</span></code> family of methods.</p></li> 940<li><p>All <code class="docutils literal notranslate"><span class="pre">load_*</span></code> methods now call <code class="docutils literal notranslate"><span class="pre">Config.merge</span></code> automatically by default 941(previously, merging was deferred to the end of most config related 942workflows.)</p> 943<p>This should only be a problem if your config contents are extremely large 944(itâs an entirely in-memory dict-traversal operation) and can be avoided 945by specifying <code class="docutils literal notranslate"><span class="pre">merge=False</span></code> to any such method. (Note that you must, at 946some point, call <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config.merge" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">merge</span></code></a> in order for the config 947object to work normally!)</p> 948</li> 949</ul> 950</div> 951</li> 952<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Display of hidden subprocess output when a command 953execution failed (end-of-session output starting with <code class="docutils literal notranslate"><span class="pre">Encountered</span> <span class="pre">a</span> <span class="pre">bad</span> 954<span class="pre">command</span> <span class="pre">exit</span> <span class="pre">code!</span></code>) was liable to display encoding errors (e.g. <code class="docutils literal notranslate"><span class="pre">'ascii'</span> 955<span class="pre">codec</span> <span class="pre">
955can't</span> <span class="pre">encode</span> <span class="pre">character</span> <span class="pre">...</span></code>) when that output was not 956ASCII-compatible.</p> 957<p>This problem was previously solved for <em>non-hidden</em> (mirrored) subprocess 958output, but the fix (encode the data with the local encoding) had not been 959applied to exception display. Now itâs applied in both cases.</p> 960</li> 961<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/396">#396</a><span>:</span> <code class="docutils literal notranslate"><span class="pre">Collection.add_task(task,</span> <span class="pre">aliases=('other',</span> <span class="pre">'names')</span></code> was 962listed in the conceptual documentation, but not implemented (technically, it 963was removed at some point and never reinstated.) It has been (re-)added and 964now exists. Thanks to <code class="docutils literal notranslate"><span class="pre">@jenisys</span></code> for the report.</p> 965<div class="admonition warning"> 966<p class="admonition-title">Warning</p> 967<p>This technically changes argument order for <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection.add_task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Collection.add_task</span></code></a>, so be aware if you were using 968positional arguments!</p> 969</div> 970</li> 971</ul> 972</section> 973<section id="0.19.0"> 974<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.19.0">0.19.0</a> <span style="font-size: 75%;">2017-06-19</span></h2><ul class="simple"> 975<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Add <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.MockContext.set_result_for" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">MockContext.set_result_for</span></code></a> to allow massaging a mock 976Contextâs configured results after instantiation.</p></li> 977</ul> 978</section> 979<section id="0.18.1"> 980<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.18.1">0.18.1</a> <span style="font-size: 75%;">2017-06-07</span></h2><ul> 981<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Update Context internals re: command execution & configuration of 982runner subclasses, to work better in client libraries such as Fabric 2.</p> 983<blockquote> 984<div><div class="admonition note"> 985<p class="admonition-title">Note</p> 986<p>If you were using the undocumented <code class="docutils literal notranslate"><span class="pre">runner</span></code> configuration value added 987in <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/446">#446</a>, it is now <code class="docutils literal notranslate"><span class="pre">runners.local</span></code>.</p> 988</div> 989<div class="admonition warning"> 990<p class="admonition-title">Warning</p> 991<p>This change modifies the internals of methods like 992<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> and <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.sudo" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">sudo</span></code></a>; users 993maintaining their own subclasses should be aware of possible breakage.</p> 994</div> 995</div></blockquote> 996</li> 997</ul> 998</section> 999<section id="0.18.0"> 1000<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.18.0">0.18.0</a> <span style="font-size: 75%;">2017-06-02</span></h2><ul> 1001<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/444">#444</a><span>:</span> Add support for being used as <code class="docutils literal notranslate"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">invoke</span> <span class="pre"><args></span></code> on 1002Python 2.7 and up. Thanks to Pekka Klärck for the feature request.</p></li> 1003<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/205">#205</a><span>:</span> Allow giving core flags like <code class="docutils literal notranslate"><span class="pre">--help</span></code> after tasks to trigger 1004per-task help. Previously, only <code class="docutils literal notranslate"><span class="pre">inv</span> <span class="pre">--help</span> <span class="pre">taskname</span></code> worked.</p> 1005<div class="admonition note"> 1006<p class="admonition-title">Note</p> 1007<p>Tasks with their own <code class="docutils literal notranslate"><span class="pre">--help</span></code> flags wonât be able to leverage this 1008feature - the parser will still interpret the flag as being per-task and 1009not global. This may change in the future to simply throw an exception 1010complaining about the ambiguity. (Feedback welcome.)</p> 1011</div> 1012</li> 1013<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/446">#446</a><span>:</span> Implement <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.cd" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">cd</span></code></a> and 1014<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.prefix" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">prefix</span></code></a> context managers (as methods on the
1015not-that-one-the-other-one <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context</span></code></a> class.) These are based 1016on similar functionality in Fabric 1.x. Credit: Ryan P Kilby.</p></li> 1017<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/448">#448</a><span>:</span> Fix up some config-related tests that have been failing on 1018Windows for some time. Thanks to Ryan P Kilby.</p></li> 1019</ul> 1020</section> 1021<section id="0.17.0"> 1022<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.17.0">0.17.0</a> <span style="font-size: 75%;">2017-05-05</span></h2><ul class="simple"> 1023<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Add a <code class="docutils literal notranslate"><span class="pre">user</span></code> kwarg & config parameter to 1024<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.sudo" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context.sudo</span></code></a>, which corresponds roughly to 1025<code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">-u</span> <span class="pre"><user></span> <span class="pre"><command></span></code>.</p></li> 1026<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/440">#440</a><span>:</span> Make sure to skip a call to <code class="docutils literal notranslate"><span class="pre">struct</span></code>/<code class="docutils literal notranslate"><span class="pre">ioctl</span></code> on Windows 1027platforms; otherwise certain situations inside <code class="docutils literal notranslate"><span class="pre">run</span></code> calls would trigger 1028import errors. Thanks to <code class="docutils literal notranslate"><span class="pre">@chrisc11</span></code> for the report.</p></li> 1029<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/425">#425</a><span>:</span> Fix <code class="docutils literal notranslate"><span class="pre">Inappropriate</span> <span class="pre">ioctl</span> <span class="pre">for</span> <span class="pre">device</span></code> errors (usually 1030<code class="docutils literal notranslate"><span class="pre">OSError</span></code>) when running Invoke without a tty-attached stdin (i.e. when run 1031under âheadlessâ continuous integration systems or simply as e.g. <code class="docutils literal notranslate"><span class="pre">inv</span> 1032<span class="pre">sometask</span> <span class="pre"><</span> <span class="pre">/dev/null</span></code> (redirected stdin.) Thanks to Javier Domingo Cansino 1033for the report & Tuukka Mustonen for troubleshooting assistance.</p></li> 1034<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/439">#439</a><span>:</span> Avoid placing stdin into bytewise read mode when it looks 1035like Invoke has been placed in the background by a shellâs job control 1036system; doing so was causing the shell to pause the Invoke process (e.g. with 1037a message like <code class="docutils literal notranslate"><span class="pre">suspended</span> <span class="pre">(tty</span> <span class="pre">output)</span></code>.) Reported by Tuukka Mustonen.</p></li> 1038</ul> 1039</section> 1040<section id="0.16.3"> 1041<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.16.3">0.16.3</a> <span style="font-size: 75%;">2017-04-18</span></h2><ul class="simple"> 1042<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Even more setup.py related tomfoolery.</p></li> 1043</ul> 1044</section> 1045<section id="0.16.2"> 1046<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.16.2">0.16.2</a> <span style="font-size: 75%;">2017-04-18</span></h2><ul class="simple"> 1047<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Deal with the fact that PyPIâs rendering of Restructured Text has no 1048idea about our fancy new use of Sphinxâs doctest module. Sob.</p></li> 1049</ul> 1050</section> 1051<section id="0.16.1"> 1052<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.16.1">0.16.1</a> <span style="font-size: 75%;">2017-04-18</span></h2><ul class="simple"> 1053<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Fix a silly typo preventing proper rendering of the packaging 1054<code class="docutils literal notranslate"><span class="pre">long_description</span></code> (causing an effectively blank PyPI description.)</p></li> 1055</ul> 1056</section> 1057<section id="0.16.0"> 1058<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.16.0">0.16.0</a> <span style="font-size: 75%;">2017-04-18</span></h2><ul> 1059<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> and <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/exceptions.html#invoke.exceptions.UnexpectedExit" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">UnexpectedExit</span></code></a> objects now have a more useful <code class="docutils literal notranslate"><span class="pre">repr()</span></code> 1060(and in the case of <code class="docutils literal notranslate"><span class="pre">UnexpectedExit</span></code>, a distinct <code class="docutils literal notranslate"><span class="pre">repr()</span></code> from their 1061preexisting <code class="docutils literal notranslate"><span class="pre">str()</span></code>.)</p></li> 1062<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.sudo" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context.sudo</span></code></a> no longer prompts 1063the user when the configured sudo password is empty; thus, an empty sudo 1064password and a <code class="docutils literal notranslate"><span class="pre">sudo</span></code> program configured to require one will result in an 1065exception.</p> 1066<p>The runtime prompting for a missing password was a temporary holdover from 1067Fabric v1, and in retrospect is undesirable. We may add it back in as an 1068opt-in behavior (probably via subclassing) in the future if anybody misses 1069it.</p> 1070<div class="admonition warning"> 1071<p class="admonition-title">Warning</p> 1072<p><strong>This is a backwards incompatible change</strong>, if you were relying on 1073<code class="docutils literal notranslate"><span class="pre">sudo()</span></code> prompting you for your password (vs configuring it). If you 1074<em>were</em> doing that, you can simply switch to <code class="docutils literal notranslate"><span class="pre">run("sudo</span> <span class="pre"><command>")</span></code> and 1075respond to the subprocessâ sudo prompt by hand instead.</p> 1076</div> 1077</li> 1078<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Switched the order of the first two arguments of 1079<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config.__init__" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config.__init__</span></code></a>, so that the <code class="docutils literal notranslate"><span class="pre">overrides</span></code> 1080kwarg becomes the first positional argument.</p> 1081<p>This supports the common use case of making a <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a> 1082object that honors the systemâs core/global defaults; previously, because 1083<code class="docutils literal notranslate"><span class="pre">defaults</span></code> was the first argument, youâd end up replacing those core 1084defaults instead of merging with them.</p> 1085<div class="admonition warning"> 1086<p class="admonition-title">Warning</p> 1087<p><strong>This is a backwards incompatible change</strong> if you were creating custom 1088<code class="docutils literal notranslate"><span class="pre">Config</span></code> objects via positional, instead of keyword, arguments. It should 1089have no effect otherwise.</p> 1090</div> 1091</li> 1092<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/309">#309</a><span>:</span> Overhaul how task execution contexts/configs are handled, such
1093that all contexts in a session now share the same config object, and thus 1094user modifications are preserved between tasks. This has been done in a 1095manner that should not break things like collection-based config (which may 1096still differ from task to task.)</p> 1097<div class="admonition warning"> 1098<p class="admonition-title">Warning</p> 1099<p><strong>This is a backwards incompatible change</strong> if you were relying on the 1100post-0.12 behavior of cloning config objects between each task execution. 1101Make sure to investigate if you find tasks affecting one another in 1102unexpected ways!</p> 1103</div> 1104</li> 1105<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/418">#418</a><span>:</span> Enhance ability of client libraries to override config 1106filename prefixes. This includes modifications to related functionality, such 1107as how env var prefixes are configured.</p> 1108<div class="admonition warning"> 1109<p class="admonition-title">Warning</p> 1110<p><strong>This is a backwards incompatible change</strong> if:</p> 1111<ul> 1112<li><p>you were relying on the <code class="docutils literal notranslate"><span class="pre">env_prefix</span></code> keyword argument to 1113<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config.__init__" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config.__init__</span></code></a>; it is now the 1114<code class="docutils literal notranslate"><span class="pre">prefix</span></code> or <code class="docutils literal notranslate"><span class="pre">env_prefix</span></code> class attribute, depending.</p></li> 1115<li><p>or the kwarg/attribute of the same name in <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/program.html#invoke.program.Program.__init__" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Program.__init__</span></code></a>; you should now be subclassing 1116<code class="docutils literal notranslate"><span class="pre">Config</span></code> and using its <code class="docutils literal notranslate"><span class="pre">env_prefix</span></code> attribute;</p></li> 1117<li><p>or if you were relying on how standalone <code class="docutils literal notranslate"><span class="pre">Config</span></code> objects defaulted to 1118having a <code class="docutils literal notranslate"><span class="pre">None</span></code> value for <code class="docutils literal notranslate"><span class="pre">env_prefix</span></code>, and thus loaded env vars 1119without an <code class="docutils literal notranslate"><span class="pre">INVOKE_</span></code> style prefix.</p> 1120<p>See new documentation for this functionality at 1121<a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/library.html#customizing-config-defaults" title="(in Invoke)"><span>Customizing the configuration systemâs defaults</span></a> for details.</p> 1122</li> 1123</ul> 1124</div> 1125</li> 1126<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/232">#232</a><span>:</span> Add support for <code class="docutils literal notranslate"><span class="pre">.yml</span></code>-suffixed config files (in addition to 1127<code class="docutils literal notranslate"><span class="pre">.yaml</span></code>, <code class="docutils literal notranslate"><span class="pre">.json</span></code> and <code class="docutils literal notranslate"><span class="pre">.py</span></code>.) Thanks to Matthias Lehmann for the 1128original request & Greg Back for an early patch.</p></li> 1129<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/430">#430</a><span>:</span> Fallback importing of PyYAML when Invoke has been installed 1130without its vendor directory, was still trying to import the vendorized 1131module names (e.g. <code class="docutils literal notranslate"><span class="pre">yaml2</span></code> or <code class="docutils literal notranslate"><span class="pre">yaml3</span></code> instead of simply <code class="docutils literal notranslate"><span class="pre">yaml</span></code>). This 1132has been fixed, thanks to Athmane Madjoudj.</p></li> 1133<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/432">#432</a><span>:</span> Tighten application of IO thread <code class="docutils literal notranslate"><span class="pre">join</span></code> timeouts (in <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>) to only happen when <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/351">#351</a> appears 1134actually present. Otherwise, slow/overworked IO threads had a chance of being 1135joined before truly reading all data from the subprocessâ pipe.</p></li> 1136<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Fixed some Python 2.6 incompatible string formatting that snuck 1137in recently.</p></li> 1138</ul> 1139</section> 1140<section id="0.15.0"> 1141<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.15.0">0.15.0</a> <span style="font-size: 75%;">2017-02-14</span></h2><ul> 1142<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config.clone" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config.clone</span></code></a> grew a new <code class="docutils literal notranslate"><span class="pre">into</span></code> 1143kwarg allowing client libraries with their own <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a> 1144subclasses to easily âupgradeâ vanilla Invoke config objects into their local 1145variety.</p></li> 1146<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/421">#421</a><span>:</span> Updated <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config.clone" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config.clone</span></code></a> (and a few 1147other related areas) to replace use of <a class="reference external" href="https://docs.python.org/3/library/copy.html#copy.deepcopy" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">copy.deepcopy</span></code></a> with a less-rigorous 1148but also less-likely-to-explode recursive dict copier. This prevents 1149frustrating <code class="docutils literal notranslate"><span class="pre">TypeErrors</span></code> while still preserving barriers between different 1150tasksâ configuration values.</p></li> 1151<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a>âs internals got cleaned up 1152somewhat; end users should not see much of a difference, but advanced 1153users or authors of extension code may notice the following:</p> 1154<ul class="simple"> 1155<li><p>Direct modification of config data (e.g. <code class="docutils literal notranslate"><span class="pre">myconfig.section.subsection.key</span> 1156<span class="pre">=</span> <span class="pre">
1156'value'</span></code> in user/task code) is now stored in its own config âlevelâ/data 1157structure; previously such modifications simply mutated the central, 1158âmergedâ config cache. This makes it much easier to determine where a final 1159observed value came from, and prevents accidental data loss.</p></li> 1160<li><p>Ditto for deleted values.</p></li> 1161<li><p>Merging/reconciliation of the config levels now happens automatically when 1162data is loaded or modified, which not only simplifies the objectâs 1163lifecycle a bit but allows the previous change to function without 1164requiring users to call <code class="docutils literal notranslate"><span class="pre">.merge()</span></code> after every modification.</p></li> 1165</ul> 1166</li> 1167<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/413">#413</a><span>:</span> Update behavior of <code class="docutils literal notranslate"><span class="pre">DataProxy</span></code> (used within 1168<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context</span></code></a> and <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a>) again, fixing two 1169related issues:</p> 1170<ul class="simple"> 1171<li><p>Creating new configuration keys via attribute access wasnât possible: one 1172had to do <code class="docutils literal notranslate"><span class="pre">config['foo']</span> <span class="pre">=</span> <span class="pre">'bar'</span></code> because <code class="docutils literal notranslate"><span class="pre">config.foo</span> <span class="pre">=</span> <span class="pre">'bar'</span></code> would 1173set a real attribute instead of touching configuration.</p></li> 1174<li><p>Supertypesâ attributes werenât being considered during the âis this a real 1175attribute on <code class="docutils literal notranslate"><span class="pre">self</span></code>?â test, leading to different behavior between a 1176nested config-value-as-attribute and a top-level Context/Config one.</p></li> 1177</ul> 1178</li> 1179<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Fix configuration framework such that nested or dict-like 1180config values may be compared with regular dicts. Previously, doing so caused 1181an <code class="docutils literal notranslate"><span class="pre">AttributeError</span></code> (as regular dicts lack a <code class="docutils literal notranslate"><span class="pre">.config</span></code>).</p></li> 1182<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/419">#419</a><span>:</span> Optional parser arguments had a few issues:</p> 1183<ul class="simple"> 1184<li><p>The <a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#optional-values" title="(in Invoke)"><span class="xref std std-ref">conceptual docs about CLI parsing</span></a> mentioned 1185them, but didnât actually show via example how to enable the feature, 1186implying (incorrectly) that they were active always by default. An example 1187has been added.</p></li> 1188<li><p>Even when enabled, they did not function correctly when their default 1189values were of type <code class="docutils literal notranslate"><span class="pre">bool</span></code>; in this situation, trying to give a value (vs 1190just giving the flag name by itself) caused a parser error. This has been 1191fixed.</p></li> 1192</ul> 1193<p>Thanks to <code class="docutils literal notranslate"><span class="pre">@ouroboroscoding</span></code> for the report.</p> 1194</li> 1195<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Configuration keys named <code class="docutils literal notranslate"><span class="pre">config</span></code> were inadvertently 1196exposing the internal dict representation of the containing config object, 1197instead of displaying the actual value stored in that key. (Thus, a set 1198config of <code class="docutils literal notranslate"><span class="pre">mycontext.foo.bar.config</span></code> would act as if it was the key/value 1199contents of the <code class="docutils literal notranslate"><span class="pre">mycontext.foo.bar</span></code> subtree.) This has been fixed.</p></li> 1200<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Python 3âs hashing rules differ from Python 2, specifically:</p> 1201<blockquote> 1202<div><p>A class that overrides <code class="docutils literal notranslate"><span class="pre">__eq__()</span></code> and does not define <code class="docutils literal notranslate"><span class="pre">__hash__()</span></code> will 1203have its <code class="docutils literal notranslate"><span class="pre">__hash__()</span></code> implicitly set to None.</p> 1204</div></blockquote> 1205<p><a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a> (specifically, its foundational class 1206<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.DataProxy" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">DataProxy</span></code></a>) only defined <code class="docutils literal notranslate"><span class="pre">__eq__</span></code> which, 1207combined with the above behavior, meant that <code class="docutils literal notranslate"><span class="pre">Config</span></code> objects appeared to 1208hash successfully on Python 2 but yielded <code class="docutils literal notranslate"><span class="pre">TypeErrors</span></code> on Python 3.</p> 1209<p>This has been fixed by explicitly setting <code class="docutils literal notranslate"><span class="pre">__hash__</span> <span class="pre">=</span> <span class="pre">None</span></code> so that the 1210objects do not hash on either interpreter (there are no good immutable 1211attributes by which to define hashability).</p> 1212</li> 1213<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/426">#426</a><span>:</span> <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.DataProxy" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">DataProxy</span></code></a> based classes like 1214<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a> and <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context</span></code></a> didnât 1215like being <a class="reference external" href="https://docs.python.org/3/library/pickle.html#module-pickle" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">pickled</span></code></a> or <a class="reference external" href="https://docs.python.org/3/library/copy.html#copy.copy" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">copied</span></code></a> and threw 1216<code class="docutils literal notranslate"><span class="pre">RecursionError</span></code>. This has been fixed.</p></li> 1217<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/204">#204</a><span>:</span> (via <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/412">#412</a>) Fall back to globally-installed copies of 1218our vendored dependencies, if the import from the <code class="docutils literal notranslate"><span class="pre">vendor</span></code> tree fails. In 1219normal situations this wonât happen, but it allows advanced users or 1220downstream maintainers to nuke <code class="docutils literal notranslate"><span class="pre">vendor/</span></code> and prefer explicitly installed 1221packages of e.g. <code class="docutils literal notranslate"><span class="pre">six</span></code>, <code class="docutils literal notranslate"><span class="pre">pyyaml</span></code> or <code class="docutils literal notranslate"><span class="pre">fluidity</span></code>. Thanks to Athmane 1222Madjoudj for the patch.</p></li> 1223</ul> 1224</section> 1225<section id="0.14.0"> 1226<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.14.0">0.14.0</a> <span style="font-size: 75%;">2016-12-05</span></h2><ul> 1227<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/369">#369</a><span>:</span> Overhaul the autoresponse functionality for <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> so 1228itâs significantly more extensible, both for its own sake and as part of 1229implementing <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/294">#294</a> (see its own changelog entry for details).</p> 1230<div class="admonition warning"> 1231<p class="admonition-title">Warning</p> 1232<p>This is a backwards incompatible change: the <code class="docutils literal notranslate"><span class="pre">responses</span></code> kwarg to 1233<code class="docutils literal notranslate"><span class="pre">run()</span></code> is now <code class="docutils literal notranslate"><span class="pre">watchers</span></code>, and accepts a list of 1234<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/watchers.html#invoke.w
1234atchers.StreamWatcher" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">StreamWatcher</span></code></a> objects (such as 1235<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/watchers.html#invoke.watchers.Responder" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Responder</span></code></a>) instead of a dict.</p> 1236<p>If you were using <code class="docutils literal notranslate"><span class="pre">run(...,</span> <span class="pre">responses={'pattern':</span> <span class="pre">'response'}</span></code> 1237previously, just update to instead use <code class="docutils literal notranslate"><span class="pre">run(...,</span> 1238<span class="pre">watchers=[Responder('pattern',</span> <span class="pre">'response')])</span></code>.</p> 1239</div> 1240</li> 1241<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/294">#294</a><span>:</span> Implement <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.sudo" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context.sudo</span></code></a>, which 1242wraps <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> inside a <code class="docutils literal notranslate"><span class="pre">sudo</span></code> command. It is capable 1243of auto-responding to <code class="docutils literal notranslate"><span class="pre">sudo</span></code>âs password prompt with a configured password, 1244and raises a specific exception (<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/exceptions.html#invoke.exceptions.AuthFailure" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">AuthFailure</span></code></a>) if that 1245password is rejected.</p></li> 1246<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Update implementation of <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> so it has 1247default values for all parameters/attributes. This allows it to be more 1248easily used when mocking <code class="docutils literal notranslate"><span class="pre">run</span></code> calls in client librariesâ tests.</p> 1249<div class="admonition warning"> 1250<p class="admonition-title">Warning</p> 1251<p>This is a backwards incompatible change if you are manually instantiating 1252<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> objects with positional arguments: positional 1253argument order has changed. (Compare the API docs between versions to see 1254exactly how.)</p> 1255</div> 1256</li> 1257<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Add a <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.MockContext" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">MockContext</span></code></a> class for easier testing of 1258user-written tasks and related client code. Includes adding a 1259<a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/testing.html#testing-user-code" title="(in Invoke)"><span class="xref std std-ref">conceptual document on how to test Invoke-using code</span></a>.</p></li> 1260<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/406">#406</a><span>:</span> Update handling of Ctrl-C/<code class="docutils literal notranslate"><span class="pre">KeyboardInterrupt</span></code>, and 1261subprocess exit status pass-through, to be more correct than before:</p> 1262<ul> 1263<li><p>Submit the interrupt byte sequence <code class="docutils literal notranslate"><span class="pre">\x03</span></code> to stdin of all subprocesses, 1264instead of sending <code class="docutils literal notranslate"><span class="pre">SIGINT</span></code>.</p> 1265<blockquote> 1266<div><ul class="simple"> 1267<li><p>This results in behavior closer to that of truly pressing Ctrl-C when 1268running subprocesses directly; for example, interactive programs like 1269<code class="docutils literal notranslate"><span class="pre">vim</span></code> or <code class="docutils literal notranslate"><span class="pre">python</span></code> now behave normally instead of prematurely 1270exiting.</p></li> 1271<li><p>Of course, programs that would normally exit on Ctrl-C will still do 1272so!</p></li> 1273</ul> 1274</div></blockquote> 1275</li> 1276<li><p>The exit statuses of subprocesses run with <code class="docutils literal notranslate"><span class="pre">pty=True</span></code> are more rigorously 1277checked (using <a class="reference external" href="https://docs.python.org/3/library/os.html#os.WIFEXITED" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">os.WIFEXITED</span></code></a> and friends), allowing us to surface the real 1278exit values of interrupted programs instead of manually assuming exit code 1279<code class="docutils literal notranslate"><span class="pre">130</span></code>.</p> 1280<blockquote> 1281<div><ul class="simple"> 1282<li><p>Typically, this will be exit code <code class="docutils literal notranslate"><span class="pre">-2</span></code>, but it is system dependent.</p></li> 1283<li><p>Other, non-Ctrl-C-driven signal-related exits under PTYs should behave 1284better now as well - previously they could appear to exit <code class="docutils literal notranslate"><span class="pre">0</span></code>!</p></li> 1285</ul> 1286</div></blockquote> 1287</li> 1288<li><p>Non-subprocess-related <code class="docutils literal notranslate"><span class="pre">KeyboardInterrupt</span></code>
1288 (i.e. those generated when 1289running top level Python code outside of any <code class="docutils literal notranslate"><span class="pre">run</span></code> function calls) 1290will now trigger exit code <code class="docutils literal notranslate"><span class="pre">1</span></code>, as that is how the Python interpreter 1291typically behaves if you <code class="docutils literal notranslate"><span class="pre">KeyboardInterrupt</span></code> it outside of a live 1292REPL.</p></li> 1293</ul> 1294<div class="admonition warning"> 1295<p class="admonition-title">Warning</p> 1296<p>These changes are <strong>backwards incompatible</strong> if you were relying on the 1297âexits <code class="docutils literal notranslate"><span class="pre">130</span></code>â behavior added in version 0.13, or on the (incorrect) 1298<code class="docutils literal notranslate"><span class="pre">SIGINT</span></code> method of killing pty-driven subprocesses on Ctrl-C.</p> 1299</div> 1300</li> 1301<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Expose the (normalized) value of <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>âs 1302<code class="docutils literal notranslate"><span class="pre">hide</span></code> parameter in its return-value <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> objects.</p></li> 1303<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Fix a bug in <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config.clone" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config.clone</span></code></a> where 1304it was instantiating a new <code class="docutils literal notranslate"><span class="pre">Config</span></code> instead of a member of the subclass.</p></li> 1305<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Correctly raise <code class="docutils literal notranslate"><span class="pre">TypeError</span></code> when unexpected keyword 1306arguments are given to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>.</p></li> 1307<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/58">#58</a><span>:</span> Work around bugs in <code class="docutils literal notranslate"><span class="pre">select()</span></code> when handling subprocess 1308stream reads, which was causing poor behavior in many nontrivial interactive 1309programs (such as <code class="docutils literal notranslate"><span class="pre">vim</span></code> and other fullscreen editors, <code class="docutils literal notranslate"><span class="pre">python</span></code> and other 1310REPLs/shells, etc). Such programs should now be largely indistinguishable 1311from their behavior when run directly from a userâs shell.</p></li> 1312<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Fix <code class="docutils literal notranslate"><span class="pre">DataProxy</span></code> (used within <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context</span></code></a> and 1313<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/config.html#invoke.config.Config" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Config</span></code></a>) so that real attributes and methods which are 1314shadowed by configuration keys, arenât proxied to the config during regular 1315attribute get/set. (Such config keys are thus required to be accessed via 1316dict-style only, or (on <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context</span></code></a>) via the explicit 1317<code class="docutils literal notranslate"><span class="pre">.config</span></code> attribute.)</p></li> 1318<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/283">#283</a><span>:</span> Fix the concepts/library docs so the example of an explicit 1319<code class="docutils literal notranslate"><span class="pre">namespace=</span></code> argument correctly shows wrapping an imported task module in a 1320<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Collection</span></code></a>. Thanks to <code class="docutils literal notranslate"><span class="pre">@zaiste</span></code> for the report.</p></li> 1321<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/288">#288</a><span>:</span> Address a bug preventing reuse of Invoke as a custom 1322binstub, by moving <code class="docutils literal notranslate"><span class="pre">--list</span></code> into the âcore argsâ set of flags present on 1323all Invoke-derived binstubs. Thanks to Jordon Mears for catch & patch.</p></li> 1324<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/349">#349</a><span>:</span> Display the string representation of 1325<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/exceptions.html#invoke.exceptions.UnexpectedExit" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">UnexpectedExit</span></code></a> when handling it inside of 1326<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/program.html#invoke.program.Program" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Program</span></code></a> (including regular <code class="docutils literal notranslate"><span class="pre">inv</span></code>), if any output was 1327hidden during the <code class="docutils literal notranslate"><span class="pre">run</span></code> that generated it.</p> 1328<p>
1328Previously, we only exited with the exceptionâs stored exit code, meaning 1329failures of <code class="docutils literal notranslate"><span class="pre">run(...,</span> <span class="pre">hide=True)</span></code> commands were unexpectedly silent. 1330(Library-style use of the codebase didnât have this problem, since tracebacks 1331arenât muted.)</p> 1332<p>While implementing this change, we also tweaked the overall display of 1333<code class="docutils literal notranslate"><span class="pre">UnexpectedExit</span></code> so itâs a bit more consistent & useful:</p> 1334<ul class="simple"> 1335<li><p>noting âhey, you ran with <code class="docutils literal notranslate"><span class="pre">pty=True</span></code>, so thereâs no stderrâ;</p></li> 1336<li><p>showing only the last 10 lines of captured output in the error message 1337(users can, of course, always manually handle the error & access the full 1338thing if desired);</p></li> 1339<li><p>only showing a given stream when it was not already printed to the userâs 1340terminal (i.e. if <code class="docutils literal notranslate"><span class="pre">hide=False</span></code>, no captured output is shown in the error 1341text; if <code class="docutils literal notranslate"><span class="pre">hide='stdout'</span></code>, only stdout is shown in the error text; etc.)</p></li> 1342</ul> 1343<p>Thanks to Patrick Massot for the original bug report.</p> 1344</li> 1345</ul> 1346</section> 1347<section id="0.13.0"> 1348<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.13.0">0.13.0</a> <span style="font-size: 75%;">2016-06-09</span></h2><ul> 1349<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/67">#67</a><span>:</span> Added <code class="docutils literal notranslate"><span class="pre">shell</span></code> option to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>, 1350allowing control of the shell used when invoking commands. Previously, 1351<code class="docutils literal notranslate"><span class="pre">pty=True</span></code> used <code class="docutils literal notranslate"><span class="pre">/bin/bash</span></code> and <code class="docutils literal notranslate"><span class="pre">pty=False</span></code> (the default) used 1352<code class="docutils literal notranslate"><span class="pre">/bin/sh</span></code>; the new unified default value is <code class="docutils literal notranslate"><span class="pre">/bin/bash</span></code>.</p> 1353<p>Thanks to Jochen Breuer for the report.</p> 1354</li> 1355<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/259">#259</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/280">#280</a>) Allow updating (or replacing) subprocess 1356shell environments, via the <code class="docutils literal notranslate"><span class="pre">env</span></code> and <code class="docutils literal notranslate"><span class="pre">replace_env</span></code> kwargs to 1357<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>. Thanks to Fotis Gimian for the report, 1358<code class="docutils literal notranslate"><span class="pre">@philtay</span></code> for an early version of the final patch, and Erich Heine & Vlad 1359Frolov for feedback.</p></li> 1360<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/114">#114</a><span>:</span> Ripped off the band-aid and removed non-contextualized tasks 1361as an option; all tasks must now be contextualized (defined as <code class="docutils literal notranslate"><span class="pre">def</span> 1362<span class="pre">mytask(context,</span> <span class="pre">...)</span></code> - see <a class="reference external" href="https://docs.pyinvoke.org/en/latest/getting-started.html#defining-and-running-task-functions" title="(in Invoke)"><span>Defining and running task functions</span></a>) even 1363if not using the context. This simplifies the implementation as well as 1364usersâ conceptual models. Thanks to Bay Grabowski for the patch.</p> 1365<div class="admonition warning"> 1366<p class="admonition-title">Warning</p> 1367<p>This is a backwards incompatible change!</p> 1368</div> 1369</li> 1370<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/152">#152</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/251">#251</a>, <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/331">#331</a>) Correctly handle 1371<code class="docutils literal notranslate"><span class="pre">KeyboardInterrupt</span></code> during <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>, re: both mirroring 1372the interrupt signal to the subprocess <em>and</em> capturing the local exception 1373within Invokeâs CLI handler (so thereâs no messy traceback, just exiting with 1374code <code class="docutils literal notranslate"><span class="pre">130</span></code>).</p> 1375<p>Thanks to Peter Darrow for the report, and to Mika Eloranta &
1375 Máté Farkas for 1376early versions of the patchset.</p> 1377</li> 1378<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/351">#351</a><span>:</span> Protect against <code class="docutils literal notranslate"><span class="pre">run</span></code> deadlocks involving exceptions in 1379I/O threads & nontrivial amounts of unread data in the corresponding 1380subprocess pipe(s). This situation should now always result in exceptions 1381instead of hangs.</p></li> 1382<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/350">#350</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/274">#274</a>, <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/241">#241</a>, <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/262">#262</a>, 1383<a class="reference external" href="https://github.com/pyinvoke/invoke/issues/242">#242</a>, <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/321">#321</a>, <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/338">#338</a>) Clean up and reorganize 1384encoding-related parts of the code to avoid some of the more common or 1385egregious encode/decode errors surrounding clearly non-ASCII-compatible text. 1386Bug reports, assistance, feedback and code examples courtesy of Paul Moore, 1387Vlad Frolov, Christian Aichinger, Fotis Gimian, Daniel Nunes, and others.</p></li> 1388<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/314">#314</a><span>:</span> (Partial fix.) Update <code class="docutils literal notranslate"><span class="pre">MANIFEST.in</span></code> so source 1389distributions include some missing project-management files (e.g. our 1390internal <code class="docutils literal notranslate"><span class="pre">tasks.py</span></code>). This makes unpacked sdists more useful for things 1391like running the doc or build tasks.</p></li> 1392<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/319">#319</a><span>:</span> Fixed an issue resulting from <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/255">#255</a> which 1393caused problems with how we generate release wheels (notably, some releases 1394such as 0.12.1 fail when installing from wheels on Python 2).</p> 1395<div class="admonition note"> 1396<p class="admonition-title">Note</p> 1397<p>As part of this fix, the next release will distribute individual Python 2 1398and Python 3 wheels instead of one âuniversalâ wheel. This change should be 1399transparent to users.</p> 1400</div> 1401<p>Thanks to <code class="docutils literal notranslate"><span class="pre">@ojos</span></code> for the initial report and Frazer McLean for some 1402particularly useful feedback.</p> 1403</li> 1404</ul> 1405</section> 1406<section id="0.12.2"> 1407<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.12.2">0.12.2</a> <span style="font-size: 75%;">2016-02-07</span></h2><ul class="simple"> 1408<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/303">#303</a><span>:</span> Make sure <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> waits for its IO worker threads to cleanly 1409exit (such as allowing a <code class="docutils literal notranslate"><span class="pre">finally</span></code> block to revert TTY settings) when 1410<code class="docutils literal notranslate"><span class="pre">KeyboardInterrupt</span></code> (or similar) aborts execution in the main thread. 1411Thanks to Tony S Yu and Máté Farkas for the report.</p></li> 1412<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/314">#314</a><span>:</span> (Partial fix.) Update <code class="docutils literal notranslate"><span class="pre">MANIFEST.in</span></code> so source 1413distributions include some missing project-management files (e.g. our 1414internal <code class="docutils literal notranslate"><span class="pre">tasks.py</span></code>). This makes unpacked sdists more useful for things 1415like running the doc or build tasks.</p></li> 1416</ul> 1417</section> 1418<section id="0.12.1"> 1419<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.12.1">0.12.1</a> <span style="font-size: 75%;">2016-02-03</span></h2><ul> 1420<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/289">#289</a><span>:</span> Handful of issues, all fallout from <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/289">#289</a>, which failed to 1421make it out the door for 0.12.0. More are on the way but these should address 1422blockers for some users:</p> 1423<blockquote> 1424<div><ul class="simple"> 1425<li><p>
1425Windows support for the new stdin replication functionality (this was 1426totally blocking Windows users, as reported in <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/302">#302</a> - sorry!);</p></li> 1427<li><p>Stdin is now mirrored to stdout when no PTY is present, so you can see 1428what youâre typing (plus a new <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> option and 1429config param, <code class="docutils literal notranslate"><span class="pre">echo_stdin</span></code>, allowing user override of this behavior);</p></li> 1430<li><p>Exposed the stdin read loopâs sleep time as <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner.input_sleep" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Runner.input_sleep</span></code></a>;</p></li> 1431<li><p>Sped up some tests a bit.</p></li> 1432</ul> 1433</div></blockquote> 1434</li> 1435<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/305">#305</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/306">#306</a>) Fix up some test-suite issues causing failures 1436on Windows/Appveyor. Thanks to Paul Moore.</p></li> 1437<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/308">#308</a><span>:</span> Earlier changes to TTY detection & its use in determining features 1438such as stdin pass-through, were insufficient to handle edge cases such as 1439nested Invoke sessions or piped stdin to Invoke processes. This manifested as 1440hangs and <code class="docutils literal notranslate"><span class="pre">OSError</span></code> messages about broken pipes.</p> 1441<p>The issue has been fixed by overhauling all related code to use more specific 1442and accurate checks (e.g. examining just <code class="docutils literal notranslate"><span class="pre">fileno</span></code> and/or just <code class="docutils literal notranslate"><span class="pre">isatty</span></code>).</p> 1443<p>Thanks to Tuukka Mustonen and Máté Farkas for the report (and for enduring 1444the subsequent flood of the project maintainerâs stream-of-consciousness 1445ticket updates).</p> 1446</li> 1447</ul> 1448</section> 1449<section id="0.12.0"> 1450<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.12.0">0.12.0</a> <span style="font-size: 75%;">2016-01-12</span></h2><ul> 1451<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/173">#173</a><span>:</span> Overhauled top level CLI functionality to allow reusing 1452Invoke for distinct binaries, optionally with bundled task namespaces as 1453subcommands. As a side effect, this functionality is now much more extensible 1454to boot. Thanks to Erich Heine for feedback/suggestions during development.</p> 1455<div class="admonition warning"> 1456<p class="admonition-title">Warning</p> 1457<p>This change is backwards incompatible if you imported anything from the 1458<code class="docutils literal notranslate"><span class="pre">invoke.cli</span></code> module (which is now rearchitected as 1459<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/program.html#invoke.program.Program" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Program</span></code></a>). It should be transparent to everybody else.</p> 1460</div> 1461<div class="admonition seealso"> 1462<p class="admonition-title">See also</p> 1463<p><a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/library.html#reusing-as-a-binary" title="(in Invoke)"><span>Reusing Invokeâs CLI module as a distinct binary</span></a></p> 1464</div> 1465</li> 1466<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/228">#228</a><span>:</span> (partial) Modified and expanded implementation of 1467<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/executor.html#invoke.executor.Executor" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Executor</span></code></a>, <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Task</span></code></a> and <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Call" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Call</span></code></a> to 1468make implementing task parameterization easier.</p></li> 1469<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/289">#289</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/263">#263</a>) Implement <a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/watchers.html#autoresponding" title="(in Invoke)"><span class="xref std std-ref">autoresponding</span></a> for <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>.</p></li> 1470<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/68">#68</a><span>:</span> Disable Pythonâs bytecode caching by default, as it complicates
1471our typical use case (frequently-changing .py files) and offers little 1472benefit for human-facing startup times. Bytecode caching can be explicitly 1473re-enabled by specifying <code class="docutils literal notranslate"><span class="pre">--write-pyc</span></code> at runtime. Thanks to Jochen Breuer 1474for feature request and <code class="docutils literal notranslate"><span class="pre">@brutus</span></code> for initial patchset.</p></li> 1475<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Fixed a bug in the parser where <code class="docutils literal notranslate"><span class="pre">invoke</span> <span class="pre">--takes-optional-arg</span> 1476<span class="pre">avalue</span> <span class="pre">--anotherflag</span></code> was incorrectly considering <code class="docutils literal notranslate"><span class="pre">--anotherflag</span></code> to be an 1477ambiguity error (as if <code class="docutils literal notranslate"><span class="pre">avalue</span></code> had not been given to 1478<code class="docutils literal notranslate"><span class="pre">--takes-optional-arg</span></code>.</p></li> 1479<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/295">#295</a><span>:</span> Make sure that <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a>âs <code class="docutils literal notranslate"><span class="pre">hide=True</span></code> also disables 1480echoing. Otherwise, âhiddenâ helper <code class="docutils literal notranslate"><span class="pre">run</span></code> calls will still pollute output 1481when run as e.g. <code class="docutils literal notranslate"><span class="pre">invoke</span> <span class="pre">--echo</span> <span class="pre">...</span></code>.</p></li> 1482<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/296">#296</a><span>:</span> Donât mutate <code class="docutils literal notranslate"><span class="pre">sys.path</span></code> on collection load if taskâs 1483parent directory is already on <code class="docutils literal notranslate"><span class="pre">sys.path</span></code>.</p></li> 1484<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/297">#297</a><span>:</span> Ignore leading and trailing underscores when turning task 1485arguments into CLI flag names.</p></li> 1486<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/257">#257</a><span>:</span> Fix a RecursionError under Python 3 due to lack of 1487<code class="docutils literal notranslate"><span class="pre">__deepcopy__</span></code> on <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Call" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Call</span></code></a> objects. Thanks to Markus 1488Zapke-Gründemann for initial report and Máté Farkas for the patch.</p></li> 1489<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Fix incorrect changelog URL in package metadata.</p></li> 1490<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Removed the <code class="docutils literal notranslate"><span class="pre">-H</span></code> short flag, leaving just <code class="docutils literal notranslate"><span class="pre">--hide</span></code>. This was 1491done to avoid conflicts with Fabricâs host-oriented <code class="docutils literal notranslate"><span class="pre">-H</span></code> flag. Favoritism 1492is real! Apologies.</p> 1493<div class="admonition warning"> 1494<p class="admonition-title">Warning</p> 1495<p>This change is backwards compatible if you used <code class="docutils literal notranslate"><span class="pre">-H</span></code>.</p> 1496</div> 1497</li> 1498<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Removed official Python 3.2 support; sibling projects also did 1499this recently, itâs simply not worth the annoyance given the userbase size.</p></li> 1500<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/144">#144</a><span>:</span> Add code-coverage reporting to our CI builds (albeit <a class="reference external" href="https://codecov.io">CodeCov</a> instead of <a class="reference external" href="https://coveralls.io">coveralls.io</a>). 1501Includes rejiggering our project-specific coverage-generating tasks. Thanks 1502to David Baumgold for the original request/PR and to Justin Abrahms for the 1503tipoff re: CodeCov.</p></li> 1504<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/254">#254</a><span>:</span> Add an <code class="docutils literal notranslate"><span class="pre">exclude</span></code> option in our <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> so setuptools 1505doesnât try loading our vendored PyYAMLâs Python 2 sub-package under Python 3 1506(or vice versa - though all reports were from Python 3 users). Thanks to 1507<code class="docutils literal notranslate"><span class="pre">@yoshiya0503</span></code> for catch & initial patch.</p></li> 1508<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/265">#265</a><span>:</span> Update our Travis config to select its newer build
1509infrastructure and also run on PyPy3. Thanks to Omer Katz.</p></li> 1510</ul> 1511</section> 1512<section id="0.11.1"> 1513<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.11.1">0.11.1</a> <span style="font-size: 75%;">2015-09-07</span></h2><ul class="simple"> 1514<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Fix incorrect changelog URL in package metadata.</p></li> 1515</ul> 1516</section> 1517<section id="0.11.0"> 1518<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.11.0">0.11.0</a> <span style="font-size: 75%;">2015-09-07</span></h2><ul> 1519<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/235">#235</a><span>:</span> Allow custom stream objects to be used in <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> calls, 1520to be used instead of the defaults of <code class="docutils literal notranslate"><span class="pre">sys.stdout</span></code>/<code class="docutils literal notranslate"><span class="pre">sys.stderr</span></code>.</p> 1521<div class="admonition warning"> 1522<p class="admonition-title">Warning</p> 1523<p>This change required a major cleanup/rearchitecture of the command 1524execution implementation. The vendored <code class="docutils literal notranslate"><span class="pre">pexpect</span></code> module has been 1525completely removed and the API of the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Runner</span></code></a> class has 1526changed dramatically (though <strong>the API for run() itself has not</strong>).</p> 1527<p>Be aware there may be edge-case terminal behaviors which have changed or 1528broken as a result of removing <code class="docutils literal notranslate"><span class="pre">pexpect</span></code>. Please report these as bugs! We 1529expect to crib small bits of what <code class="docutils literal notranslate"><span class="pre">pexpect</span></code> does but need concrete test 1530cases first.</p> 1531</div> 1532</li> 1533<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Detect local controlling terminal size 1534(<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/terminals.html#invoke.terminals.pty_size" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">pty_size</span></code></a>) and apply that information when creating 1535pseudoterminals in <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#invoke.run" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">run</span></code></a> when <code class="docutils literal notranslate"><span class="pre">pty=True</span></code>.</p></li> 1536<li><p>[<span style="color: #40A056;">Feature</span>]<span>:</span><span> </span> Add a <code class="docutils literal notranslate"><span class="pre">.command</span></code> attribute to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Result" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> to 1537preserve the command executed for post-execution introspection.</p></li> 1538<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/238">#238</a><span>:</span> (partial fix) Update the <code class="docutils literal notranslate"><span class="pre">zsh</span></code> completion script to 1539account for use of the <code class="docutils literal notranslate"><span class="pre">--collection</span></code> core flag.</p></li> 1540<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/239">#239</a><span>:</span> Completion erroneously presented core flags instead of 1541per-task flags when both are present in the invocation being completed (e.g. 1542<code class="docutils literal notranslate"><span class="pre">inv</span> <span class="pre">--debug</span> <span class="pre">my_task</span> <span class="pre">-<tab></span></code>). This has been fixed.</p></li> 1543<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/237">#237</a><span>:</span> Completion output lacked âinverseâ flag names (e.g. 1544<code class="docutils literal notranslate"><span class="pre">--no-myoption</span></code> as a boolean negative version of a defaulting-to-True 1545boolean <code class="docutils literal notranslate"><span class="pre">myoption</span></code>). This has been corrected.</p></li> 1546<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/234">#234</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/243">#243</a>) Preserve task-module load location when 1547creating explicit collections with 1548<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection.from_module" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">from_module</span></code></a>; when this was not done, 1549project-local config files were not loading correctly. Thanks to <code class="docutils literal notranslate"><span class="pre">@brutus</span></code> 1550and Jan Willems for initial report & troubleshooting, and to Greg Back for 1551identifying the fix.</p></li> 1552<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Capture & reraise exceptions generated by command execution I/O 1553threads, in the main thread, as a <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/exceptions.html#invoke.exceptions.ThreadException" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ThreadException</span></code></a>.</p></li> 1554<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Correctly handle situations where <a class="reference external" href="https://docs.python.org/3/library/sys.html#sys.stdin" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">sys.stdin</span></code></a> has been 1555replaced with an object lacking <code class="docutils literal notranslate"><span class="pre">.fileno</span></code> (e.g., some advanced Python 1556shells, headless code execution tools, etc). Previously, this situation 1557resulted in an <code class="docutils literal notranslate"><span class="pre">AttributeError</span></code>.</p></li> 1558<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Display stdout instead of stderr in the <code class="docutils literal notranslate"><span class="pre">repr()</span></code> of 1559<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/exceptions.html#invoke.exceptions.Failure" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Failure</span></code></a> objects, when a pseudo-terminal was used. 1560Previously, failure display focused on the stderr stream, which is always 1561empty under pseudo-terminals.</p></li> 1562<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Tweak README to reflect recent(-ish) changes in 1563<code class="docutils literal notranslate"><span class="pre">pip</span></code> re: users who install the development version via <code class="docutils literal notranslate"><span class="pre">pip</span></code> instead of 1564using git.</p></li> 1565<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/224">#224</a><span>:</span> Add a completion script for the <code class="docutils literal notranslate"><span class="pre">fish</span></code> shell, courtesy of 1566Jaime MarquÃnez Ferrándiz.</p></li> 1567<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Additional rearranging of <code class="docutils literal notranslate"><span class="pre">run</span></code>/<code class="docutils literal notranslate"><span class="pre">
1567Runner</span></code> related concerns 1568for improved subclassing, organization, and use in other libraries, 1569including:</p> 1570<blockquote> 1571<div><ul class="simple"> 1572<li><p>Changed the name of the <code class="docutils literal notranslate"><span class="pre">runner</span></code> module to <code class="docutils literal notranslate"><span class="pre">runners</span></code>.</p></li> 1573<li><p>Moved the top level <code class="docutils literal notranslate"><span class="pre">run</span></code> function from its original home in 1574<code class="docutils literal notranslate"><span class="pre">invoke.runner</span></code> to <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/__init__.html#module-invoke" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">invoke.__init__</span></code></a>, to reflect the fact that 1575itâs now simply a convenience wrapper around <code class="docutils literal notranslate"><span class="pre">Runner</span></code>.</p></li> 1576<li><p>Tweaked the implementation of <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Runner</span></code></a> so it can 1577reference <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context</span></code></a> objects (useful for anticipated 1578subclasses).</p></li> 1579</ul> 1580</div></blockquote> 1581<div class="admonition warning"> 1582<p class="admonition-title">Warning</p> 1583<p>These are backwards incompatible changes if your code was doing any imports 1584from the <code class="docutils literal notranslate"><span class="pre">invoke.runner</span></code> module (including especially 1585<code class="docutils literal notranslate"><span class="pre">invoke.runner.run</span></code>, which is now only <code class="docutils literal notranslate"><span class="pre">invoke.run</span></code>). Function 1586signatures have <strong>not</strong> changed.</p> 1587</div> 1588</li> 1589</ul> 1590</section> 1591<section id="0.10.1"> 1592<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.10.1">0.10.1</a> <span style="font-size: 75%;">
15922015-03-17</span></h2><ul class="simple"> 1593<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Tweak README to reflect recent(-ish) changes in 1594<code class="docutils literal notranslate"><span class="pre">pip</span></code> re: users who install the development version via <code class="docutils literal notranslate"><span class="pre">pip</span></code> instead of 1595using git.</p></li> 1596</ul> 1597</section> 1598<section id="0.10.0"> 1599<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.10.0">0.10.0</a> <span style="font-size: 75%;">2015-03-17</span></h2><ul> 1600<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/147">#147</a><span>:</span> Drastically overhaul/expand the configuration system to 1601account for multiple configuration levels including (but not limited to) file 1602paths, environment variables, and Python-level constructs (previously the 1603only option). See <a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/configuration.html#configuration" title="(in Invoke)"><span>Configuration</span></a> for details. Thanks to Erich Heine for 1604his copious feedback on this topic.</p> 1605<div class="admonition warning"> 1606<p class="admonition-title">Warning</p> 1607<p>This is technically a backwards incompatible change, though some existing 1608user config-setting code may continue to work as-is. In addition, this 1609system may see further updates before 1.0.</p> 1610</div> 1611</li> 1612<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/219">#219</a><span>:</span> Fall back to non-PTY command execution in situations where 1613<code class="docutils literal notranslate"><span class="pre">pty=True</span></code> but no PTY appears present. See <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Local" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Local</span></code></a> for 1614details.</p></li> 1615<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/104">#104</a><span>:</span> Add core CLI flag <code class="docutils literal notranslate"><span class="pre">--complete</span></code> to support shell tab 1616completion scripts, and add some âblessedâ such scripts for bash (3 and 4) 1617and zsh. Thanks to Ivan Malison and Andrew Roberts for providing discussion & 1618early patchsets.</p></li> 1619<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/175">#175</a><span>:</span> <code class="docutils literal notranslate"><span class="pre">autoprint</span></code> did not function correctly for tasks stored 1620in sub-collections; this has been fixed. Credit: Matthias Lehmann.</p></li> 1621<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/180">#180</a><span>:</span> Empty invocation (e.g. just <code class="docutils literal notranslate"><span class="pre">invoke</span></code> with no flags or 1622tasks, and when no default task is defined) no longer printed help output, 1623instead complaining about the lack of default task. It now prints help again. 1624Thanks to Brent OâConnor for the catch.</p></li> 1625<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/183">#183</a><span>:</span> Task docstrings whose first line started on the same line as 1626the opening quote(s) were incorrectly presented in <code class="docutils literal notranslate"><span class="pre">invoke</span> <span class="pre">--help</span> <span class="pre"><task></span></code>. 1627This has been fixed by using <a class="reference external" href="https://docs.python.org/3/library/inspect.html#inspect.getdoc" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">inspect.getdoc</span></code></a>. Thanks to Pekka Klärck for the 1628catch & suggested fix.</p></li> 1629<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/191">#191</a><span>:</span> Bypass <code class="docutils literal notranslate"><span class="pre">pexpect</span></code>âs automatic command splitting to avoid 1630issues running complex nested/quoted commands under a pty. Credit to 1631<code class="docutils literal notranslate"><span class="pre">@mijikai</span></code> for noticing the problem.</p></li> 1632<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/201">#201</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/211">#211</a>) Replace the old, first-draft gross 1633monkeypatched Popen code used for <code class="docutils literal notranslate"><span class="pre">invoke.runner.run</span></code> with a 1634non-monkeypatched approach that works better on non-POSIX platforms like 1635Windows, and also attempts to handle encoding and locale issues more 1636gracefully (meaning: at all gracefully).</p> 1637<p>Specifically, the new approach uses threading instead of <code class="docutils literal notranslate"><span class="pre">select.select</span></code>, 1638and performs explicit encoding/decoding based on detected or explicitly 1639expressed encodings.</p> 1640<p>Major thanks to Paul Moore for an enormous amount of 1641testing/experimentation/discussion, as well as the bulk of the code changes 1642themselves.</p> 1643<div class="admonition warning"> 1644<p class="admonition-title">Warning</p> 1645<p>The top level <code class="docutils literal notranslate"><span class="pre">invoke.runner.run</span></code> function has had a minor signature 1646change: the sixth positional argument used to be <code class="docutils literal notranslate"><span class="pre">
1646runner</span></code> and is now 1647<code class="docutils literal notranslate"><span class="pre">encoding</span></code> (with <code class="docutils literal notranslate"><span class="pre">runner</span></code> now being the seventh positional argument).</p> 1648</div> 1649</li> 1650<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/215">#215</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/213">#213</a>, <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/214">#214</a>) Tweak tests & configuration 1651sections of the code to include Windows compatibility. Thanks to Paul Moore.</p></li> 1652<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/212">#212</a><span>:</span> Implement basic linting support using <code class="docutils literal notranslate"><span class="pre">flake8</span></code>, and apply 1653formatting changes to satisfy said linting. As part of this shakeup, also 1654changed all old-style (<code class="docutils literal notranslate"><span class="pre">%s</span></code>) string formatting to new-style (<code class="docutils literal notranslate"><span class="pre">{0}</span></code>). 1655Thanks to Collin Anderson for the foundational patch.</p></li> 1656<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Reorganize <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Runner</span></code></a>, <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Local" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Local</span></code></a> and 1657<code class="docutils literal notranslate"><span class="pre">invoke.runner.run</span></code> for improved distribution of responsibilities & 1658downstream subclassing.</p> 1659<div class="admonition warning"> 1660<p class="admonition-title">Warning</p> 1661<p>This includes backwards incompatible changes to the API signature of most 1662members of the <code class="docutils literal notranslate"><span class="pre">invoke.runner</span></code> module, including <code class="docutils literal notranslate"><span class="pre">invoke.runner.run</span></code>. 1663(However, in the case of <code class="docutils literal notranslate"><span class="pre">invoke.runner.run</span></code>, the changes are mostly in 1664the later, optional keyword arguments.)</p> 1665</div> 1666</li> 1667</ul> 1668</section> 1669<section id="0.9.0"> 1670<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.9.0">0.9.0</a> <span style="font-size: 75%;">2014-08-26</span></h2><ul class="simple"> 1671<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/136">#136</a><span>:</span> Added the <code class="docutils literal notranslate"><span class="pre">autoprint</span></code> flag to 1672<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.Task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">invoke.tasks.Task</span></code></a>/<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">@task</span></code></a>, allowing users to set up 1673tasks which act as both subroutines & âprint a resultâ CLI tasks. Thanks to 1674Matthias Lehmann for the original patch.</p></li> 1675<li><p>[<span style="color: #A04040;">Bug</span>]<span>:</span><span> </span> Fixed a sub-case of the already-mostly-fixed <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/149">#149</a> so 1676the error message works usefully even with no explicit collection name given.</p></li> 1677<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/162">#162</a><span>:</span> Adjust platform-sensitive imports so Windows users donât 1678encounter import-time exceptions. Thanks to Paul Moore for the patch.</p></li> 1679<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/119">#119</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/162">#162</a>, <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/113">#113</a>) Better handle 1680platform-sensitive operations such as pty size detection or use, either 1681replacing with platform-specific implementations or raising useful 1682exceptions. Thanks to Gabi Davar and (especially) Paul Moore, for feedback & 1683original versions of the final patchset.</p></li> 1684<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/167">
1684#167</a><span>:</span> Running the same task multiple times in one CLI session was 1685horribly broken; it works now. Thanks to Erich Heine for the report.</p></li> 1686<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/165">#165</a><span>:</span> Running <code class="docutils literal notranslate"><span class="pre">inv[oke]</span></code> with no task names on a collection 1687containing a default task should (intuitively) have run that default task, 1688but instead did nothing. This has been fixed.</p></li> 1689<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/169">#169</a><span>:</span> Overhaul the Sphinx docs into two trees, one for main project 1690info and one for versioned API docs.</p></li> 1691</ul> 1692</section> 1693<section id="0.8.2"> 1694<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.8.2">0.8.2</a> <span style="font-size: 75%;">2014-06-15</span></h2><ul class="simple"> 1695<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/142">#142</a><span>:</span> The refactored Loader class failed to account for the behavior of 1696<code class="docutils literal notranslate"><span class="pre">imp.find_module</span></code> when run against packages (vs modules) and was exploding 1697at load time. This has been fixed. Thanks to David Baumgold for catch & 1698patch.</p></li> 1699<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/145">#145</a><span>:</span> Ensure a useful message is displayed (instead of a confusing 1700exception) when listing empty task collections.</p></li> 1701<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/149">#149</a><span>:</span> Print a useful message to stderr when Invoke canât find the 1702requested collection/tasks file, instead of displaying a traceback.</p></li> 1703</ul> 1704</section> 1705<section id="0.8.1"> 1706<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.8.1">0.8.1</a> <span style="font-size: 75%;">2014-06-09</span></h2><ul class="simple"> 1707<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/140">#140</a><span>:</span> Revert incorrect changes to our <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> regarding detection 1708of sub-packages such as the vendor tree & the parser. Also add additional 1709scripting to our Travis-CI config to catch this class of error in future. 1710Thanks to Steven Loria and James Cox for the reports.</p></li> 1711</ul> 1712</section> 1713<section id="0.8.0"> 1714<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.8.0">0.8.0</a> <span style="font-size: 75%;">2014-06-08</span></h2><ul> 1715<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/125">#125</a><span>:</span> Improve output of Failure exceptions when printed.</p></li> 1716<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/124">#124</a><span>:</span> Add a <code class="docutils literal notranslate"><span class="pre">--debug</span></code> flag to the core parser to enable easier 1717debugging (on top of existing <code class="docutils literal notranslate"><span class="pre">INVOKE_DEBUG</span></code> env var.)</p></li> 1718<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/87">#87</a><span>:</span> (also <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/92">#92</a>) Rework the loader module such that recursive 1719filesystem searching is implemented, and is used instead of searching 1720<a class="reference external" href="https://docs.python.org/3/library/sys.html#sys.path" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">sys.path</span></code></a>.</p> 1721<p>This adds the behavior most users expect or are familiar with from Fabric 1 1722or similar tools; and it avoids nasty surprise collisions with other 1723installed packages containing files named <code class="docutils literal notranslate"><span class="pre">tasks.py</span></code>.</p> 1724<p>Thanks to Michael Hahn for the original report & PR, and to Matt Iversen for
1725providing the discovery algorithm used in the final version of this change.</p> 1726<div class="admonition warning"> 1727<p class="admonition-title">Warning</p> 1728<p>This is technically a backwards incompatible change (reminder: weâre not 1729at 1.0 yet!). Youâll only notice if you were relying on adding your tasks 1730module to <code class="docutils literal notranslate"><span class="pre">sys.path</span></code> and then calling Invoke elsewhere on the 1731filesystem.</p> 1732</div> 1733</li> 1734<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/110">#110</a><span>:</span> Add task docstringsâ 1st lines to <code class="docutils literal notranslate"><span class="pre">--list</span></code> output. Thanks to 1735Hiroki Kiyohara for the original PR (with assists from Robert Read and James 1736Thigpen.)</p></li> 1737<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/115">#115</a><span>:</span> Make it easier to reuse Invokeâs primary CLI machinery in 1738other (non-Invoke-distributed) bin-scripts. Thanks to Noah Kantrowitz.</p></li> 1739<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/135">#135</a><span>:</span> (also bugs <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/120">#120</a>, <a class="reference external" href="https://github.com/pyinvoke/invoke/issues/123">#123</a>) Implement post-tasks to 1740match pre-tasks, and allow control over the arguments passed to both (via 1741<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/tasks.html#invoke.tasks.call" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">invoke.tasks.call</span></code></a>). For details, see <a class="reference external" href="https://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#pre-post-tasks" title="(in Invoke)"><span>Pre- and post-tasks</span></a>.</p> 1742<div class="admonition warning"> 1743<p class="admonition-title">Warning</p> 1744<p>Pre-tasks were overhauled a moderate amount to implement this feature; 1745they now require references to <strong>task objects</strong> instead of <strong>task 1746names</strong>. This is a backwards incompatible change.</p> 1747</div> 1748</li> 1749<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/127">#127</a><span>:</span> Fill in tasksâ exposed <code class="docutils literal notranslate"><span class="pre">name</span></code> attribute with body name if 1750explicit name not given.</p></li> 1751<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/116">#116</a><span>:</span> Ensure nested config overrides play nicely with default 1752tasks and pre-tasks.</p></li> 1753<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/131">#131</a><span>:</span> Make sure oneâs local tasks module is always first in 1754<code class="docutils literal notranslate"><span class="pre">sys.path</span></code>, even if its parent directory was already somewhere else in 1755<code class="docutils literal notranslate"><span class="pre">sys.path</span></code>. This ensures that local tasks modules never become hidden by 1756third-party ones. Thanks to <code class="docutils literal notranslate"><span class="pre">@crccheck</span></code> for the early report and to Dorian 1757PuÅa for assistance fixing.</p></li> 1758<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/121">#121</a><span>:</span> Add missing help output denoting inverse Boolean options 1759(i.e. <code class="docutils literal notranslate"><span class="pre">--[no-]foo</span></code> for a <code class="docutils literal notranslate"><span class="pre">--foo</span></code> flag whose value defaults to true.) 1760Thanks to Andrew Roberts for catch & patch.</p></li> 1761<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/128">#128</a><span>:</span> Positional arguments containing underscores were not 1762exporting to the parser correctly; this has been fixed. Thanks to J. Javier 1763Maestro for catch & patch.</p></li> 1764<li><p>[<span style="color: #4070A0;">Support</span>]<span>:</span><span> </span> Refactor the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/runners.html#invoke.runners.Runner" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">
1764invoke.runners.Runner</span></code></a> module to differentiate 1765what it means to run a command in the abstract, from execution specifics. Top 1766level API is unaffected.</p></li> 1767<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/117">#117</a><span>:</span> Tidy up <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> a bit, including axing the (broken) 1768<a class="reference external" href="https://docs.python.org/3/library/distutils.html#module-distutils" title="(in Python v3.14)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">distutils</span></code></a> support. Thanks to Matt Iversen for the original PR & followup 1769discussion.</p></li> 1770<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/118">#118</a><span>:</span> Update the bundled <code class="docutils literal notranslate"><span class="pre">six</span></code> plus other minor tweaks to support 1771files. Thanks to Matt Iversen.</p></li> 1772<li><p>[<span style="color: #4070A0;">Support</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/25">#25</a><span>:</span> Trim a bunch of time off the test suite by using mocking and 1773other tools instead of dogfooding a bunch of subprocess spawns.</p></li> 1774</ul> 1775</section> 1776<section id="0.7.0"> 1777<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.7.0">0.7.0</a> <span style="font-size: 75%;">2014.01.28</span></h2><ul class="simple"> 1778<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/107">#107</a><span>:</span> Update configuration merging behavior for more flexible reuse 1779of imported task modules, such as parameterizing multiple copies of a module 1780within a task tree.</p></li> 1781<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/108">#108</a><span>:</span> Update <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection.from_module" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">invoke.collection.Collection.from_module</span></code></a> to accept 1782useful shorthand arguments for tweaking the <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">invoke.collection.Collection</span></code></a> 1783objects it creates (e.g. name, configuration.)</p></li> 1784<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/109">#109</a><span>:</span> Add a <code class="docutils literal notranslate"><span class="pre">default</span></code> kwarg to 1785<a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection.add_task" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">invoke.collection.Collection.add_task</span></code></a> allowing per-collection control over 1786default tasks.</p></li> 1787</ul> 1788</section> 1789<section id="0.6.1"> 1790<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.6.1">0.6.1</a> <span style="font-size: 75%;">2013.11.21</span></h2><ul class="simple"> 1791<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/98">#98</a><span>:</span> <strong>BACKWARDS INCOMPATIBLE CHANGE!</strong> Configuration merging has been 1792reversed so outer collectionsâ config settings override inner collections. 1793This makes distributing reusable modules significantly less silly.</p></li> 1794<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/96">#96</a><span>:</span>
1794 Tasks in subcollections which set explicit names (via e.g. 1795<code class="docutils literal notranslate"><span class="pre">@task(name='foo')</span></code>) were not having those names honored. This is fixed. 1796Thanks to Omer Katz for the report.</p></li> 1797</ul> 1798</section> 1799<section id="0.6.0"> 1800<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.6.0">0.6.0</a> <span style="font-size: 75%;">2013.11.21</span></h2><ul class="simple"> 1801<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/89">#89</a><span>:</span> Implemented configuration for distributed task modules: can set 1802config options in <a class="reference external" href="https://docs.pyinvoke.org/en/latest/api/collection.html#invoke.collection.Collection" title="(in Invoke)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">invoke.collection.Collection</span></code></a> objects and they are made 1803available to contextualized tasks.</p></li> 1804<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/86">#86</a><span>:</span> Task arguments named with an underscore broke the help feature;
1805this is now fixed. Thanks to Stéphane Klein for the catch.</p></li> 1806</ul> 1807</section> 1808<section id="0.5.1"> 1809<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.5.1">0.5.1</a> <span style="font-size: 75%;">2013.09.15</span></h2><ul class="simple"> 1810<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/83">#83</a><span>:</span> Fix a bug preventing underscored keyword arguments from working 1811correctly as CLI flags (e.g. <code class="docutils literal notranslate"><span class="pre">mytask</span> <span class="pre">--my-arg</span></code> would not map back correctly 1812to <code class="docutils literal notranslate"><span class="pre">mytask(my_arg=...)</span></code>.) Credit: <code class="docutils literal notranslate"><span class="pre">@akitada</span></code>.</p></li> 1813<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/81">#81</a><span>:</span> Fall back to sane defaults for PTY sizes when autodetection gives 1814insane results. Thanks to <code class="docutils literal notranslate"><span class="pre">@akitada</span></code> for the patch.</p></li> 1815</ul> 1816</section> 1817<section id="0.5.0"> 1818<h2 style="margin-bottom: 0.3em;"><a class="reference external" href="https://github.com/pyinvoke/invoke/tree/0.5.0">0.5.0</a> <span style="font-size: 75%;">2013.08.16</span></h2><ul class="simple"> 1819<li><p>[<span style="color: #40A056;">Feature</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/57">#57</a><span>:</span> Optional-value flags added - e.g. <code class="docutils literal notranslate"><span class="pre">--foo</span></code> tells the parser to 1820set the <code class="docutils literal notranslate"><span class="pre">foo</span></code> option value to True; <code class="docutils literal notranslate"><span class="pre">--foo</span> <span class="pre">myval</span></code> sets the value to 1821âmyvalâ. The built-in <code class="docutils literal notranslate"><span class="pre">--help</span></code> option now leverages this feature for 1822per-task help (e.g. <code class="docutils literal notranslate"><span class="pre">--help</span></code> displays global help, <code class="docutils literal notranslate"><span class="pre">--help</span> <span class="pre">mytask</span></code> 1823displays help for <code class="docutils literal notranslate"><span class="pre">mytask</span></code> only.)</p></li> 1824<li><p>[<span style="color: #A04040;">Bug</span>]<span> </span><a class="reference external" href="https://github.com/pyinvoke/invoke/issues/55">#55</a><span>:</span> A bug in our vendored copy of <code class="docutils literal notranslate"><span class="pre">pexpect</span></code> clashed with a 1825Python 2->3 change in import behavior to prevent Invoke from running on 1826Python 3 unless the <code class="docutils literal notranslate"><span class="pre">six</span></code> module was installed in oneâs environment. This 1827was fixed - our vendored <code class="docutils literal notranslate"><span class="pre">pexpect</span></code> now always loads its sibling vendored 1828<code class="docutils literal notranslate"><span class="pre">six</span></code> correctly.</p></li> 1829</ul> 1830</section> 1831</section> 1832 1833 1834 </div> 1835 1836 </div> 1837 </div> 1838 <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> 1839 <div class="sphinxsidebarwrapper"> 1840<h1 class="logo"><a href="index.html">Invoke</a></h1> 1841 1842 1843 1844<p class="blurb">Pythonic task execution</p> 1845 1846 1847 1848 1849<p> 1850<iframe src="https://ghbtns.com/github-btn.html?user=pyinvoke&repo=invoke&type=watch&count=true&size=large&v=2" 1851 allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe> 1852</p> 1853 1854 1855 1856 1857 1858<h3>Navigation</h3> 1859<ul class="current"> 1860<li class="toctree-l1 current"><a class="current reference internal" href="#">Changelog</a></li> 1861<li class="toctree-l1"><a class="reference internal" href="faq.html">FAQs</a></li> 1862<li class="toctree-l1"><a class="reference internal" href="installing.html">Installing</a></li> 1863<li class="toctree-l1"><a class="reference internal" href="development.html">Development</a></li> 1864<li class="toctree-l1"><a class="reference internal" href="prior-art.html">Prior art</a></li> 1865<li class="toctree-l1"><a class="reference internal" href="contact.html">Contact</a></li> 1866</ul> 1867 1868 1869<hr /> 1870<ul> 1871 1872 <li class="toctree-l1"><a href="https://docs.pyinvoke.org">Documentation</a></li> 1873 1874</ul> 1875 1876<div id="searchbox" style="display: none" role="search"> 1877 <h3 id="searchlabel">Quick search</h3> 1878 <div class="searchformwrapper"> 1879 <form class="search" action="search.html" method="get"> 1880 <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/> 1881 <input type="submit" value="Go" /> 1882 </form> 1883 </div> 1884</div>
1885<script>document.getElementById('searchbox').style.display = "block"</script>
1885 1886 1887 1888<h3 class="donation">Donate/support</h3> 1889 1890 1891 1892 1893 1894 1895 1896<p> 1897Professionally-supported Invoke is available with the 1898<a href="https://tidelift.com/subscription/pkg/pypi-invoke?utm_source=pypi-invoke&utm_medium=referral&utm_campaign=docs">Tidelift Subscription</a>. 1899</p> 1900 1901 </div> 1902 </div> 1903 <div class="clearer"></div> 1904 </div> 1905 <div class="footer"> 1906 ©2026 Jeff Forcier. 1907 1908 | 1909 Powered by <a href="http://sphinx-doc.org/">Sphinx 7.2.6</a> 1910 & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a> 1911 1912 | 1913 <a href="_sources/changelog.rst.txt" 1914 rel="nofollow">Page source</a> 1915 </div> 1916 1917 1918 1919 1920
1920<script type="text/javascript"> 1921 1922 var _gaq = _gaq || []; 1923 _gaq.push(['_setAccount', 'UA-18486793-3']); 1924 _gaq.push(['_setDomainName', 'none']); 1925 _gaq.push(['_setAllowLinker', true]); 1926 _gaq.push(['_trackPageview']); 1927 1928 (function() { 1929 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 1930 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 1931 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 1932 })(); 1933 1934 </script>
1934 1935 1936 </body> 1937</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.