adjust SourceDirs to behave like a dictionary

This commit is contained in:
Martin A. Brown 2016-02-15 21:51:56 -08:00
parent 01bee4a269
commit 55ef688015
2 changed files with 40 additions and 22 deletions

View File

@ -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):

View File

@ -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