[Flask] Add packaging support

This commit is contained in:
cbornet
2016-11-23 18:40:02 +01:00
parent 5f372ef15e
commit bcc7e69fcc
76 changed files with 788 additions and 222 deletions

View File

@@ -0,0 +1,64 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
.hypothesis/
venv/
.python-version
# Translations
*.mo
*.pot
# Django stuff:
*.log
# Sphinx documentation
docs/_build/
# PyBuilder
target/
#Ipython Notebook
.ipynb_checkpoints

View File

@@ -0,0 +1,14 @@
# ref: https://docs.travis-ci.com/user/languages/python
language: python
python:
- "2.7"
- "3.2"
- "3.3"
- "3.4"
- "3.5"
#- "3.5-dev" # 3.5 development branch
#- "nightly" # points to the latest development branch e.g. 3.6-dev
# command to install dependencies
install: "pip install -r requirements.txt"
# command to run tests
script: nosetests

View File

@@ -7,11 +7,11 @@ is an example of building a swagger-enabled Flask server.
This example uses the [Connexion](https://github.com/zalando/connexion) library on top of Flask.
To run the server, please execute the following:
To run the server, please execute the following from the root directory:
```
sudo pip install -U connexion flask_testing typing # install Connexion from PyPI
python app.py
pip install -r requirements.txt
python -m swagger_server
```
and open your browser to here:
@@ -26,3 +26,8 @@ Your Swagger definition lives here:
http://localhost:8080/v2/swagger.json
```
To launch the integration tests, use tox:
```
sudo pip install tox
tox
```

View File

@@ -1,29 +0,0 @@
#!/usr/bin/env python
import connexion
from connexion.decorators import produces
from six import iteritems
from models.base_model_ import Model
class JSONEncoder(produces.JSONEncoder):
include_nulls = False
def default(self, o):
if isinstance(o, Model):
dikt = {}
for attr, _ in iteritems(o.swagger_types):
value = getattr(o, attr)
if value is None and not self.include_nulls:
continue
attr = o.attribute_map[attr]
dikt[attr] = value
return dikt
return produces.JSONEncoder.default(self, o)
if __name__ == '__main__':
app = connexion.App(__name__, specification_dir='./swagger/')
app.app.json_encoder = JSONEncoder
app.add_api('swagger.yaml', arguments={'title': 'This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.'})
app.run(port=8080)

View File

@@ -0,0 +1,52 @@
#!/bin/sh
# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
#
# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update"
git_user_id=$1
git_repo_id=$2
release_note=$3
if [ "$git_user_id" = "" ]; then
git_user_id="GIT_USER_ID"
echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
fi
if [ "$git_repo_id" = "" ]; then
git_repo_id="GIT_REPO_ID"
echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
fi
if [ "$release_note" = "" ]; then
release_note="Minor update"
echo "[INFO] No command line input provided. Set \$release_note to $release_note"
fi
# Initialize the local directory as a Git repository
git init
# Adds the files in the local repository and stages them for commit.
git add .
# Commits the tracked changes and prepares them to be pushed to a remote repository.
git commit -m "$release_note"
# Sets the new remote
git_remote=`git remote`
if [ "$git_remote" = "" ]; then # git remote not defined
if [ "$GIT_TOKEN" = "" ]; then
echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git crediential in your environment."
git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git
else
git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git
fi
fi
git pull origin master
# Pushes (Forces) the changes in the local repository up to the remote repository
echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git"
git push origin master 2>&1 | grep -v 'To https'

View File

@@ -0,0 +1,4 @@
connexion == 1.0.129
python_dateutil == 2.6.0
typing == 3.5.2.2
setuptools >= 21.0.0

View File

@@ -0,0 +1,33 @@
# coding: utf-8
import sys
from setuptools import setup, find_packages
NAME = "swagger_server"
VERSION = "1.0.0"
# To install the library, run the following
#
# python setup.py install
#
# prerequisite: setuptools
# http://pypi.python.org/pypi/setuptools
REQUIRES = ["connexion"]
setup(
name=NAME,
version=VERSION,
description="Swagger Petstore",
author_email="apiteam@swagger.io",
url="",
keywords=["Swagger", "Swagger Petstore"],
install_requires=REQUIRES,
packages=find_packages(),
package_data={'': ['swagger/swagger.yaml']},
include_package_data=True,
long_description="""\
This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.
"""
)

View File

@@ -0,0 +1,11 @@
#!/usr/bin/env python
import connexion
from .encoder import JSONEncoder
if __name__ == '__main__':
app = connexion.App(__name__, specification_dir='./swagger/')
app.app.json_encoder = JSONEncoder
app.add_api('swagger.yaml', arguments={'title': 'This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.'})
app.run(port=8080)

View File

@@ -1,10 +1,10 @@
import connexion
from models.api_response import ApiResponse
from models.pet import Pet
from swagger_server.models.api_response import ApiResponse
from swagger_server.models.pet import Pet
from datetime import date, datetime
from typing import List, Dict
from six import iteritems
from util import deserialize_date, deserialize_datetime
from ..util import deserialize_date, deserialize_datetime
def add_pet(body):

View File

@@ -1,9 +1,9 @@
import connexion
from models.order import Order
from swagger_server.models.order import Order
from datetime import date, datetime
from typing import List, Dict
from six import iteritems
from util import deserialize_date, deserialize_datetime
from ..util import deserialize_date, deserialize_datetime
def delete_order(orderId):

View File

@@ -1,9 +1,9 @@
import connexion
from models.user import User
from swagger_server.models.user import User
from datetime import date, datetime
from typing import List, Dict
from six import iteritems
from util import deserialize_date, deserialize_datetime
from ..util import deserialize_date, deserialize_datetime
def create_user(body):

View File

@@ -0,0 +1,19 @@
from connexion.decorators import produces
from six import iteritems
from swagger_server.models.base_model_ import Model
class JSONEncoder(produces.JSONEncoder):
include_nulls = False
def default(self, o):
if isinstance(o, Model):
dikt = {}
for attr, _ in iteritems(o.swagger_types):
value = getattr(o, attr)
if value is None and not self.include_nulls:
continue
attr = o.attribute_map[attr]
dikt[attr] = value
return dikt
return produces.JSONEncoder.default(self, o)

View File

@@ -4,7 +4,7 @@ from __future__ import absolute_import
from .base_model_ import Model
from datetime import date, datetime
from typing import List, Dict
from util import deserialize_model
from ..util import deserialize_model
class ApiResponse(Model):

View File

@@ -1,6 +1,6 @@
from pprint import pformat
from six import iteritems
from util import deserialize_model
from ..util import deserialize_model
class Model(object):

View File

@@ -4,7 +4,7 @@ from __future__ import absolute_import
from .base_model_ import Model
from datetime import date, datetime
from typing import List, Dict
from util import deserialize_model
from ..util import deserialize_model
class Category(Model):

View File

@@ -4,7 +4,7 @@ from __future__ import absolute_import
from .base_model_ import Model
from datetime import date, datetime
from typing import List, Dict
from util import deserialize_model
from ..util import deserialize_model
class Order(Model):

View File

@@ -1,12 +1,12 @@
# coding: utf-8
from __future__ import absolute_import
from models.category import Category
from models.tag import Tag
from swagger_server.models.category import Category
from swagger_server.models.tag import Tag
from .base_model_ import Model
from datetime import date, datetime
from typing import List, Dict
from util import deserialize_model
from ..util import deserialize_model
class Pet(Model):

View File

@@ -4,7 +4,7 @@ from __future__ import absolute_import
from .base_model_ import Model
from datetime import date, datetime
from typing import List, Dict
from util import deserialize_model
from ..util import deserialize_model
class Tag(Model):

View File

@@ -4,7 +4,7 @@ from __future__ import absolute_import
from .base_model_ import Model
from datetime import date, datetime
from typing import List, Dict
from util import deserialize_model
from ..util import deserialize_model
class User(Model):

View File

@@ -58,7 +58,7 @@ paths:
- petstore_auth:
- "write:pets"
- "read:pets"
x-swagger-router-controller: "controllers.pet_controller"
x-swagger-router-controller: "swagger_server.controllers.pet_controller"
put:
tags:
- "pet"
@@ -89,7 +89,7 @@ paths:
- petstore_auth:
- "write:pets"
- "read:pets"
x-swagger-router-controller: "controllers.pet_controller"
x-swagger-router-controller: "swagger_server.controllers.pet_controller"
/pet/findByStatus:
get:
tags:
@@ -127,7 +127,7 @@ paths:
- petstore_auth:
- "write:pets"
- "read:pets"
x-swagger-router-controller: "controllers.pet_controller"
x-swagger-router-controller: "swagger_server.controllers.pet_controller"
/pet/findByTags:
get:
tags:
@@ -161,7 +161,7 @@ paths:
- petstore_auth:
- "write:pets"
- "read:pets"
x-swagger-router-controller: "controllers.pet_controller"
x-swagger-router-controller: "swagger_server.controllers.pet_controller"
/pet/{petId}:
get:
tags:
@@ -190,7 +190,7 @@ paths:
description: "Pet not found"
security:
- api_key: []
x-swagger-router-controller: "controllers.pet_controller"
x-swagger-router-controller: "swagger_server.controllers.pet_controller"
post:
tags:
- "pet"
@@ -226,7 +226,7 @@ paths:
- petstore_auth:
- "write:pets"
- "read:pets"
x-swagger-router-controller: "controllers.pet_controller"
x-swagger-router-controller: "swagger_server.controllers.pet_controller"
delete:
tags:
- "pet"
@@ -254,7 +254,7 @@ paths:
- petstore_auth:
- "write:pets"
- "read:pets"
x-swagger-router-controller: "controllers.pet_controller"
x-swagger-router-controller: "swagger_server.controllers.pet_controller"
/pet/{petId}/uploadImage:
post:
tags:
@@ -292,7 +292,7 @@ paths:
- petstore_auth:
- "write:pets"
- "read:pets"
x-swagger-router-controller: "controllers.pet_controller"
x-swagger-router-controller: "swagger_server.controllers.pet_controller"
/store/inventory:
get:
tags:
@@ -313,7 +313,7 @@ paths:
format: "int32"
security:
- api_key: []
x-swagger-router-controller: "controllers.store_controller"
x-swagger-router-controller: "swagger_server.controllers.store_controller"
/store/order:
post:
tags:
@@ -338,7 +338,7 @@ paths:
$ref: "#/definitions/Order"
400:
description: "Invalid Order"
x-swagger-router-controller: "controllers.store_controller"
x-swagger-router-controller: "swagger_server.controllers.store_controller"
/store/order/{orderId}:
get:
tags:
@@ -368,7 +368,7 @@ paths:
description: "Invalid ID supplied"
404:
description: "Order not found"
x-swagger-router-controller: "controllers.store_controller"
x-swagger-router-controller: "swagger_server.controllers.store_controller"
delete:
tags:
- "store"
@@ -391,7 +391,7 @@ paths:
description: "Invalid ID supplied"
404:
description: "Order not found"
x-swagger-router-controller: "controllers.store_controller"
x-swagger-router-controller: "swagger_server.controllers.store_controller"
/user:
post:
tags:
@@ -412,7 +412,7 @@ paths:
responses:
default:
description: "successful operation"
x-swagger-router-controller: "controllers.user_controller"
x-swagger-router-controller: "swagger_server.controllers.user_controller"
/user/createWithArray:
post:
tags:
@@ -435,7 +435,7 @@ paths:
responses:
default:
description: "successful operation"
x-swagger-router-controller: "controllers.user_controller"
x-swagger-router-controller: "swagger_server.controllers.user_controller"
/user/createWithList:
post:
tags:
@@ -458,7 +458,7 @@ paths:
responses:
default:
description: "successful operation"
x-swagger-router-controller: "controllers.user_controller"
x-swagger-router-controller: "swagger_server.controllers.user_controller"
/user/login:
get:
tags:
@@ -496,7 +496,7 @@ paths:
description: "date in UTC when toekn expires"
400:
description: "Invalid username/password supplied"
x-swagger-router-controller: "controllers.user_controller"
x-swagger-router-controller: "swagger_server.controllers.user_controller"
/user/logout:
get:
tags:
@@ -511,7 +511,7 @@ paths:
responses:
default:
description: "successful operation"
x-swagger-router-controller: "controllers.user_controller"
x-swagger-router-controller: "swagger_server.controllers.user_controller"
/user/{username}:
get:
tags:
@@ -537,7 +537,7 @@ paths:
description: "Invalid username supplied"
404:
description: "User not found"
x-swagger-router-controller: "controllers.user_controller"
x-swagger-router-controller: "swagger_server.controllers.user_controller"
put:
tags:
- "user"
@@ -564,7 +564,7 @@ paths:
description: "Invalid user supplied"
404:
description: "User not found"
x-swagger-router-controller: "controllers.user_controller"
x-swagger-router-controller: "swagger_server.controllers.user_controller"
delete:
tags:
- "user"
@@ -585,7 +585,7 @@ paths:
description: "Invalid username supplied"
404:
description: "User not found"
x-swagger-router-controller: "controllers.user_controller"
x-swagger-router-controller: "swagger_server.controllers.user_controller"
securityDefinitions:
petstore_auth:
type: "oauth2"

View File

@@ -1,5 +1,5 @@
from flask_testing import TestCase
from app import JSONEncoder
from ..encoder import JSONEncoder
import connexion
import logging

View File

@@ -2,8 +2,8 @@
from __future__ import absolute_import
from models.api_response import ApiResponse
from models.pet import Pet
from swagger_server.models.api_response import ApiResponse
from swagger_server.models.pet import Pet
from . import BaseTestCase
from six import BytesIO
from flask import json

View File

@@ -2,7 +2,7 @@
from __future__ import absolute_import
from models.order import Order
from swagger_server.models.order import Order
from . import BaseTestCase
from six import BytesIO
from flask import json

View File

@@ -2,7 +2,7 @@
from __future__ import absolute_import
from models.user import User
from swagger_server.models.user import User
from . import BaseTestCase
from six import BytesIO
from flask import json

View File

@@ -0,0 +1,6 @@
flask_testing==0.6.1
coverage>=4.0.3
nose>=1.3.7
pluggy>=0.3.1
py>=1.4.31
randomize>=0.13

View File

@@ -0,0 +1,10 @@
[tox]
envlist = py27, py35
[testenv]
deps=-r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
commands=
nosetests \
[]