Skip to content
This repository has been archived by the owner on May 31, 2019. It is now read-only.

Commit

Permalink
Implement freeze the app states
Browse files Browse the repository at this point in the history
  • Loading branch information
c-bata committed Mar 19, 2017
1 parent d589170 commit 388da8d
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
12 changes: 12 additions & 0 deletions kobin/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ def index() -> Response:
import os
import traceback
from urllib.parse import urljoin
import warnings

from .routes import Router
from .requests import request
Expand All @@ -39,6 +40,15 @@ def __init__(self, config=None):
self.before_request_callbacks = []
self.after_request_callbacks = []
self.logger = self.config.get('LOGGER')
self._frozen = False

def __setattr__(self, *args, **kwargs):
if '_frozen' in dir(self):
if self._frozen:
warnings.warn("Cannot Change the state of started application!",
stacklevel=2)
else:
super().__setattr__(*args, **kwargs)

def route(self, rule=None, method='GET', name=None, callback=None):
def decorator(callback_func):
Expand Down Expand Up @@ -83,6 +93,8 @@ def _handle(self, environ):

def __call__(self, environ, start_response):
"""It is called when receive http request."""
if not self._frozen:
self._frozen = True
response = self._handle(environ)
start_response(response.status, response.headerlist)
return response.body
Expand Down
1 change: 1 addition & 0 deletions kobin/app.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class Kobin:
logger: Logger
before_request_callbacks: List[Callable[[], None]]
after_request_callbacks: List[Callable[[BaseResponse], Union[None, BaseResponse]]]
_frozen: bool

def __init__(self, config: Dict[str, Any] = ...) -> None: ...
def route(self, rule: str = ..., method: str = ..., name: str = ...,
Expand Down
21 changes: 21 additions & 0 deletions tests/test_apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,26 @@ def test_after_request(self):
self.assertEqual('200 OK', response.status)


class KobinFrozenTests(TestCase):
def setUp(self):
self.app = Kobin(config={'DEBUG': True})
self.before_counter = 0

@self.app.route('/')
def dummy_func():
return Response('hello')

def test_can_change_state_before_running(self):
test_env = {'REQUEST_METHOD': 'GET', 'PATH_INFO': '/'}

def dummy_start_response(s, h):
pass

self.app(test_env, dummy_start_response)
self.app.config = {'foo': 'bar'}
self.assertNotIn('foo', self.app.config)


class ConfigTests(TestCase):
def setUp(self):
self.base_path = os.path.dirname(os.path.abspath(__file__))
Expand Down Expand Up @@ -210,6 +230,7 @@ def test_load_jinja2_env_with_globals(self):
def test_load_jinja2_env_with_filters(self):
def foo_filter(x):
return x * 2

env = load_jinja2_env('.', global_filters={'foo': foo_filter})
self.assertEqual(foo_filter, env.filters['foo'])

Expand Down

0 comments on commit 388da8d

Please sign in to comment.