Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

logging: Improve formatting of multiline message #5312

Merged
merged 1 commit into from May 31, 2019

Conversation

Projects
None yet
4 participants
@thisch
Copy link
Contributor

commented May 25, 2019

This PR improves the formatting of captured and live log messages.

LOGGER.info("test1\nasdfdf")
LOGGER.warning("test2\nasdfkkk")
LOGGER.warning("single line")

Before this PR:

INFO     test_multiline:test_multiline.py:11 test1
asdfdf
WARNING  test_multiline:test_multiline.py:12 test2
asdfkkk
WARNING  test_multiline:test_multiline.py:13 single line

With this PR:

INFO     test_multiline:test_multiline.py:11 test1
                                             asdfdf
WARNING  test_multiline:test_multiline.py:12 test2
                                             asdfkkk
WARNING  test_multiline:test_multiline.py:13 single line
  • Target the master branch for bug fixes, documentation updates and trivial changes.
  • Target the features branch for new features and removals/deprecations.
  • Include documentation when adding new features.
  • Include new tests or update existing tests when applicable.

Unless your change is trivial or a small documentation fix (e.g., a typo or reword of a small section) please:

  • Create a new changelog file in the changelog folder, with a name like <ISSUE NUMBER>.<TYPE>.rst. See changelog/README.rst for details.
  • Add yourself to AUTHORS in alphabetical order;
@codecov

This comment has been minimized.

Copy link

commented May 25, 2019

Codecov Report

Merging #5312 into features will decrease coverage by 0.4%.
The diff coverage is 100%.

Impacted file tree graph

@@             Coverage Diff              @@
##           features    #5312      +/-   ##
============================================
- Coverage     92.37%   91.97%   -0.41%     
============================================
  Files           115      115              
  Lines         26278    26304      +26     
  Branches       2595     2598       +3     
============================================
- Hits          24275    24193      -82     
- Misses         1681     1787     +106     
- Partials        322      324       +2
Impacted Files Coverage Δ
testing/logging/test_formatter.py 100% <100%> (ø) ⬆️
src/_pytest/logging.py 95.96% <100%> (+0.21%) ⬆️
testing/python/collect.py 41.36% <0%> (-23.03%) ⬇️
testing/python/fixtures.py 76.17% <0%> (-22.34%) ⬇️
testing/test_terminal.py 86% <0%> (-12.14%) ⬇️
testing/test_tmpdir.py 93.54% <0%> (-5.38%) ⬇️
src/_pytest/terminal.py 91.49% <0%> (-1.96%) ⬇️
src/_pytest/compat.py 94.97% <0%> (-1.01%) ⬇️
src/_pytest/pytester.py 86.11% <0%> (-0.57%) ⬇️
src/_pytest/main.py 95.62% <0%> (-0.44%) ⬇️
... and 10 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 84569ca...ea3ebec. Read the comment docs.

@thisch thisch force-pushed the thisch:simple_multline_logging branch from e65df5c to 58b42d0 May 25, 2019

