def __init__(self, **kwargs): #: An Aspen :class:`~aspen.request_processor.RequestProcessor` instance. self.request_processor = RequestProcessor(**kwargs) pando_resources_dir = os.path.join(PANDO_DIR, 'www') self.request_processor.resource_directories.append(pando_resources_dir) pando_chain = StateChain.from_dotted_name('pando.state_chain') pando_chain.functions = [ getattr(f, 'placeholder_for', f) for f in pando_chain.functions ] #: The chain of functions used to process an HTTP request, imported from #: :mod:`pando.state_chain`. self.state_chain = pando_chain # configure from defaults and kwargs defaults = [(k, v) for k, v in DefaultConfiguration.__dict__.items() if k[0] != '_'] for name, default in sorted(defaults): if name in kwargs: self.__dict__[name] = kwargs[name] else: self.__dict__[name] = copy(default) # add ourself to the initial context of simplates Simplate.defaults.initial_context['website'] = self # load bodyparsers #: Mapping of content types to parsing functions. self.body_parsers = { "application/x-www-form-urlencoded": body_parsers.formdata, "multipart/form-data": body_parsers.formdata, self.request_processor.media_type_json: body_parsers.jsondata }
def test_inserted_state_chain_steps_run(sys_path): sys_path.mk(FOO_PY) chain = StateChain.from_dotted_name('foo') def biz(): return {'val': 4} chain.insert_after('buz', biz) state = chain.run(val=None) assert state == {'val': 4, 'exception': None, 'state': state, 'chain': chain}
def test_StateChain_ignores_functions_starting_with_underscore(sys_path): sys_path.mk( ('um.py', 'def um(): pass') , ('foo/__init__.py', '') , ('foo/bar.py', ''' def baz(): pass from um import um as _um def blah(): pass ''')) chain = StateChain.from_dotted_name('foo.bar') import foo.bar assert chain.functions == [foo.bar.baz, foo.bar.blah]
def test_StateChain_includes_imported_functions_and_the_order_is_screwy(sys_path): sys_path.mk( ('um.py', 'def um(): pass') , ('foo/__init__.py', '') , ('foo/bar.py', ''' def baz(): pass from um import um def blah(): pass ''')) chain = StateChain.from_dotted_name('foo.bar') import foo.bar, um assert chain.functions == [um.um, foo.bar.baz, foo.bar.blah]
def test_traceback_for_uncleared_exception_reaches_back_to_original_raise(sys_path): sys_path.mk(EXCEPT) chain = StateChain.from_dotted_name('foo') chain.remove('clear') try: chain.run() except: tb = traceback.format_exc() lines = tb.splitlines() assert lines[-1][:11] == 'NameError: ' assert "'heck'" in lines[-1] assert len(lines) == 12, tb
def test_function_can_have_default_value_for_exception_to_be_always_called(sys_path): sys_path.mk(EXCEPT) chain = StateChain.from_dotted_name('foo') # Add a both-handling function. def both(exception=None): return {'exception': None, 'um': 'yeah'} chain.insert_before('clear', both) # Exception case. assert chain.run()['um'] == 'yeah' # Non-exception case. chain.remove('bar') assert chain.run()['um'] == 'yeah'
if key and secret: s3 = boto3.client('s3', aws_access_key_id=key, aws_secret_access_key=secret) else: s3 = None return {'s3': s3} def currency_exchange_rates(db): if not db: return return {'currency_exchange_rates': get_currency_exchange_rates(db)} minimal_chain = StateChain( version, make_sentry_teller, database, ) full_chain = StateChain( version, make_sentry_teller, crypto, database, canonical, csp, app_conf, mail, billing, stripe, username_restrictions,
def test_error_raised_if_we_try_to_return_after_an_unknown_function(sys_path): sys_path.mk(FOO_PY) chain = StateChain.from_dotted_name('foo') raises(FunctionNotFound, chain.run, val=None, _return_after='blaaaaaah')
def test_can_stop_state_chain_after_a_certain_point(sys_path): sys_path.mk(FOO_PY) chain = StateChain.from_dotted_name('foo') state = chain.run(val=None, _return_after='baz') assert state == {'val': 2, 'exception': None, 'state': state, 'chain': chain}
def test_can_run_through_state_chain(sys_path): sys_path.mk(FOO_PY) chain = StateChain.from_dotted_name('foo') state = chain.run(val=None) assert state == {'val': 3, 'exception': None, 'state': state, 'chain': chain}
def test_StateChain_can_be_instantiated_with_from_dotted_name(sys_path): sys_path.mk(('foo/__init__.py', ''), ('foo/bar.py', 'def baz(): pass')) chain = StateChain.from_dotted_name('foo.bar') from foo.bar import baz assert chain.functions == [baz]
def test_per_call_trumps_constructor_for_raise_immediately(sys_path): sys_path.mk(EXCEPT) chain = StateChain.from_dotted_name('foo', raise_immediately=True) chain.remove('clear') raises(NameError, chain.run, _raise_immediately=False)
def test_exception_raises_immediately_if_told_to_via_run_call(sys_path): sys_path.mk(EXCEPT) chain = StateChain.from_dotted_name('foo') chain.remove('clear') raises(NameError, chain.run, _raise_immediately=True)
def test_exception_raises_if_uncleared(sys_path): sys_path.mk(EXCEPT) chain = StateChain.from_dotted_name('foo') chain.remove('clear') raises(NameError, chain.run)
def test_exception_fast_forwards(sys_path): sys_path.mk(EXCEPT) chain = StateChain.from_dotted_name('foo') state = chain.run() assert state == {'val': 666, 'exception': None, 'state': state, 'chain': chain}