#! /usr/bin/python # -*- coding: utf8 -*- from __future__ import absolute_import, division, print_function import os import sys import logging logger = logging.getLogger(__name__) import tldp from argparse import Namespace def detail(config, args): i = tldp.inventory.Inventory(config.pubdir, config.sourcedir) width = Namespace() width.status = max([len(x) for x in tldp.inventory.status_types]) width.stem = max([len(x) for x in i.source.keys()]) # -- if user just said "list" with no args, then give the user something # sane, "all"; it would make sense for this to be "work", too, but # "all" seems to be less surprising # if not args: args.append('all') for arg in args: status_class = tldp.inventory.status_classes[arg] for status in status_class: s = getattr(i, status, None) assert s is not None for stem, doc in s.items(): # -- a 'stale' or 'broken' document is implicitly a 'published' # document as well, but we only want to list each document # once # if doc.status == status: doc.detail(width, config.verbose, file=sys.stdout) return 0 def status(config, args): i = tldp.inventory.Inventory(config.pubdir, config.sourcedir) width = Namespace() width.status = max([len(x) for x in tldp.inventory.status_types]) width.count = len(str(len(i.source.keys()))) for status in tldp.inventory.status_types: if status == 'all': continue count = len(getattr(i, status, 0)) s = '{0:{w.status}} {1:{w.count}} '.format(status, count, w=width) print(s, end="") if config.verbose: print('\t'.join(getattr(i, status).keys())) else: abbrev = getattr(i, status).keys() displaynum = 3 if len(abbrev) > displaynum: abbrev = abbrev[:displaynum] remainder = count - displaynum abbrev.append('[and %d more]' % (remainder,)) print('\t'.join(abbrev)) return 0 def build(config, args): targets = list() stems = list() if args: for arg in args: if os.path.isfile(arg) or os.path.isdir(arg): source = tldp.sources.SourceDocument(arg) targets.append(source) else: stems.append(arg) if stems or not args: i = tldp.inventory.Inventory(config.pubdir, config.sourcedir) if stems: for source in i.source.values(): if source.stem in stems: targets.append(source) else: targets.extend(i.new.values()) targets.extend(i.stale.values()) targets.extend(i.broken.values()) for source in targets: if source.stem in config.skip: logger.info("%s skipping build per request", source.stem) continue if not source.output: dirname = os.path.join(config.pubdir, source.stem) source.output = tldp.outputs.OutputDirectory(dirname) if not source.doctype: logger.warning("%s skipping document of unknown doctype", source.stem) continue output = source.output runner = source.doctype(source=source, output=output, config=config) runner.generate() return 0 def run(): tag = os.path.basename(sys.argv[0]).strip('.py') argv = sys.argv[1:] config, args = tldp.config.collectconfiguration(tag, argv) # -- check to see if the user wishes to --list things # this function and friends is called 'detail', because # Python reserves a special (fundamental) meaning for the word # list; but for the end-user they are synonyms # if config.detail: sys.exit(detail(config, args)) # -- check to see if the user wants --status output # if config.status: if config.pubdir is None: sys.exit("Option --pubdir required for --status.") if not config.sourcedir: sys.exit("Option --sourcedir required for --status.") sys.exit(status(config, args)) # -- our primary action is to try to build if config.build is None: config.all = True sys.exit(build(config, args)) # # -- end of file