output = style.format(record)
assert output == (
"dummypath 10 INFO Test Message line1\n"
"dummypath 10 INFO line2"

This comment has been minimized.

Copy link
@blueyed

blueyed May 25, 2019

Contributor

Hmm, I think it would be better for this to just be indented, but not have the prefix for the second line - it is rather confusing, since it looks like two separate log messages (although there is an indicator (\n)).

This comment has been minimized.

Copy link
@thisch

thisch May 25, 2019

Author Contributor

I also think it would be better to just indent this line. The problem is that it is not so easy to determine the indentation in a generic way. A year ago I wrote this, which I don't really like.

This comment has been minimized.

Copy link
@thisch

thisch May 25, 2019

Author Contributor

Here is a simplified approach of my commit from last year:

diff --git a/src/_pytest/logging.py b/src/_pytest/logging.py
index 1f2d5e1d4..70ce15ad9 100644
--- a/src/_pytest/logging.py
+++ b/src/_pytest/logging.py
@@ -17,6 +17,7 @@ from _pytest.pathlib import Path
 
 DEFAULT_LOG_FORMAT = "%(levelname)-8s %(name)s:%(filename)s:%(lineno)d %(message)s"
 DEFAULT_LOG_DATE_FORMAT = "%H:%M:%S"
+_ESCAPE_SEQ = re.compile(r'\x1b\[[\d;]+m')
 
 
 class ColoredLevelFormatter(logging.Formatter):
@@ -88,15 +89,13 @@ if not six.PY2:
 
         def format(self, record):
             if "\n" in record.message:
-                fmt = self._fmt
-                dct = record.__dict__
-
-                data_seq = [
-                    # fmt % {**dct, "message": line}
-                    fmt % self._update_message(dct, line)
-                    for line in record.message.splitlines()
-                ]
-                return "\n".join(data_seq)
+                lines = record.message.splitlines()
+                formatted = self._fmt % self._update_message(
+                    record.__dict__, lines[0])
+                indentation = (_ESCAPE_SEQ.sub('', formatted)
+                               .find(lines[0]))
+                lines[0] = formatted
+                return ("\n" + ' '*indentation).join(lines)
             else:
                 return self._fmt % record.__dict__
 
diff --git a/testing/logging/test_formatter.py b/testing/logging/test_formatter.py
index 2fa4b3157..0879875df 100644
--- a/testing/logging/test_formatter.py
+++ b/testing/logging/test_formatter.py
@@ -62,5 +62,5 @@ def test_multiline_message():
     output = style.format(record)
     assert output == (
         "dummypath                   10 INFO     Test Message line1\n"
-        "dummypath                   10 INFO     line2"
+        "                                        line2"
     )

This comment has been minimized.

Copy link
@blueyed

blueyed May 27, 2019

Contributor

Doesn't look too bad to me..!

FWIW: I'm using loguru for my current project, where log messages end up on stdout/stderr instead - should check how it behaves with regard to multiple lines there.

formatter = logging.Formatter(log_format, log_date_format)

if not six.PY2:
formatter._style = PercentStyleMultiline(formatter._style._fmt)

This comment has been minimized.

Copy link
@nicoddemus

nicoddemus May 27, 2019

Member

Can you write a comment here please explaining why this is needed only for Python 3? I didn't look deep into it, but it feels surprising that Python 3 does not support this.

I suggest to write your skip reason here then: Formatter classes don't support format styles in PY2 😁

@thisch thisch force-pushed the thisch:simple_multline_logging branch from 58b42d0 to ea3ebec May 29, 2019

@nicoddemus nicoddemus merged commit c8d23c2 into pytest-dev:features May 31, 2019

5 checks passed

WIP Ready for review
Details
codecov/patch 100% of diff hit (target 92.37%)
Details
codecov/project Absolute coverage decreased by -0.4% but relative coverage increased by +7.62% compared to 84569ca
Details
continuous-integration/travis-ci/pr The Travis CI build passed
Details
pytest-CI #20190529.14 succeeded
Details
@nicoddemus

This comment has been minimized.

Copy link
Member

commented May 31, 2019

I've tried and it looks great, thanks @thisch!

bors bot added a commit to rehandalal/therapist that referenced this pull request Jun 2, 2019

Merge #81
81: Update pytest to 4.6.1 r=rehandalal a=pyup-bot


This PR updates [pytest](https://pypi.org/project/pytest) from **4.5.0** to **4.6.1**.



<details>
  <summary>Changelog</summary>
  
  
   ### 4.6.0
   ```
   =========================

Important
---------

The ``4.6.X`` series will be the last series to support **Python 2 and Python 3.4**.

For more details, see our `Python 2.7 and 3.4 support plan &lt;https://docs.pytest.org/en/latest/py27-py34-deprecation.html&gt;`__.


Features
--------

- `4559 &lt;https://github.com/pytest-dev/pytest/issues/4559&gt;`_: Added the ``junit_log_passing_tests`` ini value which can be used to enable or disable logging of passing test output in the Junit XML file.


- `4956 &lt;https://github.com/pytest-dev/pytest/issues/4956&gt;`_: pytester&#39;s ``testdir.spawn`` uses ``tmpdir`` as HOME/USERPROFILE directory.


- `5062 &lt;https://github.com/pytest-dev/pytest/issues/5062&gt;`_: Unroll calls to ``all`` to full for-loops with assertion rewriting for better failure messages, especially when using Generator Expressions.


- `5063 &lt;https://github.com/pytest-dev/pytest/issues/5063&gt;`_: Switch from ``pkg_resources`` to ``importlib-metadata`` for entrypoint detection for improved performance and import time.


- `5091 &lt;https://github.com/pytest-dev/pytest/issues/5091&gt;`_: The output for ini options in ``--help`` has been improved.


- `5269 &lt;https://github.com/pytest-dev/pytest/issues/5269&gt;`_: ``pytest.importorskip`` includes the ``ImportError`` now in the default ``reason``.


- `5311 &lt;https://github.com/pytest-dev/pytest/issues/5311&gt;`_: Captured logs that are output for each failing test are formatted using the
  ColoredLevelFormatter.


- `5312 &lt;https://github.com/pytest-dev/pytest/issues/5312&gt;`_: Improved formatting of multiline log messages in Python 3.



Bug Fixes
---------

- `2064 &lt;https://github.com/pytest-dev/pytest/issues/2064&gt;`_: The debugging plugin imports the wrapped ``Pdb`` class (``--pdbcls``) on-demand now.


- `4908 &lt;https://github.com/pytest-dev/pytest/issues/4908&gt;`_: The ``pytest_enter_pdb`` hook gets called with post-mortem (``--pdb``).


- `5036 &lt;https://github.com/pytest-dev/pytest/issues/5036&gt;`_: Fix issue where fixtures dependent on other parametrized fixtures would be erroneously parametrized.


- `5256 &lt;https://github.com/pytest-dev/pytest/issues/5256&gt;`_: Handle internal error due to a lone surrogate unicode character not being representable in Jython.


- `5257 &lt;https://github.com/pytest-dev/pytest/issues/5257&gt;`_: Ensure that ``sys.stdout.mode`` does not include ``&#39;b&#39;`` as it is a text stream.


- `5278 &lt;https://github.com/pytest-dev/pytest/issues/5278&gt;`_: Pytest&#39;s internal python plugin can be disabled using ``-p no:python`` again.


- `5286 &lt;https://github.com/pytest-dev/pytest/issues/5286&gt;`_: Fix issue with ``disable_test_id_escaping_and_forfeit_all_rights_to_community_support`` option not working when using a list of test IDs in parametrized tests.


- `5330 &lt;https://github.com/pytest-dev/pytest/issues/5330&gt;`_: Show the test module being collected when emitting ``PytestCollectionWarning`` messages for
  test classes with ``__init__`` and ``__new__`` methods to make it easier to pin down the problem.


- `5333 &lt;https://github.com/pytest-dev/pytest/issues/5333&gt;`_: Fix regression in 4.5.0 with ``--lf`` not re-running all tests with known failures from non-selected tests.



Improved Documentation
----------------------

- `5250 &lt;https://github.com/pytest-dev/pytest/issues/5250&gt;`_: Expand docs on use of ``setenv`` and ``delenv`` with ``monkeypatch``.
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/pytest
  - Changelog: https://pyup.io/changelogs/pytest/
  - Homepage: https://docs.pytest.org/en/latest/
</details>



Co-authored-by: pyup-bot <github-bot@pyup.io>
Co-authored-by: R&D <rehandalal@users.noreply.github.com>

bors bot added a commit to mozilla/normandy that referenced this pull request Jun 3, 2019

Merge #1896
1896: Scheduled weekly dependency update for week 22 r=rehandalal a=pyup-bot






### Update [botocore](https://pypi.org/project/botocore) from **1.12.156** to **1.12.159**.


<details>
  <summary>Changelog</summary>
  
  
   ### 1.12.159
   ```
   ========

* api-change:``iotevents-data``: Update iotevents-data client to latest version
* api-change:``iotevents``: Update iotevents client to latest version
* api-change:``pinpoint-email``: Update pinpoint-email client to latest version
* api-change:``iotanalytics``: Update iotanalytics client to latest version
* api-change:``codecommit``: Update codecommit client to latest version
* api-change:``rds-data``: Update rds-data client to latest version
* api-change:``rds``: Update rds client to latest version
* api-change:``servicecatalog``: Update servicecatalog client to latest version
* api-change:``kafka``: Update kafka client to latest version
   ```
   
  
  
   ### 1.12.158
   ```
   ========

* api-change:``ssm``: Update ssm client to latest version
* api-change:``securityhub``: Update securityhub client to latest version
* api-change:``iotthingsgraph``: Update iotthingsgraph client to latest version
* api-change:``dlm``: Update dlm client to latest version
* api-change:``rds``: Update rds client to latest version
* api-change:``ec2``: Update ec2 client to latest version
   ```
   
  
  
   ### 1.12.157
   ```
   ========

* api-change:``groundstation``: Update groundstation client to latest version
* api-change:``transcribe``: Update transcribe client to latest version
* api-change:``chime``: Update chime client to latest version
* api-change:``rds``: Update rds client to latest version
* api-change:``waf``: Update waf client to latest version
* api-change:``pinpoint-email``: Update pinpoint-email client to latest version
* api-change:``robomaker``: Update robomaker client to latest version
* api-change:``sts``: Update sts client to latest version
* api-change:``storagegateway``: Update storagegateway client to latest version
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/botocore
  - Changelog: https://pyup.io/changelogs/botocore/
  - Repo: https://github.com/boto/botocore
</details>





### Update [cryptography](https://pypi.org/project/cryptography) from **2.6.1** to **2.7**.


<details>
  <summary>Changelog</summary>
  
  
   ### 2.7
   ```
   ~~~~~~~~~~~~~~~~

* **BACKWARDS INCOMPATIBLE:** We no longer distribute 32-bit ``manylinux1``
  wheels. Continuing to produce them was a maintenance burden.
* **BACKWARDS INCOMPATIBLE:** Removed the
  ``cryptography.hazmat.primitives.mac.MACContext`` interface. The ``CMAC`` and
  ``HMAC`` APIs have not changed, but they are no longer registered as
  ``MACContext`` instances.
* Removed support for running our tests with ``setup.py test``. Users
  interested in running our tests can continue to follow the directions in our
  :doc:`development documentation&lt;/development/getting-started&gt;`.
* Add support for :class:`~cryptography.hazmat.primitives.poly1305.Poly1305`
  when using OpenSSL 1.1.1 or newer.
* Support serialization with ``Encoding.OpenSSH`` and ``PublicFormat.OpenSSH``
  in
  :meth:`Ed25519PublicKey.public_bytes
  &lt;cryptography.hazmat.primitives.asymmetric.ed25519.Ed25519PublicKey.public_bytes&gt;`
  .
* Correctly allow passing a ``SubjectKeyIdentifier`` to
  :meth:`~cryptography.x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier`
  and deprecate passing an ``Extension`` object. The documentation always
  required ``SubjectKeyIdentifier`` but the implementation previously
  required an ``Extension``.

.. _v2-6-1:
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/cryptography
  - Changelog: https://pyup.io/changelogs/cryptography/
  - Repo: https://github.com/pyca/cryptography
</details>





### Update [google-api-core](https://pypi.org/project/google-api-core) from **1.11.0** to **1.11.1**.


*The bot wasn't able to find a changelog for this release. [Got an idea?](https://github.com/pyupio/changelogs/issues/new)*

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/google-api-core
  - Repo: https://github.com/GoogleCloudPlatform/google-cloud-python
</details>





### Update [google-cloud-core](https://pypi.org/project/google-cloud-core) from **1.0.0** to **1.0.1**.


*The bot wasn't able to find a changelog for this release. [Got an idea?](https://github.com/pyupio/changelogs/issues/new)*

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/google-cloud-core
  - Repo: https://github.com/GoogleCloudPlatform/google-cloud-python
</details>





### Update [pluggy](https://pypi.org/project/pluggy) from **0.11.0** to **0.12.0**.


<details>
  <summary>Changelog</summary>
  
  
   ### 0.12.0
   ```
   ==========================

Features
--------

- `215 &lt;https://github.com/pytest-dev/pluggy/issues/215&gt;`_: Switch from ``pkg_resources`` to ``importlib-metadata`` for entrypoint detection for improved performance and import time.  This time with ``.egg`` support.
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/pluggy
  - Changelog: https://pyup.io/changelogs/pluggy/
  - Repo: https://github.com/pytest-dev/pluggy
</details>





### Update [protobuf](https://pypi.org/project/protobuf) from **3.7.1** to **3.8.0**.


*The bot wasn't able to find a changelog for this release. [Got an idea?](https://github.com/pyupio/changelogs/issues/new)*

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/protobuf
  - Changelog: https://pyup.io/changelogs/protobuf/
  - Repo: https://github.com/protocolbuffers/protobuf/releases
  - Homepage: https://developers.google.com/protocol-buffers/
</details>





### Update [Pygments](https://pypi.org/project/Pygments) from **2.4.1** to **2.4.2**.


*The bot wasn't able to find a changelog for this release. [Got an idea?](https://github.com/pyupio/changelogs/issues/new)*

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/pygments
  - Homepage: http://pygments.org/
</details>





### Update [boto3](https://pypi.org/project/boto3) from **1.9.156** to **1.9.159**.


<details>
  <summary>Changelog</summary>
  
  
   ### 1.9.159
   ```
   =======

* api-change:``iotevents-data``: [``botocore``] Update iotevents-data client to latest version
* api-change:``iotevents``: [``botocore``] Update iotevents client to latest version
* api-change:``pinpoint-email``: [``botocore``] Update pinpoint-email client to latest version
* api-change:``iotanalytics``: [``botocore``] Update iotanalytics client to latest version
* api-change:``codecommit``: [``botocore``] Update codecommit client to latest version
* api-change:``rds-data``: [``botocore``] Update rds-data client to latest version
* api-change:``rds``: [``botocore``] Update rds client to latest version
* api-change:``servicecatalog``: [``botocore``] Update servicecatalog client to latest version
* api-change:``kafka``: [``botocore``] Update kafka client to latest version
   ```
   
  
  
   ### 1.9.158
   ```
   =======

* api-change:``ssm``: [``botocore``] Update ssm client to latest version
* api-change:``securityhub``: [``botocore``] Update securityhub client to latest version
* api-change:``iotthingsgraph``: [``botocore``] Update iotthingsgraph client to latest version
* api-change:``dlm``: [``botocore``] Update dlm client to latest version
* api-change:``rds``: [``botocore``] Update rds client to latest version
* api-change:``ec2``: [``botocore``] Update ec2 client to latest version
   ```
   
  
  
   ### 1.9.157
   ```
   =======

* api-change:``groundstation``: [``botocore``] Update groundstation client to latest version
* api-change:``transcribe``: [``botocore``] Update transcribe client to latest version
* api-change:``chime``: [``botocore``] Update chime client to latest version
* api-change:``rds``: [``botocore``] Update rds client to latest version
* api-change:``waf``: [``botocore``] Update waf client to latest version
* api-change:``pinpoint-email``: [``botocore``] Update pinpoint-email client to latest version
* api-change:``robomaker``: [``botocore``] Update robomaker client to latest version
* api-change:``sts``: [``botocore``] Update sts client to latest version
* api-change:``storagegateway``: [``botocore``] Update storagegateway client to latest version
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/boto3
  - Changelog: https://pyup.io/changelogs/boto3/
  - Repo: https://github.com/boto/boto3
</details>





### Update [Django](https://pypi.org/project/Django) from **2.1.8** to **2.1.9**.


<details>
  <summary>Changelog</summary>
  
  
   ### 2.1.9
   ```
   ============================

*June 3, 2019*

Django 2.1.9 fixes security issues in 2.1.8.

CVE-2019-12308: AdminURLFieldWidget XSS
---------------------------------------

The clickable &quot;Current URL&quot; link generated by ``AdminURLFieldWidget`` displayed
the provided value without validating it as a safe URL. Thus, an unvalidated
value stored in the database, or a value provided as a URL query parameter
payload, could result in an clickable JavaScript link.

``AdminURLFieldWidget`` now validates the provided value using
:class:`~django.core.validators.URLValidator` before displaying the clickable
link. You may customise the validator by passing a ``validator_class`` kwarg to
``AdminURLFieldWidget.__init__()``, e.g. when using
:attr:`~django.contrib.admin.ModelAdmin.formfield_overrides`.

Patched bundled jQuery for CVE-2019-11358: Prototype pollution
--------------------------------------------------------------

jQuery before 3.4.0, mishandles ``jQuery.extend(true, {}, ...)`` because of
``Object.prototype`` pollution. If an unsanitized source object contained an
enumerable ``__proto__`` property, it could extend the native
``Object.prototype``.

The bundled version of jQuery used by the Django admin has been patched to
allow for the ``select2`` library&#39;s use of ``jQuery.extend()``.


==========================
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/django
  - Changelog: https://pyup.io/changelogs/django/
  - Homepage: https://www.djangoproject.com/
</details>





### Update [django-cors-headers](https://pypi.org/project/django-cors-headers) from **3.0.1** to **3.0.2**.


*The bot wasn't able to find a changelog for this release. [Got an idea?](https://github.com/pyupio/changelogs/issues/new)*

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/django-cors-headers
  - Changelog: https://pyup.io/changelogs/django-cors-headers/
  - Repo: https://github.com/ottoyiu/django-cors-headers
</details>





### Update [django-mozilla-product-details](https://pypi.org/project/django-mozilla-product-details) from **0.13.1** to **0.14.1**.


*The bot wasn't able to find a changelog for this release. [Got an idea?](https://github.com/pyupio/changelogs/issues/new)*

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/django-mozilla-product-details
  - Repo: https://github.com/mozilla/django-product-details/
</details>





### Update [pytest](https://pypi.org/project/pytest) from **4.5.0** to **4.6.1**.


<details>
  <summary>Changelog</summary>
  
  
   ### 4.6.0
   ```
   =========================

Important
---------

The ``4.6.X`` series will be the last series to support **Python 2 and Python 3.4**.

For more details, see our `Python 2.7 and 3.4 support plan &lt;https://docs.pytest.org/en/latest/py27-py34-deprecation.html&gt;`__.


Features
--------

- `4559 &lt;https://github.com/pytest-dev/pytest/issues/4559&gt;`_: Added the ``junit_log_passing_tests`` ini value which can be used to enable or disable logging of passing test output in the Junit XML file.


- `4956 &lt;https://github.com/pytest-dev/pytest/issues/4956&gt;`_: pytester&#39;s ``testdir.spawn`` uses ``tmpdir`` as HOME/USERPROFILE directory.


- `5062 &lt;https://github.com/pytest-dev/pytest/issues/5062&gt;`_: Unroll calls to ``all`` to full for-loops with assertion rewriting for better failure messages, especially when using Generator Expressions.


- `5063 &lt;https://github.com/pytest-dev/pytest/issues/5063&gt;`_: Switch from ``pkg_resources`` to ``importlib-metadata`` for entrypoint detection for improved performance and import time.


- `5091 &lt;https://github.com/pytest-dev/pytest/issues/5091&gt;`_: The output for ini options in ``--help`` has been improved.


- `5269 &lt;https://github.com/pytest-dev/pytest/issues/5269&gt;`_: ``pytest.importorskip`` includes the ``ImportError`` now in the default ``reason``.


- `5311 &lt;https://github.com/pytest-dev/pytest/issues/5311&gt;`_: Captured logs that are output for each failing test are formatted using the
  ColoredLevelFormatter.


- `5312 &lt;https://github.com/pytest-dev/pytest/issues/5312&gt;`_: Improved formatting of multiline log messages in Python 3.



Bug Fixes
---------

- `2064 &lt;https://github.com/pytest-dev/pytest/issues/2064&gt;`_: The debugging plugin imports the wrapped ``Pdb`` class (``--pdbcls``) on-demand now.


- `4908 &lt;https://github.com/pytest-dev/pytest/issues/4908&gt;`_: The ``pytest_enter_pdb`` hook gets called with post-mortem (``--pdb``).


- `5036 &lt;https://github.com/pytest-dev/pytest/issues/5036&gt;`_: Fix issue where fixtures dependent on other parametrized fixtures would be erroneously parametrized.


- `5256 &lt;https://github.com/pytest-dev/pytest/issues/5256&gt;`_: Handle internal error due to a lone surrogate unicode character not being representable in Jython.


- `5257 &lt;https://github.com/pytest-dev/pytest/issues/5257&gt;`_: Ensure that ``sys.stdout.mode`` does not include ``&#39;b&#39;`` as it is a text stream.


- `5278 &lt;https://github.com/pytest-dev/pytest/issues/5278&gt;`_: Pytest&#39;s internal python plugin can be disabled using ``-p no:python`` again.


- `5286 &lt;https://github.com/pytest-dev/pytest/issues/5286&gt;`_: Fix issue with ``disable_test_id_escaping_and_forfeit_all_rights_to_community_support`` option not working when using a list of test IDs in parametrized tests.


- `5330 &lt;https://github.com/pytest-dev/pytest/issues/5330&gt;`_: Show the test module being collected when emitting ``PytestCollectionWarning`` messages for
  test classes with ``__init__`` and ``__new__`` methods to make it easier to pin down the problem.


- `5333 &lt;https://github.com/pytest-dev/pytest/issues/5333&gt;`_: Fix regression in 4.5.0 with ``--lf`` not re-running all tests with known failures from non-selected tests.



Improved Documentation
----------------------

- `5250 &lt;https://github.com/pytest-dev/pytest/issues/5250&gt;`_: Expand docs on use of ``setenv`` and ``delenv`` with ``monkeypatch``.
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/pytest
  - Changelog: https://pyup.io/changelogs/pytest/
  - Homepage: https://docs.pytest.org/en/latest/
</details>





### Update [pytest-django](https://pypi.org/project/pytest-django) from **3.4.8** to **3.5.0**.


<details>
  <summary>Changelog</summary>
  
  
   ### 3.5.0
   ```
   ------------------

Features
^^^^^^^^

* Run tests in the same order as Django (223)

* Use verbosity=0 with disabled migrations (729, 730)

Bugfixes
^^^^^^^^

* django_db_setup: warn instead of crash with teardown errors (726)

Misc
^^^^
* tests: fix test_sqlite_database_renamed (739, 741)

* tests/conftest.py: move import of db_helpers (737)

* Cleanup/improve coverage, mainly with tests (706)

* Slightly revisit unittest handling (740)
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/pytest-django
  - Changelog: https://pyup.io/changelogs/pytest-django/
  - Docs: https://pytest-django.readthedocs.io/
</details>





### Update [Sphinx](https://pypi.org/project/Sphinx) from **2.0.1** to **2.1.0**.


<details>
  <summary>Changelog</summary>
  
  
   ### 2.1.0
   ```
   =====================================

Incompatible changes
--------------------

* Ignore filenames without file extension given to ``Builder.build_specific()``
  API directly
* 6230: The anchor of term in glossary directive is changed if it is consisted
  by non-ASCII characters
* 4550: html: Centering tables by default using CSS
* 6239: latex: xelatex and xeCJK are used for Chinese documents by default
* ``Sphinx.add_lexer()`` now takes a Lexer class instead of instance.  An
  instance of lexers are still supported until Sphinx-3.x.

Deprecated
----------

* ``sphinx.builders.latex.LaTeXBuilder.apply_transforms()``
* ``sphinx.builders._epub_base.EpubBuilder.esc()``
* ``sphinx.directives.Acks``
* ``sphinx.directives.Author``
* ``sphinx.directives.Centered``
* ``sphinx.directives.Class``
* ``sphinx.directives.CodeBlock``
* ``sphinx.directives.Figure``
* ``sphinx.directives.HList``
* ``sphinx.directives.Highlight``
* ``sphinx.directives.Include``
* ``sphinx.directives.Index``
* ``sphinx.directives.LiteralInclude``
* ``sphinx.directives.Meta``
* ``sphinx.directives.Only``
* ``sphinx.directives.SeeAlso``
* ``sphinx.directives.TabularColumns``
* ``sphinx.directives.TocTree``
* ``sphinx.directives.VersionChange``
* ``sphinx.domains.python.PyClassmember``
* ``sphinx.domains.python.PyModulelevel``
* ``sphinx.domains.std.StandardDomain._resolve_citation_xref()``
* ``sphinx.domains.std.StandardDomain.note_citations()``
* ``sphinx.domains.std.StandardDomain.note_citation_refs()``
* ``sphinx.domains.std.StandardDomain.note_labels()``
* ``sphinx.environment.NoUri``
* ``sphinx.ext.apidoc.format_directive()``
* ``sphinx.ext.apidoc.format_heading()``
* ``sphinx.ext.apidoc.makename()``
* ``sphinx.ext.autodoc.importer.MockFinder``
* ``sphinx.ext.autodoc.importer.MockLoader``
* ``sphinx.ext.autodoc.importer.mock()``
* ``sphinx.ext.autosummary.autolink_role()``
* ``sphinx.ext.imgmath.DOC_BODY``
* ``sphinx.ext.imgmath.DOC_BODY_PREVIEW``
* ``sphinx.ext.imgmath.DOC_HEAD``
* ``sphinx.transforms.CitationReferences``
* ``sphinx.transforms.SmartQuotesSkipper``
* ``sphinx.util.docfields.DocFieldTransformer.preprocess_fieldtypes()``
* ``sphinx.util.node.find_source_node()``
* ``sphinx.util.i18n.find_catalog()``
* ``sphinx.util.i18n.find_catalog_files()``
* ``sphinx.util.i18n.find_catalog_source_files()``

For more details, see :ref:`deprecation APIs list &lt;dev-deprecated-apis&gt;`.

Features added
--------------

* Add a helper class ``sphinx.transforms.post_transforms.SphinxPostTransform``
* Add helper methods

  - ``PythonDomain.note_module()``
  - ``PythonDomain.note_object()``
  - ``SphinxDirective.set_source_info()``

* 6180: Support ``--keep-going`` with BuildDoc setup command
* ``math`` directive now supports ``:class:`` option
* 6310: imgmath: let :confval:`imgmath_use_preview` work also with the SVG
  format for images rendering inline math
* todo: ``todo`` directive now supports ``:name:`` option
* Enable override via environment of ``SPHINXOPTS`` and ``SPHINXBUILD`` Makefile
  variables (refs: 6232, 6303)
* 6287: autodoc: Unable to document bound instance methods exported as module
  functions
* 6289: autodoc: :confval:`autodoc_default_options` now supports
  ``imported-members`` option
* 4777: autodoc: Support coroutine
* 744: autodoc: Support abstractmethod
* 6325: autodoc: Support attributes in __slots__.  For dict-style __slots__,
  autodoc considers values as a docstring of the attribute
* 6361: autodoc: Add :confval:`autodoc_typehints` to suppress typehints from
  signature
* 1063: autodoc: ``automodule`` directive now handles undocumented module level
  variables
* 6212 autosummary: Add :confval:`autosummary_imported_members` to display
  imported members on autosummary
* 6271: ``make clean`` is catastrophically broken if building into &#39;.&#39;
* 6363: Support ``%O%`` environment variable in make.bat
* 4777: py domain: Add ``:async:`` option to :rst:dir:`py:function` directive
* py domain: Add new options to :rst:dir:`py:method` directive

  - ``:abstractmethod:``
  - ``:async:``
  - ``:classmethod:``
  - ``:property:``
  - ``:staticmethod:``

* rst domain: Add :rst:dir:`directive:option` directive to describe the option
  for directive
* 6306: html: Add a label to search form for accessability purposes
* 4390: html: Consistent and semantic CSS for signatures
* 6358: The ``rawsource`` property of ``production`` nodes now contains the
  full production rule
* 6373: autosectionlabel: Allow suppression of warnings
* coverage: Support a new ``coverage_ignore_pyobjects`` option
* 6239: latex: Support to build Chinese documents

Bugs fixed
----------

* 6230: Inappropriate node_id has been generated by glossary directive if term
  is consisted by non-ASCII characters
* 6213: ifconfig: contents after headings are not shown
* commented term in glossary directive is wrongly recognized
* 6299: rst domain: rst:directive directive generates waste space
* 6379: py domain: Module index (py-modindex.html) has duplicate titles
* 6331: man: invalid output when doctest follows rubric
* 6351: &quot;Hyperlink target is not referenced&quot; message is shown even if
  referenced
* 6165: autodoc: ``tab_width`` setting of docutils has been ignored
* 6347: autodoc: crashes with a plain Tuple on Python 3.6 and 3.5
* 6311: autosummary: autosummary table gets confused by complex type hints
* 6350: autosummary: confused by an argument having some kind of default value
* Generated Makefiles lack a final EOL (refs: 6232)
* 6375: extlinks: Cannot escape angle brackets in link caption
* 6378: linkcheck: Send commonly used User-Agent
* 6387: html search: failed to search document with haiku and scrolls themes
* 6408: html search: Fix the ranking of search results
* 6406: Wrong year is returned for ``SOURCE_DATE_EPOCH``
* 6402: image directive crashes by unknown image format
* 6286: C++, allow 8 and 9 in hexadecimal integer literals.
* 6305: Fix the string in quickstart for &#39;path&#39; argument of parser
* LaTeX: Figures in admonitions produced errors (refs: 6364)
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/sphinx
  - Changelog: https://pyup.io/changelogs/sphinx/
  - Homepage: http://sphinx-doc.org/
</details>







Co-authored-by: pyup-bot <github-bot@pyup.io>
Co-authored-by: Mike Cooper <mythmon@gmail.com>
@Lothiraldan

This comment has been minimized.

Copy link
Contributor

commented Jun 4, 2019

If you got broken test because you try to check if a multi-line log message is present in the capture log using assert msg in caplog.text, see iterative/dvc#2082 workaround, TLDR use caplog.messages instead of caplog.text

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.