diff --git a/tests/test_sources.py b/tests/test_sources.py index c75dd4b..5e84c8c 100644 --- a/tests/test_sources.py +++ b/tests/test_sources.py @@ -70,9 +70,9 @@ class TestFileSourceDirsMultiDir(TestSourceDirs): d.reldir, d.absdir = self.mkdir_components(d.components) d.relname, d.absname = self.addfile(d.absdir, ex, stem=d.stem) 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]) - found = set([x.stem for x in s.docs]) + found = set([x for x in s]) self.assertEquals(sought, found) @@ -84,7 +84,7 @@ class TestFileSourceDirsOneDir(TestSourceDirs): reldir, absdir = self.mkdir_components(maindir) _, _ = self.addfile(absdir, ex) s = SourceDirs([absdir]) - self.assertEquals(1, len(s.docs)) + self.assertEquals(1, len(s)) def test_skipping_misnamed_singlefile(self): ex = random.choice(examples.examples) @@ -92,7 +92,7 @@ class TestFileSourceDirsOneDir(TestSourceDirs): reldir, absdir = self.mkdir_components(maindir) self.addfile(absdir, ex, ext=".mis") s = SourceDirs([absdir]) - self.assertEquals(1, len(s.docs)) + self.assertEquals(1, len(s)) class TestInvalidSourceDirs(TestSourceDirs): @@ -114,7 +114,9 @@ class TestInvalidSourceDirs(TestSourceDirs): def testEmptyDir(self): s = SourceDirs([self.tempdir]) - self.assertEquals(0, len(s.docs)) + import pprint + pprint.pprint(s.__dict__) + self.assertEquals(0, len(s)) class TestMissingSourceDocuments(TestSourceDirs): diff --git a/tldp/sources.py b/tldp/sources.py index 64980c9..70680cd 100644 --- a/tldp/sources.py +++ b/tldp/sources.py @@ -4,47 +4,62 @@ from __future__ import absolute_import, division, print_function import os import errno +import collections from .utils import logger from .typeguesser import guess, knownextensions -class SourceDirs(object): +class SourceDirs(collections.MutableMapping): def __repr__(self): return '<%s:(%s docs)>' % \ - (self.__class__.__name__, len(self.docs)) + (self.__class__.__name__, len(self)) def __init__(self, args): - self.sourcedirs = [os.path.abspath(x) for x in args] - self.docs = list() - self.validateDirs() - self.enumerateDocuments() - self.docs.sort(key=lambda x: x.stem.lower()) + sourcedirs = [os.path.abspath(x) for x in args] + results = [os.path.exists(x) for x in sourcedirs] - def validateDirs(self): - results = [os.path.exists(x) for x in self.sourcedirs] 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) raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), sdir) - def enumerateDocuments(self): - for sdir in self.sourcedirs: - docs = list() + for sdir in sourcedirs: + docs = dict() for fname in os.listdir(sdir): possible = os.path.join(sdir, fname) if os.path.isfile(possible): - docs.append(SourceDocument(possible)) + this = SourceDocument(possible) + docs[this.stem] = this elif os.path.isdir(fname): stem = os.path.basename(fname) for ext in knownextensions: possible = os.path.join(sdir, fname, stem + ext) 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) - self.docs.extend(docs) - logger.info("Discovered %s documents total", len(self.docs)) + self.update(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): @@ -81,4 +96,5 @@ class SourceDocument(object): def doctype(self): return guess(self.filename) +# # -- end of file