<h1 dir="auto">Checklist</h1>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have verified that the issue exists against the <code class="notranslate">master</code> branch of Celery.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> This has already been asked to the <a href="https://groups.google.com/forum/#!forum/celery-users" rel="nofollow">discussion group</a> first.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have read the relevant section in the<br>
<a href="http://docs.celeryproject.org/en/latest/contributing.html#other-bugs" rel="nofollow">contribution guide</a><br>
on reporting bugs.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have checked the <a href="https://github.com/celery/celery/issues?q=is%3Aissue+label%3A%22Issue+Type%3A+Bug+Report%22+-label%3A%22Category%3A+Documentation%22">issues list</a><br>
for similar or identical bug reports.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have checked the <a href="https://github.com/celery/celery/pulls?q=is%3Apr+label%3A%22PR+Type%3A+Bugfix%22+-label%3A%22Category%3A+Documentation%22">pull requests list</a><br>
for existing proposed fixes.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have checked the <a href="https://github.com/celery/celery/commits/master">commit log</a><br>
to find out if the bug was already fixed in the master branch.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have included all related issues and possible duplicate issues<br>
in this issue (If there are none, check this box anyway).</li>
</ul>
<h2 dir="auto">Mandatory Debugging Information</h2>
<ul dir="auto">
<li>Version: Celery 4.4.7, 5.0.2, and <code class="notranslate">master</code></li>
</ul>
<h1 dir="auto">Problem</h1>
<p dir="auto">I was trying to set up testing for a project using Celery using py.test and while wondering why <code class="notranslate">celery_app</code> didn't seem to have an effect (accessing <code class="notranslate">celery.current_app</code> printed out a decidedly non-test app), I think I may have found a bug in the implementation of <code class="notranslate">setup_default_app</code> (which is used by the <code class="notranslate">celery_app</code> fixture).</p>
<p dir="auto">If you look at the implementation below (which is the same in 4.4.7, <a href="https://github.com/celery/celery/blob/d50c6cfc448e9e31384190b23f285254cb44e8a2/celery/contrib/testing/app.py">https://github.com/celery/celery/blob/d50c6cfc448e9e31384190b23f285254cb44e8a2/celery/contrib/testing/app.py</a>), the <code class="notranslate">app</code> argument is actually never assigned to the current state globals. I believe this problem has existed for a long while, effectively making <code class="notranslate">setup_default_app</code> a no-op unless the trap is enabled.</p>
<p dir="auto"></p><div class="Box Box--condensed my-2">
  <div class="Box-header f6">
    <p class="mb-0 text-bold">
      <a href="https://github.com/celery/celery/blob/f50cf7d9944558167b85c14d73e8f790da251730/celery/contrib/testing/app.py#L68-L109">celery/celery/contrib/testing/app.py</a>
    </p>
    <p class="mb-0 color-fg-muted">
        Lines 68 to 109
      in
      <a data-pjax="true" class="commit-tease-sha" href="/celery/celery/commit/f50cf7d9944558167b85c14d73e8f790da251730">f50cf7d</a>
    </p>
  </div>
  <div itemprop="text" class="Box-body p-0 blob-wrapper blob-wrapper-embedded data">
    <table class="highlight tab-size mb-0 js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">

        <tbody><tr class="border-0">
          <td id="L68" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="68"></td>
          <td id="LC68" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-en">@<span class="pl-s1">contextmanager</span></span> </td>
        </tr>

        <tr class="border-0">
          <td id="L69" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="69"></td>
          <td id="LC69" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">set_trap</span>(<span class="pl-s1">app</span>): </td>
        </tr>

        <tr class="border-0">
          <td id="L70" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="70"></td>
          <td id="LC70" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s">"""Contextmanager that installs the trap app.</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L71" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="71"></td>
          <td id="LC71" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-s"></span> </td>
        </tr>

        <tr class="border-0">
          <td id="L72" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="72"></td>
          <td id="LC72" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-s">    The trap means that anything trying to use the current or default app</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L73" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="73"></td>
          <td id="LC73" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-s">    will raise an exception.</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L74" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="74"></td>
          <td id="LC74" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-s">    """</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L75" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="75"></td>
          <td id="LC75" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">trap</span> <span class="pl-c1">=</span> <span class="pl-v">Trap</span>() </td>
        </tr>

        <tr class="border-0">
          <td id="L76" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="76"></td>
          <td id="LC76" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">prev_tls</span> <span class="pl-c1">=</span> <span class="pl-s1">_state</span>.<span class="pl-s1">_tls</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L77" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="77"></td>
          <td id="LC77" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">_state</span>.<span class="pl-en">set_default_app</span>(<span class="pl-s1">trap</span>) </td>
        </tr>

        <tr class="border-0">
          <td id="L78" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="78"></td>
          <td id="LC78" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">  </td>
        </tr>

        <tr class="border-0">
          <td id="L79" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="79"></td>
          <td id="LC79" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-k">class</span> <span class="pl-v">NonTLS</span>: </td>
        </tr>

        <tr class="border-0">
          <td id="L80" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="80"></td>
          <td id="LC80" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">         <span class="pl-s1">current_app</span> <span class="pl-c1">=</span> <span class="pl-s1">trap</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L81" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="81"></td>
          <td id="LC81" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">_state</span>.<span class="pl-s1">_tls</span> <span class="pl-c1">=</span> <span class="pl-v">NonTLS</span>() </td>
        </tr>

        <tr class="border-0">
          <td id="L82" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="82"></td>
          <td id="LC82" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">  </td>
        </tr>

        <tr class="border-0">
          <td id="L83" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="83"></td>
          <td id="LC83" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-k">yield</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L84" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="84"></td>
          <td id="LC84" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">_state</span>.<span class="pl-s1">_tls</span> <span class="pl-c1">=</span> <span class="pl-s1">prev_tls</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L85" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="85"></td>
          <td id="LC85" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">  </td>
        </tr>

        <tr class="border-0">
          <td id="L86" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="86"></td>
          <td id="LC86" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">  </td>
        </tr>

        <tr class="border-0">
          <td id="L87" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="87"></td>
          <td id="LC87" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-en">@<span class="pl-s1">contextmanager</span></span> </td>
        </tr>

        <tr class="border-0">
          <td id="L88" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="88"></td>
          <td id="LC88" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">setup_default_app</span>(<span class="pl-s1">app</span>, <span class="pl-s1">use_trap</span><span class="pl-c1">=</span><span class="pl-c1">False</span>): </td>
        </tr>

        <tr class="border-0">
          <td id="L89" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="89"></td>
          <td id="LC89" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s">"""Setup default app for testing.</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L90" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="90"></td>
          <td id="LC90" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-s"></span> </td>
        </tr>

        <tr class="border-0">
          <td id="L91" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="91"></td>
          <td id="LC91" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-s">    Ensures state is clean after the test returns.</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L92" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="92"></td>
          <td id="LC92" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-s">    """</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L93" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="93"></td>
          <td id="LC93" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">prev_current_app</span> <span class="pl-c1">=</span> <span class="pl-s1">_state</span>.<span class="pl-en">get_current_app</span>() </td>
        </tr>

        <tr class="border-0">
          <td id="L94" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="94"></td>
          <td id="LC94" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">prev_default_app</span> <span class="pl-c1">=</span> <span class="pl-s1">_state</span>.<span class="pl-s1">default_app</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L95" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="95"></td>
          <td id="LC95" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">prev_finalizers</span> <span class="pl-c1">=</span> <span class="pl-en">set</span>(<span class="pl-s1">_state</span>.<span class="pl-s1">_on_app_finalizers</span>) </td>
        </tr>

        <tr class="border-0">
          <td id="L96" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="96"></td>
          <td id="LC96" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">prev_apps</span> <span class="pl-c1">=</span> <span class="pl-s1">weakref</span>.<span class="pl-v">WeakSet</span>(<span class="pl-s1">_state</span>.<span class="pl-s1">_apps</span>) </td>
        </tr>

        <tr class="border-0">
          <td id="L97" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="97"></td>
          <td id="LC97" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">  </td>
        </tr>

        <tr class="border-0">
          <td id="L98" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="98"></td>
          <td id="LC98" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-k">if</span> <span class="pl-s1">use_trap</span>: </td>
        </tr>

        <tr class="border-0">
          <td id="L99" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="99"></td>
          <td id="LC99" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">         <span class="pl-k">with</span> <span class="pl-en">set_trap</span>(<span class="pl-s1">app</span>): </td>
        </tr>

        <tr class="border-0">
          <td id="L100" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="100"></td>
          <td id="LC100" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">             <span class="pl-k">yield</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L101" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="101"></td>
          <td id="LC101" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-k">else</span>: </td>
        </tr>

        <tr class="border-0">
          <td id="L102" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="102"></td>
          <td id="LC102" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">         <span class="pl-k">yield</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L103" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="103"></td>
          <td id="LC103" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">  </td>
        </tr>

        <tr class="border-0">
          <td id="L104" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="104"></td>
          <td id="LC104" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">_state</span>.<span class="pl-en">set_default_app</span>(<span class="pl-s1">prev_default_app</span>) </td>
        </tr>

        <tr class="border-0">
          <td id="L105" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="105"></td>
          <td id="LC105" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">_state</span>.<span class="pl-s1">_tls</span>.<span class="pl-s1">current_app</span> <span class="pl-c1">=</span> <span class="pl-s1">prev_current_app</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L106" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="106"></td>
          <td id="LC106" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-k">if</span> <span class="pl-s1">app</span> <span class="pl-c1">is</span> <span class="pl-c1">not</span> <span class="pl-s1">prev_current_app</span>: </td>
        </tr>

        <tr class="border-0">
          <td id="L107" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="107"></td>
          <td id="LC107" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">         <span class="pl-s1">app</span>.<span class="pl-en">close</span>() </td>
        </tr>

        <tr class="border-0">
          <td id="L108" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="108"></td>
          <td id="LC108" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">_state</span>.<span class="pl-s1">_on_app_finalizers</span> <span class="pl-c1">=</span> <span class="pl-s1">prev_finalizers</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L109" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="109"></td>
          <td id="LC109" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">_state</span>.<span class="pl-s1">_apps</span> <span class="pl-c1">=</span> <span class="pl-s1">prev_apps</span> </td>
        </tr>
    </tbody></table>
  </div>
</div>
<p></p>
<p dir="auto">The <code class="notranslate">celery_app</code> pytest fixture attempts to use <code class="notranslate">setup_default_app()</code>: </p><div class="Box Box--condensed my-2">
  <div class="Box-header f6">
    <p class="mb-0 text-bold">
      <a href="https://github.com/celery/celery/blob/c3e041050ae252be79d9b4ae400ec0c5b2831d14/celery/contrib/pytest.py#L40-L41">celery/celery/contrib/pytest.py</a>
    </p>
    <p class="mb-0 color-fg-muted">
        Lines 40 to 41
      in
      <a data-pjax="true" class="commit-tease-sha" href="/celery/celery/commit/c3e041050ae252be79d9b4ae400ec0c5b2831d14">c3e0410</a>
    </p>
  </div>
  <div itemprop="text" class="Box-body p-0 blob-wrapper blob-wrapper-embedded data">
    <table class="highlight tab-size mb-0 js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">

        <tbody><tr class="border-0">
          <td id="L40" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="40"></td>
          <td id="LC40" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-k">with</span> <span class="pl-en">setup_default_app</span>(<span class="pl-s1">test_app</span>, <span class="pl-s1">use_trap</span><span class="pl-c1">=</span><span class="pl-s1">use_trap</span>): </td>
        </tr>

        <tr class="border-0">
          <td id="L41" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="41"></td>
          <td id="LC41" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-k">yield</span> <span class="pl-s1">test_app</span> </td>
        </tr>
    </tbody></table>
  </div>
</div>
<p></p>
<p dir="auto">but when the trap argument is False, no change is done to the ambient current app setting.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="585257825" data-permission-text="Title is private" data-url="https://github.com/celery/celery/issues/6007" data-hovercard-type="issue" data-hovercard-url="/celery/celery/issues/6007/hovercard" href="https://github.com/celery/celery/issues/6007">#6007</a> may be vaguely related to this.</p>
<p dir="auto">Replica sets are support by celery now for brokers and result backends, but I seem to have trouble when specifying ports on the individual nodes in the mongodb URL.</p>
<p dir="auto">In my settings:</p>
<p dir="auto">MONGODB_CONNECTION_URI = 'mongodb://localhost:27037,localhost:27038,localhost:27039'</p>
<p dir="auto">The result when I run celeryd (via python manage.py celeryd):</p>
<p dir="auto">[2012-04-16 14:16:19,389: WARNING/MainProcess] Traceback (most recent call last):<br>
...<br>
[2012-04-16 14:16:19,393: WARNING/MainProcess] File "/my/virtual/env/lib/python2.7/site-packages/celery/apps/worker.py", line 200, in startup_info<br>
[2012-04-16 14:16:19,394: WARNING/MainProcess] "conninfo": self.app.broker_connection().as_uri(),<br>
[2012-04-16 14:16:19,394: WARNING/MainProcess] File "/my/virtual/env/lib/python2.7/site-packages/celery/app/base.py", line 234, in broker_connection<br>
[2012-04-16 14:16:19,394: WARNING/MainProcess] **transport_options or {}))<br>
[2012-04-16 14:16:19,394: WARNING/MainProcess] File "/my/virtual/env/lib/python2.7/site-packages/kombu/connection.py", line 101, in <strong>init</strong><br>
[2012-04-16 14:16:19,394: WARNING/MainProcess] params.update(parse_url(hostname))<br>
[2012-04-16 14:16:19,395: WARNING/MainProcess] File "/my/virtual/env/lib/python2.7/site-packages/kombu/utils/url.py", line 33, in parse_url<br>
[2012-04-16 14:16:19,395: WARNING/MainProcess] scheme, host, port, user, password, path, query = _parse_url(url)<br>
[2012-04-16 14:16:19,395: WARNING/MainProcess] File "/my/virtual/env/lib/python2.7/site-packages/kombu/utils/url.py", line 25, in _parse_url<br>
[2012-04-16 14:16:19,395: WARNING/MainProcess] int(parts.port) if parts.port else None,<br>
[2012-04-16 14:16:19,395: WARNING/MainProcess] File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urlparse.py", line 106, in port<br>
[2012-04-16 14:16:19,396: WARNING/MainProcess] return int(port, 10)<br>
[2012-04-16 14:16:19,396: WARNING/MainProcess] ValueError<br>
[2012-04-16 14:16:19,396: WARNING/MainProcess] :<br>
[2012-04-16 14:16:19,396: WARNING/MainProcess] invalid literal for int() with base 10: '27037,localhost'</p>
<p dir="auto">Here [1] is the full stack. So, it keeps parsing for port after the first ':', when it should break up the nodes on ',' first.</p>
<p dir="auto">There seems to be another report of this in this comment [2] on the original celery pull request.</p>
<p dir="auto">[1] <a href="http://pastebin.com/DvZcGdVm" rel="nofollow">http://pastebin.com/DvZcGdVm</a><br>
[2] <a href="https://github.com/ask/kombu/pull/81#issuecomment-4327785">https://github.com/ask/kombu/pull/81#issuecomment-4327785</a></p>