PNG  IHDR* pHYs+ IDATx]n#; cdLb Ǚ[at¤_:uP}>!Usă cag޿ ֵNu`ݼTâabO7uL&y^wFٝA"l[|ŲHLN밪4*sG3|Dv}?+y߉{OuOAt4Jj.u]Gz*҉sP'VQKbA1u\`& Af;HWj hsO;ogTu uj7S3/QzUr&wS`M$X_L7r2;aE+ώ%vikDA:dR+%KzƉo>eOth$z%: :{WwaQ:wz%4foɹE[9<]#ERINƻv溂E%P1i01 |Jvҗ&{b?9g=^wζXn/lK::90KwrюO\!ջ3uzuGv^;騢wq<Iatv09:tt~hEG`v;3@MNZD.1]L:{ծI3`L(÷ba")Y.iljCɄae#I"1 `3*Bdz>j<fU40⨬%O$3cGt]j%Fߠ_twJ;ABU8vP3uEԑwQ V:h%))LfraqX-ۿX]v-\9I gl8tzX ]ecm)-cgʒ#Uw=Wlێn(0hPP/ӨtQ“&J35 $=]r1{tLuǮ*i0_;NƝ8;-vݏr8+U-kruȕYr0RnC]*ެ(M:]gE;{]tg(#ZJ9y>utRDRMdr9㪩̞zֹb<ģ&wzJM"iI( .ꮅX)Qw:9,i좜\Ԛi7&N0:asϓc];=ΗOӣ APqz93 y $)A*kVHZwBƺnWNaby>XMN*45~ղM6Nvm;A=jֲ.~1}(9`KJ/V F9[=`~[;sRuk]rєT!)iQO)Y$V ی ۤmzWz5IM Zb )ˆC`6 rRa}qNmUfDsWuˤV{ Pݝ'=Kֳbg,UҘVz2ﴻnjNgBb{? ߮tcsͻQuxVCIY۠:(V뺕 ٥2;t`@Fo{Z9`;]wMzU~%UA蛚dI vGq\r82iu +St`cR.6U/M9IENDB`# -*- coding: utf-8 -*- """ parsedatetime/context.py Context related classes """ from threading import local class pdtContextStack(object): """ A thread-safe stack to store context(s) Internally used by L{Calendar} object """ def __init__(self): self.__local = local() @property def __stack(self): if not hasattr(self.__local, 'stack'): self.__local.stack = [] return self.__local.stack def push(self, ctx): self.__stack.append(ctx) def pop(self): try: return self.__stack.pop() except IndexError: return None def last(self): try: return self.__stack[-1] except IndexError: raise RuntimeError('context stack is empty') def isEmpty(self): return not self.__stack class pdtContext(object): """ Context contains accuracy flag detected by L{Calendar.parse()} Accuracy flag uses bitwise-OR operation and is combined by: ACU_YEAR - "next year", "2014" ACU_MONTH - "March", "July 2014" ACU_WEEK - "last week", "next 3 weeks" ACU_DAY - "tomorrow", "July 4th 2014" ACU_HALFDAY - "morning", "tonight" ACU_HOUR - "18:00", "next hour" ACU_MIN - "18:32", "next 10 minutes" ACU_SEC - "18:32:55" ACU_NOW - "now" """ __slots__ = ('accuracy',) ACU_YEAR = 2 ** 0 ACU_MONTH = 2 ** 1 ACU_WEEK = 2 ** 2 ACU_DAY = 2 ** 3 ACU_HALFDAY = 2 ** 4 ACU_HOUR = 2 ** 5 ACU_MIN = 2 ** 6 ACU_SEC = 2 ** 7 ACU_NOW = 2 ** 8 ACU_DATE = ACU_YEAR | ACU_MONTH | ACU_WEEK | ACU_DAY ACU_TIME = ACU_HALFDAY | ACU_HOUR | ACU_MIN | ACU_SEC | ACU_NOW _ACCURACY_MAPPING = [ (ACU_YEAR, 'year'), (ACU_MONTH, 'month'), (ACU_WEEK, 'week'), (ACU_DAY, 'day'), (ACU_HALFDAY, 'halfday'), (ACU_HOUR, 'hour'), (ACU_MIN, 'min'), (ACU_SEC, 'sec'), (ACU_NOW, 'now')] _ACCURACY_REVERSE_MAPPING = { 'year': ACU_YEAR, 'years': ACU_YEAR, 'month': ACU_MONTH, 'months': ACU_MONTH, 'week': ACU_WEEK, 'weeks': ACU_WEEK, 'day': ACU_DAY, 'days': ACU_DAY, 'halfday': ACU_HALFDAY, 'morning': ACU_HALFDAY, 'afternoon': ACU_HALFDAY, 'evening': ACU_HALFDAY, 'night': ACU_HALFDAY, 'tonight': ACU_HALFDAY, 'midnight': ACU_HALFDAY, 'hour': ACU_HOUR, 'hours': ACU_HOUR, 'min': ACU_MIN, 'minute': ACU_MIN, 'mins': ACU_MIN, 'minutes': ACU_MIN, 'sec': ACU_SEC, 'second': ACU_SEC, 'secs': ACU_SEC, 'seconds': ACU_SEC, 'now': ACU_NOW} def __init__(self, accuracy=0): """ Default constructor of L{pdtContext} class. @type accuracy: integer @param accuracy: Accuracy flag @rtype: object @return: L{pdtContext} instance """ self.accuracy = accuracy def updateAccuracy(self, *accuracy): """ Updates current accuracy flag """ for acc in accuracy: if not isinstance(acc, int): acc = self._ACCURACY_REVERSE_MAPPING[acc] self.accuracy |= acc def update(self, context): """ Uses another L{pdtContext} instance to update current one """ self.updateAccuracy(context.accuracy) @property def hasDate(self): """ Returns True if current context is accurate to date """ return bool(self.accuracy & self.ACU_DATE) @property def hasTime(self): """ Returns True if current context is accurate to time """ return bool(self.accuracy & self.ACU_TIME) @property def dateTimeFlag(self): """ Returns the old date/time flag code """ return int(self.hasDate and 1) | int(self.hasTime and 2) @property def hasDateOrTime(self): """ Returns True if current context is accurate to date/time """ return bool(self.accuracy) def __repr__(self): accuracy_repr = [] for acc, name in self._ACCURACY_MAPPING: if acc & self.accuracy: accuracy_repr.append('pdtContext.ACU_%s' % name.upper()) if accuracy_repr: accuracy_repr = 'accuracy=' + ' | '.join(accuracy_repr) else: accuracy_repr = '' return 'pdtContext(%s)' % accuracy_repr def __eq__(self, ctx): return self.accuracy == ctx.accuracy