Beispiel #1
0
    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
        }
Beispiel #2
0
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}
Beispiel #3
0
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]
Beispiel #4
0
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]
Beispiel #5
0
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
Beispiel #6
0
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'
Beispiel #7
0
    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,
Beispiel #8
0
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')
Beispiel #9
0
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}
Beispiel #10
0
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}
Beispiel #11
0
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]
Beispiel #12
0
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)
Beispiel #13
0
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)
Beispiel #14
0
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)
Beispiel #15
0
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}