2016-02-13 07:48:48 +00:00
|
|
|
|
|
|
|
from __future__ import absolute_import, division, print_function
|
|
|
|
|
|
|
|
import os
|
2016-02-16 05:32:35 +00:00
|
|
|
import errno
|
2016-02-13 07:48:48 +00:00
|
|
|
import unittest
|
|
|
|
from tempfile import NamedTemporaryFile as ntf
|
|
|
|
from tempfile import mkdtemp, mkstemp
|
|
|
|
import shutil
|
2016-02-13 20:32:05 +00:00
|
|
|
import random
|
|
|
|
|
|
|
|
try:
|
|
|
|
from types import SimpleNamespace
|
|
|
|
except ImportError:
|
|
|
|
from utils import SimpleNamespace
|
2016-02-13 07:48:48 +00:00
|
|
|
|
|
|
|
# -- Test Data
|
2016-02-13 20:32:05 +00:00
|
|
|
import examples
|
2016-02-13 07:48:48 +00:00
|
|
|
|
|
|
|
# -- SUT
|
2016-02-16 07:52:08 +00:00
|
|
|
from tldp.sources import SourceCollection, SourceDocument
|
2016-02-13 07:48:48 +00:00
|
|
|
|
2016-02-13 20:32:05 +00:00
|
|
|
datadir = os.path.join(os.path.dirname(__file__), 'testdata')
|
|
|
|
|
|
|
|
|
|
|
|
def stem_and_ext(name):
|
|
|
|
stem, ext = os.path.splitext(os.path.basename(name))
|
|
|
|
assert ext != ''
|
|
|
|
return stem, ext
|
|
|
|
|
2016-02-16 18:44:05 +00:00
|
|
|
def dir_to_components(reldir):
|
|
|
|
reldir = os.path.normpath(reldir)
|
|
|
|
components = list()
|
|
|
|
while reldir != '':
|
|
|
|
reldir, basename = os.path.split(reldir)
|
|
|
|
components.append(basename)
|
|
|
|
assert len(components) >= 1
|
|
|
|
components.reverse()
|
|
|
|
return components
|
|
|
|
|
2016-02-13 07:48:48 +00:00
|
|
|
|
2016-02-16 07:52:08 +00:00
|
|
|
class TestSourceCollection(unittest.TestCase):
|
2016-02-13 07:48:48 +00:00
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
self.tempdir = mkdtemp(prefix='tldp-sources-test-')
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
shutil.rmtree(self.tempdir)
|
|
|
|
|
2016-02-16 18:44:05 +00:00
|
|
|
def adddir(self, reldir):
|
|
|
|
components = dir_to_components(reldir)
|
|
|
|
absdir = self.tempdir
|
2016-02-13 20:32:05 +00:00
|
|
|
while components:
|
2016-02-16 18:44:05 +00:00
|
|
|
absdir = os.path.join(absdir, components.pop(0))
|
|
|
|
if not os.path.isdir(absdir):
|
|
|
|
os.mkdir(absdir)
|
|
|
|
self.assertTrue(os.path.isdir(absdir))
|
|
|
|
relpath = os.path.relpath(absdir, self.tempdir)
|
|
|
|
return relpath, absdir
|
2016-02-13 20:32:05 +00:00
|
|
|
|
|
|
|
def addfile(self, dirname, exfile, stem=None, ext=None):
|
|
|
|
if stem is None:
|
|
|
|
stem, _ = stem_and_ext(exfile.filename)
|
|
|
|
if ext is None:
|
|
|
|
_, ext = stem_and_ext(exfile.filename)
|
|
|
|
newname = os.path.join(dirname, stem + ext)
|
|
|
|
shutil.copy(exfile.filename, newname)
|
|
|
|
relname = os.path.relpath(newname, self.tempdir)
|
|
|
|
return relname, newname
|
|
|
|
|
|
|
|
|
2016-02-16 07:52:08 +00:00
|
|
|
class TestFileSourceCollectionMultiDir(TestSourceCollection):
|
2016-02-13 20:32:05 +00:00
|
|
|
|
|
|
|
def test_multidir_finding_singlefiles(self):
|
|
|
|
ex = random.choice(examples.examples)
|
2016-02-16 18:44:05 +00:00
|
|
|
doc0 = SimpleNamespace(reldir='LDP/howto', stem="A-Unique-Stem")
|
|
|
|
doc1 = SimpleNamespace(reldir='LDP/guide', stem="A-Different-Stem")
|
2016-02-13 20:32:05 +00:00
|
|
|
documents = (doc0, doc1)
|
|
|
|
for d in documents:
|
2016-02-16 18:44:05 +00:00
|
|
|
d.reldir, d.absdir = self.adddir(d.reldir)
|
2016-02-13 20:32:05 +00:00
|
|
|
d.relname, d.absname = self.addfile(d.absdir, ex, stem=d.stem)
|
2016-02-16 07:52:08 +00:00
|
|
|
s = SourceCollection([x.absdir for x in documents])
|
2016-02-16 05:51:56 +00:00
|
|
|
self.assertEquals(2, len(s))
|
2016-02-16 18:44:05 +00:00
|
|
|
expected = set([x.stem for x in documents])
|
|
|
|
found = set(s.keys())
|
|
|
|
self.assertEquals(expected, found)
|
|
|
|
|
|
|
|
def test_multidir_finding_namecollision(self):
|
|
|
|
ex = random.choice(examples.examples)
|
|
|
|
doc0 = SimpleNamespace(reldir='LDP/howto', stem="A-Non-Unique-Stem")
|
|
|
|
doc1 = SimpleNamespace(reldir='LDP/guide', stem="A-Non-Unique-Stem")
|
|
|
|
documents = (doc0, doc1)
|
|
|
|
for d in documents:
|
|
|
|
d.reldir, d.absdir = self.adddir(d.reldir)
|
|
|
|
d.relname, d.absname = self.addfile(d.absdir, ex, stem=d.stem)
|
|
|
|
s = SourceCollection([x.absdir for x in documents])
|
|
|
|
self.assertEquals(1, len(s))
|
|
|
|
expected = set([x.stem for x in documents])
|
|
|
|
found = set(s.keys())
|
|
|
|
self.assertEquals(expected, found)
|
2016-02-13 20:32:05 +00:00
|
|
|
|
|
|
|
|
2016-02-16 07:52:08 +00:00
|
|
|
class TestFileSourceCollectionOneDir(TestSourceCollection):
|
2016-02-13 20:32:05 +00:00
|
|
|
|
2016-02-16 18:44:05 +00:00
|
|
|
def test_finding_nonfile(self):
|
|
|
|
maindir = 'LDP/LDP/howto'
|
|
|
|
reldir, absdir = self.adddir(maindir)
|
|
|
|
os.mkfifo(os.path.join(absdir, 'non-dir-non-file.rst'))
|
|
|
|
s = SourceCollection([absdir])
|
|
|
|
self.assertEquals(0, len(s))
|
|
|
|
|
2016-02-13 20:32:05 +00:00
|
|
|
def test_finding_singlefile(self):
|
|
|
|
ex = random.choice(examples.examples)
|
2016-02-16 18:44:05 +00:00
|
|
|
maindir = 'LDP/LDP/howto'
|
|
|
|
reldir, absdir = self.adddir(maindir)
|
2016-02-13 20:32:05 +00:00
|
|
|
_, _ = self.addfile(absdir, ex)
|
2016-02-16 07:52:08 +00:00
|
|
|
s = SourceCollection([absdir])
|
2016-02-16 05:51:56 +00:00
|
|
|
self.assertEquals(1, len(s))
|
2016-02-13 20:32:05 +00:00
|
|
|
|
|
|
|
def test_skipping_misnamed_singlefile(self):
|
|
|
|
ex = random.choice(examples.examples)
|
2016-02-16 18:44:05 +00:00
|
|
|
maindir = 'LDP/LDP/howto'
|
|
|
|
reldir, absdir = self.adddir(maindir)
|
2016-02-13 20:32:05 +00:00
|
|
|
self.addfile(absdir, ex, ext=".mis")
|
2016-02-16 07:52:08 +00:00
|
|
|
s = SourceCollection([absdir])
|
2016-02-16 05:51:56 +00:00
|
|
|
self.assertEquals(1, len(s))
|
2016-02-13 20:32:05 +00:00
|
|
|
|
2016-02-16 18:44:05 +00:00
|
|
|
def test_multiple_stems_of_different_extensions(self):
|
|
|
|
ex = random.choice(examples.examples)
|
|
|
|
stem = 'A-Non-Unique-Stem'
|
|
|
|
maindir = os.path.join('LDP/LDP/howto', stem)
|
|
|
|
reldir, absdir = self.adddir(maindir)
|
|
|
|
self.addfile(absdir, ex, stem=stem, ext=".xml")
|
|
|
|
self.addfile(absdir, ex, stem=stem, ext=".md")
|
|
|
|
s = SourceCollection([absdir])
|
|
|
|
self.assertEquals(1, len(s))
|
|
|
|
|
2016-02-13 20:32:05 +00:00
|
|
|
|
2016-02-16 07:52:08 +00:00
|
|
|
class TestInvalidSourceCollection(TestSourceCollection):
|
2016-02-13 07:48:48 +00:00
|
|
|
|
|
|
|
def test_validateDirs_onebad(self):
|
|
|
|
invalid0 = os.path.join(self.tempdir, 'unique', 'rabbit')
|
2016-02-16 05:32:35 +00:00
|
|
|
with self.assertRaises(IOError) as ecm:
|
2016-02-16 07:52:08 +00:00
|
|
|
SourceCollection([invalid0])
|
2016-02-13 07:48:48 +00:00
|
|
|
e = ecm.exception
|
2016-02-16 05:32:35 +00:00
|
|
|
self.assertTrue('unique/rabbit' in e.filename)
|
2016-02-13 07:48:48 +00:00
|
|
|
|
|
|
|
def test_validateDirs_multibad(self):
|
|
|
|
invalid0 = os.path.join(self.tempdir, 'unique', 'rabbit')
|
|
|
|
invalid1 = os.path.join(self.tempdir, 'affable', 'elephant')
|
2016-02-16 05:32:35 +00:00
|
|
|
with self.assertRaises(IOError) as ecm:
|
2016-02-16 07:52:08 +00:00
|
|
|
SourceCollection([invalid0, invalid1])
|
2016-02-13 07:48:48 +00:00
|
|
|
e = ecm.exception
|
2016-02-16 05:32:35 +00:00
|
|
|
self.assertTrue('affable/elephant' in e.filename)
|
2016-02-13 07:48:48 +00:00
|
|
|
|
|
|
|
def testEmptyDir(self):
|
2016-02-16 07:52:08 +00:00
|
|
|
s = SourceCollection([self.tempdir])
|
2016-02-16 05:51:56 +00:00
|
|
|
self.assertEquals(0, len(s))
|
2016-02-13 20:32:05 +00:00
|
|
|
|
2016-02-13 07:48:48 +00:00
|
|
|
|
2016-02-16 07:52:08 +00:00
|
|
|
class TestMissingSourceDocuments(TestSourceCollection):
|
2016-02-13 07:59:44 +00:00
|
|
|
|
|
|
|
def test_init_missing(self):
|
|
|
|
missing = os.path.join(self.tempdir, 'vanishing')
|
2016-02-16 05:32:35 +00:00
|
|
|
with self.assertRaises(IOError) as ecm:
|
2016-02-13 07:59:44 +00:00
|
|
|
SourceDocument(missing)
|
|
|
|
e = ecm.exception
|
2016-02-16 05:32:35 +00:00
|
|
|
self.assertEquals(errno.ENOENT, e.errno)
|
2016-02-13 07:59:44 +00:00
|
|
|
|
2016-02-16 05:32:35 +00:00
|
|
|
with self.assertRaises(TypeError) as ecm:
|
2016-02-13 07:59:44 +00:00
|
|
|
SourceDocument(self.tempdir)
|
|
|
|
e = ecm.exception
|
|
|
|
self.assertTrue('Wrong type' in e.message)
|
|
|
|
|
2016-02-13 07:48:48 +00:00
|
|
|
#
|
|
|
|
# -- end of file
|