コード例 #1
0
def test_callback_returning_something_cancels_parent_section_hook_handling():
    config = Config({'uploads': {
        'db': {
            'user': '******',
        }
    }})

    calls = []

    @config.hooks.item_added_to_section
    def root_handler(**kwargs):
        calls.append('root')

    @config.uploads.hooks.item_added_to_section
    def uploads_handler(**kwargs):
        calls.append('uploads')

    @config.uploads.db.hooks.item_added_to_section
    def db_handler(**kwargs):
        calls.append('db')

    assert calls == []

    config.uploads.db.add_item('password', config.create_item(name='password'))

    assert calls == ['db', 'uploads', 'root']

    @config.uploads.hooks.item_added_to_section
    def another_uploads_handler(**kwargs):
        calls.append('uploads2')
        return True

    # Root hooks are not handled because uploads2 returned something
    config.uploads.db.add_item('host', config.create_item(name='host'))
    assert len(calls) == 6
    assert calls[-3:] == ['db', 'uploads', 'uploads2']

    # Root hook is handled because the event happens on root level
    config.add_item('greeting', config.create_item(name='greeting'))
    assert len(calls) == 7
    assert calls[-1:] == ['root']
コード例 #2
0
def test_item_added_to_section_hook():
    calls = []

    config = Config({'uploads': {
        'db': {
            'user': '******',
        }
    }})

    @config.hooks.item_added_to_section
    def item_added_to_section(*args, **kwargs):
        calls.append(
            ('first', args, sub_dict(kwargs, ('section', 'subject', 'alias'))))

    @config.hooks.item_added_to_section
    def item_added_to_section2(*args, **kwargs):
        calls.append(
            ('second', args, sub_dict(kwargs,
                                      ('section', 'subject', 'alias'))))

    assert calls == []

    # Adding a section to a section is unrelated
    config.add_section('downloads', config.create_section())

    assert calls == []

    password = config.create_item(name='password')
    threads = config.create_item(name='threads', default=5)
    assert calls == []

    config.uploads.db.add_item(password.name, password)

    # Note that the item added to Config is actually a different instance to the one that was passed to add_item.
    # This is because we do deepcopy in add_item.
    assert calls == [
        ('first', (), {
            'section': config.uploads.db,
            'subject': config.uploads.db.password,
            'alias': 'password'
        }),
        ('second', (), {
            'section': config.uploads.db,
            'subject': config.uploads.db.password,
            'alias': 'password'
        }),
    ]

    config.uploads.add_item('threads_alias', threads)
    assert len(calls) == 4

    assert calls[2:] == [
        ('first', (), {
            'section': config.uploads,
            'subject': config.uploads.threads,
            'alias': 'threads_alias'
        }),
        ('second', (), {
            'section': config.uploads,
            'subject': config.uploads.threads,
            'alias': 'threads_alias'
        }),
    ]