From cda37e78dc61e8993e5868f3bbac173a69c5afd3 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Mon, 7 Jul 2008 17:06:34 -0400 Subject: Including yaml parser for use by Func-transmit, as we want to make sure we have one around that is compatible with older Python, and also tweaked not to do crayz things with stream layout. --- func/yaml/timestamp.py | 152 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 func/yaml/timestamp.py (limited to 'func/yaml/timestamp.py') diff --git a/func/yaml/timestamp.py b/func/yaml/timestamp.py new file mode 100644 index 0000000..5c522f6 --- /dev/null +++ b/func/yaml/timestamp.py @@ -0,0 +1,152 @@ +""" +pyyaml legacy +Copyright (c) 2001 Steve Howell and Friends; All Rights Reserved +(see open source license information in docs/ directory) +""" + + +import time, re, string +from types import ListType, TupleType + +PRIVATE_NOTICE = """ + This module is considered to be private implementation + details and is subject to change. Please only use the + objects and methods exported to the top level yaml package. +""" + +# +# Time specific operations +# + +_splitTime = re.compile('\-|\s|T|t|:|\.|Z') +matchTime = re.compile(\ + '\d+-\d+-\d+([\s|T|t]\d+:\d+:\d+.\d+(Z|(\s?[\-|\+]\d+:\d+)))?') + +def _parseTime(val): + if not matchTime.match(val): raise ValueError(val) + tpl = _splitTime.split(val) + if not(tpl): raise ValueError(val) + siz = len(tpl) + sec = 0 + if 3 == siz: + tpl += [0,0,0,0,0,-1] + elif 7 == siz: + tpl.append(0) + tpl.append(-1) + elif 8 == siz: + if len(tpl.pop()) > 0: raise ValueError(val) + tpl.append(0) + tpl.append(-1) + elif 9 == siz or 10 == siz: + mn = int(tpl.pop()) + hr = int(tpl.pop()) + sec = (hr*60+mn)*60 + if val.find("+") > -1: sec = -sec + if 10 == siz: tpl.pop() + tpl.append(0) + tpl.append(-1) + else: + raise ValueError(val) + idx = 0 + while idx < 9: + tpl[idx] = int(tpl[idx]) + idx += 1 + if tpl[1] < 1 or tpl[1] > 12: raise ValueError(val) + if tpl[2] < 1 or tpl[2] > 31: raise ValueError(val) + if tpl[3] > 24: raise ValueError(val) + if tpl[4] > 61: raise ValueError(val) + if tpl[5] > 61: raise ValueError(val) + if tpl[0] > 2038: + #TODO: Truncation warning + tpl = (2038,1,18,0,0,0,0,0,-1) + tpl = tuple(tpl) + ret = time.mktime(tpl) + ret = time.localtime(ret+sec) + ret = ret[:8] + (0,) + return ret + + +class _timestamp: + def __init__(self,val=None): + if not val: + self.__tval = time.gmtime() + else: + typ = type(val) + if ListType == typ: + self.__tval = tuple(val) + elif TupleType == typ: + self.__tval = val + else: + self.__tval = _parseTime(val) + if 9 != len(self.__tval): raise ValueError + def __getitem__(self,idx): return self.__tval[idx] + def __len__(self): return 9 + def strftime(self,format): return time.strftime(format,self.__tval) + def mktime(self): return time.mktime(self.__tval) + def asctime(self): return time.asctime(self.__tval) + def isotime(self): + return "%04d-%02d-%02dT%02d:%02d:%02d.00Z" % self.__tval[:6] + def __repr__(self): return "yaml.timestamp('%s')" % self.isotime() + def __str__(self): return self.isotime() + def to_yaml_implicit(self): return self.isotime() + def __hash__(self): return hash(self.__tval[:6]) + def __cmp__(self,other): + try: + return cmp(self.__tval[:6],other.__tval[:6]) + except AttributeError: + return -1 + +try: # inherit from mx.DateTime functionality if available + from mx import DateTime + class timestamp(_timestamp): + def __init__(self,val=None): + _timestamp.__init__(self,val) + self.__mxdt = DateTime.mktime(self.__tval) + def __getattr__(self, name): + return getattr(self.__mxdt, name) +except: + class timestamp(_timestamp): pass + + + +def unquote(expr): + """ + summary: > + Simply returns the unquoted string, and the + length of the quoted string token at the + beginning of the expression. + """ + tok = expr[0] + if "'" == tok: + idx = 1 + odd = 0 + ret = "" + while idx < len(expr): + chr = expr[idx] + if "'" == chr: + if odd: ret += chr + odd = not odd + else: + if odd: + tok = expr[:idx] + break + ret += chr + idx += 1 + if "'" == tok: tok = expr + return (ret,len(tok)) + if '"' == tok: + idx = 1 + esc = 0 + while idx < len(expr): + chr = expr[idx] + if '"' == chr and not esc: + tok = expr[:idx] + '"' + break + if '\\' == chr and not esc: esc = 1 + else: esc = 0 + idx += 1 + if '"' == tok: + raise SyntaxError("unmatched quote: " + expr) + ret = eval(tok) #TODO: find better way to unquote + return (ret,len(tok)) + return (expr,len(expr)) -- cgit