diff --git a/nodes.py b/nodes.py index d38132309706536d97d25f4f90a946fb8779b4d1_bm9kZXMucHk=..3a26ac60e6f4f9073c48de86c3adc9372e8fa700_bm9kZXMucHk= 100644 --- a/nodes.py +++ b/nodes.py @@ -3,10 +3,10 @@ This module defines all the nodes we can find in a RQL Syntax tree, except root nodes, defined in the `stmts` module. -:copyright: 2003-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +:copyright: 2003-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved. :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr :license: General Public License version 2 - http://www.gnu.org/licenses """ __docformat__ = "restructuredtext en" from itertools import chain @@ -7,8 +7,11 @@ :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr :license: General Public License version 2 - http://www.gnu.org/licenses """ __docformat__ = "restructuredtext en" from itertools import chain - +from decimal import Decimal +from datetime import datetime, date, time, timedelta +from time import localtime + try: @@ -14,3 +17,3 @@ try: - from mx.DateTime import DateTimeType, today, now + from mx.DateTime import DateTimeType, DateTimeDeltaType, today, now except: @@ -16,13 +19,5 @@ except: - from datetime import datetime as DateTimeType, date, datetime - from time import localtime - def now(): - return datetime(*localtime()[:6]) - def today(): - return date(*localtime()[:3]) - -KEYWORD_MAP = {'NOW' : now, - 'TODAY': today} + pass from rql import CoercionError from rql.base import BaseNode, Node, BinaryNode, LeafNode @@ -32,4 +27,28 @@ CONSTANT_TYPES = frozenset((None, 'Date', 'Datetime', 'Boolean', 'Float', 'Int', 'String', 'Substitute', 'etype')) +KEYWORD_MAP = {'NOW' : now, + 'TODAY': today} + +# keep using mx DateTime by default for bw compat +def use_py_datetime(): + global KEYWORD_MAP + KEYWORD_MAP = {'NOW' : datetime.now, + 'TODAY': date.today} + +ETYPE_PYOBJ_MAP = { bool: 'Boolean', + int: 'Int', + long: 'Int', + float: 'Float', + Decimal: 'Decimal', + unicode: 'String', + str: 'String', + datetime: 'Datetime', + date: 'Date', + time: 'Time', + timedelta: 'Interval', + DateTimeType: 'Datetime', + DateTimeDeltaType: 'Datetime', + } + def etype_from_pyobj(value): @@ -35,15 +54,10 @@ def etype_from_pyobj(value): - # try to guess type from value - if isinstance(value, bool): - return 'Boolean' - if isinstance(value, (int, long)): - return 'Int' - if isinstance(value, DateTimeType): - return 'Datetime' - elif isinstance(value, float): - return 'Float' - # XXX Bytes - return 'String' + """guess yams type from python value""" + # note: + # * Password is not selectable so no problem) + # * use type(value) and not value.__class__ since mx instances have no + # __class__ attribute + return ETYPE_PYOBJ_MAP[type(value)] def variable_ref(var): """get a VariableRef"""