source: OpenRLabs-Git/deploy/rlabs-docker/web2py-rlabs/gluon/packages/dal/pydal/representers/__init__.py

main
Last change on this file was 42bd667, checked in by David Fuertes <dfuertes@…>, 4 years ago

Historial Limpio

  • Property mode set to 100755
File size: 8.6 KB
Line 
1from collections import defaultdict
2from .._compat import PY2, with_metaclass, iteritems, to_unicode, to_bytes, string_types
3from .._gae import gae
4from ..helpers._internals import Dispatcher
5from ..helpers.regex import REGEX_TYPE
6
7representers = Dispatcher("representer")
8
9
10class for_type(object):
11    def __init__(self, field_type, encode=False, adapt=True):
12        self.field_type = field_type
13        self.encode = encode
14        self.adapt = adapt
15
16    def __call__(self, f):
17        self.f = f
18        return self
19
20
21class before_type(object):
22    def __init__(self, field_type):
23        self.field_type = field_type
24
25    def __call__(self, f):
26        self.f = f
27        return self
28
29
30class for_instance(object):
31    def __init__(self, inst_type, repr_type=False):
32        self.inst_type = inst_type
33        self.repr_type = repr_type
34
35    def __call__(self, f):
36        self.f = f
37        return self
38
39
40class pre(object):
41    _inst_count_ = 0
42
43    def __init__(self, is_breaking=None):
44        self.breaking = is_breaking
45        self._inst_count_ = pre._inst_count_
46        pre._inst_count_ += 1
47
48    def __call__(self, f):
49        self.f = f
50        return self
51
52
53class MetaRepresenter(type):
54    def __new__(cls, name, bases, attrs):
55        new_class = type.__new__(cls, name, bases, attrs)
56        if bases == (object,):
57            return new_class
58        #: collect declared attributes
59        trepresenters = {}
60        irepresenters = {}
61        tbefore = {}
62        pres = {}
63        for key, value in list(attrs.items()):
64            if isinstance(value, for_type):
65                trepresenters[key] = value
66            elif isinstance(value, before_type):
67                tbefore[key] = value
68            elif isinstance(value, for_instance):
69                irepresenters[key] = value
70            elif isinstance(value, pre):
71                pres[key] = value
72        #: get super declared attributes
73        declared_trepresenters = {}
74        declared_irepresenters = {}
75        declared_tbefore = {}
76        declared_pres = {}
77        for base in reversed(new_class.__mro__[1:]):
78            if hasattr(base, "_declared_trepresenters_"):
79                declared_trepresenters.update(base._declared_trepresenters_)
80            if hasattr(base, "_declared_irepresenters_"):
81                declared_irepresenters.update(base._declared_irepresenters_)
82            if hasattr(base, "_declared_tbefore_"):
83                declared_tbefore.update(base._declared_tbefore_)
84            if hasattr(base, "_declared_pres_"):
85                declared_pres.update(base._declared_pres_)
86        #: set trepresenters
87        declared_trepresenters.update(trepresenters)
88        declared_irepresenters.update(irepresenters)
89        declared_tbefore.update(tbefore)
90        declared_pres.update(pres)
91        new_class._declared_trepresenters_ = declared_trepresenters
92        new_class._declared_irepresenters_ = declared_irepresenters
93        new_class._declared_tbefore_ = declared_tbefore
94        new_class._declared_pres_ = declared_pres
95        return new_class
96
97
98class TReprMethodWrapper(object):
99    def __init__(self, representer, obj, extra=None):
100        self.representer = representer
101        self.obj = obj
102        if extra:
103            self.extra = extra
104            self.call = self._call_with_extras
105        else:
106            self.call = self._call
107        if self.obj.encode and PY2:
108            self.inner_call = self._inner_call_with_encode
109        else:
110            self.inner_call = self._inner_call
111        if self.obj.adapt:
112            self.adapt = self._adapt
113        else:
114            self.adapt = self._no_adapt
115
116    def _adapt(self, value):
117        return self.representer.adapt(value)
118
119    def _no_adapt(self, value):
120        return value
121
122    def _inner_call(self, value, **kwargs):
123        return self.obj.f(self.representer, value, **kwargs)
124
125    def _inner_call_with_encode(self, value, **kwargs):
126        if isinstance(value, unicode):
127            value = value.encode(self.representer.adapter.db_codec)
128        return self.obj.f(self.representer, value, **kwargs)
129
130    def _call_with_extras(self, value, field_type):
131        extras = self.extra(self.representer, field_type)
132        return self.inner_call(value, **extras)
133
134    def _call(self, value, field_type):
135        return self.inner_call(value)
136
137    def __call__(self, value, field_type):
138        return self.adapt(self.call(value, field_type))
139
140
141class IReprMethodWrapper(object):
142    def __init__(self, representer, obj):
143        self.representer = representer
144        self.obj = obj
145
146    def __call__(self, value, field_type):
147        rv = self.obj.f(self.representer, value, field_type)
148        return self.obj.repr_type, rv
149
150
151class PreMethodWrapper(object):
152    def __init__(self, representer, obj):
153        self.representer = representer
154        self.obj = obj
155        if self.obj.breaking is None:
156            self.call = self._call_autobreak
157        elif self.obj.breaking == True:
158            self.call = self._call_break
159        else:
160            self.call = self._call_nobreak
161
162    def _call_autobreak(self, value, field_type):
163        rv = self.obj.f(self.representer, value, field_type)
164        if rv is not None:
165            return True, rv
166        return False, value
167
168    def _call_break(self, value, field_type):
169        return self.obj.f(self.representer, value, field_type)
170
171    def _call_nobreak(self, value, field_type):
172        return False, self.obj.f(self.representer, value, field_type)
173
174    def __call__(self, value, field_type):
175        return self.call(value, field_type)
176
177
178class Representer(with_metaclass(MetaRepresenter)):
179    def __init__(self, adapter):
180        self.adapter = adapter
181        self.dialect = adapter.dialect
182        self._tbefore_registry_ = {}
183        for name, obj in iteritems(self._declared_tbefore_):
184            self._tbefore_registry_[obj.field_type] = obj.f
185        self.registered_t = defaultdict(lambda self=self: self._default)
186        for name, obj in iteritems(self._declared_trepresenters_):
187            if obj.field_type in self._tbefore_registry_:
188                self.registered_t[obj.field_type] = TReprMethodWrapper(
189                    self, obj, self._tbefore_registry_[obj.field_type]
190                )
191            else:
192                self.registered_t[obj.field_type] = TReprMethodWrapper(self, obj)
193        self.registered_i = {}
194        for name, obj in iteritems(self._declared_irepresenters_):
195            self.registered_i[obj.inst_type] = IReprMethodWrapper(self, obj)
196        self._pre_registry_ = []
197        pres = []
198        for name, obj in iteritems(self._declared_pres_):
199            pres.append(obj)
200        pres.sort(key=lambda x: x._inst_count_)
201        for pre in pres:
202            self._pre_registry_.append(PreMethodWrapper(self, pre))
203
204    def _default(self, value, field_type):
205        return self.adapt(value)
206
207    def _default_instance(self, value, field_type):
208        return True, value
209
210    def get_representer_for_instance(self, value):
211        for inst, representer in iteritems(self.registered_i):
212            if isinstance(value, inst):
213                return representer
214        return self._default_instance
215
216    def get_representer_for_type(self, field_type):
217        key = REGEX_TYPE.match(field_type).group(0)
218        return self.registered_t[key]
219
220    def adapt(self, value):
221        if PY2:
222            if not isinstance(value, string_types):
223                value = str(value)
224            value = to_bytes(value)
225            try:
226                value.decode(self.adapter.db_codec)
227            except:
228                value = value.decode("latin1").encode(self.adapter.db_codec)
229        else:
230            value = to_unicode(value)
231        return self.adapter.adapt(value)
232
233    def exceptions(self, value, field_type):
234        return None
235
236    def represent(self, value, field_type):
237        pre_end = False
238        for pre in self._pre_registry_:
239            pre_end, value = pre(value, field_type)
240            if pre_end:
241                break
242        if pre_end:
243            return value
244        repr_type, rv = self.get_representer_for_instance(value)(value, field_type)
245        if repr_type:
246            rv = self.get_representer_for_type(field_type)(rv, field_type)
247        return rv
248
249
250from .base import BaseRepresenter, SQLRepresenter, NoSQLRepresenter
251from .sqlite import SQLiteRepresenter, SpatialiteRepresenter
252from .postgre import PostgreRepresenter
253from .mysql import MySQLRepresenter
254from .mssql import MSSQLRepresenter
255from .mongo import MongoRepresenter
256from .db2 import DB2Representer
257from .informix import InformixRepresenter
258from .oracle import OracleRepresenter
259from .couchdb import CouchDBRepresenter
260
261if gae is not None:
262    from .google import GoogleDatastoreRepresenter
Note: See TracBrowser for help on using the repository browser.