2016-02-11 03:22:23 +00:00
|
|
|
#! /usr/bin/python
|
|
|
|
|
2016-02-11 19:29:00 +00:00
|
|
|
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
|
2016-02-15 22:01:55 +00:00
|
|
|
import errno
|
2016-02-18 02:31:51 +00:00
|
|
|
import shutil
|
2016-02-11 03:22:23 +00:00
|
|
|
|
2016-02-16 07:52:52 +00:00
|
|
|
import collections
|
2016-02-18 02:31:51 +00:00
|
|
|
from .utils import logger, logdir, statfiles
|
2016-02-11 17:15:22 +00:00
|
|
|
|
|
|
|
|
2016-02-15 22:01:55 +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
|
|
|
|
2016-02-17 21:50:06 +00:00
|
|
|
def __init__(self, dirname, stem):
|
2016-02-15 22:01:55 +00:00
|
|
|
self.dirname = dirname
|
2016-02-17 21:50:06 +00:00
|
|
|
self.stem = stem
|
2016-02-11 17:15:22 +00:00
|
|
|
|
|
|
|
@property
|
2016-02-15 22:01:55 +00:00
|
|
|
def name_txt(self):
|
|
|
|
return os.path.join(self.dirname, self.stem + '.txt')
|
2016-02-11 17:15:22 +00:00
|
|
|
|
|
|
|
@property
|
2016-02-15 22:01:55 +00:00
|
|
|
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
|
2016-02-15 22:01:55 +00:00
|
|
|
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
|
2016-02-15 22:01:55 +00:00
|
|
|
def name_htmls(self):
|
|
|
|
return os.path.join(self.dirname, self.stem + '-single.html')
|
|
|
|
|
2016-02-18 03:04:21 +00:00
|
|
|
@property
|
|
|
|
def name_epub(self):
|
|
|
|
return os.path.join(self.dirname, self.stem + '.epub')
|
|
|
|
|
2016-02-16 05:04:41 +00:00
|
|
|
@property
|
|
|
|
def name_index(self):
|
|
|
|
return os.path.join(self.dirname, 'index.html')
|
|
|
|
|
2016-02-15 22:01:55 +00:00
|
|
|
|
|
|
|
class OutputDirectory(OutputNamingConvention):
|
|
|
|
|
2016-02-16 07:52:52 +00:00
|
|
|
def __repr__(self):
|
|
|
|
return '<%s:%s>' % (self.__class__.__name__, self.dirname)
|
|
|
|
|
2016-02-15 22:01:55 +00:00
|
|
|
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)
|
2016-02-16 22:13:17 +00:00
|
|
|
raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), parent)
|
2016-02-17 19:19:48 +00:00
|
|
|
self.statinfo = statfiles(self.dirname, relative=self.dirname)
|
2016-02-17 08:17:49 +00:00
|
|
|
self.status = 'output'
|
2016-02-18 02:31:51 +00:00
|
|
|
self.logdir = os.path.join(self.dirname, logdir)
|
2016-02-17 21:50:06 +00:00
|
|
|
super(OutputDirectory, self).__init__(self.dirname, self.stem)
|
2016-02-15 22:01:55 +00:00
|
|
|
|
2016-02-18 03:19:48 +00:00
|
|
|
@property
|
|
|
|
def iscomplete(self):
|
|
|
|
files = list()
|
|
|
|
for prop in self.expected:
|
|
|
|
name = getattr(self, prop, None)
|
|
|
|
assert name is not None
|
|
|
|
files.append(os.path.isfile(name))
|
|
|
|
return all(files)
|
|
|
|
|
2016-02-16 05:04:41 +00:00
|
|
|
def clean(self):
|
2016-02-18 02:31:51 +00:00
|
|
|
logger.info("%s cleaning dir %s.", self.stem, self.dirname)
|
2016-02-18 03:04:21 +00:00
|
|
|
if os.path.isdir(self.dirname):
|
|
|
|
shutil.rmtree(self.dirname)
|
2016-02-15 22:01:55 +00:00
|
|
|
|
2016-02-18 02:31:51 +00:00
|
|
|
def prebuild_hook(self):
|
2016-02-18 03:04:21 +00:00
|
|
|
self.clean()
|
2016-02-18 02:31:51 +00:00
|
|
|
for d in (self.dirname, self.logdir):
|
|
|
|
if not os.path.isdir(d):
|
|
|
|
logger.info("%s creating dir %s.", self.stem, d)
|
|
|
|
os.mkdir(d)
|
2016-02-18 03:04:21 +00:00
|
|
|
self.copy_ancillaries(self.dirname)
|
2016-02-18 02:31:51 +00:00
|
|
|
|
|
|
|
def build_failure_hook(self):
|
|
|
|
logger.critical("%s FAILURE, see logs in %s", self.stem, self.logdir)
|
|
|
|
|
|
|
|
def build_success_hook(self):
|
|
|
|
logger.info("%s SUCCESS!", self.stem)
|
|
|
|
logger.debug("%s removing logs %s)", self.stem, self.logdir)
|
|
|
|
if os.path.isdir(self.logdir):
|
|
|
|
shutil.rmtree(logdir)
|
|
|
|
|
2016-02-15 22:01:55 +00:00
|
|
|
|
2016-02-16 07:52:52 +00:00
|
|
|
class OutputCollection(collections.MutableMapping):
|
2016-02-15 22:01:55 +00:00
|
|
|
|
|
|
|
def __repr__(self):
|
2016-02-16 07:52:52 +00:00
|
|
|
return '<%s:(%s docs)>' % (self.__class__.__name__, len(self))
|
2016-02-15 22:01:55 +00:00
|
|
|
|
2016-02-17 07:43:07 +00:00
|
|
|
def __init__(self, dirname=None):
|
|
|
|
if dirname is None:
|
|
|
|
return
|
|
|
|
elif not os.path.isdir(dirname):
|
2016-02-15 22:01:55 +00:00
|
|
|
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)
|
2016-02-16 05:55:58 +00:00
|
|
|
for fname in os.listdir(dirname):
|
|
|
|
name = os.path.join(dirname, fname)
|
2016-02-15 22:01:55 +00:00
|
|
|
if not os.path.isdir(name):
|
2016-02-17 07:43:07 +00:00
|
|
|
logger.info("Skipping non-directory %s (in %s)", name, dirname)
|
2016-02-16 22:13:17 +00:00
|
|
|
continue
|
2016-02-16 05:04:41 +00:00
|
|
|
o = OutputDirectory(name)
|
2016-02-17 07:43:07 +00:00
|
|
|
assert o.stem not in self
|
2016-02-16 05:55:58 +00:00
|
|
|
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-15 22:01:55 +00:00
|
|
|
#
|
2016-02-11 03:22:23 +00:00
|
|
|
# -- end of file
|