#-*- coding: utf-8 -*- # Copyright 2008-2010 Calculate Ltd. http://www.calculate-linux.org # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os,sys from cl_print import color_print # translate language import cl_lang tr = cl_lang.lang() tr.setLocalDomain('cl_lib') tr.setLanguage(sys.modules[__name__]) import cl_overriding from cl_datavars import DataVars class APIError(Exception): """Класс ошибок""" class libVars: clLibVars = False def createClLibVars(self, clLibVars=False): """Создает объект библиотечных переменных""" if not clLibVars: clLibVars = DataVars() # Заменяем значения переменных переменными из env файлов clLibVars.flIniFile() # Устанавливаем у объекта атрибут объект переменных self.clLibVars = clLibVars return True class _services(color_print, libVars): def __init__(self): self.apiObjs = {} def getApiClass(self, apiFile): importPath, moduleName = os.path.split(apiFile) moduleName = moduleName.rpartition(".py")[0] if not importPath in sys.path: sys.path.insert(0, importPath) try: className = getattr(__import__(moduleName, globals(), locals(), ['serviceAPI']), 'serviceAPI') except (ImportError, AttributeError), e: self.printERROR(str(e).strip()) self.printERROR(_("Can not import module %s")% apiFile) cl_overriding.exit(1) return className def getPkgApi(self, pkgName): """get package api""" if not pkgName in self.apiObjs: self.createClLibVars(clLibVars=self.clLibVars) apiDict = self.clLibVars.Get('cl_api') if not apiDict or not type(apiDict) is dict: return None if not pkgName in apiDict: return None apiFile = apiDict[pkgName] className = self.getApiClass(apiFile) try: apiObject = className() except Exception, e: self.printERROR(str(e).strip()) self.printERROR(_("Can not create API object")) self.printERROR(_("Module %s")% apiFile) cl_overriding.exit(1) self.apiObjs[pkgName] = apiObject return apiObject else: return self.apiObjs[pkgName] def getAllPkgApi(self): """get all packages api objects""" self.createClLibVars(clLibVars=self.clLibVars) apiDict = self.clLibVars.Get('cl_api') if not apiDict or not type(apiDict) is dict: return [] apiFiles = apiDict.values() apiObjects = [] for apiFile in apiFiles: className = self.getApiClass(apiFile) try: apiObjects.append(className()) except: self.printERROR(_("Can not create API object")) self.printERROR(_("Module %s")% apiFile) cl_overriding.exit(1) return apiObjects def runMethodToPkg(self, pkgName, methodName, argv=[]): """Execute method from pkg""" pkgObj = self.getPkgApi(pkgName) if pkgObj is None: return "" if not hasattr(pkgObj, methodName) or\ not callable(getattr(pkgObj, methodName)): self.printERROR(_("Can not found method %(method)s in \ API object service %(service)s") %{'method':methodName, 'service':pkgObj.getServiceName()}) cl_overriding.exit(1) if argv: res = getattr(pkgObj, methodName)(*argv) else: res = getattr(pkgObj, methodName)() return res class attribute(object): def __init__(self, clVars): self._varsObj=clVars def __getattribute__(self, attr): if attr.startswith("__"): value = object.__getattribute__(self, attr) else: try: value = object.__getattribute__(self,'_varsObj').Get(attr) except Exception, e: #value = "" raise APIError(str(e).strip()) object.__setattr__(self, attr, value) return value def __setattr__(self, attr, value): if attr.startswith("__") or attr=="_varsObj": object.__setattr__(self, attr, value) else: try: varObj = object.__getattribute__(self,'_varsObj') if varObj.Set(attr, value) is False: raise AttributeError(attr) except: raise AttributeError(attr) class _pkgAPI(object): def __init__(self, pkgName): self._pkgName = pkgName def __setvar__(self, pkgName): services = _services() varObj = services.runMethodToPkg(pkgName, 'get_vars') if varObj: self.var = attribute(varObj) def __setmethods__(self, pkgName): services = _services() pkgObj = services.getPkgApi(pkgName) for attr in dir(pkgObj): if not attr.startswith("_") and callable(getattr(pkgObj, attr)) and\ getattr(pkgObj, attr).im_func.func_code.co_argcount == 1: setattr(self, attr, getattr(pkgObj, attr)) def __getattribute__(self, attr): if attr.startswith("__") or attr in ('_pkgName'): value = object.__getattribute__(self, attr) elif attr == 'var': try: value = object.__getattribute__(self, attr) except AttributeError: pkgName = object.__getattribute__(self, '_pkgName') self.__setvar__(pkgName) value = object.__getattribute__(self, attr) elif attr == 'api': try: value = object.__getattribute__(self, attr) except AttributeError: services = _services() pkgName = object.__getattribute__(self, '_pkgName') value = services.getPkgApi(pkgName) setattr(self, attr, value) else: try: value = object.__getattribute__(self, attr)() flagFoundAttr = True except: flagFoundAttr = False if flagFoundAttr is False: pkgName = object.__getattribute__(self, '_pkgName') self.__setmethods__(pkgName) try: value = object.__getattribute__(self, attr)() except: raise APIError(_("Can not found method %s")%attr) return value class _allPkg(object): def __init__(self, listPkgObj): def smpPrioritetReverse(objectA, objectB): '''Comparison of the run priorities of objects to sort in descending order ''' prioritetA = objectA.get_prioritet() prioritetB = objectB.get_prioritet() if prioritetA == prioritetB: return 0 elif prioritetA < prioritetB: return 1 else: return -1 def smpPrioritetNormal(objectA, objectB): '''Comparison of the run priorities of objects to sort in descending order ''' prioritetA = objectA.get_prioritet() prioritetB = objectB.get_prioritet() if prioritetA == prioritetB: return 0 elif prioritetA > prioritetB: return 1 else: return -1 self._listPkgObjNormal = listPkgObj[:] self._listPkgObjNormal.sort(smpPrioritetNormal) self._listPkgObjReverse = listPkgObj[:] self._listPkgObjReverse.sort(smpPrioritetReverse) def APIList(self): return self._listPkgObjNormal def APIListReverse(self): return self._listPkgObjReverse def __getattribute__(self, attr): if attr.startswith("__") or\ attr in ('_listPkgObjNormal', '_listPkgObjReverse', 'APIList', 'APIListReverse'): value = object.__getattribute__(self, attr) else: if attr.startswith('stop') or attr.startswith('del'): listObi = object.__getattribute__(self, '_listPkgObjReverse') else: listObi = object.__getattribute__(self,'_listPkgObjNormal') listValues = [] for pkgObj in listObi: try: val = getattr(pkgObj, attr) except Exception, e: continue listValues.append(val) if filter(lambda x: set(listValues) == set(x), ([True],[False],[True,False])): if False in listValues: return False else: return True listValues = filter(lambda x: x, listValues) listValues = map(lambda x: '1' if x is True else str(x), listValues) value = "\n".join(listValues) object.__setattr__(self, attr, value) return value class packagesAPI(object): def __getattribute__(self, attr): if attr.startswith("__"): value = object.__getattribute__(self, attr) else: try: value = object.__getattribute__(self, attr) flagFoundAttr = True except AttributeError: flagFoundAttr = False if flagFoundAttr is False: objLibVars = libVars() objLibVars.createClLibVars() apiDict = objLibVars.clLibVars.Get('cl_api') listPkgObj = [] for pkgName in apiDict.keys(): pkgAPIObj = _pkgAPI(pkgName) setattr(self, pkgName.replace('-','_'), pkgAPIObj) listPkgObj.append(pkgAPIObj) setattr(self, 'all', _allPkg(listPkgObj)) value = object.__getattribute__(self, attr) return value