summaryrefslogtreecommitdiffstats
path: root/func/yaml/timestamp.py
diff options
context:
space:
mode:
Diffstat (limited to 'func/yaml/timestamp.py')
-rw-r--r--func/yaml/timestamp.py152
1 files changed, 152 insertions, 0 deletions
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))