python-tldp/tldp/outputs.py

109 lines
3.2 KiB
Python
Raw Normal View History

2016-02-11 03:22:23 +00:00
#! /usr/bin/python
from __future__ import absolute_import, division, print_function
2016-02-11 17:15:22 +00:00
2016-02-11 03:22:23 +00:00
import os
import errno
2016-02-11 03:22:23 +00:00
2016-02-16 07:52:52 +00:00
import collections
from .utils import logger, getfileset
2016-02-11 17:15:22 +00:00
class OutputNamingConvention(object):
2016-02-11 17:15:22 +00:00
2016-02-16 05:04:41 +00:00
expected = ['name_txt', 'name_pdf', 'name_htmls', 'name_html',
'name_index']
2016-02-11 17:15:22 +00:00
def __init__(self, stem, dirname):
self.stem = stem
self.dirname = dirname
2016-02-11 17:15:22 +00:00
@property
def name_txt(self):
return os.path.join(self.dirname, self.stem + '.txt')
2016-02-11 17:15:22 +00:00
@property
def name_pdf(self):
return os.path.join(self.dirname, self.stem + '.pdf')
2016-02-11 03:22:23 +00:00
2016-02-11 17:15:22 +00:00
@property
def name_html(self):
return os.path.join(self.dirname, self.stem + '.html')
2016-02-11 03:22:23 +00:00
2016-02-11 17:15:22 +00:00
@property
def name_htmls(self):
return os.path.join(self.dirname, self.stem + '-single.html')
2016-02-16 05:04:41 +00:00
@property
def name_index(self):
return os.path.join(self.dirname, 'index.html')
class OutputDirectory(OutputNamingConvention):
2016-02-16 07:52:52 +00:00
def __repr__(self):
return '<%s:%s>' % (self.__class__.__name__, self.dirname)
def __init__(self, dirname):
self.dirname = os.path.abspath(dirname)
self.stem = os.path.basename(self.dirname)
parent = os.path.dirname(self.dirname)
if not os.path.isdir(parent):
logger.critical("Missing output tree %s.", parent)
raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), parent)
if not os.path.isdir(self.dirname):
logger.info("%s creating output directory %s.", self.stem, dirname)
os.mkdir(dirname)
self.fileset = getfileset(self.dirname)
super(OutputDirectory, self).__init__(self.stem, self.dirname)
2016-02-16 05:04:41 +00:00
def clean(self):
logger.info("%s cleaning directory %s.", self.stem, self.dirname)
for oformat in self.expected:
name = getattr(self, oformat, None)
assert name is not None
2016-02-16 05:04:41 +00:00
if os.path.exists(name) or os.path.islink(name):
logger.info("%s cleaning directory %s, removing file %s",
self.stem, self.dirname, os.path.basename(name))
os.unlink(name)
2016-02-16 05:04:41 +00:00
return True
2016-02-16 07:52:52 +00:00
class OutputCollection(collections.MutableMapping):
def __repr__(self):
2016-02-16 07:52:52 +00:00
return '<%s:(%s docs)>' % (self.__class__.__name__, len(self))
def __init__(self, dirname=None):
if dirname is None:
return
elif not os.path.isdir(dirname):
logger.critical("Directory %s must already exist.", dirname)
2016-02-16 07:52:52 +00:00
raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), dirname)
for fname in os.listdir(dirname):
name = os.path.join(dirname, fname)
if not os.path.isdir(name):
logger.info("Skipping non-directory %s (in %s)", name, dirname)
continue
2016-02-16 05:04:41 +00:00
o = OutputDirectory(name)
assert o.stem not in self
self[o.stem] = o
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__)
#
2016-02-11 03:22:23 +00:00
# -- end of file