Skip to content

Commit

Permalink
Merge pull request #171 from jimmyppi/wsgi_env
Browse files Browse the repository at this point in the history
Expose all app arguments as env variables
  • Loading branch information
jonashaag committed Jan 15, 2017
2 parents e1cb2c4 + adfbdc6 commit af02129
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 36 deletions.
23 changes: 23 additions & 0 deletions klaus/contrib/app_args.py
@@ -0,0 +1,23 @@
import os
from distutils.util import strtobool


def get_args_from_env():
repos = os.environ.get('KLAUS_REPOS', [])
if repos:
repos = repos.split()
args = (
repos,
os.environ['KLAUS_SITE_NAME']
)
kwargs = dict(
htdigest_file=os.environ.get('KLAUS_HTDIGEST_FILE'),
use_smarthttp=strtobool(os.environ.get('KLAUS_USE_SMARTHTTP', '0')),
require_browser_auth=strtobool(
os.environ.get('KLAUS_REQUIRE_BROWSER_AUTH', '0')),
disable_push=strtobool(os.environ.get('KLAUS_DISABLE_PUSH', '0')),
unauthenticated_push=strtobool(
os.environ.get('KLAUS_UNAUTHENTICATED_PUSH', '0')),
ctags_policy=os.environ.get('KLAUS_CTAGS_POLICY', 'none')
)
return args, kwargs
23 changes: 8 additions & 15 deletions klaus/contrib/wsgi.py
@@ -1,18 +1,11 @@
import os
from klaus import make_app
from .app_args import get_args_from_env

if 'KLAUS_HTDIGEST_FILE' in os.environ:
with open(os.environ['KLAUS_HTDIGEST_FILE']) as file:
application = make_app(
os.environ['KLAUS_REPOS'].split(),
os.environ['KLAUS_SITE_NAME'],
os.environ.get('KLAUS_USE_SMARTHTTP'),
file,
)
args, kwargs = get_args_from_env()

if kwargs['htdigest_file']:
with open(kwargs['htdigest_file']) as file:
kwargs['htdigest_file'] = file
application = make_app(*args, **kwargs)
else:
application = make_app(
os.environ['KLAUS_REPOS'].split(),
os.environ['KLAUS_SITE_NAME'],
os.environ.get('KLAUS_USE_SMARTHTTP'),
None,
)
application = make_app(*args, **kwargs)
26 changes: 11 additions & 15 deletions klaus/contrib/wsgi_autoreload.py
Expand Up @@ -6,6 +6,8 @@
from io import open, StringIO

from klaus import make_app
from .app_args import get_args_from_env


# Shared state between poller and application wrapper
class _:
Expand Down Expand Up @@ -55,20 +57,14 @@ def app(environ, start_response):
if 'KLAUS_REPOS' in os.environ:
warnings.warn("use KLAUS_REPOS_ROOT instead of KLAUS_REPOS for the autoreloader apps", DeprecationWarning)

if 'KLAUS_HTDIGEST_FILE' in os.environ:
args, kwargs = get_args_from_env()
repos_root = os.environ.get('KLAUS_REPOS_ROOT') or os.environ['KLAUS_REPOS']
args = (repos_root,) + args[1:]

if kwargs['htdigest_file']:
# Cache the contents of the htdigest file, the application will not read
# the file like object until later when called.
with open(os.environ['KLAUS_HTDIGEST_FILE'], encoding='utf-8') as htdigest_file:
htdigest_io = StringIO(htdigest_file.read())
application = make_autoreloading_app(
os.environ.get('KLAUS_REPOS_ROOT') or os.environ['KLAUS_REPOS'],
os.environ['KLAUS_SITE_NAME'],
os.environ.get('KLAUS_USE_SMARTHTTP'),
htdigest_io,
)
else:
application = make_autoreloading_app(
os.environ.get('KLAUS_REPOS_ROOT') or os.environ['KLAUS_REPOS'],
os.environ['KLAUS_SITE_NAME'],
os.environ.get('KLAUS_USE_SMARTHTTP'),
)
with open(kwargs['htdigest_file'], encoding='utf-8') as htdigest_file:
kwargs['htdigest_file'] = StringIO(htdigest_file.read())

application = make_autoreloading_app(*args, **kwargs)
87 changes: 81 additions & 6 deletions tests/test_contrib.py
Expand Up @@ -4,34 +4,109 @@
except ImportError:
pass

