From 25bd3085c5464862172c5bd921deca550185fe83 Mon Sep 17 00:00:00 2001 From: Clipperz Date: Tue, 8 Jan 2013 16:12:19 +0100 Subject: [PATCH] Updated builder script --- scripts/builder/backendBuilder.py | 37 ++++---- scripts/builder/backends/devBuilder.py | 56 +++++++++++ scripts/builder/frontendBuilder.py | 44 +++++++-- scripts/builder/frontends/betaBuilder.py | 14 +++ scripts/builder/frontends/gammaBuilder.py | 26 +++++ .../builder/frontends/gamma_mobileBuilder.py | 9 ++ scripts/builder/main.py | 26 +++-- scripts/builder/repository.py | 11 ++- scripts/dev-proxy | 7 ++ scripts/proxy/main.py | 95 +++++++++++++++++++ 10 files changed, 293 insertions(+), 32 deletions(-) create mode 100644 scripts/builder/backends/devBuilder.py create mode 100644 scripts/builder/frontends/betaBuilder.py create mode 100644 scripts/builder/frontends/gammaBuilder.py create mode 100644 scripts/builder/frontends/gamma_mobileBuilder.py create mode 100755 scripts/dev-proxy create mode 100755 scripts/proxy/main.py diff --git a/scripts/builder/backendBuilder.py b/scripts/builder/backendBuilder.py index 5b91678..36b28ca 100644 --- a/scripts/builder/backendBuilder.py +++ b/scripts/builder/backendBuilder.py @@ -9,7 +9,6 @@ import main #=================================================================== - class BackendBuilder(object): def __init__ (self, projectTargetDir, frontends, versions, settings): @@ -50,10 +49,12 @@ class BackendBuilder(object): def developmentTargetFolder (self): - return os.path.join(self.projectTargetDir, 'development', self.relativePath()) + return os.path.join(self.projectTargetDir, 'development') + def targetFolder (self): return os.path.join(self.projectTargetDir, self.relativePath()) + # -------------------------------------------------------------------------- @@ -103,7 +104,7 @@ class BackendBuilder(object): index = self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG')) self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index_debug' + submoduleExtension + '.html'), index) - + if 'install' in self.versions: index = self.configureIndexContent(frontend.assemble()) self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index' + submoduleExtension + '.html'), index) @@ -112,20 +113,22 @@ class BackendBuilder(object): self.createPackage() - if 'development' in self.versions: - for frontend in self.frontends: - if (frontend.module == frontend.submodule): - submoduleExtension = '' - else: - submoduleExtension = '.' + frontend.submodule - - print "FRONTEND module: " + frontend.module - print "FRONTEND submodule: " + frontend.submodule - - main.createFolder(os.path.join(self.developmentTargetFolder(), frontend.module)) - - index = self.configureIndexContent(frontend.assemble(assemblyMode='DEVELOPMENT', versionType='DEBUG'), self.settings['development.settings']['url']) - self.writeToFolder(self.developmentTargetFolder(), os.path.join(frontend.module, 'index' + submoduleExtension + '.html'), index) +# if 'development' in self.versions: +# for frontend in self.frontends: +# if (frontend.module == frontend.submodule): +# submoduleExtension = '' +# else: +# submoduleExtension = '.' + frontend.submodule +# +# print "FRONTEND module: " + frontend.module +# print "FRONTEND submodule: " + frontend.submodule +# +## main.createFolder(os.path.join(self.developmentTargetFolder(), frontend.module)) +# main.createFolder(self.developmentTargetFolder()) +# +# index = self.configureIndexContent(frontend.assemble(assemblyMode='DEVELOPMENT', versionType='DEBUG'), self.settings['development.settings']['url']) +## self.writeToFolder(self.developmentTargetFolder(), os.path.join(frontend.module, 'index_development' + submoduleExtension + '.html'), index) +# self.writeToFolder(self.developmentTargetFolder(), os.path.join(frontend.module + submoduleExtension + '.html'), index) #=================================================================== diff --git a/scripts/builder/backends/devBuilder.py b/scripts/builder/backends/devBuilder.py new file mode 100644 index 0000000..671765e --- /dev/null +++ b/scripts/builder/backends/devBuilder.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +import os +import shutil +import subprocess +import main + +from backendBuilder import BackendBuilder + +class DevBuilder(BackendBuilder): + + def name(self): + return "Dev builder" + + + def relativePath(self): + return 'dev' + + +# def frontEndTempFolder (self): +# return os.path.join(self.tempFolder(), 'src', 'main', 'webapp') + + +# def targetFolder (self): +# return self.projectTargetDir + + + def compileCode (self): + pass + + + def createPackage (self): + src = self.tempFolder() + dst = self.targetFolder() + + shutil.copytree(src, dst) + + + def run (self): + print self.name() + " - RUN (dev)" + + for frontend in self.frontends: + if (frontend.module == frontend.submodule): + submoduleExtension = '' + else: + submoduleExtension = '.' + frontend.submodule + + main.createFolder(os.path.join(self.frontEndTempFolder(), frontend.module)) + + index = self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG')) + self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index' + submoduleExtension + '.html'), index) + + self.createPackage() + + diff --git a/scripts/builder/frontendBuilder.py b/scripts/builder/frontendBuilder.py index 1f0f92f..fc603c4 100644 --- a/scripts/builder/frontendBuilder.py +++ b/scripts/builder/frontendBuilder.py @@ -11,6 +11,8 @@ import urllib import main +#=============================================================================== + class FrontendBuilder(object): def __init__ (self, frontend, settings, repositoryVersion): @@ -27,10 +29,23 @@ class FrontendBuilder(object): # self.repository = repository.repositoryWithPath(self.projectDir) self.repositoryVersion = repositoryVersion self.processedFiles = {} - + + #--------------------------------------------------------------------------- + + def name (self): + raise NotImplementedError() + + + def copyStaticResources (self, targetFolder): + raise NotImplementedError() + + #--------------------------------------------------------------------------- def log (self, message): - print "frontend [" + self.module + "]: " + message + module = self.module + if (self.module != self.submodule): + module = module + "." + self.submodule + print "frontend [" + module + "]: " + message def absolutePathForSources (self): @@ -58,16 +73,30 @@ class FrontendBuilder(object): def copyResources (self, sourceFolder, destinationFolder, fileType): - for file in self.filterFiles(self.settings[fileType]): - src = self.absolutePathForSourceFile(fileType, file) - dst = self.absolutePathForTargetFile(destinationFolder, fileType, file) - main.createFolder(os.path.dirname(dst)) - shutil.copy2(src, dst) + if fileType in self.settings: + for file in self.filterFiles(self.settings[fileType]): + src = self.absolutePathForSourceFile(fileType, file) + dst = self.absolutePathForTargetFile(destinationFolder, fileType, file) + main.createFolder(os.path.dirname(dst)) + shutil.copy2(src, dst) + else: + srcFolder = os.path.join(self.absolutePathForSources(), fileType) + dstFolder = os.path.join(destinationFolder, self.module, fileType) + if not(os.path.exists(dstFolder)): + shutil.copytree(srcFolder, dstFolder) + +# try: +# shutil.copytree(srcFolder, dstFolder) +# except: +# pass + def copyResourcesToFolder (self, targetFolder): self.copyResources(self.projectDir, targetFolder, 'css') self.copyResources(self.projectDir, targetFolder, 'js') + self.copyResources(self.projectDir, targetFolder, 'images') + self.copyStaticResources(targetFolder) def loadFilesContent (self, basePath, files): @@ -371,6 +400,7 @@ class FrontendBuilder(object): '\n' + \ self.scriptTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'js')), self.filterFiles(self.settings['js'])) jsLoadMode = 'LINKED' + versionType = 'development' else: raise NotImplementedError() diff --git a/scripts/builder/frontends/betaBuilder.py b/scripts/builder/frontends/betaBuilder.py new file mode 100644 index 0000000..c5a3e76 --- /dev/null +++ b/scripts/builder/frontends/betaBuilder.py @@ -0,0 +1,14 @@ +from frontendBuilder import FrontendBuilder +import shutil + +class BetaBuilder(FrontendBuilder): + + def name(self): + return "/beta builder" + + def copyStaticResources (self, targetFolder): + for file in self.filterFiles(self.settings['staticResources']): + src = self.absolutePathForSourceFile('staticResources', file) + dst = self.absolutePathForTargetFile(targetFolder, '', file) + shutil.copy2(src, dst) + diff --git a/scripts/builder/frontends/gammaBuilder.py b/scripts/builder/frontends/gammaBuilder.py new file mode 100644 index 0000000..35fa68b --- /dev/null +++ b/scripts/builder/frontends/gammaBuilder.py @@ -0,0 +1,26 @@ +from frontendBuilder import FrontendBuilder +import shutil + +class GammaBuilder(FrontendBuilder): + + def name(self): + return "/gamma builder" + + def copyStaticResources (self, targetFolder): + resourcesToCopy = [ + {'folder': 'html', 'source': 'exit_template.html', 'target': 'exit.html'}, + {'folder': 'css', 'source': 'static.css', 'target': 'static.css'} + ] + + for resource in resourcesToCopy: + src = self.absolutePathForSourceFile(resource['folder'], resource['source']) + dst = self.absolutePathForTargetFile(targetFolder, '', resource['target']) + shutil.copy2(src, dst) + + # src = self.absolutePathForSourceFile('html', 'exit_template.html') + # dst = self.absolutePathForTargetFile(targetFolder, '', 'exit.html') + # shutil.copy2(src, dst) + + # src = self.absolutePathForSourceFile('css', 'static.css') + # dst = self.absolutePathForTargetFile(targetFolder, '', 'static.css') + # shutil.copy2(src, dst) diff --git a/scripts/builder/frontends/gamma_mobileBuilder.py b/scripts/builder/frontends/gamma_mobileBuilder.py new file mode 100644 index 0000000..f2e80c9 --- /dev/null +++ b/scripts/builder/frontends/gamma_mobileBuilder.py @@ -0,0 +1,9 @@ +from frontendBuilder import FrontendBuilder + +class Gamma_MobileBuilder(FrontendBuilder): + + def name(self): + return "/gamma.mobile builder" + + def copyStaticResources (self, targetFolder): + pass diff --git a/scripts/builder/main.py b/scripts/builder/main.py index 6fce65d..b9fe04a 100755 --- a/scripts/builder/main.py +++ b/scripts/builder/main.py @@ -10,7 +10,7 @@ import codecs import itertools from collections import deque -import frontendBuilder +#import frontendBuilder import repository pp = pprint.PrettyPrinter(indent=4, depth=4) @@ -75,7 +75,7 @@ def assembleBackend (backend, frontends, versions): builderModuleName = backend + 'Builder' builderClassName = backend.capitalize() + 'Builder' - + #print ("BUILD BACKENDS - module: " + builderModuleName + " , class: " + builderClassName) builderModule = __import__(builderModuleName) builderClass = getattr(builderModule, builderClassName) @@ -88,10 +88,22 @@ def build (settings, repository): frontends = [] if repository.areTherePendingChanges(): - print "\nWARNING: repository has pending changes\n" + if 'install' in settings['versions']: + raise Exception("repository has pending changes, can't 'install'") + else: + print "\nWARNING: repository has pending changes\n" for frontend in settings['frontends']: - frontends.append(frontendBuilder.FrontendBuilder(frontend, loadSettings('frontend', frontend), repository.version())) + normalizedFrontendName = frontend.replace(".", "_") + builderModuleName = normalizedFrontendName + 'Builder' + builderClassName = normalizedFrontendName.title() + 'Builder' + + #print ("BUILD FRONTEND - module: " + builderModuleName + " , class: " + builderClassName) + builderModule = __import__(builderModuleName) + builderClass = getattr(builderModule, builderClassName) + builder = builderClass(frontend, loadSettings('frontend', frontend), repository.version()) + #builder = frontendBuilder.FrontendBuilder(frontend, loadSettings('frontend', frontend), repository.version()) + frontends.append(builder) for backend in settings['backends']: assembleBackend(backend, frontends, settings['versions']) @@ -114,6 +126,7 @@ def usage (message): # print "build clean install" print "build install --ALL" print "build install debug --ALL" + print "build install debug development --ALL" # print "build clean install debug --ALL" print "build install debug --backends php python --frontends beta gamma" print "build install debug development --backends php python --frontends beta gamma gamma.mobile" @@ -122,7 +135,7 @@ def usage (message): #-------------------------------------------------------------------- def allFrontends (): - return ['beta', 'gamma', 'mobile'] + return ['beta', 'gamma', 'gamma.mobile'] def allBackends (): return ['php', 'python'] @@ -134,6 +147,7 @@ def main (): parameters = list(itertools.islice(sys.argv, 1, None)) sys.path.append(os.path.join(scriptDir(), 'backends')) + sys.path.append(os.path.join(scriptDir(), 'frontends')) currentRepository = repository.repositoryWithPath(projectBaseDir()) clean() @@ -174,4 +188,4 @@ def main (): if __name__ == "__main__": - main() + main() diff --git a/scripts/builder/repository.py b/scripts/builder/repository.py index 0045de7..a47e249 100644 --- a/scripts/builder/repository.py +++ b/scripts/builder/repository.py @@ -56,11 +56,18 @@ class GitRepository(Repository): # http://gitorious.org/git-python def revision (self): - return self.repository.head.commit.hexsha + try: + return self.repository.head.commit.hexsha + except: + return self.repository.commits()[0].id def areTherePendingChanges (self): - return self.repository.is_dirty() + try: + return self.repository.is_dirty() + except TypeError, te: + return self.repository.is_dirty + #=================================================================== diff --git a/scripts/dev-proxy b/scripts/dev-proxy new file mode 100755 index 0000000..e5980e3 --- /dev/null +++ b/scripts/dev-proxy @@ -0,0 +1,7 @@ +#!/bin/bash + +readonly CURR_DIR=$(cd "$(dirname "$0")"; pwd -P) + +#${CURR_DIR}/proxy/main.py $@ +python ${CURR_DIR}/proxy/main.py $@ +#twistd -y ${CURR_DIR}/proxy/main.py --pidfile=${CURR_DIR}/../target/proxy/proxy.pid --logfile=${CURR_DIR}/../target/proxy/logs/proxy.log \ No newline at end of file diff --git a/scripts/proxy/main.py b/scripts/proxy/main.py new file mode 100755 index 0000000..107ba16 --- /dev/null +++ b/scripts/proxy/main.py @@ -0,0 +1,95 @@ +from twisted.internet import reactor +from twisted.web import proxy, server, http, resource, static +from posixpath import basename, dirname + +import copy +import sys +import os +import pprint + +#-------------------------------------------------------------------- + +def scriptDir (): + return os.path.dirname(sys.argv[0]) + +def projectBaseDir (): + return os.path.abspath(scriptDir() + '/../..') + +def projectTargetDir(): + return projectBaseDir() + '/target/' + +#-------------------------------------------------------------------- + +class ClipperzTestSite(server.Site): + + def __init__(self, resource, logPath=None, timeout=60 * 60 * 12): + server.Site.__init__(self, resource, logPath, timeout) + + + def getResourceFor(self, request): + if request.uri.startswith('/json') or request.uri.startswith('/dump'): + request.site = self + request.sitepath = copy.copy(request.prepath) + result = resource.getChildForRequest(self.resource, request) + + else: + pathParts = request.uri.split('/') + version = pathParts[1] + + if pathParts[2].startswith('index.'): + contentType = 'text/html' + absoluteFilePath = os.path.join(projectTargetDir(), 'dev', version, pathParts[2]) + result = static.File(absoluteFilePath, contentType) + + else: +# http://homer.local:8888/beta/css/clipperz/images/loginInfoBackground.png +# pathParts: ['', 'beta', 'css', 'clipperz', 'images', 'loginInfoBackground.png'] + try: + imagePathIndex = pathParts.index('images') + resourceType = 'images' + for _ in range(2, imagePathIndex): + del pathParts[2] + except: + resourceType = pathParts[2] + + basePath = projectBaseDir() + '/frontend' + if resourceType == 'images': + fileExtension = os.path.splitext(request.uri)[1] + if fileExtension == '.png': + contentType = 'image/png' + elif fileExtension == '.jpg': + contentType = 'image/jpeg' + elif fileExtension == '.gif': + contentType = 'image/gif' + else: + print "ERROR - unknown image extension: " + fileExtension + + absoluteFilePath = basePath + '/'.join(pathParts) + else: + resourceType = pathParts[2] + + if resourceType == 'css': + contentType = 'text/css' + elif resourceType == 'js': + contentType = 'text/javascript' + else: + contentType = 'text/html' + + absoluteFilePath = basePath + request.uri + + result = static.File(absoluteFilePath, contentType) + + + return result + + + +def main (): + site = ClipperzTestSite(proxy.ReverseProxyResource('localhost', 8084, '/java-backend')) + reactor.listenTCP(8888, site) + reactor.run() + + +if __name__ == "__main__": + main() +