diff --git a/python-flask-server/.gitignore b/python-flask-server/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..a655050c2631466828b5b8bfc59ae27f9ac02dc5
--- /dev/null
+++ b/python-flask-server/.gitignore
@@ -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
diff --git a/python-flask-server/.swagger-codegen-ignore b/python-flask-server/.swagger-codegen-ignore
new file mode 100644
index 0000000000000000000000000000000000000000..c5fa491b4c557bf997d5dd21797de782545dc9e5
--- /dev/null
+++ b/python-flask-server/.swagger-codegen-ignore
@@ -0,0 +1,23 @@
+# Swagger Codegen Ignore
+# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/python-flask-server/.travis.yml b/python-flask-server/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dd6c4450aa902ae68479c3d76d45145e18d6052e
--- /dev/null
+++ b/python-flask-server/.travis.yml
@@ -0,0 +1,13 @@
+# ref: https://docs.travis-ci.com/user/languages/python
+language: python
+python:
+ - "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
diff --git a/python-flask-server/README.md b/python-flask-server/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..323aaee2ae6b1e0c241e9cf9e86f83d66c29a04f
--- /dev/null
+++ b/python-flask-server/README.md
@@ -0,0 +1,33 @@
+# Swagger generated server
+
+## Overview
+This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the
+[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This
+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 from the root directory:
+
+```
+pip3 install -r requirements.txt
+python3 -m swagger_server
+```
+
+and open your browser to here:
+
+```
+http://localhost:8080/ui/
+```
+
+Your Swagger definition lives here:
+
+```
+http://localhost:8080/swagger.json
+```
+
+To launch the integration tests, use tox:
+```
+sudo pip install tox
+tox
+```
diff --git a/python-flask-server/git_push.sh b/python-flask-server/git_push.sh
new file mode 100644
index 0000000000000000000000000000000000000000..6ca091b49d95e3553ca74febd220e1ff1873eb8a
--- /dev/null
+++ b/python-flask-server/git_push.sh
@@ -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=""
+ echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+ 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=""
+ 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'
+
diff --git a/python-flask-server/requirements.txt b/python-flask-server/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..995dc64d6559ef7a5adec5e2047b827d7819e147
--- /dev/null
+++ b/python-flask-server/requirements.txt
@@ -0,0 +1,3 @@
+connexion == 1.0.129
+python_dateutil == 2.6.0
+setuptools >= 21.0.0
diff --git a/python-flask-server/setup.py b/python-flask-server/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..1d08c48ed3fc83b61cab84bb758dcf9b7e18131f
--- /dev/null
+++ b/python-flask-server/setup.py
@@ -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="PCMAWeb API Specification",
+ author_email="",
+ url="",
+ keywords=["Swagger", "PCMAWeb API Specification"],
+ install_requires=REQUIRES,
+ packages=find_packages(),
+ package_data={'': ['swagger/swagger.yaml']},
+ include_package_data=True,
+ long_description="""\
+ No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ """
+)
+
diff --git a/python-flask-server/swagger_server/__init__.py b/python-flask-server/swagger_server/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/python-flask-server/swagger_server/__main__.py b/python-flask-server/swagger_server/__main__.py
new file mode 100644
index 0000000000000000000000000000000000000000..d0bb8478eada47bfdd6f591f68b3dbb56e118231
--- /dev/null
+++ b/python-flask-server/swagger_server/__main__.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python3
+
+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': 'No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)'})
+ app.run(port=8080)
diff --git a/python-flask-server/swagger_server/controllers/__init__.py b/python-flask-server/swagger_server/controllers/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/python-flask-server/swagger_server/controllers/default_controller.py b/python-flask-server/swagger_server/controllers/default_controller.py
new file mode 100644
index 0000000000000000000000000000000000000000..9939484a1eaa03789927daecc440ce7276428b1e
--- /dev/null
+++ b/python-flask-server/swagger_server/controllers/default_controller.py
@@ -0,0 +1,82 @@
+import connexion
+from swagger_server.models.phenotype import Phenotype
+from datetime import date, datetime
+from typing import List, Dict
+from six import iteritems
+from ..util import deserialize_date, deserialize_datetime
+
+
+def phenotypes_get():
+ """
+ phenotypes_get
+ Gets the list of available phenotypes
+
+ :rtype: List[Phenotype]
+ """
+ return 'do some magic!'
+
+
+def projects_get():
+ """
+ projects_get
+ Gets `Project` characteristics (listed phenotypes).
+
+ :rtype: List[Phenotype]
+ """
+ return 'do some magic!'
+
+
+def projects_post(phenotypeID):
+ """
+ projects_post
+ Create a new project from a selection of phenotypes
+ :param phenotypeID: IDs of the phenotypes selected for the project
+ :type phenotypeID: List[str]
+
+ :rtype: str
+ """
+ return 'do some magic!'
+
+
+def projects_project_id_datazoom_get(projectID, threshold=None, start_pos=None, end_pos=None):
+ """
+ projects_project_id_datazoom_get
+ Manhattan plot and heatmap data
+ :param projectID: project ID
+ :type projectID: str
+ :param threshold: significance threshold for the SNPs
+ :type threshold: float
+ :param start_pos: start position for the SNPs
+ :type start_pos: float
+ :param end_pos: end position for the SNPs
+ :type end_pos: float
+
+ :rtype: str
+ """
+ return 'do some magic!'
+
+
+def projects_project_id_genome_get(projectID, threshold=None):
+ """
+ projects_project_id_genome_get
+ Retrieve genome panel data for a given project
+ :param projectID: project ID
+ :type projectID: str
+ :param threshold: significance threshold for the SNPs
+ :type threshold: float
+
+ :rtype: str
+ """
+ return 'do some magic!'
+
+
+def projects_project_idget(projectID):
+ """
+ projects_project_idget
+ Retrieve a project definition
+ :param projectID: project ID
+ :type projectID: str
+
+ :rtype: Phenotype
+ """
+ return 'do some magic!'
diff --git a/python-flask-server/swagger_server/encoder.py b/python-flask-server/swagger_server/encoder.py
new file mode 100644
index 0000000000000000000000000000000000000000..90988e4d3eaa78f769c3a6ee06877a2fc52bfcb3
--- /dev/null
+++ b/python-flask-server/swagger_server/encoder.py
@@ -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)
\ No newline at end of file
diff --git a/python-flask-server/swagger_server/models/__init__.py b/python-flask-server/swagger_server/models/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1244184bd359fd5d073719b753250d632380909e
--- /dev/null
+++ b/python-flask-server/swagger_server/models/__init__.py
@@ -0,0 +1,5 @@
+# coding: utf-8
+
+from __future__ import absolute_import
+# import models into model package
+from .phenotype import Phenotype
diff --git a/python-flask-server/swagger_server/models/base_model_.py b/python-flask-server/swagger_server/models/base_model_.py
new file mode 100644
index 0000000000000000000000000000000000000000..5202b30fb63da1879343e51ef9c6ebcf54ce8349
--- /dev/null
+++ b/python-flask-server/swagger_server/models/base_model_.py
@@ -0,0 +1,75 @@
+from pprint import pformat
+from typing import TypeVar, Type
+from six import iteritems
+from ..util import deserialize_model
+
+T = TypeVar('T')
+
+
+class Model(object):
+ # swaggerTypes: The key is attribute name and the value is attribute type.
+ swagger_types = {}
+
+ # attributeMap: The key is attribute name and the value is json key in definition.
+ attribute_map = {}
+
+ @classmethod
+ def from_dict(cls: Type[T], dikt) -> T:
+ """
+ Returns the dict as a model
+ """
+ return deserialize_model(dikt, cls)
+
+ def to_dict(self):
+ """
+ Returns the model properties as a dict
+
+ :rtype: dict
+ """
+ result = {}
+
+ for attr, _ in iteritems(self.swagger_types):
+ value = getattr(self, attr)
+ if isinstance(value, list):
+ result[attr] = list(map(
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
+ value
+ ))
+ elif hasattr(value, "to_dict"):
+ result[attr] = value.to_dict()
+ elif isinstance(value, dict):
+ result[attr] = dict(map(
+ lambda item: (item[0], item[1].to_dict())
+ if hasattr(item[1], "to_dict") else item,
+ value.items()
+ ))
+ else:
+ result[attr] = value
+
+ return result
+
+ def to_str(self):
+ """
+ Returns the string representation of the model
+
+ :rtype: str
+ """
+ return pformat(self.to_dict())
+
+ def __repr__(self):
+ """
+ For `print` and `pprint`
+ """
+ return self.to_str()
+
+ def __eq__(self, other):
+ """
+ Returns true if both objects are equal
+ """
+ return self.__dict__ == other.__dict__
+
+ def __ne__(self, other):
+ """
+ Returns true if both objects are not equal
+ """
+ return not self == other
\ No newline at end of file
diff --git a/python-flask-server/swagger_server/models/phenotype.py b/python-flask-server/swagger_server/models/phenotype.py
new file mode 100644
index 0000000000000000000000000000000000000000..ab8b18118d8f755e8c9cdc8180ebe8331b250050
--- /dev/null
+++ b/python-flask-server/swagger_server/models/phenotype.py
@@ -0,0 +1,90 @@
+# coding: utf-8
+
+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
+
+
+class Phenotype(Model):
+ """
+ NOTE: This class is auto generated by the swagger code generator program.
+ Do not edit the class manually.
+ """
+ def __init__(self, id: str=None, label: str=None):
+ """
+ Phenotype - a model defined in Swagger
+
+ :param id: The id of this Phenotype.
+ :type id: str
+ :param label: The label of this Phenotype.
+ :type label: str
+ """
+ self.swagger_types = {
+ 'id': str,
+ 'label': str
+ }
+
+ self.attribute_map = {
+ 'id': 'id',
+ 'label': 'label'
+ }
+
+ self._id = id
+ self._label = label
+
+ @classmethod
+ def from_dict(cls, dikt) -> 'Phenotype':
+ """
+ Returns the dict as a model
+
+ :param dikt: A dict.
+ :type: dict
+ :return: The Phenotype of this Phenotype.
+ :rtype: Phenotype
+ """
+ return deserialize_model(dikt, cls)
+
+ @property
+ def id(self) -> str:
+ """
+ Gets the id of this Phenotype.
+
+ :return: The id of this Phenotype.
+ :rtype: str
+ """
+ return self._id
+
+ @id.setter
+ def id(self, id: str):
+ """
+ Sets the id of this Phenotype.
+
+ :param id: The id of this Phenotype.
+ :type id: str
+ """
+
+ self._id = id
+
+ @property
+ def label(self) -> str:
+ """
+ Gets the label of this Phenotype.
+
+ :return: The label of this Phenotype.
+ :rtype: str
+ """
+ return self._label
+
+ @label.setter
+ def label(self, label: str):
+ """
+ Sets the label of this Phenotype.
+
+ :param label: The label of this Phenotype.
+ :type label: str
+ """
+
+ self._label = label
+
diff --git a/python-flask-server/swagger_server/swagger/swagger.yaml b/python-flask-server/swagger_server/swagger/swagger.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..91eb9a0411aa67eb76d267a5d84b3662fcaec032
--- /dev/null
+++ b/python-flask-server/swagger_server/swagger/swagger.yaml
@@ -0,0 +1,138 @@
+---
+swagger: "2.0"
+info:
+ version: "0.0.0"
+ title: "PCMAWeb API Specification"
+paths:
+ /phenotypes:
+ get:
+ description: "Gets the list of available phenotypes\n"
+ operationId: "phenotypes_get"
+ parameters: []
+ responses:
+ 200:
+ description: "List of the available phenotypes"
+ schema:
+ type: "array"
+ title: "ArrayOfPhenotypes"
+ items:
+ $ref: "#/definitions/Phenotype"
+ x-swagger-router-controller: "swagger_server.controllers.default_controller"
+ /projects:
+ get:
+ description: "Gets `Project` characteristics (listed phenotypes).\n"
+ operationId: "projects_get"
+ parameters: []
+ responses:
+ 200:
+ description: "Retrieved project"
+ schema:
+ type: "array"
+ title: "ArrayOfPhenotypes"
+ items:
+ $ref: "#/definitions/Phenotype"
+ x-swagger-router-controller: "swagger_server.controllers.default_controller"
+ post:
+ description: "Create a new project from a selection of phenotypes\n"
+ operationId: "projects_post"
+ parameters:
+ - name: "phenotypeID"
+ in: "formData"
+ description: "IDs of the phenotypes selected for the project"
+ required: true
+ type: "array"
+ items:
+ type: "string"
+ collectionFormat: "multi"
+ responses:
+ 200:
+ description: "Project created"
+ schema:
+ type: "string"
+ title: "ProjectID"
+ x-swagger-router-controller: "swagger_server.controllers.default_controller"
+ /projects/{projectID}:
+ get:
+ description: "Retrieve a project definition\n"
+ operationId: "projects_project_idget"
+ parameters:
+ - name: "projectID"
+ in: "path"
+ description: "project ID"
+ required: true
+ type: "string"
+ responses:
+ 200:
+ description: "Retrieved project"
+ schema:
+ $ref: "#/definitions/Phenotype"
+ x-swagger-router-controller: "swagger_server.controllers.default_controller"
+ /projects/{projectID}/genome:
+ get:
+ description: "Retrieve genome panel data for a given project\n"
+ operationId: "projects_project_id_genome_get"
+ produces:
+ - "text/tab-separated-values; charset=utf-8"
+ parameters:
+ - name: "projectID"
+ in: "path"
+ description: "project ID"
+ required: true
+ type: "string"
+ - name: "threshold"
+ in: "query"
+ description: "significance threshold for the SNPs"
+ required: false
+ type: "number"
+ responses:
+ 200:
+ description: "Genome panel data in TSV format, where each column is position:chrid:p-value\n"
+ schema:
+ type: "string"
+ title: "Genome panel data"
+ x-swagger-router-controller: "swagger_server.controllers.default_controller"
+ /projects/{projectID}/datazoom:
+ get:
+ description: "Manhattan plot and heatmap data\n"
+ operationId: "projects_project_id_datazoom_get"
+ produces:
+ - "text/tab-separated-values; charset=utf-8"
+ parameters:
+ - name: "projectID"
+ in: "path"
+ description: "project ID"
+ required: true
+ type: "string"
+ - name: "threshold"
+ in: "query"
+ description: "significance threshold for the SNPs"
+ required: false
+ type: "number"
+ - name: "start_pos"
+ in: "query"
+ description: "start position for the SNPs"
+ required: false
+ type: "number"
+ - name: "end_pos"
+ in: "query"
+ description: "end position for the SNPs"
+ required: false
+ type: "number"
+ responses:
+ 200:
+ description: "Manhattan plot and heatmap data in TSV format\nEach line is\
+ \ a SNP with the first column containing the SNP ID, the second the Chromosome\
+ \ ID and the third the position (absolute or relative in the chromosome?),\
+ \ the fourth the joint statistic, and the 5th and following columns the\
+ \ phenotype-specific statistics.\n"
+ schema:
+ type: "string"
+ title: "Manhattan plot/Heatmap data"
+ x-swagger-router-controller: "swagger_server.controllers.default_controller"
+definitions:
+ Phenotype:
+ properties:
+ id:
+ type: "string"
+ label:
+ type: "string"
diff --git a/python-flask-server/swagger_server/test/__init__.py b/python-flask-server/swagger_server/test/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..77b10c3a012f7114a239d6816f79036d21f49efa
--- /dev/null
+++ b/python-flask-server/swagger_server/test/__init__.py
@@ -0,0 +1,14 @@
+from flask_testing import TestCase
+from ..encoder import JSONEncoder
+import connexion
+import logging
+
+
+class BaseTestCase(TestCase):
+
+ def create_app(self):
+ logging.getLogger('connexion.operation').setLevel('ERROR')
+ app = connexion.App(__name__, specification_dir='../swagger/')
+ app.app.json_encoder = JSONEncoder
+ app.add_api('swagger.yaml')
+ return app.app
diff --git a/python-flask-server/swagger_server/test/test_default_controller.py b/python-flask-server/swagger_server/test/test_default_controller.py
new file mode 100644
index 0000000000000000000000000000000000000000..0a193be77f837a07972fc5be2f113e816201f7a0
--- /dev/null
+++ b/python-flask-server/swagger_server/test/test_default_controller.py
@@ -0,0 +1,85 @@
+# coding: utf-8
+
+from __future__ import absolute_import
+
+from swagger_server.models.phenotype import Phenotype
+from . import BaseTestCase
+from six import BytesIO
+from flask import json
+
+
+class TestDefaultController(BaseTestCase):
+ """ DefaultController integration test stubs """
+
+ def test_phenotypes_get(self):
+ """
+ Test case for phenotypes_get
+
+
+ """
+ response = self.client.open('/phenotypes',
+ method='GET')
+ self.assert200(response, "Response body is : " + response.data.decode('utf-8'))
+
+ def test_projects_get(self):
+ """
+ Test case for projects_get
+
+
+ """
+ response = self.client.open('/projects',
+ method='GET')
+ self.assert200(response, "Response body is : " + response.data.decode('utf-8'))
+
+ def test_projects_post(self):
+ """
+ Test case for projects_post
+
+
+ """
+ data = dict(phenotypeID='phenotypeID_example')
+ response = self.client.open('/projects',
+ method='POST',
+ data=data)
+ self.assert200(response, "Response body is : " + response.data.decode('utf-8'))
+
+ def test_projects_project_id_datazoom_get(self):
+ """
+ Test case for projects_project_id_datazoom_get
+
+
+ """
+ query_string = [('threshold', 3.4),
+ ('start_pos', 3.4),
+ ('end_pos', 3.4)]
+ response = self.client.open('/projects/{projectID}/datazoom'.format(projectID='projectID_example'),
+ method='GET',
+ query_string=query_string)
+ self.assert200(response, "Response body is : " + response.data.decode('utf-8'))
+
+ def test_projects_project_id_genome_get(self):
+ """
+ Test case for projects_project_id_genome_get
+
+
+ """
+ query_string = [('threshold', 3.4)]
+ response = self.client.open('/projects/{projectID}/genome'.format(projectID='projectID_example'),
+ method='GET',
+ query_string=query_string)
+ self.assert200(response, "Response body is : " + response.data.decode('utf-8'))
+
+ def test_projects_project_idget(self):
+ """
+ Test case for projects_project_idget
+
+
+ """
+ response = self.client.open('/projects/{projectID}'.format(projectID='projectID_example'),
+ method='GET')
+ self.assert200(response, "Response body is : " + response.data.decode('utf-8'))
+
+
+if __name__ == '__main__':
+ import unittest
+ unittest.main()
diff --git a/python-flask-server/swagger_server/util.py b/python-flask-server/swagger_server/util.py
new file mode 100644
index 0000000000000000000000000000000000000000..40c72d43ebd26285cc5602aed924ff166ff69354
--- /dev/null
+++ b/python-flask-server/swagger_server/util.py
@@ -0,0 +1,149 @@
+from typing import GenericMeta
+from datetime import datetime, date
+from six import integer_types, iteritems
+
+
+def _deserialize(data, klass):
+ """
+ Deserializes dict, list, str into an object.
+
+ :param data: dict, list or str.
+ :param klass: class literal, or string of class name.
+
+ :return: object.
+ """
+ if data is None:
+ return None
+
+ if klass in integer_types or klass in (float, str, bool):
+ return _deserialize_primitive(data, klass)
+ elif klass == object:
+ return _deserialize_object(data)
+ elif klass == date:
+ return deserialize_date(data)
+ elif klass == datetime:
+ return deserialize_datetime(data)
+ elif type(klass) == GenericMeta:
+ if klass.__extra__ == list:
+ return _deserialize_list(data, klass.__args__[0])
+ if klass.__extra__ == dict:
+ return _deserialize_dict(data, klass.__args__[1])
+ else:
+ return deserialize_model(data, klass)
+
+
+def _deserialize_primitive(data, klass):
+ """
+ Deserializes to primitive type.
+
+ :param data: data to deserialize.
+ :param klass: class literal.
+
+ :return: int, long, float, str, bool.
+ :rtype: int | long | float | str | bool
+ """
+ try:
+ value = klass(data)
+ except UnicodeEncodeError:
+ value = unicode(data)
+ except TypeError:
+ value = data
+ return value
+
+
+def _deserialize_object(value):
+ """
+ Return a original value.
+
+ :return: object.
+ """
+ return value
+
+
+def deserialize_date(string):
+ """
+ Deserializes string to date.
+
+ :param string: str.
+ :type string: str
+ :return: date.
+ :rtype: date
+ """
+ try:
+ from dateutil.parser import parse
+ return parse(string).date()
+ except ImportError:
+ return string
+
+
+def deserialize_datetime(string):
+ """
+ Deserializes string to datetime.
+
+ The string should be in iso8601 datetime format.
+
+ :param string: str.
+ :type string: str
+ :return: datetime.
+ :rtype: datetime
+ """
+ try:
+ from dateutil.parser import parse
+ return parse(string)
+ except ImportError:
+ return string
+
+
+def deserialize_model(data, klass):
+ """
+ Deserializes list or dict to model.
+
+ :param data: dict, list.
+ :type data: dict | list
+ :param klass: class literal.
+ :return: model object.
+ """
+ instance = klass()
+
+ if not instance.swagger_types:
+ return data
+
+ for attr, attr_type in iteritems(instance.swagger_types):
+ if data is not None \
+ and instance.attribute_map[attr] in data \
+ and isinstance(data, (list, dict)):
+ value = data[instance.attribute_map[attr]]
+ setattr(instance, attr, _deserialize(value, attr_type))
+
+ return instance
+
+
+def _deserialize_list(data, boxed_type):
+ """
+ Deserializes a list and its elements.
+
+ :param data: list to deserialize.
+ :type data: list
+ :param boxed_type: class literal.
+
+ :return: deserialized list.
+ :rtype: list
+ """
+ return [_deserialize(sub_data, boxed_type)
+ for sub_data in data]
+
+
+
+def _deserialize_dict(data, boxed_type):
+ """
+ Deserializes a dict and its elements.
+
+ :param data: dict to deserialize.
+ :type data: dict
+ :param boxed_type: class literal.
+
+ :return: deserialized dict.
+ :rtype: dict
+ """
+ return {k: _deserialize(v, boxed_type)
+ for k, v in iteritems(data)}
diff --git a/python-flask-server/test-requirements.txt b/python-flask-server/test-requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7f8d96e6b40e853d658f88fa745ddcf37ff7644c
--- /dev/null
+++ b/python-flask-server/test-requirements.txt
@@ -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
diff --git a/python-flask-server/tox.ini b/python-flask-server/tox.ini
new file mode 100644
index 0000000000000000000000000000000000000000..b696749b3a16ef32084d3516efa7628d128e981e
--- /dev/null
+++ b/python-flask-server/tox.ini
@@ -0,0 +1,10 @@
+[tox]
+envlist = py35
+
+[testenv]
+deps=-r{toxinidir}/requirements.txt
+ -r{toxinidir}/test-requirements.txt
+
+commands=
+ nosetests \
+ []
\ No newline at end of file