Пример #1
0
    def setUp(self):
        self.sitedir = sitedir = tempfile.mkdtemp()
        self.scanroot = scanroot = os.path.join(sitedir, 'scanroot')
        os.mkdir(scanroot)
        os.mkdir(os.path.join(scanroot, 'foo'))
        os.mkdir(os.path.join(scanroot, 'bar'))
        self.siteconf = siteconf = os.path.join(sitedir, 'marv.conf')
        with open(siteconf, 'w') as f:
            f.write(inspect.cleandoc(self.CONFIG))

        prefix = 'test{}_'.format(self.counter.next())
        marv.model._LISTING_PREFIX
        marv.model._LISTING_PREFIX = prefix
        self.site = Site(siteconf)

        app = marv.app.create_app(self.site)
        appctx = app.app_context()
        appctx.push()

        def cleanup():
            appctx.pop()
            db.session.remove()
            del self.site
            for table in [
                    v for k, v in db.metadata.tables.items()
                    if k.startswith(prefix)
            ]:
                db.metadata.remove(table)
            if not KEEP:
                shutil.rmtree(sitedir)
            else:
                print('Keeping {}'.format(sitedir))

        self.cleanup = cleanup
def site(tmpdir):
    flag = (tmpdir / 'TEST_SITE')
    flag.write('')

    marv_conf = (tmpdir / 'marv.conf')
    marv_conf.write(MARV_CONF)

    # make scanroots
    for sitename in ('foo', ):
        for idx, name in enumerate(['a', 'b']):
            name = '{}_{}'.format(sitename, name)
            path = tmpdir / 'scanroots' / sitename / name
            path.write(str(idx), ensure=True)

    yield Site(marv_conf.strpath)
Пример #3
0
def create_app(push=True, init=None):
    ctx = click.get_current_context()
    siteconf = ctx.obj
    if siteconf is None:
        ctx.fail('Could not find config file: ./marv.conf or /etc/marv/marv.conf.\n'
                 'Change working directory or specify explicitly:\n\n'
                 '  marv --config /path/to/marv.conf\n')
    site = Site(siteconf)
    try:
        app = marv.app.create_app(site, init=init)
    except ConfigError as e:
        click.echo('Error {}'.format(e.args[0]), err=True)
        click.get_current_context().exit(1)
    except OSError as e:
        if e.errno == 13:
            print(e, file=sys.stderr)
            sys.exit(13)
        raise
    if push:
        appctx = app.app_context()
        appctx.push()
        ctx.call_on_close(appctx.pop)
    return app
