00001 import sys 00002 import logging 00003 import types 00004 00005 from vyperlogix.classes import CooperativeClass 00006 from vyperlogix import misc 00007 from vyperlogix.misc import ObjectTypeName 00008 from vyperlogix.misc.ObjectTypeName import __typeName as ObjectTypeName__typeName 00009 00010 __copyright__ = """\ 00011 (c). Copyright 1990-2008, Vyper Logix Corp., All Rights Reserved. 00012 00013 Published under Creative Commons License 00014 (http://creativecommons.org/licenses/by-nc/3.0/) 00015 restricted to non-commercial educational use only., 00016 00017 See also: http://www.VyperLogix.com and http://www.pypi.info for details. 00018 00019 THE AUTHOR VYPER LOGIX CORP DISCLAIMS ALL WARRANTIES WITH REGARD TO 00020 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 00021 FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, 00022 INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 00023 FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 00024 NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 00025 WITH THE USE OR PERFORMANCE OF THIS SOFTWARE ! 00026 00027 USE AT YOUR OWN RISK. 00028 """ 00029 get = lambda source,key,default:source[key] if (source[key] is not None) else default 00030 00031 def isDict(foo): 00032 bool = False 00033 try: 00034 bool = (foo.iteritems != None) 00035 except: 00036 pass 00037 return bool 00038 00039 def can_asDict(foo): 00040 bool = False 00041 try: 00042 bool = (callable(foo.asDict)) 00043 except: 00044 pass 00045 return bool 00046 00047 def copyAsDict(obj): 00048 if (isDict(obj)): 00049 d = HashedLists2() 00050 for k,v in obj.iteritems(): 00051 d[k] = '' if (v is None) else str(v) 00052 return d 00053 return obj 00054 00055 def asDict(__dict__,insideOut=False,isCopy=False): 00056 cl = ObjectTypeName.typeClassName(__dict__) 00057 clName = cl.split('.')[-1] 00058 dObj = {} if (not isCopy) else eval('%s()' % (clName)) 00059 for k,v in __dict__.iteritems(): 00060 if (insideOut): 00061 if (isinstance(v,list)): 00062 for item in v: 00063 if (not callable(item)) and (not isDict(item)): 00064 dObj[item] = k 00065 else: 00066 if (not callable(v)) and (not isDict(v)): 00067 dObj[v] = k 00068 else: 00069 if (not callable(v)): 00070 try: 00071 if ((callable(v.asDict))): 00072 v = v.asDict(isCopy=isCopy,insideOut=insideOut) 00073 except: 00074 pass 00075 dObj[k] = v 00076 return dObj 00077 00078 def asJSONSerializable(__dict__): 00079 dObj = {} 00080 def asJSON(vv): 00081 return misc._unpack_([asJSONSerializable(_vv) for _vv in vv]) if (misc.isList(vv)) else vv 00082 try: 00083 iterable = __dict__ 00084 is_or_has_dict = False 00085 if (isDict(__dict__)): 00086 is_or_has_dict = True 00087 iterable = __dict__ 00088 else: 00089 try: 00090 __dict__.__dict__ 00091 is_or_has_dict = True 00092 iterable = __dict__.__dict__ 00093 except: 00094 pass 00095 if (is_or_has_dict): 00096 for k,v in iterable.iteritems(): 00097 if (not callable(v)): 00098 try: 00099 if (isDict(v)) or (isDict(v.__dict__)): 00100 dObj[k] = asJSONSerializable(v) 00101 else: 00102 dObj[k] = asJSON(v) 00103 except AttributeError: 00104 dObj[k] = asJSON(v) 00105 else: 00106 return iterable 00107 except: 00108 pass 00109 return dObj 00110 00111 def prettyPrint(item,prefix='',title='',tab_width=4,delay_end=False,asCSV=False,isHorizontal=False,csv_callback=None,fOut=sys.stdout): 00112 import types 00113 from vyperlogix.misc import ReportTheList 00114 00115 _type_name = ObjectTypeName._typeName(item.__class__) 00116 ret = [] 00117 try: 00118 if (isDict(item)): 00119 tab_width = 4 if (not str(tab_width).isdigit()) else tab_width 00120 if (asCSV): 00121 if (isHorizontal): 00122 print >>fOut, '%s' % (misc.asCSV(item.keys())) 00123 print >>fOut, '%s' % (misc.asCSV(item.values())) 00124 print >>fOut, '' 00125 else: 00126 isCallback = ( (csv_callback) and (callable(csv_callback)) ) 00127 i = 1 00128 for kk,vv in item.iteritems(): 00129 l = [i,kk,vv] 00130 if (isCallback): 00131 try: 00132 l = csv_callback(l) 00133 except: 00134 pass 00135 print >>fOut, '%s' % (misc.asCSV(l)) 00136 i += 1 00137 else: 00138 l_keys = [len(kk) for kk,vv in item.iteritems()] 00139 if (len(l_keys) > 0): 00140 max_len = misc.sort(l_keys)[-1] 00141 print >>fOut, '%sBEGIN: %s (%d items)' % (prefix,title,len(item)) 00142 i = 1 00143 for kk,vv in item.iteritems(): 00144 i_s_len = int(len(kk)/tab_width) 00145 i_s_len = 1 if (i_s_len == 0) else i_s_len 00146 i_spaces = (int(max_len/tab_width) - i_s_len) -1 00147 if (isinstance(vv,tuple)): 00148 vv = list(vv) 00149 if (isinstance(vv,list)): 00150 print >>fOut, '(%s' % ('-'*40) 00151 ReportTheList.reportTheList(vv,title='%d :: (%s) %s' % (i,kk,title),fOut=fOut) 00152 print >>fOut, ')%s' % ('-'*40) 00153 print >>fOut, '' 00154 elif (isDict(vv)): 00155 print >>fOut, '{%s' % ('-'*40) 00156 prettyPrint(vv,'\t\t',title='%d :: (%s) %s' % (i,kk,title),fOut=fOut) 00157 print >>fOut, '}%s' % ('-'*40) 00158 print >>fOut, '' 00159 else: 00160 try: 00161 print >>fOut, '%s\t\t%d :: %s%s-->%s' % (prefix,i,kk,'\t'*i_spaces,vv) 00162 except: 00163 pass 00164 i += 1 00165 _end_msg = '%sEND! %s from %s' % (prefix,title,_type_name) 00166 if (not delay_end): 00167 print >>fOut, _end_msg 00168 print >>fOut, '' 00169 else: 00170 ret.append(_end_msg) 00171 ret.append('') 00172 else: 00173 logging.warning('(%s) :: Unable to process the object passed to this function due to lack of data.' % (misc.funcName())) 00174 else: 00175 logging.warning('(%s) :: Unable to process the object passed to this function because it is of type "%s" and a dictionary object was expected.' % (misc.funcName(),_type_name)) 00176 except Exception, details: 00177 info_string = misc.formattedException(details=details) 00178 print >>sys.stderr, info_string 00179 return ret 00180 00181 def _prettyPrint(item,prefix='',title='',tab_width=4,delay_end=False,fOut=sys.stdout): 00182 prettyPrint(item,prefix=prefix,title=title,tab_width=tab_width,delay_end=delay_end,fOut=fOut) 00183 00184 class UnicodeMixin(CooperativeClass.Cooperative): 00185 ## 00186 # encodes the contents of the object using the named codec 00187 def encode(self,codec_name): 00188 if (isDict(self)): 00189 for k,v in self.iteritems(): 00190 self[k] = v.encode(codec_name) 00191 elif (isinstance(self,list)): 00192 for i in xrange(len(self)): 00193 self[i] = self[i].encode(codec_name) 00194 elif (misc.isString(self)): 00195 self = self.encode(codec_name) 00196 else: 00197 self = str(self).encode(codec_name) 00198 00199 class HashedLists(UnicodeMixin, CooperativeClass.Cooperative): 00200 def __init__(self,fromDict={},caseless=False): 00201 self.__dict = {} 00202 self.__caseless__ = caseless 00203 self.__make_key__ = lambda key:str(key) if (not caseless) else str(key).lower() 00204 if (isinstance(fromDict,list)): 00205 self.fromListOfPairs(fromDict) 00206 else: 00207 try: 00208 if (fromDict.keys()) and (fromDict.values()): 00209 self.fromDict(fromDict) 00210 except Exception, details: 00211 info_string = misc.formattedException(details=details) 00212 print >>sys.stderr, info_string 00213 00214 def __repr__(self): 00215 return '(%s) storing %d keys.' % (ObjectTypeName__typeName(self),len(self.keys())) 00216 00217 def prettyPrint(self,prefix='',title='',tab_width=4,delay_end=False,fOut=sys.stdout): 00218 _prettyPrint(self,prefix='',title='',tab_width=4,delay_end=delay_end,fOut=fOut) 00219 00220 def fromDict(self, d): 00221 try: 00222 if (d.keys()) and (d.values()): 00223 for k,v in d.iteritems(): 00224 try: 00225 if (v.keys()) and (v.values()): 00226 cc = '%s()' % ObjectTypeName.typeName(self).split('.')[-1] 00227 new_d = eval(cc) 00228 new_d.fromDict(v) 00229 self[k] = new_d 00230 except AttributeError: 00231 if (isinstance(v,list)): 00232 for item in v: 00233 self[k] = item 00234 else: 00235 self[k] = v 00236 except: 00237 pass 00238 return self 00239 00240 ## 00241 # l_pairs is a list of pairs of values where the first value is the key and the next value is the value. 00242 def fromListOfPairs(self,l_pairs): 00243 for i in xrange(0,len(l_pairs),2): 00244 self[l_pairs[i]] = l_pairs[i+1] 00245 return self 00246 00247 def asDict(self,insideOut=False,isCopy=False): 00248 return asDict(self,insideOut=insideOut,isCopy=isCopy) 00249 00250 def asJSONSerializable(self,insideOut=False): 00251 return asJSONSerializable(self) 00252 00253 def invert(self): 00254 return asDict(self,insideOut=True,isCopy=True) 00255 00256 def insideOut(self): 00257 return asDict(self,insideOut=True,isCopy=True) 00258 00259 def invert(self): 00260 return dict(zip(*zip(*self.items())[::-1])) 00261 00262 def items(self): 00263 return ((k,v) for k,v in self.iteritems()) 00264 00265 def fileName(): 00266 doc = "fileName" 00267 def fget(self): 00268 return ObjectTypeName.typeClassName(self) 00269 return locals() 00270 fileName = property(**fileName()) 00271 00272 def diff(self, other): 00273 d = {} 00274 for k,v in other.iteritems(): 00275 key = self.__make_key__(k) 00276 if (self[key] != v): 00277 d[key] = v 00278 return d 00279 00280 def __add__(self, other): 00281 for k,v in other.iteritems(): 00282 self[self.__make_key__(k)] = v 00283 return self 00284 00285 def __iadd__(self, other): 00286 self.__add__(other) 00287 return self 00288 00289 def sortedKeys(self): 00290 return misc.sort(self.keys()) 00291 00292 def get(self,key, default): 00293 v = self.__dict[_key] 00294 if (v is not None): 00295 return v 00296 return default 00297 00298 def __getitem__(self, key): 00299 _key = self.__make_key__(key) 00300 return self.__dict[_key] if (self.has_key(_key)) else None 00301 00302 def __setitem__(self, key, value): 00303 _key = self.__make_key__(key) 00304 if (self.has_key(_key)) and (value == None): 00305 self.__delitem__(_key) 00306 elif (value != None): 00307 if (not self.__dict.has_key(_key)): 00308 self.__dict[_key] = [] 00309 bucket = self.__dict[_key] 00310 bucket.append(value) 00311 self.__dict[_key] = bucket 00312 00313 def __delitem__(self, key): 00314 _key = self.__make_key__(key) 00315 del self.__dict[_key] 00316 00317 def pretty(self,delim=''): 00318 return ('{%s' % (delim))+(',%s' % (delim)).join(["'%s':%s%s%s" % (k,"'" if (not str(self[k]).isdigit()) else "",str(self[k]).replace("'",""),"'" if (not str(self[k]).isdigit()) else "") for k in self.keys()])+('%s}' % (delim)) 00319 00320 def __str__(self): 00321 return '(%s)%s' % (ObjectTypeName__typeName(self),self.pretty()) 00322 00323 def __len__(self): 00324 return len(self.keys()) 00325 00326 def length(self): 00327 n = 0 00328 for k,v in self.iteritems(): 00329 n += len(v) 00330 return n 00331 00332 def has_key(self, key): 00333 return self.__dict.has_key(self.__make_key__(key)) 00334 00335 def keys(self): 00336 return self.__dict.keys() 00337 00338 def values(self): 00339 return self.__dict.values() 00340 00341 def iteritems(self): 00342 return ((k,self.__getitem__(k)) for k in self.keys()) 00343 00344 def caseless(): 00345 doc = "caseless flag, True if case is not used for keys otherwise False if case is used." 00346 def fget(self): 00347 return self.__caseless__ 00348 def fset(self,isCaseless): 00349 self.__caseless__ = isCaseless if (isinstance(isCaseless,bool)) else False 00350 return locals() 00351 caseless = property(**caseless()) 00352 00353 def represent(self,level=0,output=False): 00354 s = [] 00355 _indent = '\t'*level 00356 for k,v in self.iteritems(): 00357 s.append('%s%s = ' % (_indent,k)) 00358 if (isDict(v)): 00359 t = represent(v,level+1) 00360 s += t.split('\n') 00361 elif (isinstance(v,list)): 00362 for i in v: 00363 if (isDict(i)): 00364 t = represent(i,level+1) 00365 s += t.split('\n') 00366 else: 00367 s[-1] = s[-1]+'"%s"' % (i) 00368 else: 00369 s[-1] = s[-1]+'"%s"' % (v) 00370 if (output): 00371 print '\n'.join(s) 00372 return '\n'.join(s) 00373 00374 class HashedLists2(HashedLists): 00375 def __getitem__(self, key): 00376 return super(HashedLists2, self).__getitem__(key)[0] if (super(HashedLists2, self).has_key(key)) else None 00377 00378 def __setitem__(self, key, value): 00379 if (super(HashedLists2, self).has_key(key)): 00380 super(HashedLists2, self).__delitem__(key) 00381 super(HashedLists2, self).__setitem__(key,value) 00382 00383 class HashedFuzzyLists(HashedLists): 00384 def __init__(self,d={}): 00385 super(HashedFuzzyLists, self).__init__(fromDict=d,caseless=True) 00386 00387 def __getitem__(self, key): 00388 _key = key.lower() 00389 for k in self.keys(): 00390 if (k.lower() == _key): 00391 val = super(HashedFuzzyLists, self).__getitem__(k) 00392 return val 00393 return None 00394 00395 class HashedFuzzyLists2(HashedLists2): 00396 def __init__(self,d={}): 00397 super(HashedFuzzyLists2, self).__init__(fromDict=d,caseless=True) 00398 00399 def __getitem__(self, key): 00400 _key = key.lower() 00401 for k in self.keys(): 00402 if (k.lower() == _key): 00403 val = super(HashedFuzzyLists2, self).__getitem__(k) 00404 return val if (not isinstance(val,list)) else val[0] 00405 return None 00406 00407 ## 00408 # Takes a list of tuple items and makes an Ordered Dictionary from them. 00409 class HashedOrderedList(HashedLists2): 00410 def __init__(self,fromTupleList=[]): 00411 self.__list = fromTupleList 00412 d = {} 00413 for item in self.__list: 00414 d[item[0]] = item[-1] 00415 super(HashedOrderedList, self).__init__(d) 00416 00417 def keys(self): 00418 return [n[0] for n in self.__list] 00419 00420 def values(self): 00421 return [n[-1] for n in self.__list] 00422 00423 def length(self): 00424 return len(self.keys()) 00425 00426 00427 if (__name__ == '__main__'): 00428 import sys 00429 print >>sys.stdout, __copyright__ 00430 print >>sys.stderr, __copyright__ 00431 00432
© Copyright 2008-2009 Vyper Logix Corp., All Right Reserved; If you reference this document or any part of this document you must use the citation verbatim (including the link) "© Copyright 2008-2009 Vyper Logix Corp., All Right Reserved."
Notice: This source code contained in this document is NOT open source and is NOT being distributed as open source.
122,241 lines of code and growing...