Skip to content

Commit

Permalink
Flask required only if necessary (#424)
Browse files Browse the repository at this point in the history
* Example with Flask support

* Only show import error when trying to use Flask

* Re-organize imports

* Move flask_utils next to related module

* Code style

* Change back to incentivizes

* Includes Flask by default

* Project clean up

* Update Rafael Caricio's e-mail address

* Fix conflicts
  • Loading branch information
rafaelcaricio authored and hjacobs committed Apr 4, 2017
1 parent 6f567ee commit 1858c9d
Show file tree
Hide file tree
Showing 28 changed files with 46 additions and 67 deletions.
10 changes: 0 additions & 10 deletions .turnstile.yml

This file was deleted.

2 changes: 1 addition & 1 deletion MAINTAINERS
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
João Santos <joao.santos@zalando.de>
Henning Jacobs <henning.jacobs@zalando.de>
Rafael Caricio <rafael.caricio@zalando.de>
Rafael Caricio <rafael@caricio.com>
4 changes: 2 additions & 2 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ Connexion is a framework on top of Flask_ that automagically handles
HTTP requests based on `OpenAPI 2.0 Specification`_ (formerly known as
Swagger Spec) of your API described in `YAML format`_. Connexion
allows you to write a Swagger specification, then maps the
endpoints to your Python functions; this makes it unique, as many tools generate the specification based on your Python
endpoints to your Python functions; this makes it unique, as many
tools generate the specification based on your Python
code. You can describe your REST API in as much detail as
you want; then Connexion guarantees that it will work as
you specified.
Expand Down Expand Up @@ -93,7 +94,6 @@ In your command line, type:
$ pip install connexion
Running It
----------

Expand Down
18 changes: 16 additions & 2 deletions connexion/__init__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,25 @@
import werkzeug.exceptions as exceptions # NOQA
from .apps import AbstractApp, FlaskApp # NOQA
from .apis import AbstractAPI, FlaskApi # NOQA
from .apps import AbstractApp # NOQA
from .apis import AbstractAPI # NOQA
from .exceptions import ProblemException # NOQA
from .problem import problem # NOQA
from .decorators.produces import NoContent # NOQA
from .resolver import Resolution, Resolver, RestyResolver # NOQA

try:
from .apis.flask_api import FlaskApi
from .apps.flask_app import FlaskApp
except ImportError as e: # pragma: no cover
import sys
import six
import functools

def _required_lib(exec_info, *args, **kwargs):
six.reraise(*exec_info)

FlaskApi = functools.partial(_required_lib, sys.exc_info())
FlaskApp = functools.partial(_required_lib, sys.exc_info())

App = FlaskApp
Api = FlaskApi

Expand Down
5 changes: 1 addition & 4 deletions connexion/apis/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
from .abstract import AbstractAPI
from .flask_api import FlaskApi

__all__ = ['AbstractAPI', 'FlaskApi']
from .abstract import AbstractAPI # NOQA
3 changes: 1 addition & 2 deletions connexion/apis/abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
import pathlib
import sys

import jinja2
import six

import yaml
from swagger_spec_validator.validator20 import validate_spec

import jinja2
from ..exceptions import ResolverError
from ..operation import Operation
from ..resolver import Resolver
Expand Down
6 changes: 3 additions & 3 deletions connexion/apis/flask_api.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import logging

import six

import flask
import six
import werkzeug.exceptions
from connexion import flask_utils

from connexion.apis import flask_utils
from connexion.apis.abstract import AbstractAPI
from connexion.decorators.produces import BaseSerializer, NoContent
from connexion.handlers import AuthErrorHandler
Expand Down
1 change: 0 additions & 1 deletion connexion/flask_utils.py → connexion/apis/flask_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import re
import string


import flask
import werkzeug.wrappers

Expand Down
5 changes: 1 addition & 4 deletions connexion/apps/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
from .abstract import AbstractApp
from .flask_app import FlaskApp

__all__ = ['AbstractApp', 'FlaskApp']
from .abstract import AbstractApp # NOQA
1 change: 1 addition & 0 deletions connexion/apps/abstract.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import abc
import logging
import pathlib

import six

from ..resolver import Resolver
Expand Down
1 change: 0 additions & 1 deletion connexion/apps/flask_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
from ..resolver import Resolver
from .abstract import AbstractApp


logger = logging.getLogger('connexion.app')


Expand Down
1 change: 0 additions & 1 deletion connexion/request.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from collections import namedtuple


_ConnexionRequest = namedtuple('SwaggerRequest', [
'url', 'method', 'path_params', 'query', 'headers',
'form', 'body', 'json', 'files', 'context'
Expand Down
1 change: 0 additions & 1 deletion connexion/response.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from collections import namedtuple


_ConnexionResponse = namedtuple('SwaggerRequest', [
'mimetype', 'content_type', 'status_code', 'body', 'headers'
])
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ def readme():
keywords='openapi oai swagger rest api oauth flask microservice framework',
license='Apache License Version 2.0',
setup_requires=['flake8'],
install_requires=install_requires,
install_requires=install_requires + [flask_require],
tests_require=tests_require,
extras_require={'tests': tests_require, 'flask': flask_require},
cmdclass={'test': PyTest},
Expand Down
6 changes: 2 additions & 4 deletions tests/api/test_bootstrap.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import jinja2
import yaml

import jinja2
import pytest
from conftest import TEST_FOLDER, build_app_from_fixture
from connexion.apis import FlaskApi
from connexion.apps import FlaskApp
from connexion import FlaskApp
from connexion.exceptions import InvalidSpecification


Expand All @@ -22,7 +21,6 @@ def test_app_with_relative_path(simple_api_spec_dir):

def test_no_swagger_ui(simple_api_spec_dir):
app = FlaskApp(__name__, 5001, simple_api_spec_dir, swagger_ui=False, debug=True)
# app = FlaskApp(__name__, 5001, simple_api_spec_dir, debug=True)
app.add_api('swagger.yaml')

app_client = app.app.test_client()
Expand Down
1 change: 1 addition & 0 deletions tests/api/test_errors.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import json

import flask


Expand Down
1 change: 1 addition & 0 deletions tests/api/test_parameters.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import json
from io import BytesIO


def test_parameter_validation(simple_app):
app_client = simple_app.app.test_client()

Expand Down
3 changes: 1 addition & 2 deletions tests/api/test_secure_api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import json

from connexion.apis import FlaskApi
from connexion.apps import FlaskApp
from connexion import FlaskApp


def test_security_over_inexistent_endpoints(oauth_requests, secure_api_spec_dir):
Expand Down
3 changes: 1 addition & 2 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
import pathlib

import pytest
from connexion.apis import FlaskApi
from connexion.apps import FlaskApp
from connexion import FlaskApi, FlaskApp

logging.basicConfig(level=logging.DEBUG)

Expand Down
4 changes: 1 addition & 3 deletions tests/fakeapi/hello.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
#!/usr/bin/env python3

import json
from flask import jsonify, redirect

from connexion import NoContent, ProblemException, problem
from connexion.apis import FlaskApi
from flask import jsonify, redirect, request


class DummyClass(object):
Expand Down
3 changes: 1 addition & 2 deletions tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@
from yaml import YAMLError

import pytest
from connexion.apis import FlaskApi
from connexion import FlaskApi
from connexion.apis.abstract import canonical_base_url
from connexion.apis.flask_api import FlaskApi
from connexion.exceptions import InvalidSpecification, ResolverError

TEST_FOLDER = pathlib.Path(__file__).parent
Expand Down
1 change: 0 additions & 1 deletion tests/test_flask_encoder.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import datetime
import json
import math

from decimal import Decimal

from connexion.apps.flask_app import FlaskJSONEncoder
Expand Down
8 changes: 1 addition & 7 deletions tests/test_flask_utils.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
import math

import connexion.apps
import connexion.flask_utils as flask_utils
import connexion.utils as utils
import pytest
from mock import MagicMock
import connexion.apis.flask_utils as flask_utils


def test_flaskify_path():
Expand Down
4 changes: 2 additions & 2 deletions tests/test_metrics.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import json

import connexion
import flask
from connexion.apis import FlaskApi

import connexion
from connexion.decorators.metrics import UWSGIMetricsCollector
from mock import MagicMock

Expand Down
1 change: 0 additions & 1 deletion tests/test_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

import mock
import pytest

from connexion.apis.flask_api import Jsonifier
from connexion.decorators.security import security_passthrough, verify_oauth
from connexion.exceptions import InvalidSpecification
Expand Down
8 changes: 4 additions & 4 deletions tests/test_resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@


def test_standard_get_function():
function = Resolver().resolve_function_from_operation_id('connexion.apps.FlaskApp.common_error_handler')
assert function == connexion.apps.FlaskApp.common_error_handler
function = Resolver().resolve_function_from_operation_id('connexion.FlaskApp.common_error_handler')
assert function == connexion.FlaskApp.common_error_handler


def test_resty_get_function():
function = RestyResolver('connexion').resolve_function_from_operation_id('connexion.apps.FlaskApp.common_error_handler')
assert function == connexion.apps.FlaskApp.common_error_handler
function = RestyResolver('connexion').resolve_function_from_operation_id('connexion.FlaskApp.common_error_handler')
assert function == connexion.FlaskApp.common_error_handler


def test_missing_operation_id():
Expand Down
8 changes: 3 additions & 5 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import math

import connexion.apps
import connexion.flask_utils as flask_utils
import connexion.utils as utils
import pytest

from connexion import utils
from mock import MagicMock


Expand All @@ -28,8 +26,8 @@ def test_get_function_from_name_attr_error(monkeypatch):


def test_get_function_from_name_for_class_method():
function = utils.get_function_from_name('connexion.apps.FlaskApp.common_error_handler')
assert function == connexion.apps.FlaskApp.common_error_handler
function = utils.get_function_from_name('connexion.FlaskApp.common_error_handler')
assert function == connexion.FlaskApp.common_error_handler


def test_boolean():
Expand Down
2 changes: 1 addition & 1 deletion tests/test_validation.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import json

import flask

from connexion.apis.flask_api import FlaskApi
Expand All @@ -7,7 +8,6 @@
from mock import MagicMock



def test_parameter_validator(monkeypatch):
request = MagicMock(name='request')
request.args = {}
Expand Down

0 comments on commit 1858c9d

Please sign in to comment.