Initial import to Tizen
[profile/ivi/python-twisted.git] / twisted / lore / process.py
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))