Пример #4
0
class TestCase(unittest.TestCase):
    CONFIG = """
    [marv]
    collections = foo bar

    [collection foo]
    scanner = marv.tests.test_site:scan_foo
    scanroots = scanroot/foo

    [collection bar]
    scanner = marv.tests.test_site:scan_bar
    scanroots = scanroot/bar
    """
    counter = count()

    def setUp(self):
        self.sitedir = sitedir = tempfile.mkdtemp()
        self.scanroot = scanroot = os.path.join(sitedir, 'scanroot')
        os.mkdir(scanroot)
        os.mkdir(os.path.join(scanroot, 'foo'))
        os.mkdir(os.path.join(scanroot, 'bar'))
        self.siteconf = siteconf = os.path.join(sitedir, 'marv.conf')
        with open(siteconf, 'w') as f:
            f.write(inspect.cleandoc(self.CONFIG))

        prefix = 'test{}_'.format(self.counter.next())
        marv.model._LISTING_PREFIX
        marv.model._LISTING_PREFIX = prefix
        self.site = Site(siteconf)

        app = marv.app.create_app(self.site)
        appctx = app.app_context()
        appctx.push()

        def cleanup():
            appctx.pop()
            db.session.remove()
            del self.site
            for table in [
                    v for k, v in db.metadata.tables.items()
                    if k.startswith(prefix)
            ]:
                db.metadata.remove(table)
            if not KEEP:
                shutil.rmtree(sitedir)
            else:
                print('Keeping {}'.format(sitedir))

        self.cleanup = cleanup

    def tearDown(self):
        self.cleanup()

    def generate_foo(self, name):
        filename = os.path.join(self.scanroot, 'foo', '{}.foo'.format(name))
        with open(filename, 'w') as f:
            f.write('')
        log.verbose('wrote %s', filename)
        return filename

    def generate_bar(self, name):
        filename = os.path.join(self.scanroot, 'bar', '{}.bar'.format(name))
        with open(filename, 'w') as f:
            f.write('')
        log.verbose('wrote %s', filename)
        return filename

    def test_flow_query_and_tag(self):
        # init and scan empty
        site = self.site
        site.init()
        site.scan()
        self.assertEqual(site.query(), [])

        # generate some
        random.seed(42)
        foo1 = self.generate_foo('foo1')
        foo2 = self.generate_foo('foo2')
        bar1 = self.generate_bar('bar1')
        site.scan()
        self.assertEqual(site.query(), [
            'k5jgqruqhoyt5xsweq46tqnyem', 'tv43di37ggabzui2m4dpwqgwxu',
            'vfqitpfhd46ru3jnhsw3gzu4xu'
        ])

        # generate more and rescan
        foo3 = self.generate_foo('foo3')
        bar2 = self.generate_bar('bar2')
        site.scan()
        self.assertEqual(len(site.query()), 5)

        # get ids
        foo1id = site.query(path=foo1)[0]
        foo2id = site.query(path=foo2)[0]
        foo3id = site.query(path=foo3)[0]
        bar1id = site.query(path=bar1)[0]
        bar2id = site.query(path=bar2)[0]

        # query combinations
        self.assertEqual(set(site.query(collections=['bar'])),
                         {bar1id, bar2id})
        self.assertEqual(site.query(path=foo1[:-1]), [foo1id])
        self.assertEqual(site.query(collections=['bar'], path=foo1[:-1]), [])
        self.assertEqual(site.query(collections=['foo', 'bar'], path=foo1),
                         [foo1id])

        # tag
        self.site.tag([foo1id, foo2id, bar1id], add=['a', 'b'])
        self.site.tag([foo3id], add=['c'])
        self.assertEqual(site.listtags(), ['a', 'b', 'c'])
        self.assertEqual(site.listtags(collections=['foo']), ['a', 'b', 'c'])
        self.assertEqual(site.listtags(collections=['bar']), ['a', 'b'])

        # query tagged
        self.assertEqual(set(site.query(tags=['a'])), {foo1id, foo2id, bar1id})
        self.assertEqual(set(site.query(tags=['b', 'c'])),
                         {foo1id, foo2id, foo3id, bar1id})

        # untag
        self.site.tag([foo1id, bar1id, bar2id], add=['x'], remove=['a', 'b'])
        self.assertEqual(site.listtags(), ['a', 'b', 'c', 'x'])
        self.assertEqual(site.listtags(collections=['foo']),
                         ['a', 'b', 'c', 'x'])
        self.assertEqual(site.listtags(collections=['bar']), ['a', 'b', 'x'])
        self.assertEqual(site.query(path=foo1, tags=['a']), [])
        self.assertEqual(site.query(path=foo2, tags=['a']), [foo2id])
        self.site.tag([foo1id], remove=['x'])

        # cleanup tags
        self.site.cleanup_tags()
        self.assertEqual(site.listtags(), ['a', 'b', 'c', 'x'])
        self.assertEqual(site.listtags(collections=['foo']), ['a', 'b', 'c'])
        self.assertEqual(site.listtags(collections=['bar']), ['x'])

        # run nodes
        self.site.run(foo1id)

    def test_outdated_node(self):
        site = self.site

        site.init()
        foo1 = self.generate_foo('foo1')
        site.scan()
        foo1id = site.query(path=foo1)[0]