Source code for woo.objectlibrary

'''Module for manipulating locally-stored object library'''

import os, os.path
from os.path import join

import woo
import woo._monkey.io
import logging
libDir=woo.master.confDir+'/library' # must NOT include the trailing slash
libObjs=None

[docs]def refresh(): 'Load or refresh the library.' objs={} for root,dirs,files in os.walk(libDir): for f in files: ext=os.path.splitext(f)[-1].lower() ff=os.path.join(root,f) assert ff.startswith(libDir+'/') libPath=ff[len(libDir)+1:] if ext=='xls': raise NotImplementedError('Reading library objects from XLS not yet implemented.') # load multiple objects from the XLS file for key,val in loadFromXLS(ff): objs[tuple((libPath+'/'+key).split('/'))]=val else: try: obj=woo._monkey.io.Object_load(None,ff) objs[tuple(libPath.split('/'))]=obj except: logging.warning('Loading library object from %s failed (skipped):\n\n'%ff) import traceback traceback.print_exc() print(logging.warning('--------------------------------------------------------')) global libObjs libObjs=objs
[docs]def ensureLoaded(): global libObjs if libObjs==None: refresh()
[docs]def checkout(types=None): 'Return library objects matching given *types*. If *types* is ``None``, return all objects. Types can be a type or a 1-tuple with one type, in which case lists of those instances are matched.' ensureLoaded() global libObjs import copy if types==None: return copy.deepcopy(libObjs) if isinstance(types,list) or isinstance(types,tuple): seqType=types[0] else: seqType=None seqObj=(seqType and isinstance(seqType(),woo.core.Object)) ret={} for key,val in libObjs.items(): if seqType==None: if isinstance(val,types): ret[key]=val else: if isinstance(val,woo.core.Object): continue # sequence required, object found # perhaps sequences on both sides # print seqType,type(val) try: for item in val: if not seqObj: # print key,item,seqType.__name__ try: seqType(item) # attempt conversion (like (0,1) to Vector2 except: raise TypeError # catch-all exception else: if not isinstance(item,seqType): raise TypeError ret[key]=val except TypeError: pass # non-iterable types return ret