# Path: drift/fixers.py
# class ReverseProxied(object):
#     '''Wrap the application in this middleware and configure the
#     front-end server to add these headers, to let you quietly bind
#     this to a URL other than / and to an HTTP scheme that is
#     different than what is used locally.
# 
#     In nginx:
#     location /myprefix {
#         proxy_pass http://192.168.0.1:5001;
#         proxy_set_header Host $host;
#         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#         proxy_set_header X-Scheme $scheme;
#         proxy_set_header X-Script-Name /myprefix;
#         }
# 
#     :param app: the WSGI application
#     '''
#     def __init__(self, app):
#         self.app = app
# 
#     def __call__(self, environ, start_response):
#         script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
#         if script_name:
#             environ['SCRIPT_NAME'] = script_name
#             path_info = environ['PATH_INFO']
#             if path_info.startswith(script_name):
#                 environ['PATH_INFO'] = path_info[len(script_name):]
# 
#         scheme = environ.get('HTTP_X_SCHEME', environ.get('X-Forwarded-Proto', ''))
#         if scheme:
#             environ['wsgi.url_scheme'] = scheme
# 
#         server = environ.get('HTTP_X_FORWARDED_SERVER', '')
#         if server:
#             environ['HTTP_HOST'] = server
# 
#         return self.app(environ, start_response)
# 
# class CustomJSONEncoder(JSONEncoder):
#     '''Extend the JSON encoder to treat date-time objects as strict
#     rfc3339 types.
#     '''
#     def default(self, obj):
#         from drift.orm import ModelBase
#         if isinstance(obj, date):
#             return obj.isoformat() + "Z"
#         elif isinstance(obj, ModelBase):
#             return obj.as_dict()
#         else:
#             return JSONEncoder.default(self, obj)
# 
# Path: drift/utils.py
# def get_app_root():
#     """Returns absolute path to the current application root directory."""
#     return os.path.expanduser(os.environ.get('DRIFT_APP_ROOT', os.path.abspath('.')))


import os
import sys
import logging
import importlib
import json
import os.path
import time
import warnings
import pkgutil
import drift.core.extensions
from flask import Flask
from flask_smorest import Api
from werkzeug.middleware.proxy_fix import ProxyFix
from werkzeug.utils import import_string, ImportStringError
from drift.fixers import ReverseProxied, CustomJSONEncoder
from drift.utils import get_app_root


log = logging.getLogger(__name__)


APP_INIT_THRESHOLD = .250  # If app creation takes longer a warning is logged.
MODULE_INIT_THRESHOLD = .050  # If module initialization takes longer a warning is logged.


class AppRootNotFound(RuntimeError):
    """To enable CLI to filter on this particular case."""
    pass


def drift_app(app=None):
    try:
        return _drift_app(app=app)
    except Exception:
        log.exception("Flask app creation failed.")


def _drift_app(app=None):
    """Flask factory for Drift based apps."""


# Path: drift/fixers.py
# class ReverseProxied(object):
#     '''Wrap the application in this middleware and configure the
#     front-end server to add these headers, to let you quietly bind
#     this to a URL other than / and to an HTTP scheme that is
#     different than what is used locally.
# 
#     In nginx:
#     location /myprefix {
#         proxy_pass http://192.168.0.1:5001;
#         proxy_set_header Host $host;
#         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#         proxy_set_header X-Scheme $scheme;
#         proxy_set_header X-Script-Name /myprefix;
#         }
# 
#     :param app: the WSGI application
#     '''
#     def __init__(self, app):
#         self.app = app
# 
#     def __call__(self, environ, start_response):
#         script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
#         if script_name:
#             environ['SCRIPT_NAME'] = script_name
#             path_info = environ['PATH_INFO']
#             if path_info.startswith(script_name):
#                 environ['PATH_INFO'] = path_info[len(script_name):]
# 
#         scheme = environ.get('HTTP_X_SCHEME', environ.get('X-Forwarded-Proto', ''))
#         if scheme:
#             environ['wsgi.url_scheme'] = scheme
# 
#         server = environ.get('HTTP_X_FORWARDED_SERVER', '')
#         if server:
#             environ['HTTP_HOST'] = server
# 
#         return self.app(environ, start_response)
# 
# class CustomJSONEncoder(JSONEncoder):
#     '''Extend the JSON encoder to treat date-time objects as strict
#     rfc3339 types.
#     '''
#     def default(self, obj):
#         from drift.orm import ModelBase
#         if isinstance(obj, date):
#             return obj.isoformat() + "Z"
#         elif isinstance(obj, ModelBase):
#             return obj.as_dict()
#         else:
#             return JSONEncoder.default(self, obj)
# 
# Path: drift/utils.py
# def get_app_root():
#     """Returns absolute path to the current application root directory."""
#     return os.path.expanduser(os.environ.get('DRIFT_APP_ROOT', os.path.abspath('.')))


# Path: drift/flaskfactory.py
import os
import sys
import logging
import importlib
import json
import os.path
import time
import warnings
import pkgutil
import drift.core.extensions
from flask import Flask
from flask_smorest import Api
from werkzeug.middleware.proxy_fix import ProxyFix
from werkzeug.utils import import_string, ImportStringError
from drift.fixers import ReverseProxied, CustomJSONEncoder
from drift.utils import get_app_root



log = logging.getLogger(__name__)


APP_INIT_THRESHOLD = .250  # If app creation takes longer a warning is logged.
MODULE_INIT_THRESHOLD = .050  # If module initialization takes longer a warning is logged.


class AppRootNotFound(RuntimeError):
    """To enable CLI to filter on this particular case."""
    pass


def drift_app(app=None):
    try:
        return _drift_app(app=app)
    except Exception:
        log.exception("Flask app creation failed.")


def _drift_app(app=None):
    """Flask factory for Drift based apps."""


    app_root = get_app_root()