| 1 | # -*- test-case-name: twisted.lore.test.test_lore -*- |
|---|
| 2 | # Copyright (c) Twisted Matrix Laboratories. |
|---|
| 3 | # See LICENSE for details. |
|---|
| 4 | |
|---|
| 5 | # |
|---|
| 6 | import sys, os |
|---|
| 7 | import tree #todo: get rid of this later |
|---|
| 8 | import indexer |
|---|
| 9 | |
|---|
| 10 | class NoProcessorError(Exception): |
|---|
| 11 | pass |
|---|
| 12 | |
|---|
| 13 | class ProcessingFailure(Exception): |
|---|
| 14 | pass |
|---|
| 15 | |
|---|
| 16 | cols = 79 |
|---|
| 17 | |
|---|
| 18 | def dircount(d): |
|---|
| 19 | return len([1 for el in d.split("/") if el != '.']) |
|---|
| 20 | |
|---|
| 21 | |
|---|
| 22 | class Walker: |
|---|
| 23 | |
|---|
| 24 | def __init__(self, df, fext, linkrel): |
|---|
| 25 | self.df = df |
|---|
| 26 | self.linkrel = linkrel |
|---|
| 27 | self.fext = fext |
|---|
| 28 | self.walked = [] |
|---|
| 29 | self.failures = [] |
|---|
| 30 | |
|---|
| 31 | def walkdir(self, topdir, prefix=''): |
|---|
| 32 | self.basecount = dircount(topdir) |
|---|
| 33 | os.path.walk(topdir, self.walk, prefix) |
|---|
| 34 | |
|---|
| 35 | def walk(self, prefix, d, names): |
|---|
| 36 | linkrel = prefix + '../' * (dircount(d) - self.basecount) |
|---|
| 37 | for name in names: |
|---|
| 38 | fullpath = os.path.join(d, name) |
|---|
| 39 | fext = os.path.splitext(name)[1] |
|---|
| 40 | if fext == self.fext: |
|---|
| 41 | self.walked.append((linkrel, fullpath)) |
|---|
| 42 | |
|---|
| 43 | def generate(self): |
|---|
| 44 | i = 0 |
|---|
| 45 | indexer.clearEntries() |
|---|
| 46 | tree.filenum = 0 |
|---|
| 47 | for linkrel, fullpath in self.walked: |
|---|
| 48 | linkrel = self.linkrel + linkrel |
|---|
| 49 | i += 1 |
|---|
| 50 | fname = os.path.splitext(fullpath)[0] |
|---|
| 51 | self.percentdone((float(i) / len(self.walked)), fname) |
|---|
| 52 | try: |
|---|
| 53 | self.df(fullpath, linkrel) |
|---|
| 54 | except ProcessingFailure, e: |
|---|
| 55 | self.failures.append((fullpath, e)) |
|---|
| 56 | indexer.generateIndex() |
|---|
| 57 | self.percentdone(1., None) |
|---|
| 58 | |
|---|
| 59 | def percentdone(self, percent, fname): |
|---|
| 60 | # override for neater progress bars |
|---|
| 61 | proglen = 40 |
|---|
| 62 | hashes = int(percent * proglen) |
|---|
| 63 | spaces = proglen - hashes |
|---|
| 64 | progstat = "[%s%s] (%s)" %('#' * hashes, ' ' * spaces,fname or "*Done*") |
|---|
| 65 | progstat += (cols - len(progstat)) * ' ' |
|---|
| 66 | progstat += '\r' |
|---|
| 67 | sys.stdout.write(progstat) |
|---|
| 68 | sys.stdout.flush() |
|---|
| 69 | if fname is None: |
|---|
| 70 | print |
|---|
| 71 | |
|---|
| 72 | class PlainReportingWalker(Walker): |
|---|
| 73 | |
|---|
| 74 | def percentdone(self, percent, fname): |
|---|
| 75 | if fname: |
|---|
| 76 | print fname |
|---|
| 77 | |
|---|
| 78 | class NullReportingWalker(Walker): |
|---|
| 79 | |
|---|
| 80 | def percentdone(self, percent, fname): |
|---|
| 81 | pass |
|---|
| 82 | |
|---|
| 83 | def parallelGenerator(originalFileName, outputExtension): |
|---|
| 84 | return os.path.splitext(originalFileName)[0]+outputExtension |
|---|
| 85 | |
|---|
| 86 | def fooAddingGenerator(originalFileName, outputExtension): |
|---|
| 87 | return os.path.splitext(originalFileName)[0]+"foo"+outputExtension |
|---|
| 88 | |
|---|
| 89 | def outputdirGenerator(originalFileName, outputExtension, inputdir, outputdir): |
|---|
| 90 | originalFileName = os.path.abspath(originalFileName) |
|---|
| 91 | abs_inputdir = os.path.abspath(inputdir) |
|---|
| 92 | if os.path.commonprefix((originalFileName, abs_inputdir)) != abs_inputdir: |
|---|
| 93 | raise ValueError("Original file name '" + originalFileName + |
|---|
| 94 | "' not under input directory '" + abs_inputdir + "'") |
|---|
| 95 | |
|---|
| 96 | adjustedPath = os.path.join(outputdir, os.path.basename(originalFileName)) |
|---|
| 97 | return tree.getOutputFileName(adjustedPath, outputExtension) |
|---|
| 98 | |
|---|
| 99 | def getFilenameGenerator(config, outputExt): |
|---|
| 100 | if config.get('outputdir'): |
|---|
| 101 | return (lambda originalFileName, outputExtension: |
|---|
| 102 | outputdirGenerator(originalFileName, outputExtension, |
|---|
| 103 | os.path.abspath(config.get('inputdir')), |
|---|
| 104 | os.path.abspath(config.get('outputdir')))) |
|---|
| 105 | else: |
|---|
| 106 | return tree.getOutputFileName |
|---|
| 107 | |
|---|
| 108 | def getProcessor(module, output, config): |
|---|
| 109 | try: |
|---|
| 110 | m = getattr(module.factory, 'generate_'+output) |
|---|
| 111 | except AttributeError: |
|---|
| 112 | raise NoProcessorError("cannot generate "+output+" output") |
|---|
| 113 | |
|---|
| 114 | if config.get('ext'): |
|---|
| 115 | ext = config['ext'] |
|---|
| 116 | else: |
|---|
| 117 | from default import htmlDefault |
|---|
| 118 | ext = htmlDefault['ext'] |
|---|
| 119 | |
|---|
| 120 | return m(config, getFilenameGenerator(config, ext)) |
|---|