mirror of https://github.com/tLDP/python-tldp
adjust SourceDirs to behave like a dictionary
This commit is contained in:
parent
01bee4a269
commit
55ef688015
|
@ -70,9 +70,9 @@ class TestFileSourceDirsMultiDir(TestSourceDirs):
|
||||||
d.reldir, d.absdir = self.mkdir_components(d.components)
|
d.reldir, d.absdir = self.mkdir_components(d.components)
|
||||||
d.relname, d.absname = self.addfile(d.absdir, ex, stem=d.stem)
|
d.relname, d.absname = self.addfile(d.absdir, ex, stem=d.stem)
|
||||||
s = SourceDirs([x.absdir for x in documents])
|
s = SourceDirs([x.absdir for x in documents])
|
||||||
self.assertEquals(2, len(s.docs))
|
self.assertEquals(2, len(s))
|
||||||
sought = set([x.stem for x in documents])
|
sought = set([x.stem for x in documents])
|
||||||
found = set([x.stem for x in s.docs])
|
found = set([x for x in s])
|
||||||
self.assertEquals(sought, found)
|
self.assertEquals(sought, found)
|
||||||
|
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ class TestFileSourceDirsOneDir(TestSourceDirs):
|
||||||
reldir, absdir = self.mkdir_components(maindir)
|
reldir, absdir = self.mkdir_components(maindir)
|
||||||
_, _ = self.addfile(absdir, ex)
|
_, _ = self.addfile(absdir, ex)
|
||||||
s = SourceDirs([absdir])
|
s = SourceDirs([absdir])
|
||||||
self.assertEquals(1, len(s.docs))
|
self.assertEquals(1, len(s))
|
||||||
|
|
||||||
def test_skipping_misnamed_singlefile(self):
|
def test_skipping_misnamed_singlefile(self):
|
||||||
ex = random.choice(examples.examples)
|
ex = random.choice(examples.examples)
|
||||||
|
@ -92,7 +92,7 @@ class TestFileSourceDirsOneDir(TestSourceDirs):
|
||||||
reldir, absdir = self.mkdir_components(maindir)
|
reldir, absdir = self.mkdir_components(maindir)
|
||||||
self.addfile(absdir, ex, ext=".mis")
|
self.addfile(absdir, ex, ext=".mis")
|
||||||
s = SourceDirs([absdir])
|
s = SourceDirs([absdir])
|
||||||
self.assertEquals(1, len(s.docs))
|
self.assertEquals(1, len(s))
|
||||||
|
|
||||||
|
|
||||||
class TestInvalidSourceDirs(TestSourceDirs):
|
class TestInvalidSourceDirs(TestSourceDirs):
|
||||||
|
@ -114,7 +114,9 @@ class TestInvalidSourceDirs(TestSourceDirs):
|
||||||
|
|
||||||
def testEmptyDir(self):
|
def testEmptyDir(self):
|
||||||
s = SourceDirs([self.tempdir])
|
s = SourceDirs([self.tempdir])
|
||||||
self.assertEquals(0, len(s.docs))
|
import pprint
|
||||||
|
pprint.pprint(s.__dict__)
|
||||||
|
self.assertEquals(0, len(s))
|
||||||
|
|
||||||
|
|
||||||
class TestMissingSourceDocuments(TestSourceDirs):
|
class TestMissingSourceDocuments(TestSourceDirs):
|
||||||
|
|
|
@ -4,47 +4,62 @@ from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import errno
|
import errno
|
||||||
|
import collections
|
||||||
|
|
||||||
from .utils import logger
|
from .utils import logger
|
||||||
from .typeguesser import guess, knownextensions
|
from .typeguesser import guess, knownextensions
|
||||||
|
|
||||||
|
|
||||||
class SourceDirs(object):
|
class SourceDirs(collections.MutableMapping):
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '<%s:(%s docs)>' % \
|
return '<%s:(%s docs)>' % \
|
||||||
(self.__class__.__name__, len(self.docs))
|
(self.__class__.__name__, len(self))
|
||||||
|
|
||||||
def __init__(self, args):
|
def __init__(self, args):
|
||||||
self.sourcedirs = [os.path.abspath(x) for x in args]
|
sourcedirs = [os.path.abspath(x) for x in args]
|
||||||
self.docs = list()
|
results = [os.path.exists(x) for x in sourcedirs]
|
||||||
self.validateDirs()
|
|
||||||
self.enumerateDocuments()
|
|
||||||
self.docs.sort(key=lambda x: x.stem.lower())
|
|
||||||
|
|
||||||
def validateDirs(self):
|
|
||||||
results = [os.path.exists(x) for x in self.sourcedirs]
|
|
||||||
if not all(results):
|
if not all(results):
|
||||||
for result, sdir in zip(results, self.sourcedirs):
|
for result, sdir in zip(results, sourcedirs):
|
||||||
logger.critical("Directory does not exist: " + sdir)
|
logger.critical("Directory does not exist: " + sdir)
|
||||||
raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), sdir)
|
raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), sdir)
|
||||||
|
|
||||||
def enumerateDocuments(self):
|
for sdir in sourcedirs:
|
||||||
for sdir in self.sourcedirs:
|
docs = dict()
|
||||||
docs = list()
|
|
||||||
for fname in os.listdir(sdir):
|
for fname in os.listdir(sdir):
|
||||||
possible = os.path.join(sdir, fname)
|
possible = os.path.join(sdir, fname)
|
||||||
if os.path.isfile(possible):
|
if os.path.isfile(possible):
|
||||||
docs.append(SourceDocument(possible))
|
this = SourceDocument(possible)
|
||||||
|
docs[this.stem] = this
|
||||||
elif os.path.isdir(fname):
|
elif os.path.isdir(fname):
|
||||||
stem = os.path.basename(fname)
|
stem = os.path.basename(fname)
|
||||||
for ext in knownextensions:
|
for ext in knownextensions:
|
||||||
possible = os.path.join(sdir, fname, stem + ext)
|
possible = os.path.join(sdir, fname, stem + ext)
|
||||||
if os.path.isfile(possible):
|
if os.path.isfile(possible):
|
||||||
docs.append(SourceDocument(possible))
|
this = SourceDocument(possible)
|
||||||
|
if not docs.has_key(this):
|
||||||
|
docs[this.stem] = this
|
||||||
|
else:
|
||||||
|
logger.critical("Uh-oh, duplicate STEM near %s", fname)
|
||||||
logger.debug("Discovered %s documents in %s", len(docs), sdir)
|
logger.debug("Discovered %s documents in %s", len(docs), sdir)
|
||||||
self.docs.extend(docs)
|
self.update(docs)
|
||||||
logger.info("Discovered %s documents total", len(self.docs))
|
logger.info("Discovered %s documents total", len(self))
|
||||||
|
|
||||||
|
def __delitem__(self, key):
|
||||||
|
del self.__dict__[key]
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
return self.__dict__[key]
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
self.__dict__[key] = value
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return iter(self.__dict__)
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.__dict__)
|
||||||
|
|
||||||
|
|
||||||
class SourceDocument(object):
|
class SourceDocument(object):
|
||||||
|
@ -81,4 +96,5 @@ class SourceDocument(object):
|
||||||
def doctype(self):
|
def doctype(self):
|
||||||
return guess(self.filename)
|
return guess(self.filename)
|
||||||
|
|
||||||
|
#
|
||||||
# -- end of file
|
# -- end of file
|
||||||
|
|
Loading…
Reference in New Issue