summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--scripts/builder/backendBuilder.py2
-rw-r--r--scripts/builder/frontendBuilder.py2
-rwxr-xr-xscripts/builder/main.py4
-rw-r--r--scripts/builder/phpBuilder.py2
-rw-r--r--scripts/builder/pythonBuilder.py2
5 files changed, 6 insertions, 6 deletions
diff --git a/scripts/builder/backendBuilder.py b/scripts/builder/backendBuilder.py
index f5dc7b2..16dbe2f 100644
--- a/scripts/builder/backendBuilder.py
+++ b/scripts/builder/backendBuilder.py
@@ -1,89 +1,89 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys, os, json
import shutil
import main
import hashlib
class BackendBuilder:
def __init__ (self, projectTargetDir, frontends, versions, settings):
self.projectTargetDir = projectTargetDir
self.frontends = frontends
self.versions = versions
self.settings = settings
def name (self):
raise NotImplementedError()
def relativePath (self):
raise NotImplementedError()
def compileCode (self):
pass
def copyCompiledCodeToTargetDir (self):
src = self.sourceFolder()
dst = self.targetFolder()
main.createFolder(os.path.dirname(dst))
shutil.copytree(src, dst)
def sourceFolder (self):
return main.projectBaseDir() + '/backend/' + self.relativePath() + '/src'
def targetFolder (self):
return self.projectTargetDir + self.relativePath()
def createTargetFolder (self):
main.createFolder(self.targetFolder())
# def copyFrontendResources (self, frontend):
# print "copying resources for frontend: " + frontend
# print "SETTINGS: " + str(self.settings)
def writeToTargetFolder (self, filename, content):
file = open(self.targetFolder() + '/' + filename, 'w')
file.write(content.encode('utf-8'))
file.close()
def configureIndexContent (self, indexContent):
result = indexContent
result = result.replace( '@request.path@', self.settings['request.path'] )
result = result.replace( '@should.pay.toll@', self.settings['should.pay.toll'] )
return result
def logChecksums (self, content, message):
md5Digest = hashlib.md5(content.encode('utf-8')).hexdigest()
shaDigest = hashlib.sha1(content.encode('utf-8')).hexdigest()
sha256Digest = hashlib.sha256(content.encode('utf-8')).hexdigest()
print message + ": " + md5Digest + " (md5)"
print message + ": " + shaDigest + " (sha1)"
print message + ": " + sha256Digest + " (sha256)"
def run (self):
print self.name() + " - RUN"
self.compileCode()
self.copyCompiledCodeToTargetDir()
for frontend in self.frontends:
frontendPath = frontend.module + '/'
if 'debug' in self.versions:
frontend.copyResourcesToTargetFolder(self.targetFolder())
#self.writeToTargetFolder(frontendPath + 'index_debug.html', self.configureIndexContent(frontend.assembleDebugVersion()))
self.writeToTargetFolder(frontendPath + 'index_debug.html', self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG')))
if 'install' in self.versions:
index = self.configureIndexContent(frontend.assemble())
self.writeToTargetFolder(frontendPath + 'index.html', index)
self.logChecksums(index, "[" + self.name() + " - " + frontend.module + "] index.html checksum")
diff --git a/scripts/builder/frontendBuilder.py b/scripts/builder/frontendBuilder.py
index b796438..55054ee 100644
--- a/scripts/builder/frontendBuilder.py
+++ b/scripts/builder/frontendBuilder.py
@@ -1,193 +1,193 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys, os, re
import cssmin
import jsmin
import codecs
import shutil
import StringIO
import urllib
#from mercurial import ui, hg
#from mercurial.node import hex
from dulwich.repo import Repo
import main
class FrontendBuilder:
def __init__ (self, frontend, settings):
if '.' in frontend:
moduleComponents = frontend.split('.')
self.module = moduleComponents[0]
self.submodule = moduleComponents[1]
else:
self.module = frontend
self.submodule = frontend
self.settings = settings
self.projectDir = main.projectBaseDir()
self.processedFiles = {}
def mercurialRepositoryVersion (self):
repo = hg.repository(ui.ui(), self.projectDir)
context = repo['tip']
result = str(context)
return result
def gitRepositoryVersion (self):
repo = Repo(self.projectDir)
#if repo.is_dirty():
# print "WARNING: build run with dirty repository"
result = repo.refs['HEAD']
return result
def repositoryVersion (self):
cacheKey = 'repositoryVersion'
if not self.processedFiles.has_key(cacheKey):
#result = self.mercurialRepositoryVersion()
result = self.gitRepositoryVersion()
self.processedFiles[cacheKey] = result
else:
result = self.processedFiles[cacheKey]
return result
#def relativePath (self):
# return self.module
#
def log (self, message):
print "frontend [" + self.module + "]: " + message
def absolutePathForSourceFile (self, folder, basePath, file):
return folder + '/frontend/' + self.module + '/' + basePath + '/' + file
def absolutePathForTargetFile (self, folder, basePath, file):
return folder + '/' + self.module + '/' + basePath + '/' + file
def filterFiles (self, files):
result = []
for file in files:
if file.startswith('--'):
pass
else:
result.append(file)
return result
def copyResources (self, sourceFolder, destinationFolder, fileType):
for file in self.filterFiles(self.settings[fileType]):
src = self.absolutePathForSourceFile(sourceFolder, fileType, file)
dst = self.absolutePathForTargetFile(destinationFolder, fileType, file)
main.createFolder(os.path.dirname(dst))
shutil.copy2(src, dst)
def copyResourcesToTargetFolder (self, targetFolder):
self.copyResources(self.projectDir, targetFolder, 'css')
self.copyResources(self.projectDir, targetFolder, 'js')
def loadFilesContent (self, basePath, files):
result = ""
for file in self.filterFiles(files):
try:
fileHandler = codecs.open(self.absolutePathForSourceFile(self.projectDir, basePath, file), 'r', 'utf-8')
except:
print "FILE: " + file
result += fileHandler.read() + '\n'
fileHandler.close()
return result
def template (self):
processedFile = 'html_template'
if not self.processedFiles.has_key(processedFile):
self.processedFiles[processedFile] = self.loadFilesContent('html', ['index_template.html'])
return self.processedFiles[processedFile]
def cssminCompressor (self, css):
# package found here:
# - http://stackoverflow.com/questions/222581/python-script-for-minifying-css/2396777#2396777
# actual downloaded version: http://pypi.python.org/pypi/cssmin/0.1.4
return cssmin.cssmin(css)
def regexCssCompressor (self, css):
# http://stackoverflow.com/questions/222581/python-script-for-minifying-css/223689#223689
# remove comments - this will break a lot of hacks :-P
css = re.sub( r'\s*/\*\s*\*/', "$$HACK1$$", css ) # preserve IE<6 comment hack
css = re.sub( r'/\*[\s\S]*?\*/', "", css )
css = css.replace( "$$HACK1$$", '/**/' ) # preserve IE<6 comment hack
# url() doesn't need quotes
css = re.sub( r'url\((["\'])([^)]*)\1\)', r'url(\2)', css )
# spaces may be safely collapsed as generated content will collapse them anyway
css = re.sub( r'\s+', ' ', css )
# shorten collapsable colors: #aabbcc to #abc
css = re.sub( r'#([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3(\s|;)', r'#\1\2\3\4', css )
# fragment values can loose zeros
css = re.sub( r':\s*0(\.\d+([cm]m|e[mx]|in|p[ctx]))\s*;', r':\1;', css )
for rule in re.findall( r'([^{]+){([^}]*)}', css ):
# we don't need spaces around operators
selectors = [re.sub( r'(?<=[\[\(>+=])\s+|\s+(?=[=~^$*|>+\]\)])', r'', selector.strip() ) for selector in rule[0].split( ',' )]
# order is important, but we still want to discard repetitions
properties = {}
porder = []
for prop in re.findall( '(.*?):(.*?)(;|$)', rule[1] ):
key = prop[0].strip().lower()
if key not in porder: porder.append( key )
properties[ key ] = prop[1].strip()
# output rule if it contains any declarations
if properties:
print "%s{%s}" % ( ','.join( selectors ), ''.join(['%s:%s;' % (key, properties[key]) for key in porder])[:-1] )
return css
def compressCSS (self, css):
self.log("compressing CSS")
#return self.regexCssCompressor(css)
return self.cssminCompressor(css)
#==========================================================================
def compressJS_jsmin (self, js):
self.log("compressing JS code")
original = StringIO.StringIO(js)
output = StringIO.StringIO()
jsMinifier = jsmin.JavascriptMinify()
jsMinifier.minify(original, output)
result = output.getvalue()
diff --git a/scripts/builder/main.py b/scripts/builder/main.py
index ba0c72a..94f738f 100755
--- a/scripts/builder/main.py
+++ b/scripts/builder/main.py
@@ -1,166 +1,166 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys, os, json
import shutil
import pprint
import frontendBuilder
import codecs
import itertools
from collections import deque
from phpBuilder import PhpBuilder
from pythonBuilder import PythonBuilder
pp = pprint.PrettyPrinter(indent=4, depth=4)
#--------------------------------------------------------------------
def scriptDir ():
return os.path.dirname(sys.argv[0])
def projectBaseDir ():
return os.path.abspath(scriptDir() + '/../..')
def projectTargetDir():
return projectBaseDir() + '/target/'
#--------------------------------------------------------------------
def createFolder (path):
if not os.path.exists(path):
os.makedirs(path)
#--------------------------------------------------------------------
def loadSettings (component, module):
print "MODULE: " + module
if '.' in module:
moduleComponents = module.split('.')
module = moduleComponents[0]
submodule = moduleComponents[1]
else:
submodule = module
settings = codecs.open(projectBaseDir() + '/' + component + '/' + module + '/properties/' + submodule + '.properties.json', 'r', 'utf-8')
result = json.load(settings)
settings.close
return result
#====================================================================
#
# def assembleFrontend (frontend, versions):
# result = {}
# settings = loadSettings('frontend', frontend)
# builder = frontendBuilder.FrontendBuilder(frontend, settings, projectBaseDir())
#
# for version in versions:
# if version == 'install':
# result[version] = builder.assembleInstallVersion()
# elif version == 'debug':
# result[version] = builder.assembleDebugVersion()
# else:
# raise Exception('unrecognized version: ' + version)
#
# return result
#
#====================================================================
def assembleBackend (backend, frontends, versions):
settings = loadSettings('backend', backend)
if backend == 'php':
backendBuilder = PhpBuilder(projectTargetDir(), frontends, versions, settings)
elif backend == 'python':
backendBuilder = PythonBuilder(projectTargetDir(), frontends, versions, settings)
#elif backend == 'java':
# buildJavaBackend (frontends, versions, settings)
else:
raise Exception('unrecognized backend: ' + backend)
backendBuilder.run()
#====================================================================
def build (settings):
frontends = []
for frontend in settings['frontends']:
frontends.append(frontendBuilder.FrontendBuilder(frontend, loadSettings('frontend', frontend)))
for backend in settings['backends']:
assembleBackend(backend, frontends, settings['versions'])
#--------------------------------------------------------------------
def clean ():
print "cleaning up …"
if os.path.exists(projectTargetDir()):
shutil.rmtree(projectTargetDir())
#--------------------------------------------------------------------
def usage (message):
if message != None:
print "ERROR: " + message
print
print "build.py clean"
print "build.py clean install"
print "build.py install --ALL"
print "build.py install debug --ALL"
print "build.py clean install debug --ALL"
print "build.ph install, debug --backends php java --frontends beta gamma"
print "build.ph install, debug --backends php java --frontends beta gamma gamma.mobile"
exit(1)
#--------------------------------------------------------------------
def main ():
settings = {}
parameters = list(itertools.islice(sys.argv, 1, None))
shouldClean = len(filter(lambda x: x == 'clean', parameters)) > 0
if (shouldClean):
clean ()
parameters = filter(lambda x: x != 'clean', parameters)
versions = list(itertools.takewhile(lambda x: not x.startswith('--'), parameters))
settings['versions'] = versions; #['debug', 'install']
parameters = deque(itertools.dropwhile(lambda x: not x.startswith('--'), parameters))
if len(parameters) > 0:
parameter = parameters.popleft()
if parameter == "--ALL":
settings['frontends'] = ['beta', 'gamma', 'mobile']
settings['backends'] = ['php', 'python', 'java']
else:
while parameter != None:
values = list(itertools.takewhile(lambda x: not x.startswith('--'), parameters))
if parameter == "--backends":
settings['backends'] = values
elif parameter == "--frontends":
settings['frontends'] = values
parameters = deque(itertools.dropwhile(lambda x: not x.startswith('--'), parameters))
if parameters:
parameter = parameters.popleft()
else:
parameter = None
if (not settings.has_key('versions')):
usage("missing 'versions'")
if (not settings.has_key('frontends')):
usage("missing 'frontends'")
if (not settings.has_key('backends')):
usage("missing 'backends'")
build (settings)
if __name__ == "__main__":
- main() \ No newline at end of file
+ main()
diff --git a/scripts/builder/phpBuilder.py b/scripts/builder/phpBuilder.py
index 9512192..cb4661d 100644
--- a/scripts/builder/phpBuilder.py
+++ b/scripts/builder/phpBuilder.py
@@ -1,14 +1,14 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from backendBuilder import BackendBuilder
class PhpBuilder(BackendBuilder):
def name(self):
return "PHP builder"
def relativePath(self):
return 'php'
diff --git a/scripts/builder/pythonBuilder.py b/scripts/builder/pythonBuilder.py
index 44c62a8..a84598d 100644
--- a/scripts/builder/pythonBuilder.py
+++ b/scripts/builder/pythonBuilder.py
@@ -1,14 +1,14 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from backendBuilder import BackendBuilder
class PythonBuilder(BackendBuilder):
def name(self):
return "Python builder"
def relativePath(self):
return 'python'