summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--scripts/builder/backendBuilder.py21
-rw-r--r--scripts/builder/frontendBuilder.py5
-rw-r--r--scripts/builder/repository.py4
3 files changed, 22 insertions, 8 deletions
diff --git a/scripts/builder/backendBuilder.py b/scripts/builder/backendBuilder.py
index 3e61955..5b91678 100644
--- a/scripts/builder/backendBuilder.py
+++ b/scripts/builder/backendBuilder.py
@@ -70,49 +70,62 @@ class BackendBuilder(object):
70 70
71 return result 71 return result
72 72
73 73
74 def logChecksums (self, content, message): 74 def logChecksums (self, content, message):
75 md5Digest = hashlib.md5(content.encode('utf-8')).hexdigest() 75 md5Digest = hashlib.md5(content.encode('utf-8')).hexdigest()
76 shaDigest = hashlib.sha1(content.encode('utf-8')).hexdigest() 76 shaDigest = hashlib.sha1(content.encode('utf-8')).hexdigest()
77 sha256Digest= hashlib.sha256(content.encode('utf-8')).hexdigest() 77 sha256Digest= hashlib.sha256(content.encode('utf-8')).hexdigest()
78 print message + ": " + md5Digest + " (md5)" 78 print message + ": " + md5Digest + " (md5)"
79 print message + ": " + shaDigest + " (sha1)" 79 print message + ": " + shaDigest + " (sha1)"
80 print message + ": " + sha256Digest + " (sha256)" 80 print message + ": " + sha256Digest + " (sha256)"
81 81
82 82
83 def shouldCompileCode (self): 83 def shouldCompileCode (self):
84 return ('debug' in self.versions) or ('install' in self.versions) 84 return ('debug' in self.versions) or ('install' in self.versions)
85 85
86 86
87 def run (self): 87 def run (self):
88 print self.name() + " - RUN" 88 print self.name() + " - RUN"
89 89
90 if self.shouldCompileCode(): 90 if self.shouldCompileCode():
91 self.compileCode() 91 self.compileCode()
92 92
93 for frontend in self.frontends: 93 for frontend in self.frontends:
94 if (frontend.module == frontend.submodule):
95 submoduleExtension = ''
96 else:
97 submoduleExtension = '.' + frontend.submodule
98
94 main.createFolder(os.path.join(self.frontEndTempFolder(), frontend.module)) 99 main.createFolder(os.path.join(self.frontEndTempFolder(), frontend.module))
95 100
96 if 'debug' in self.versions: 101 if 'debug' in self.versions:
97 frontend.copyResourcesToFolder(self.frontEndTempFolder()) 102 frontend.copyResourcesToFolder(self.frontEndTempFolder())
98 103
99 index = self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG')) 104 index = self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG'))
100 self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index_debug.html'), index) 105 self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index_debug' + submoduleExtension + '.html'), index)
101 106
102 if 'install' in self.versions: 107 if 'install' in self.versions:
103 index = self.configureIndexContent(frontend.assemble()) 108 index = self.configureIndexContent(frontend.assemble())
104 self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index.html'), index) 109 self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index' + submoduleExtension + '.html'), index)
105 110
106 self.logChecksums(index, "[" + self.name() + " - " + frontend.module + "] index.html checksum") 111 self.logChecksums(index, "[" + self.name() + " - " + frontend.module + "] index" + submoduleExtension + ".html checksum")
107 112
108 self.createPackage() 113 self.createPackage()
109 114
110 if 'development' in self.versions: 115 if 'development' in self.versions:
111 for frontend in self.frontends: 116 for frontend in self.frontends:
117 if (frontend.module == frontend.submodule):
118 submoduleExtension = ''
119 else:
120 submoduleExtension = '.' + frontend.submodule
121
122 print "FRONTEND module: " + frontend.module
123 print "FRONTEND submodule: " + frontend.submodule
124
112 main.createFolder(os.path.join(self.developmentTargetFolder(), frontend.module)) 125 main.createFolder(os.path.join(self.developmentTargetFolder(), frontend.module))
113 126
114 index = self.configureIndexContent(frontend.assemble(assemblyMode='DEVELOPMENT', versionType='DEBUG'), self.settings['development.settings']['url']) 127 index = self.configureIndexContent(frontend.assemble(assemblyMode='DEVELOPMENT', versionType='DEBUG'), self.settings['development.settings']['url'])
115 self.writeToFolder(self.developmentTargetFolder(), os.path.join(frontend.module, 'index.html'), index) 128 self.writeToFolder(self.developmentTargetFolder(), os.path.join(frontend.module, 'index' + submoduleExtension + '.html'), index)
116 129
117 130
118#=================================================================== 131#===================================================================
diff --git a/scripts/builder/frontendBuilder.py b/scripts/builder/frontendBuilder.py
index dae837b..1f0f92f 100644
--- a/scripts/builder/frontendBuilder.py
+++ b/scripts/builder/frontendBuilder.py
@@ -67,49 +67,50 @@ class FrontendBuilder(object):
67 67
68 def copyResourcesToFolder (self, targetFolder): 68 def copyResourcesToFolder (self, targetFolder):
69 self.copyResources(self.projectDir, targetFolder, 'css') 69 self.copyResources(self.projectDir, targetFolder, 'css')
70 self.copyResources(self.projectDir, targetFolder, 'js') 70 self.copyResources(self.projectDir, targetFolder, 'js')
71 71
72 72
73 def loadFilesContent (self, basePath, files): 73 def loadFilesContent (self, basePath, files):
74 result = "" 74 result = ""
75 75
76 for file in self.filterFiles(files): 76 for file in self.filterFiles(files):
77 try: 77 try:
78 fileHandler = codecs.open(self.absolutePathForSourceFile(basePath, file), 'r', 'utf-8') 78 fileHandler = codecs.open(self.absolutePathForSourceFile(basePath, file), 'r', 'utf-8')
79 except: 79 except:
80 print "FILE: " + file 80 print "FILE: " + file
81 81
82 result += fileHandler.read() + '\n' 82 result += fileHandler.read() + '\n'
83 fileHandler.close() 83 fileHandler.close()
84 84
85 return result 85 return result
86 86
87 87
88 def template (self): 88 def template (self):
89 processedFile = 'html_template' 89 processedFile = 'html_template'
90 if not self.processedFiles.has_key(processedFile): 90 if not self.processedFiles.has_key(processedFile):
91 self.processedFiles[processedFile] = self.loadFilesContent('html', ['index_template.html']) 91 #self.processedFiles[processedFile] = self.loadFilesContent('html', ['index_template.html'])
92 self.processedFiles[processedFile] = self.loadFilesContent('html', [self.settings['html.template']])
92 93
93 return self.processedFiles[processedFile] 94 return self.processedFiles[processedFile]
94 95
95 96
96 def cssminCompressor (self, css): 97 def cssminCompressor (self, css):
97 # package found here: 98 # package found here:
98 # - http://stackoverflow.com/questions/222581/python-script-for-minifying-css/2396777#2396777 99 # - http://stackoverflow.com/questions/222581/python-script-for-minifying-css/2396777#2396777
99 # actual downloaded version: http://pypi.python.org/pypi/cssmin/0.1.4 100 # actual downloaded version: http://pypi.python.org/pypi/cssmin/0.1.4
100 return cssmin.cssmin(css) 101 return cssmin.cssmin(css)
101 102
102 103
103 def regexCssCompressor (self, css): 104 def regexCssCompressor (self, css):
104 # http://stackoverflow.com/questions/222581/python-script-for-minifying-css/223689#223689 105 # http://stackoverflow.com/questions/222581/python-script-for-minifying-css/223689#223689
105 106
106 # remove comments - this will break a lot of hacks :-P 107 # remove comments - this will break a lot of hacks :-P
107 css = re.sub( r'\s*/\*\s*\*/', "$$HACK1$$", css ) # preserve IE<6 comment hack 108 css = re.sub( r'\s*/\*\s*\*/', "$$HACK1$$", css ) # preserve IE<6 comment hack
108 css = re.sub( r'/\*[\s\S]*?\*/', "", css ) 109 css = re.sub( r'/\*[\s\S]*?\*/', "", css )
109 css = css.replace( "$$HACK1$$", '/**/' ) # preserve IE<6 comment hack 110 css = css.replace( "$$HACK1$$", '/**/' ) # preserve IE<6 comment hack
110 111
111 # url() doesn't need quotes 112 # url() doesn't need quotes
112 css = re.sub( r'url\((["\'])([^)]*)\1\)', r'url(\2)', css ) 113 css = re.sub( r'url\((["\'])([^)]*)\1\)', r'url(\2)', css )
113 114
114 # spaces may be safely collapsed as generated content will collapse them anyway 115 # spaces may be safely collapsed as generated content will collapse them anyway
115 css = re.sub( r'\s+', ' ', css ) 116 css = re.sub( r'\s+', ' ', css )
@@ -298,49 +299,49 @@ class FrontendBuilder(object):
298 copyrightValues = self.settings['copyright.values'] 299 copyrightValues = self.settings['copyright.values']
299 license = self.loadFilesContent('../../properties', ['license.txt']) 300 license = self.loadFilesContent('../../properties', ['license.txt'])
300 result = self.loadFilesContent('properties', ['creditsAndCopyrights.txt']) 301 result = self.loadFilesContent('properties', ['creditsAndCopyrights.txt'])
301 302
302 result = re.sub('@clipperz.license@', license, result) 303 result = re.sub('@clipperz.license@', license, result)
303 for key in copyrightValues: 304 for key in copyrightValues:
304 result = re.sub('@'+key+'@', copyrightValues[key], result) 305 result = re.sub('@'+key+'@', copyrightValues[key], result)
305 306
306 self.processedFiles[processedFile] = result 307 self.processedFiles[processedFile] = result
307 308
308 return self.processedFiles[processedFile] 309 return self.processedFiles[processedFile]
309 310
310 311
311 def cssTagsForFiles (self, basePath, files): 312 def cssTagsForFiles (self, basePath, files):
312 #<link rel="stylesheet" type="text/css" href="./css/reset-min.css" /> 313 #<link rel="stylesheet" type="text/css" href="./css/reset-min.css" />
313 return '\n'.join(map(lambda file: '<link rel="stylesheet" type="text/css" href="' + basePath + '/' + file + '" />', files)) 314 return '\n'.join(map(lambda file: '<link rel="stylesheet" type="text/css" href="' + basePath + '/' + file + '" />', files))
314 315
315 316
316 def cssTagForContent (self, content): 317 def cssTagForContent (self, content):
317 return '<style type="text/css">' + content + '</style>' 318 return '<style type="text/css">' + content + '</style>'
318 319
319 320
320 def scriptTagsForFiles (self, basePath, files): 321 def scriptTagsForFiles (self, basePath, files):
321 #<script type='text/javascript' src='./js/src/bookmarklet.js'></script> 322 #<script type='text/javascript' src='./js/src/bookmarklet.js'></script>
322 return '\n'.join(map(lambda file: '<script type="text/javascript" src="' + basePath + '/' + file + '"></script>', files)) 323 return '\n'.join(map(lambda file: '<script type="text/javascript" src="' + basePath + '/' + file + '" charset="utf-8"></script>', files))
323 324
324 325
325 def scriptTagForContent (self, content): 326 def scriptTagForContent (self, content):
326 return '<script>' + content + '</script>' 327 return '<script>' + content + '</script>'
327 328
328 329
329 def assembleVersion (self, pageTitle, copyright, css, js, jsLoadMode, version, versionType): 330 def assembleVersion (self, pageTitle, copyright, css, js, jsLoadMode, version, versionType):
330 cacheKey = version + "-" + versionType 331 cacheKey = version + "-" + versionType
331 if not self.processedFiles.has_key(cacheKey): 332 if not self.processedFiles.has_key(cacheKey):
332 result = self.replaceTemplatePlaceholders(pageTitle, copyright, css, js, jsLoadMode, version, versionType) 333 result = self.replaceTemplatePlaceholders(pageTitle, copyright, css, js, jsLoadMode, version, versionType)
333 self.processedFiles[cacheKey] = result 334 self.processedFiles[cacheKey] = result
334 else: 335 else:
335 result = self.processedFiles[cacheKey] 336 result = self.processedFiles[cacheKey]
336 337
337 #self.log("# cacheKey:\n" + result) 338 #self.log("# cacheKey:\n" + result)
338 return result 339 return result
339 340
340 341
341 def assemble (self, assemblyMode='INSTALL', versionType='LIVE'): 342 def assemble (self, assemblyMode='INSTALL', versionType='LIVE'):
342 343
343 if versionType == 'LIVE': 344 if versionType == 'LIVE':
344 pageTitle = "Clipperz - " + self.module 345 pageTitle = "Clipperz - " + self.module
345 else: 346 else:
346 pageTitle = "Clipperz - " + self.module + " [" + versionType + " - " + assemblyMode +"]" 347 pageTitle = "Clipperz - " + self.module + " [" + versionType + " - " + assemblyMode +"]"
diff --git a/scripts/builder/repository.py b/scripts/builder/repository.py
index 89db9a5..9da98a2 100644
--- a/scripts/builder/repository.py
+++ b/scripts/builder/repository.py
@@ -29,47 +29,47 @@ class Repository(object):
29 29
30 def revision (self): 30 def revision (self):
31 raise NotImplementedError() 31 raise NotImplementedError()
32 32
33 33
34 def areTherePendingChanges (self): 34 def areTherePendingChanges (self):
35 raise NotImplementedError() 35 raise NotImplementedError()
36 36
37 37
38 def version (self): 38 def version (self):
39 result = self.revision() 39 result = self.revision()
40 if self.areTherePendingChanges(): 40 if self.areTherePendingChanges():
41 result = '>>> ' + result + ' <<<' 41 result = '>>> ' + result + ' <<<'
42 42
43 # print "VERSION: " + result 43 # print "VERSION: " + result
44 return result 44 return result
45 45
46 46
47#=================================================================== 47#===================================================================
48 48
49 49
50class GitRepository(Repository): 50class GitRepository(Repository):
51 51
52 def revision (self): 52 def revision (self):
53 return repository.refs['HEAD'] 53 return self.repository.refs['HEAD']
54 54
55 55
56 def areTherePendingChanges (self): 56 def areTherePendingChanges (self):
57 return repository.is_dirty() 57 return self.repository.is_dirty()
58 58
59 59
60#=================================================================== 60#===================================================================
61 61
62 62
63class HgRepository(Repository): 63class HgRepository(Repository):
64 #http://mercurial.selenic.com/wiki/MercurialApi 64 #http://mercurial.selenic.com/wiki/MercurialApi
65 65
66 def revision (self): 66 def revision (self):
67 return 'hg:' + str(self.repository['tip']) 67 return 'hg:' + str(self.repository['tip'])
68 68
69 69
70 def areTherePendingChanges (self): 70 def areTherePendingChanges (self):
71 # TODO: FIXME: repository.status() does not report 'unknown(?)' files. :( 71 # TODO: FIXME: repository.status() does not report 'unknown(?)' files. :(
72 return not all(map(lambda fileList: len(fileList) == 0, self.repository.status())) 72 return not all(map(lambda fileList: len(fileList) == 0, self.repository.status()))
73 73
74 74
75#=================================================================== 75#===================================================================