def test_extrinsic_metadata(self):
        """Various format front matter."""

        qs = FBO(
            path=TEST_FILES_ROOT,
            glob='*.rst',
            metadata=FileObject.MetadataInFileHead,
        ).all()

        self.assertEqual(
            3,
            qs.count(),
        )
        # Have to test this both ways so that however it
        # comes out of the filesystem "by default" (ie
        # intrinsically, probably inode ordering) we'll get
        # a failure if our explicit ordering isn't applied.
        self.assertEqual(
            'test1.rst',
            qs.order_by('title')[0].name,
        )
        self.assertEqual(
            'test3.rst',
            qs.order_by('-title')[0].name,
        )
    def test_intrinsic_metadata(self):
        """Intrinsic metadata."""

        qs = FBO(
            path=TEST_FILES_ROOT,
            glob='*.md',
            metadata='.meta',
        ).all()

        self.assertEqual(
            4,
            qs.count(),
        )
        # Have to test this both ways so that however it
        # comes out of the filesystem "by default" (ie
        # intrinsically, probably inode ordering) we'll get
        # a failure if our explicit ordering isn't applied.
        self.assertEqual(
            'index.md',
            qs.order_by('name')[0].name,
        )
        self.assertEqual(
            'test2.md',
            qs.order_by('-name')[0].name,
        )
    def test_everything(self):
        """Just find all file objects."""

        qs = FBO(
            path=TEST_FILES_ROOT,
        ).exclude(
            name__glob='*~',
        ).exclude(
            name__glob='*.meta',
        )

        self.assertEqual(
            7,
            qs.count(),
        )
        self.assertEqual(
            {
                'index.md',
                'subdir/index.md',
                'test1.md',
                'test2.md',
                'test1.rst',
                'test2.rst',
                'test3.rst',
            },
            { o.name for o in qs },
        )
    def test_get(self):
        """Fetch a single file instance."""

        qs = FBO(
            path=TEST_FILES_ROOT,
        ).all()

        obj = qs.get(
            name='test1.md',
        )

        self.assertEqual(
            'test1.md',
            obj.name,
        )
 def test_filters_are_clones_not_references(self):
     """_filter must be cloned"""
     # Everything else is considered immutable
     qs = FBO(
         path=TEST_FILES_ROOT,
         glob='*.rst',
     )
     self.assertEqual(
         3,
         qs.count(),
     )
     qs2 = qs.filter(name='test1.rst')
     self.assertEqual(
         3,
         qs.count(),
     )
 def setUp(self):
     self.qs = FBO(
         path=TEST_FILES_ROOT,
     ).exclude(
         name__glob='*~',
     ).exclude(
         name__glob='*.meta',
     ).order_by(
         'name'
     )
    def test_glob_restriction(self):
        """With globbing."""

        qs = FBO(
            path=TEST_FILES_ROOT,
            glob='*.md',
        ).all()

        self.assertEqual(
            4,
            qs.count(),
        )
        self.assertEqual(
            {
                'index.md',
                'subdir/index.md',
                'test1.md',
                'test2.md',
            },
            { o.name for o in qs },
        )
class TestSlice(TestCase):
    """Can we slice FBO?"""

    def setUp(self):
        self.qs = FBO(
            path=TEST_FILES_ROOT,
        ).exclude(
            name__glob='*~',
        ).exclude(
            name__glob='*.meta',
        ).order_by(
            'name'
        )

    def test_sliced_filter(self):
        # We want to test that the slice is applied last.
        # However we prefetch at the start of the iterator,
        # so we need to cause that prefetch to happen before
        # the filter is applied, so that the filter will be
        # applied within the iterator rather than in the
        # prefetch.
        #
        # This incidentally also showed that our prefetch
        # cache wasn't being propagated down to sub querysets,
        # so it acts as a regression test against that also.
        qs = self.qs.clone()
        _ = iter(qs)
        qs = qs.filter(
            name__glob='*.rst'
        )[2:]

        self.assertEqual(
            [
                'test3.rst',
            ],
            [ o.name for o in qs ],
        )

    def test_open_both(self):
        qs = self.qs[:]

        self.assertEqual(
            [
                'index.md',
                'subdir/index.md',
                'test1.md',
                'test1.rst',
                'test2.md',
                'test2.rst',
                'test3.rst',
            ],
            [ o.name for o in qs ],
        )

    def test_open_start(self):
        qs = self.qs[:4]

        self.assertEqual(
            [
                'index.md',
                'subdir/index.md',
                'test1.md',
                'test1.rst',
            ],
            [ o.name for o in qs ],
        )

    def test_open_end(self):
        qs = self.qs[1:]

        self.assertEqual(
            [
                'subdir/index.md',
                'test1.md',
                'test1.rst',
                'test2.md',
                'test2.rst',
                'test3.rst',
            ],
            [ o.name for o in qs ],
        )

    def test_closed(self):
        qs = self.qs[1:3]

        self.assertEqual(
            [
                'subdir/index.md',
                'test1.md',
            ],
            [ o.name for o in qs ],
        )

    def test_sliced_slice1(self):
        qs = self.qs[1:4][:2]

        self.assertEqual(
            [
                'subdir/index.md',
                'test1.md',
            ],
            [ o.name for o in qs ],
        )

    def test_sliced_slice2(self):
        qs = self.qs[1:3][:4]

        self.assertEqual(
            [
                'subdir/index.md',
                'test1.md',
            ],
            [ o.name for o in qs ],
        )

    def test_sliced_slice3(self):
        qs = self.qs[:2][1:4]

        self.assertEqual(
            [
                'subdir/index.md',
                'test1.md',
            ],
            [ o.name for o in qs ],
        )

    def test_sliced_slice4(self):
        qs = self.qs[1:4][1:3]

        self.assertEqual(
            [
                'test1.md',
                'test1.rst',
            ],
            [ o.name for o in qs ],
        )

    def test_step(self):
        qs = self.qs[1::2]

        self.assertEqual(
            [
                'subdir/index.md',
                'test1.rst',
                'test2.rst',
            ],
            [ o.name for o in qs ],
        )

    def test_sliced_step1(self):
        qs = self.qs[1::2][:1]

        self.assertEqual(
            [
                'subdir/index.md',
            ],
            [ o.name for o in qs ],
        )

    def test_sliced_step2(self):
        qs = self.qs[1::2][::]

        self.assertEqual(
            [
                'subdir/index.md',
                'test1.rst',
                'test2.rst',
            ],
            [ o.name for o in qs ],
        )

    def test_sliced_step3(self):
        qs = self.qs[1:][::2]

        self.assertEqual(
            [
                'subdir/index.md',
                'test1.rst',
                'test2.rst',
            ],
            [ o.name for o in qs ],
        )