PageSourceSearch

https://www.pyinvoke.org/changelog.html

html pyinvoke.org collected 2026-10-03 21:37:07 UTC 234,863 bytes, 1,937 lines download raw bytes

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 &#8212; 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">&#64;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">&#64;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">&#64;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">&#64;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 &amp;
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 &lt;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">&#64;kasium</span></code> for the original bug report and to <code class="docutils literal notranslate"><span class="pre">&#64;rathann</span></code> and
167<code class="docutils literal notranslate"><span class="pre">&#64;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">&#64;kasium</span></code> for the original bug report and to <code class="docutils literal notranslate"><span class="pre">&#64;rathann</span></code> and
180<code class="docutils literal notranslate"><span class="pre">&#64;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 &amp; 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 &amp; 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 &amp; 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">&lt;submodule&gt;</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 &amp; 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 &lt;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">&#64;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">&#64;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 &amp; 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 &amp; 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">&#64;SwampFalc</span></code> for the report &amp; 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">&#64;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">&#64;task(help={&quot;foo&quot;:</span> <span class="pre">&quot;help</span> <span class="pre">for</span> <span class="pre">foo&quot;})</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">&#64;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> &amp; 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> &amp; 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">&#64;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 &amp; 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">&#64;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">&#64;plockc</span></code> for the report &amp; 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">&quot;No</span> <span class="pre">such</span> <span class="pre">file&quot;</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">&#64;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 &amp;
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 &amp;
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">&#64;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">&#64;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">&#64;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">&#64;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">&quot;Call&quot;</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 &amp; 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&amp; 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">&#64;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">&#64;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 &amp; 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 &amp; 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">&#64;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">&#64;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 &amp;
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">&#64;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 &amp; 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">&quot;{}&quot;.format(val)</span></code> instead of <code class="docutils literal notranslate"><span class="pre">&quot;{0}&quot;.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">&#64;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 &amp; 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">&#64;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 &amp; 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">&lt;args&gt;</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 &amp; 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">&lt;user&gt;</span> <span class="pre">&lt;command&gt;</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">&#64;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">&lt;</span> <span class="pre">/dev/null</span></code> (redirected stdin.) Thanks to Javier Domingo Cansino
1033for the report &amp; 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(&quot;sudo</span> <span class="pre">&lt;command&gt;&quot;)</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 &amp; 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">&#64;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">&#64;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 &amp; 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 &amp; 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 &amp; 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">&#64;philtay</span></code> for an early version of the final patch, and Erich Heine &amp; 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 &amp;
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 &amp; 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">&#64;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 &amp; 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">&#64;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">&#64;yoshiya0503</span></code> for catch &amp; 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">-&lt;tab&gt;</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">&#64;brutus</span></code>
1550and Jan Willems for initial report &amp; 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 &amp; 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 &amp;
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">&lt;task&gt;</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 &amp; 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">&#64;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 &amp; 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 &amp;
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">&#64;task</span></code></a>, allowing users to set up
1673tasks which act as both subroutines &amp; “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 &amp;
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 &amp;
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 &amp; 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 &amp; 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">&#64;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 &amp; 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 &amp; 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 &amp; 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">&#64;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">&#64;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">&#64;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-&gt;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      &copy;2026 Jeff Forcier.
1907      
1908      |
1909      Powered by <a href="http://sphinx-doc.org/">Sphinx 7.2.6</a>
1910      &amp; <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.