From 1577cd187d1e6ef6e1b48f33ec7f35e19dbc1679 Mon Sep 17 00:00:00 2001 From: Jon Wayne Parrott Date: Tue, 20 Mar 2018 13:13:13 -0700 Subject: [PATCH] Warn about missing long description Additionally, add comprehensive tests for the disutils integration. Resolves #64 --- readme_renderer/integration/distutils.py | 11 ++++- tests/test_integration_distutils.py | 56 ++++++++++++++++++++++++ tox.ini | 1 + 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tests/test_integration_distutils.py diff --git a/readme_renderer/integration/distutils.py b/readme_renderer/integration/distutils.py index d1152bc..0a13fe2 100644 --- a/readme_renderer/integration/distutils.py +++ b/readme_renderer/integration/distutils.py @@ -26,6 +26,13 @@ def check_restructuredtext(self): Checks if the long string fields are reST-compliant. """ data = self.distribution.get_long_description() + + # None or empty string should both trigger this branch. + if not data or data == 'UNKNOWN': + self.warn( + "The project's long_description is either missing or empty.") + return + stream = io.StringIO() markup = render(data, stream=stream) @@ -35,4 +42,6 @@ def check_restructuredtext(self): self.warn(line) if markup is None: - self.warn("Invalid markup which will not be rendered on PyPI.") + self.warn( + "The project's long_description has invalid markup which will " + "not be rendered on PyPI.") diff --git a/tests/test_integration_distutils.py b/tests/test_integration_distutils.py new file mode 100644 index 0000000..8576b2a --- /dev/null +++ b/tests/test_integration_distutils.py @@ -0,0 +1,56 @@ +import distutils.dist + +import mock + +import readme_renderer.integration.distutils + + +def test_valid_rst(): + dist = distutils.dist.Distribution(attrs=dict( + long_description="Hello, I am some text.")) + checker = readme_renderer.integration.distutils.Check(dist) + checker.warn = mock.Mock() + + checker.check_restructuredtext() + + checker.warn.assert_not_called() + + +def test_invalid_rst(): + dist = distutils.dist.Distribution(attrs=dict( + long_description="Hello, I am some `totally borked< text.")) + checker = readme_renderer.integration.distutils.Check(dist) + checker.warn = mock.Mock() + + checker.check_restructuredtext() + + # Should warn once for the syntax error, and finally to warn that the + # overall syntax is invalid + checker.warn.call_count = 2 + message_one = checker.warn.call_args_list[0][0][0] + assert 'start-string without end-string' in message_one + message_two = checker.warn.call_args_list[1][0][0] + assert 'invalid markup' in message_two + + +def test_invalid_missing(): + dist = distutils.dist.Distribution(attrs=dict()) + checker = readme_renderer.integration.distutils.Check(dist) + checker.warn = mock.Mock() + + checker.check_restructuredtext() + + checker.warn.assert_called_once_with(mock.ANY) + assert 'missing' in checker.warn.call_args[0][0] + + +def test_invalid_empty(): + dist = distutils.dist.Distribution(attrs=dict( + long_description="")) + checker = readme_renderer.integration.distutils.Check(dist) + checker.warn = mock.Mock() + + checker.check_restructuredtext() + + checker.warn.assert_called_once_with(mock.ANY) + assert 'missing' in checker.warn.call_args[0][0] diff --git a/tox.ini b/tox.ini index a98369f..5ee1df4 100644 --- a/tox.ini +++ b/tox.ini @@ -5,6 +5,7 @@ envlist = py27,pypy,py34,py35,py36,pep8,py2pep8,packaging extras = gfm deps = pytest + mock commands = py.test --strict {posargs}