From 6299ad28b73ffc2440fbb855ab13ead17a473092 Mon Sep 17 00:00:00 2001 From: Jace Browning Date: Wed, 17 Jun 2015 00:55:02 -0400 Subject: [PATCH] Add template list, point to from root --- Makefile | 4 +- memegen/app.py | 4 +- memegen/domain/image.py | 2 +- memegen/routes/__init__.py | 5 ++- memegen/routes/{link.py => links.py} | 7 +-- memegen/routes/root.py | 16 +++++++ memegen/routes/templates.py | 28 ++++++++++++ tests/test_all.py | 67 +++++++++++++++++++--------- 8 files changed, 105 insertions(+), 28 deletions(-) rename memegen/routes/{link.py => links.py} (70%) create mode 100644 memegen/routes/root.py create mode 100644 memegen/routes/templates.py diff --git a/Makefile b/Makefile index e1200d49..d109449d 100644 --- a/Makefile +++ b/Makefile @@ -11,9 +11,9 @@ ifndef TRAVIS endif # Test settings -UNIT_TEST_COVERAGE := 53 +UNIT_TEST_COVERAGE := 64 INTEGRATION_TEST_COVERAGE := 75 -COMBINED_TEST_COVERAGE := 90 +COMBINED_TEST_COVERAGE := 96 # System paths PLATFORM := $(shell python -c 'import sys; print(sys.platform)') diff --git a/memegen/app.py b/memegen/app.py index 382a11f5..adabfd37 100644 --- a/memegen/app.py +++ b/memegen/app.py @@ -40,5 +40,7 @@ def register_services(app): def register_blueprints(app): - app.register_blueprint(routes.link.blueprint) + app.register_blueprint(routes.root.blueprint) + app.register_blueprint(routes.templates.blueprint) + app.register_blueprint(routes.links.blueprint) app.register_blueprint(routes.image.blueprint) diff --git a/memegen/domain/image.py b/memegen/domain/image.py index c7624b79..b1cdbad3 100644 --- a/memegen/domain/image.py +++ b/memegen/domain/image.py @@ -10,7 +10,7 @@ class Image: """Meme image generated from a template.""" # TODO: support more image types - KINDS = ('jpg',) # 'png', 'gif') + KINDS = ('JPG',) # 'PNG', 'GIF') @classmethod def from_template(cls, template, text, kind): diff --git a/memegen/routes/__init__.py b/memegen/routes/__init__.py index 2dec1c4a..61e5b7af 100644 --- a/memegen/routes/__init__.py +++ b/memegen/routes/__init__.py @@ -1 +1,4 @@ -from . import link, image +from . import root +from . import templates +from . import links +from . import image diff --git a/memegen/routes/link.py b/memegen/routes/links.py similarity index 70% rename from memegen/routes/link.py rename to memegen/routes/links.py index 6869fb7d..96753d1b 100644 --- a/memegen/routes/link.py +++ b/memegen/routes/links.py @@ -5,19 +5,20 @@ from ..domain import Image -blueprint = Blueprint('link', __name__, url_prefix="/") +blueprint = Blueprint('links', __name__, url_prefix="/") @blueprint.route("//") def get(**kwargs): + """Get links for generated images.""" data = OrderedDict() data['visible'] = OrderedDict() data['hidden'] = OrderedDict() for kind in Image.KINDS: - url = url_for('image.get', kind=kind, _external=True, **kwargs) + url = url_for('image.get', kind=kind.lower(), _external=True, **kwargs) data['visible'][kind] = url code = app.link_service.encode(**kwargs) - url = url_for('image.get_encoded', kind=kind, _external=True, code=code) + url = url_for('image.get_encoded', kind=kind.lower(), _external=True, code=code) data['hidden'][kind] = url return data diff --git a/memegen/routes/root.py b/memegen/routes/root.py new file mode 100644 index 00000000..9154a873 --- /dev/null +++ b/memegen/routes/root.py @@ -0,0 +1,16 @@ +from collections import OrderedDict + +from flask import Blueprint, current_app as app, url_for, redirect + +from ..domain import Image + + +blueprint = Blueprint('root', __name__, url_prefix="/") + + +@blueprint.route("") +def get(**kwargs): + """Generate memes from templates.""" + data = OrderedDict() + data['templates'] = url_for("templates.get", _external=True) + return data diff --git a/memegen/routes/templates.py b/memegen/routes/templates.py new file mode 100644 index 00000000..07053c62 --- /dev/null +++ b/memegen/routes/templates.py @@ -0,0 +1,28 @@ +from collections import OrderedDict + +from flask import Blueprint, current_app as app, request, url_for +from flask_api import exceptions + + +blueprint = Blueprint('templates', __name__, url_prefix="/templates/") + + +@blueprint.route("") +def get(): + """Get a list of all meme templates.""" + data = OrderedDict() + data['Insanity Wolf'] = url_for(".create", key='iw', _external=True) + return data + + +@blueprint.route("", methods=['GET', 'POST']) +def create(key): + """Generate a meme from a templates.""" + if request.method == 'GET': + return dict(sample=url_for("links.get", key=key, _external=True, + top="hello", bottom="world")) + elif request.method == 'POST': + # TODO: https://github.com/jacebrowning/memegen/issues/12 + raise exceptions.PermissionDenied("Feature not implemented.") + else: # pragma: no cover + assert None diff --git a/tests/test_all.py b/tests/test_all.py index f8811912..f3051809 100644 --- a/tests/test_all.py +++ b/tests/test_all.py @@ -1,6 +1,53 @@ from .conftest import load +class TestRoot: + + def test_get_root(self, client): + response = client.get("/") + assert response.status_code == 200 + assert dict( + templates="http://localhost/templates/", + ) == load(response) + + +class TestTemplates: + + def test_get_templates(self, client): + response = client.get("/templates/") + assert response.status_code == 200 + data = load(response) + assert len(data) > 0 # TODO: check for a minimum number of memes + assert "http://localhost/templates/iw" == data['Insanity Wolf'] + + def test_get_template(self, client): + response = client.get("/templates/iw") + assert response.status_code == 200 + assert dict( + sample="http://localhost/iw/hello/world", + ) == load(response) + + +class TestLink: + + def test_get_links(self, client): + response = client.get("/iw/hello/world") + assert response.status_code == 200 + assert dict( + visible=dict( + JPG="http://localhost/iw/hello/world.jpg", + ), + hidden=dict( + JPG="http://localhost/aXcJaGVsbG8Jd29ybGQJ.jpg", + ), + ) == load(response) + + def test_get_links_redirect_hidden(self, client): + response = client.get("/aXcJaGVsbG8Jd29ybGQJ") + assert response.status_code == 302 + assert '' in load(response, as_json=False) + + class TestMeme: def test_get_visible_jpg(self, client): @@ -29,23 +76,3 @@ def test_get_hidden_jpg(self, client): response = client.get("/aXcJaGVsbG8Jd29ybGQJ.jpg") assert response.status_code == 200 assert response.mimetype == 'image/jpeg' - - -class TestLink: - - def test_get_links(self, client): - response = client.get("/iw/hello/world") - assert response.status_code == 200 - assert dict( - visible=dict( - jpg="http://localhost/iw/hello/world.jpg", - ), - hidden=dict( - jpg="http://localhost/aXcJaGVsbG8Jd29ybGQJ.jpg", - ), - ) == load(response) - - def test_get_links_redirect_hidden(self, client): - response = client.get("/aXcJaGVsbG8Jd29ybGQJ") - assert response.status_code == 302 - assert '' in load(response, as_json=False)