From 589f916daad1e3a33aaf6f47a1f5eb8acf402eb5 Mon Sep 17 00:00:00 2001 From: Pratik Vyas Date: Mon, 13 Jun 2011 17:10:36 +0530 Subject: [PATCH] jsdependency and compilejs.py tested OK --- cgi-bin/compilejs.py | 50 +++++++++++++------------- cgi-bin/getjsfile.cgi | 15 +++++--- cgi-bin/webnotes/utils/jsdependency.py | 16 +++++---- cgi-bin/webnotes/utils/jsnamespace.py | 32 +++++++++++++---- cgi-bin/webnotes/utils/jstimestamp.py | 44 ++++++++++++++++++----- 5 files changed, 107 insertions(+), 50 deletions(-) diff --git a/cgi-bin/compilejs.py b/cgi-bin/compilejs.py index 52b7d41750..aaf8e65010 100644 --- a/cgi-bin/compilejs.py +++ b/cgi-bin/compilejs.py @@ -1,11 +1,12 @@ class wnJSCompiler: @staticmethod - def concate_files_in_dir(self,path,dest): + def concate_files_in_dir(path,dest): """ Concatenates all files in a directory """ import os allfiles = [] + dirname = path l = os.listdir(path) for i in l: if os.path.isfile(os.path.join(dirname,i)): @@ -19,7 +20,7 @@ class wnJSCompiler: @staticmethod - def getsubs(self,path): + def getsubs(path): """ gets all the sub directories of a directory (recursive) """ @@ -30,42 +31,43 @@ class wnJSCompiler: subs.append(os.path.join(root,i)) return subs @staticmethod - def compilejs(self,path): + def compilejs(path): """ Compiles the js tree for ondemand import """ + if not wnJSCompiler.is_changed(path): + return + import os import webnotes.utils.jsnamespace as jsn - subs = self.getsubs(path) + subs = wnJSCompiler.getsubs(path) for subdir in subs: modname = jsn.jsNamespace.getmodname(subdir) - self.concate_files_in_dir(subdir,os.path.join(subdir, modname)) - self.minifyjs(os.path.join(subdir, modname)) + wnJSCompiler.concate_files_in_dir(subdir,os.path.join(subdir, modname)) + wnJSCompiler.minifyjs(os.path.join(subdir, modname)) @staticmethod - def minifyjs(self,modpath): + def is_changed(path): + #compare new timestamps with the ones stored in file + from webnotes.utils import jstimestamp + try: + frm_file = jstimestamp.generateTimestamp.read_ts_from_file(path) + newts = jstimestamp.generateTimestamp.gents(path) + except IOError: + return True + if frm_file == newts: + return False + else: + return True + + + @staticmethod + def minifyjs(modpath): """ Stub to minify js """ pass - - - - @staticmethod - def gentsfile(self,spath,dpath): - """ - function to generate timestamps of all files in spath - dpath is the file in which the timestamps JSON is stored - """ - import webnotes.utils.jstimestamp as jst - import json - a = jst.generateTimestamp() - f = open(dpath,'w') - f.write('wn = {}\n') - f.write('wn.timestamp = ') - f.write(json.dumps(a.gents(spath))) - f.close() if __name__=="__main__": a = wnJSCompiler() print a.compilejs('../js/wntest') diff --git a/cgi-bin/getjsfile.cgi b/cgi-bin/getjsfile.cgi index 8e8c5abeea..889e8c6c15 100755 --- a/cgi-bin/getjsfile.cgi +++ b/cgi-bin/getjsfile.cgi @@ -28,9 +28,10 @@ try: global jsonout import webnotes.utils.jsnamespace as jsn filename = jsn.jsNamespace.modname_to_filename(module_name,jsdir) + print 'filename is ' + filename import os try: - f = open(os.path.join(filename) + f = open(os.path.join(filename)) try: out = f.read() finally: @@ -40,6 +41,11 @@ try: jsonout[module_name]=out def load_js_module(module_name): + from webnotes import defs + devmode = getattr(defs,'developer_mode') + if devmode: + import compilejs + compilejs.wnJSCompiler.compilejs(jsdir) if module_name not in jsonout: dependent_mods = get_dependencies(module_name) for module in dependent_mods: @@ -48,7 +54,8 @@ try: def get_dependencies(module_name): import webnotes.utils.jsdependency as jsd - ret = jsd.jsDependencyBuilder.build_dependency(module_name) + print 'module_name is ' + module_name + ret = jsd.jsDependencyBuilder.build_dependency(jsdir,module_name) return ret @@ -67,7 +74,7 @@ try: except: pass - load_js_module('test.js') + load_js_module('wntest.a.s') if compress and len(out)>512: out_buf = compress_string(str_out) @@ -88,4 +95,4 @@ try: except Exception, e: print "Content-Type: text/javascript" print - print getTraceback().replace('\n','
') + print getTraceback()#.replace('\n','
') diff --git a/cgi-bin/webnotes/utils/jsdependency.py b/cgi-bin/webnotes/utils/jsdependency.py index d10f180ea5..c9069f18dc 100644 --- a/cgi-bin/webnotes/utils/jsdependency.py +++ b/cgi-bin/webnotes/utils/jsdependency.py @@ -1,6 +1,6 @@ class jsDependencyBuilder: @staticmethod - def read_code(self,js_path): + def read_code(js_path): try: f = open(js_path) try: @@ -11,19 +11,21 @@ class jsDependencyBuilder: raise e return code @staticmethod - def read_imports(self,code): + def read_imports(code): import re p = re.compile('\$import\(\' (?P [^)]*)\' \)', re.VERBOSE) return p.findall(code) @staticmethod - def build_dependency(self,modname,depends= set()): + def build_dependency(jsdir,modname,depends= set()): import webnotes.utils.jsnamespace as jsn - jsdir = '../js' js_path = jsn.jsNamespace.modname_to_filename(modname,jsdir) - code = self.read_code(js_path) - curdepend = self.read_imports(code) + code = jsDependencyBuilder.read_code(js_path) + curdepend = jsDependencyBuilder.read_imports(code) for i in curdepend: if i not in depends: depends.add(i) - depends = depends.union( self.build_dependency(i,depends)) + depends = depends.union( jsDependencyBuilder.build_dependency(jsdir,i,depends)) return depends + def build_dependency_from_file(modname,depends= set()): + # TODO STUB to read dependency from dependency tree stored in file + return jsDependencyBuilder.build_dependency(modname) diff --git a/cgi-bin/webnotes/utils/jsnamespace.py b/cgi-bin/webnotes/utils/jsnamespace.py index c8a36fdf44..3a730a6dcb 100644 --- a/cgi-bin/webnotes/utils/jsnamespace.py +++ b/cgi-bin/webnotes/utils/jsnamespace.py @@ -1,25 +1,43 @@ class jsNamespace: - @staticmethod package_prefix = '_' + @staticmethod def modname_to_filename(modname,jsdir, ext='.js'): import os path = modname.replace('.',os.sep) path = os.path.join(jsdir,path) - if os.path.isdir(path): - #package - packagename = self.package_prefix + path.split(os.sep)[-1] + if jsNamespace.is_package(modname,jsdir): + packagename = jsNamespace.getmodfilename(modname) path = os.path.join(path,packagename) - elif os.path.isfile(path + ext): + elif jsNamespace.is_jsfile(modname,jsdir,ext): path = path + ext else: path = 'notf' # TODO raise exception that it doesnt exist return path + @staticmethod + def is_package(modname,jsdir): + import os + path = modname.replace('.',os.sep) + path = os.path.join(jsdir,path) + return os.path.isdir(path) + @staticmethod + def is_jsfile(modname,jsdir,ext='.js'): + import os + path = modname.replace('.',os.sep) + path = os.path.join(jsdir,path) + return os.path.isfile(path + ext) - def getmodname(self,modpath,ext='.js'): + @staticmethod + def getmodname(modpath,ext='.js'): """ returns filename for the stiched file """ import os b = modpath.split(os.sep) - modname = package_prefix + b[-1] + ext + modname = jsNamespace.package_prefix + b[-1] + ext return modname + @staticmethod + def getmodfilename(modname,ext='.js'): + ret = modname.split('.') + ret = ret[-1] + ret = jsNamespace.getmodname(ret) + return ret diff --git a/cgi-bin/webnotes/utils/jstimestamp.py b/cgi-bin/webnotes/utils/jstimestamp.py index 49b6cd1c49..a5785c2fb9 100644 --- a/cgi-bin/webnotes/utils/jstimestamp.py +++ b/cgi-bin/webnotes/utils/jstimestamp.py @@ -1,5 +1,7 @@ class generateTimestamp: - def list_js_files(self,jsdir,ext='js'): + ts_filename = 'timestamp.json' + @staticmethod + def list_js_files(jsdir,ext='js'): import os all_files= [] nono = ['./tiny_mce','./jquery'] @@ -7,7 +9,7 @@ class generateTimestamp: os.chdir(jsdir) # TODO Sanitize the loop below for root, subfolders, files in os.walk('.'): - if self.is_allowed(nono,root): + if generateTimestamp.is_allowed(nono,root): for filename in files: if filename.endswith(ext): all_files.append(os.path.join(root,filename)) @@ -19,20 +21,22 @@ class generateTimestamp: all_files.remove(j) return all_files - def is_allowed(self,disallowed,item): + @staticmethod + def is_allowed(disallowed,item): for i in disallowed: if item.startswith(i): return False return True - def get_timestamp_dict(self,jsdir,filelist): + @staticmethod + def get_timestamp_dict(jsdir,filelist): tsdict={} import os import webnotes.modules as webmod oldcwd = os.getcwd() os.chdir(jsdir) - for filename in self.list_js_files('.'): + for filename in generateTimestamp.list_js_files('.'): ts = webmod.get_file_timestamp(filename) filename = filename.lstrip('./') filename = filename.rstrip('.js') @@ -41,6 +45,30 @@ class generateTimestamp: os.chdir(oldcwd) return tsdict - def gents(self,jsdir): - fl=self.list_js_files(jsdir) - return self.get_timestamp_dict(jsdir,fl) + @staticmethod + def read_ts_from_file(jsdir): + import json + filename=generateTimestamp.ts_filename + f = open(generateTimestamp.ts_filename) + tsjson = eval(f.read()) + f.close() + ret = json.loads(tsjson) + return ret + + @staticmethod + def gents(jsdir): + fl=generateTimestamp.list_js_files(jsdir) + return generateTimestamp.get_timestamp_dict(jsdir,fl) + + @staticmethod + def gentsfile(jsdir): + """ + function to generate timestamps of all files in spath + dpath is the file in which the timestamps JSON is stored + """ + import json + import os + tsdict = generateTimestamp.gents(jsdir) + f = open(os.path.join(jsdir,generateTimestamp.ts_filename),'w') + f.write(json.dumps(tsdict)) + f.close()