Skip to content

Commit

Permalink
Select renderer based on description_content_type (#3296)
Browse files Browse the repository at this point in the history
  • Loading branch information
di authored Mar 16, 2018
1 parent 155a25d commit 819f88c
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 24 deletions.
82 changes: 67 additions & 15 deletions tests/unit/test_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,9 @@ def test_camo_url():

class TestReadmeRender:

def test_can_render(self, monkeypatch):
monkeypatch.setattr(
readme_renderer.rst,
"render",
lambda raw: "rendered",
)
def test_can_render_rst(self, monkeypatch):
renderer = pretend.call_recorder(lambda raw: "rendered")
monkeypatch.setattr(readme_renderer.rst, "render", renderer)

ctx = {
"request": pretend.stub(
Expand All @@ -53,15 +50,18 @@ def test_can_render(self, monkeypatch):
),
}

result = filters.readme(ctx, "raw thing", format="rst")
result = filters.readme(
ctx, "raw thing", description_content_type="text/x-rst",
)

assert result == jinja2.Markup("rendered")
assert renderer.calls == [pretend.call('raw thing')]

def test_cant_render(self, monkeypatch):
monkeypatch.setattr(readme_renderer.rst, "render", lambda raw: None)
monkeypatch.setattr(
readme_renderer.txt, "render", lambda raw: "rendered<br>thing",
)
def test_cant_render_rst(self, monkeypatch):
rst_renderer = pretend.call_recorder(lambda raw: None)
txt_renderer = pretend.call_recorder(lambda raw: "rendered<br>thing")
monkeypatch.setattr(readme_renderer.rst, "render", rst_renderer)
monkeypatch.setattr(readme_renderer.txt, "render", txt_renderer)

ctx = {
"request": pretend.stub(
Expand All @@ -74,9 +74,57 @@ def test_cant_render(self, monkeypatch):
),
}

result = filters.readme(ctx, "raw thing", format="rst")
result = filters.readme(
ctx, "raw thing", description_content_type="text/x-rst",
)

assert result == jinja2.Markup("rendered<br>thing")
assert rst_renderer.calls == [pretend.call('raw thing')]
assert txt_renderer.calls == [pretend.call('raw thing')]

def test_can_render_plaintext(self, monkeypatch):
renderer = pretend.call_recorder(lambda raw: "rendered")
monkeypatch.setattr(readme_renderer.txt, "render", renderer)

ctx = {
"request": pretend.stub(
registry=pretend.stub(
settings={
"camo.url": "https://camo.example.net/",
"camo.key": "fake key",
},
),
),
}

result = filters.readme(
ctx, "raw thing", description_content_type="text/plain",
)

assert result == jinja2.Markup("rendered")
assert renderer.calls == [pretend.call('raw thing')]

def test_can_render_markdown(self, monkeypatch):
renderer = pretend.call_recorder(lambda raw: "rendered")
monkeypatch.setattr(readme_renderer.markdown, "render", renderer)

ctx = {
"request": pretend.stub(
registry=pretend.stub(
settings={
"camo.url": "https://camo.example.net/",
"camo.key": "fake key",
},
),
),
}

result = filters.readme(
ctx, "raw thing", description_content_type="text/markdown",
)

assert result == jinja2.Markup("rendered")
assert renderer.calls == [pretend.call('raw thing')]

def test_renders_camo(self, monkeypatch):
html = "<img src=http://example.com/image.jpg>"
Expand All @@ -98,7 +146,9 @@ def test_renders_camo(self, monkeypatch):
),
}

result = filters.readme(ctx, "raw thing", format="rst")
result = filters.readme(
ctx, "raw thing", description_content_type="text/x-rst",
)

assert result == jinja2.Markup(
'<img src="https://camo.example.net/image.jpg">'
Expand Down Expand Up @@ -131,7 +181,9 @@ def test_renders_camo_no_src(self, monkeypatch):
),
}

result = filters.readme(ctx, "raw thing", format="rst")
result = filters.readme(
ctx, "raw thing", description_content_type="text/x-rst",
)

assert result == jinja2.Markup("<img>")
assert gen_camo_url.calls == []
Expand Down
24 changes: 16 additions & 8 deletions warehouse/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
# limitations under the License.

import binascii
import cgi
import collections
import enum
import hmac
Expand All @@ -24,13 +25,21 @@
import jinja2

import packaging.version
import readme_renderer.markdown
import readme_renderer.rst
import readme_renderer.txt

from pyramid.threadlocal import get_current_request

from warehouse.utils.http import is_valid_uri

_renderers = {
'': readme_renderer.rst, # Default if description_content_type is None
'text/plain': readme_renderer.txt,
'text/x-rst': readme_renderer.rst,
'text/markdown': readme_renderer.markdown,
}


class PackageType(enum.Enum):
bdist_dmg = "OSX Disk Image"
Expand Down Expand Up @@ -63,23 +72,22 @@ def _camo_url(camo_url, camo_key, url):


@jinja2.contextfilter
def readme(ctx, value, *, format):
def readme(ctx, value, *, description_content_type):
request = ctx.get("request") or get_current_request()

camo_url = request.registry.settings["camo.url"].format(request=request)
camo_key = request.registry.settings["camo.key"]

# The format parameter is here so we can more easily expand this to cover
# READMEs which do not use restructuredtext, but for now rst is the only
# format we support.
assert format == "rst", "We currently only support rst rendering."
content_type, parameters = cgi.parse_header(description_content_type)

# Get the appropriate renderer
renderer = _renderers[content_type]

# Actually render the given value, this will not only render the value, but
# also ensure that it's had any disallowed markup removed.
rendered = readme_renderer.rst.render(value)
rendered = renderer.render(value, **parameters)

# If the content was not rendered, we'll replace the newlines with breaks
# so that it shows up nicer when rendered.
# If the content was not rendered, we'll render as plaintext instead
if rendered is None:
rendered = readme_renderer.txt.render(value)

Expand Down
2 changes: 1 addition & 1 deletion warehouse/templates/packaging/detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ <h3>Classifiers</h3>
<h2 class="page-title">Project Description</h2>
{% if release.description %}
<div class="project-description">
{{ release.description|readme(format="rst") }}
{{ release.description|readme(description_content_type=release.description_content_type) }}
</div>
{% else %}
<div class="callout-block">
Expand Down

0 comments on commit 819f88c

Please sign in to comment.