import pytest

from klaus.contrib import app_args
from .utils import *
from .test_make_app import can_reach_unauth, can_push_auth


def test_wsgi():
def check_env(env, expected_args, expected_kwargs):
os.environ.update(env)
args, kwargs = app_args.get_args_from_env()
assert args == expected_args
assert kwargs == expected_kwargs


def test_missing_in_env(monkeypatch):
"""Test that KeyError is raised when required env var is missing"""
monkeypatch.setattr(os, 'environ', os.environ.copy())
with pytest.raises(KeyError):
args, kwargs = app_args.get_args_from_env()


def test_minimum_env(monkeypatch):
"""Test to provide only required env var"""
monkeypatch.setattr(os, 'environ', os.environ.copy())
check_env(
{'KLAUS_SITE_NAME': TEST_SITE_NAME},
([], TEST_SITE_NAME),
dict(
htdigest_file=None,
use_smarthttp=False,
require_browser_auth=False,
disable_push=False,
unauthenticated_push=False,
ctags_policy='none')
)


def test_complete_env(monkeypatch):
"""Test to provide all supported env var"""
monkeypatch.setattr(os, 'environ', os.environ.copy())
check_env(
{
'KLAUS_REPOS': TEST_REPO,
'KLAUS_SITE_NAME': TEST_SITE_NAME,
'KLAUS_HTDIGEST_FILE': HTDIGEST_FILE,
'KLAUS_USE_SMARTHTTP': 'yes',
'KLAUS_REQUIRE_BROWSER_AUTH': '1',
'KLAUS_DISABLE_PUSH': 'false',
'KLAUS_UNAUTHENTICATED_PUSH': '0',
'KLAUS_CTAGS_POLICY': 'ALL'
},
([TEST_REPO], TEST_SITE_NAME),
dict(
htdigest_file=HTDIGEST_FILE,
use_smarthttp=True,
require_browser_auth=True,
disable_push=False,
unauthenticated_push=False,
ctags_policy='ALL')
)


def test_unsupported_boolean_env(monkeypatch):
"""Test that unsupported boolean env var raises ValueError"""
monkeypatch.setattr(os, 'environ', os.environ.copy())
with pytest.raises(ValueError):
check_env(
{
'KLAUS_REPOS': TEST_REPO,
'KLAUS_SITE_NAME': TEST_SITE_NAME,
'KLAUS_HTDIGEST_FILE': HTDIGEST_FILE,
'KLAUS_USE_SMARTHTTP': 'unsupported',
}, (), {}
)


def test_wsgi(monkeypatch):
"""Test start of wsgi app"""
monkeypatch.setattr(os, 'environ', os.environ.copy())
os.environ['KLAUS_REPOS'] = TEST_REPO
os.environ['KLAUS_SITE_NAME'] = TEST_SITE_NAME
os.environ.pop('KLAUS_HTDIGEST_FILE', None)
os.environ.pop('KLAUS_USE_SMARTHTTP', None)
from klaus.contrib import wsgi
with serve_app(wsgi.application):
assert can_reach_unauth()
assert not can_push_auth()

os.environ['KLAUS_HTDIGEST_FILE'] = HTDIGEST_FILE
os.environ['KLAUS_USE_SMARTHTTP'] = 'yes'
reload(wsgi)
with serve_app(wsgi.application):
assert can_reach_unauth()
assert can_push_auth()


def test_wsgi_autoreload():
def test_wsgi_autoreload(monkeypatch):
"""Test start of wsgi autoreload app"""
monkeypatch.setattr(os, 'environ', os.environ.copy())
os.environ['KLAUS_REPOS_ROOT'] = TEST_REPO_ROOT
os.environ['KLAUS_SITE_NAME'] = TEST_SITE_NAME
os.environ.pop('KLAUS_HTDIGEST_FILE', None)
os.environ.pop('KLAUS_USE_SMARTHTTP', None)
from klaus.contrib import wsgi_autoreload
with serve_app(wsgi_autoreload.application):
assert can_reach_unauth()
assert not can_push_auth()

os.environ['KLAUS_HTDIGEST_FILE'] = HTDIGEST_FILE
os.environ['KLAUS_USE_SMARTHTTP'] = 'yes'
Expand Down

0 comments on commit af02129

Please sign in to comment.