author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Wed, 07 Apr 2010 14:26:35 +0200 | |
changeset 5174 | 78438ad513ca |
parent 5143 | 43afbdd5c8b4 |
child 5273 | c4caef6f09c9 |
permissions | -rw-r--r-- |
0 | 1 |
""" |
2308
b478c3a8ad2a
typos, cleanup, lighter traced seletion output
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2173
diff
changeset
|
2 |
* the vregistry handles various types of objects interacting |
b478c3a8ad2a
typos, cleanup, lighter traced seletion output
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2173
diff
changeset
|
3 |
together. The vregistry handles registration of dynamically loaded |
b478c3a8ad2a
typos, cleanup, lighter traced seletion output
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2173
diff
changeset
|
4 |
objects and provides a convenient api to access those objects |
0 | 5 |
according to a context |
6 |
||
2308
b478c3a8ad2a
typos, cleanup, lighter traced seletion output
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2173
diff
changeset
|
7 |
* to interact with the vregistry, objects should inherit from the |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
8 |
AppObject abstract class |
1433 | 9 |
|
0 | 10 |
* the selection procedure has been generalized by delegating to a |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
11 |
selector, which is responsible to score the appobject according to the |
0 | 12 |
current state (req, rset, row, col). At the end of the selection, if |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
13 |
a appobject class has been found, an instance of this class is |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
14 |
returned. The selector is instantiated at appobject registration |
0 | 15 |
|
16 |
||
17 |
:organization: Logilab |
|
4212
ab6573088b4a
update copyright: welcome 2010
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3641
diff
changeset
|
18 |
:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2. |
0 | 19 |
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
1977
606923dff11b
big bunch of copyright / docstring update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1943
diff
changeset
|
20 |
:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
0 | 21 |
""" |
22 |
__docformat__ = "restructuredtext en" |
|
23 |
||
24 |
import sys |
|
25 |
from os import listdir, stat |
|
4719
aaed3f813ef8
kill dead/useless code as suggested by pylint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4576
diff
changeset
|
26 |
from os.path import dirname, join, realpath, isdir, exists |
0 | 27 |
from logging import getLogger |
2083
f8f94c2951d3
add warning when rset isn't a named argument in select()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2058
diff
changeset
|
28 |
from warnings import warn |
0 | 29 |
|
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
30 |
from logilab.common.deprecation import deprecated, class_moved |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
31 |
from logilab.common.logging_ext import set_log_methods |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
32 |
|
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
33 |
from cubicweb import CW_SOFTWARE_ROOT |
2651
3ad936634d2a
[registry] when a source file is changed, reset and reload the whole registry
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2589
diff
changeset
|
34 |
from cubicweb import (RegistryNotFound, ObjectNotFound, NoSelectableObject, |
3ad936634d2a
[registry] when a source file is changed, reset and reload the whole registry
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2589
diff
changeset
|
35 |
RegistryOutOfDate) |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
36 |
from cubicweb.appobject import AppObject |
0 | 37 |
|
2025
010a4b0fe855
fix lookup of files to load when using CW_CUBES_PATH
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
38 |
def _toload_info(path, extrapath, _toload=None): |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
39 |
"""return a dictionary of <modname>: <modpath> and an ordered list of |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
40 |
(file, module name) to load |
0 | 41 |
""" |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
42 |
from logilab.common.modutils import modpath_from_file |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
43 |
if _toload is None: |
2025
010a4b0fe855
fix lookup of files to load when using CW_CUBES_PATH
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
44 |
assert isinstance(path, list) |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
45 |
_toload = {}, [] |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
46 |
for fileordir in path: |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
47 |
if isdir(fileordir) and exists(join(fileordir, '__init__.py')): |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
48 |
subfiles = [join(fileordir, fname) for fname in listdir(fileordir)] |
2025
010a4b0fe855
fix lookup of files to load when using CW_CUBES_PATH
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
49 |
_toload_info(subfiles, extrapath, _toload) |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
50 |
elif fileordir[-3:] == '.py': |
5078
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
51 |
modpath = modpath_from_file(fileordir, extrapath) |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
52 |
# omit '__init__' from package's name to avoid loading that module |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
53 |
# once for each name when it is imported by some other appobject |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
54 |
# module. This supposes import in modules are done as:: |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
55 |
# |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
56 |
# from package import something |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
57 |
# |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
58 |
# not:: |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
59 |
# |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
60 |
# from package.__init__ import something |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
61 |
# |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
62 |
# which seems quite correct. |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
63 |
if modpath[-1] == '__init__': |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
64 |
modpath.pop() |
ea66c4aabb47
[appobject imports] don't include __init__ in package's name. See comment for more info
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
65 |
modname = '.'.join(modpath) |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
66 |
_toload[0][modname] = fileordir |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
67 |
_toload[1].append((fileordir, modname)) |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
68 |
return _toload |
0 | 69 |
|
70 |
||
2821
526f44213b70
no need for a classid class method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2820
diff
changeset
|
71 |
def classid(cls): |
526f44213b70
no need for a classid class method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2820
diff
changeset
|
72 |
"""returns a unique identifier for an appobject class""" |
526f44213b70
no need for a classid class method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2820
diff
changeset
|
73 |
return '%s.%s' % (cls.__module__, cls.__name__) |
526f44213b70
no need for a classid class method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2820
diff
changeset
|
74 |
|
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
75 |
def class_regid(cls): |
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
76 |
"""returns a unique identifier for an appobject class""" |
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
77 |
if 'id' in cls.__dict__: |
3405
9d31c9cb8103
nicer deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3383
diff
changeset
|
78 |
warn('[3.6] %s.%s: id is deprecated, use __regid__' |
3383
c6aff16e5aed
nicer warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3376
diff
changeset
|
79 |
% (cls.__module__, cls.__name__), DeprecationWarning) |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3072
diff
changeset
|
80 |
cls.__regid__ = cls.id |
4013
f0d1038e5059
.id backward compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3674
diff
changeset
|
81 |
if hasattr(cls, 'id') and not isinstance(cls.id, property): |
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
82 |
return cls.id |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3072
diff
changeset
|
83 |
return cls.__regid__ |
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
84 |
|
5093
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
85 |
def class_registries(cls, registryname): |
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
86 |
if registryname: |
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
87 |
return (registryname,) |
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
88 |
return cls.__registries__ |
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
89 |
|
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
90 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
91 |
class Registry(dict): |
0 | 92 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
93 |
def __init__(self, config): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
94 |
super(Registry, self).__init__() |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
95 |
self.config = config |
0 | 96 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
97 |
def __getitem__(self, name): |
0 | 98 |
"""return the registry (dictionary of class objects) associated to |
99 |
this name |
|
100 |
""" |
|
101 |
try: |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
102 |
return super(Registry, self).__getitem__(name) |
0 | 103 |
except KeyError: |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
104 |
raise ObjectNotFound(name), None, sys.exc_info()[-1] |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
105 |
|
4490
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
106 |
def initialization_completed(self): |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
107 |
for appobjects in self.itervalues(): |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
108 |
for appobjectcls in appobjects: |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
109 |
appobjectcls.__registered__(self) |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
110 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
111 |
def register(self, obj, oid=None, clear=False): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
112 |
"""base method to add an object in the registry""" |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
113 |
assert not '__abstract__' in obj.__dict__ |
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
114 |
oid = oid or class_regid(obj) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
115 |
assert oid |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
116 |
if clear: |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
117 |
appobjects = self[oid] = [] |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
118 |
else: |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
119 |
appobjects = self.setdefault(oid, []) |
4490
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
120 |
assert not obj in appobjects, \ |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
121 |
'object %s is already registered' % obj |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
122 |
appobjects.append(obj) |
0 | 123 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
124 |
def register_and_replace(self, obj, replaced): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
125 |
# XXXFIXME this is a duplication of unregister() |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
126 |
# remove register_and_replace in favor of unregister + register |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
127 |
# or simplify by calling unregister then register here |
2821
526f44213b70
no need for a classid class method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2820
diff
changeset
|
128 |
if not isinstance(replaced, basestring): |
526f44213b70
no need for a classid class method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2820
diff
changeset
|
129 |
replaced = classid(replaced) |
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
130 |
registered_objs = self.get(class_regid(obj), ()) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
131 |
for index, registered in enumerate(registered_objs): |
2821
526f44213b70
no need for a classid class method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2820
diff
changeset
|
132 |
if classid(registered) == replaced: |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
133 |
del registered_objs[index] |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
134 |
break |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
135 |
else: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
136 |
self.warning('trying to replace an unregistered view %s by %s', |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
137 |
replaced, obj) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
138 |
self.register(obj) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
139 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
140 |
def unregister(self, obj): |
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
141 |
clsid = classid(obj) |
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
142 |
oid = class_regid(obj) |
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
143 |
for registered in self.get(oid, ()): |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
144 |
# use classid() to compare classes because vreg will probably |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
145 |
# have its own version of the class, loaded through execfile |
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
146 |
if classid(registered) == clsid: |
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
147 |
self[oid].remove(registered) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
148 |
break |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
149 |
else: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
150 |
self.warning('can\'t remove %s, no id %s in the registry', |
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
151 |
clsid, oid) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
152 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
153 |
def all_objects(self): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
154 |
"""return a list containing all objects in this registry. |
0 | 155 |
""" |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
156 |
result = [] |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
157 |
for objs in self.values(): |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
158 |
result += objs |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
159 |
return result |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
160 |
|
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
161 |
# dynamic selection methods ################################################ |
665
1305da1ce3f9
reorganize a bit, some cleanup and fixes
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
162 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
163 |
def object_by_id(self, oid, *args, **kwargs): |
5143
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
164 |
"""return object with the `oid` identifier. Only one object is expected |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
165 |
to be found. |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
166 |
|
5143
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
167 |
raise :exc:`ObjectNotFound` if not object with id <oid> in <registry> |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
168 |
|
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
169 |
raise :exc:`AssertionError` if there is more than one object there |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
170 |
""" |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
171 |
objects = self[oid] |
665
1305da1ce3f9
reorganize a bit, some cleanup and fixes
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
172 |
assert len(objects) == 1, objects |
2658
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
173 |
return objects[0](*args, **kwargs) |
665
1305da1ce3f9
reorganize a bit, some cleanup and fixes
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
174 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
175 |
def select(self, oid, *args, **kwargs): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
176 |
"""return the most specific object among those with the given oid |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
177 |
according to the given context. |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
178 |
|
5143
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
179 |
raise :exc:`ObjectNotFound` if not object with id <oid> in <registry> |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
180 |
|
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
181 |
raise :exc:`NoSelectableObject` if not object apply |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
182 |
""" |
2769
1800aa0bf396
R [registry] changes in the API
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2689
diff
changeset
|
183 |
return self._select_best(self[oid], *args, **kwargs) |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
184 |
|
2769
1800aa0bf396
R [registry] changes in the API
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2689
diff
changeset
|
185 |
def select_or_none(self, oid, *args, **kwargs): |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
186 |
"""return the most specific object among those with the given oid |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
187 |
according to the given context, or None if no object applies. |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
188 |
""" |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
189 |
try: |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
190 |
return self.select(oid, *args, **kwargs) |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
191 |
except (NoSelectableObject, ObjectNotFound): |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
192 |
return None |
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
193 |
select_object = deprecated('[3.6] use select_or_none instead of select_object' |
2769
1800aa0bf396
R [registry] changes in the API
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2689
diff
changeset
|
194 |
)(select_or_none) |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
195 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
196 |
def possible_objects(self, *args, **kwargs): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
197 |
"""return an iterator on possible objects in this registry for the given |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
198 |
context |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
199 |
""" |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
200 |
for appobjects in self.itervalues(): |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
201 |
try: |
2769
1800aa0bf396
R [registry] changes in the API
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2689
diff
changeset
|
202 |
yield self._select_best(appobjects, *args, **kwargs) |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
203 |
except NoSelectableObject: |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
204 |
continue |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
205 |
|
2769
1800aa0bf396
R [registry] changes in the API
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2689
diff
changeset
|
206 |
def _select_best(self, appobjects, *args, **kwargs): |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
207 |
"""return an instance of the most specific object according |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
208 |
to parameters |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
209 |
|
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
210 |
raise `NoSelectableObject` if not object apply |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
211 |
""" |
2083
f8f94c2951d3
add warning when rset isn't a named argument in select()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2058
diff
changeset
|
212 |
if len(args) > 1: |
3044 | 213 |
warn('[3.5] only the request param can not be named when calling select*', |
2302
e0393451e9a5
fix stacklevel
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2181
diff
changeset
|
214 |
DeprecationWarning, stacklevel=3) |
5095
eaf522b9b998
[optimisation] _select_best is used very intensivly. Peanuts optimization may count :)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5093
diff
changeset
|
215 |
score, winners = 0, None |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
216 |
for appobject in appobjects: |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
217 |
appobjectscore = appobject.__select__(appobject, *args, **kwargs) |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
218 |
if appobjectscore > score: |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
219 |
score, winners = appobjectscore, [appobject] |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
220 |
elif appobjectscore > 0 and appobjectscore == score: |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
221 |
winners.append(appobject) |
5095
eaf522b9b998
[optimisation] _select_best is used very intensivly. Peanuts optimization may count :)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5093
diff
changeset
|
222 |
if winners is None: |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
223 |
raise NoSelectableObject('args: %s\nkwargs: %s %s' |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
224 |
% (args, kwargs.keys(), |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
225 |
[repr(v) for v in appobjects])) |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
226 |
if len(winners) > 1: |
5103
2b242604fc42
[vreg] we do want the opposite...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5096
diff
changeset
|
227 |
# log in production environement, error while debugging |
3641
cf30e4498674
fix debug attribute conflict on configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3638
diff
changeset
|
228 |
if self.config.debugmode: |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
229 |
raise Exception('select ambiguity, args: %s\nkwargs: %s %s' |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
230 |
% (args, kwargs.keys(), |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
231 |
[repr(v) for v in winners])) |
5103
2b242604fc42
[vreg] we do want the opposite...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5096
diff
changeset
|
232 |
self.error('select ambiguity, args: %s\nkwargs: %s %s', |
2b242604fc42
[vreg] we do want the opposite...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5096
diff
changeset
|
233 |
args, kwargs.keys(), [repr(v) for v in winners]) |
2658
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
234 |
# return the result of calling the appobject |
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
235 |
return winners[0](*args, **kwargs) |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
236 |
|
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
237 |
select_best = deprecated('[3.6] select_best is now private')(_select_best) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
238 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
239 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
240 |
class VRegistry(dict): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
241 |
"""class responsible to register, propose and select the various |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
242 |
elements used to build the web interface. Currently, we have templates, |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
243 |
views, actions and components. |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
244 |
""" |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
245 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
246 |
def __init__(self, config): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
247 |
super(VRegistry, self).__init__() |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
248 |
self.config = config |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
249 |
|
2760
30063071aee0
fix reloading, new .reset prototype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2689
diff
changeset
|
250 |
def reset(self, path=None, force_reload=None): |
2906
677fa98659a8
fix cw properties initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2836
diff
changeset
|
251 |
# don't use self.clear, we want to keep existing subdictionaries |
677fa98659a8
fix cw properties initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2836
diff
changeset
|
252 |
for subdict in self.itervalues(): |
677fa98659a8
fix cw properties initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2836
diff
changeset
|
253 |
subdict.clear() |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
254 |
self._lastmodifs = {} |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
255 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
256 |
def __getitem__(self, name): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
257 |
"""return the registry (dictionary of class objects) associated to |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
258 |
this name |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
259 |
""" |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
260 |
try: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
261 |
return super(VRegistry, self).__getitem__(name) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
262 |
except KeyError: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
263 |
raise RegistryNotFound(name), None, sys.exc_info()[-1] |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
264 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
265 |
# dynamic selection methods ################################################ |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
266 |
|
2788
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2771
diff
changeset
|
267 |
@deprecated('[3.4] use vreg[registry].object_by_id(oid, *args, **kwargs)') |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
268 |
def object_by_id(self, registry, oid, *args, **kwargs): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
269 |
"""return object in <registry>.<oid> |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
270 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
271 |
raise `ObjectNotFound` if not object with id <oid> in <registry> |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
272 |
raise `AssertionError` if there is more than one object there |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
273 |
""" |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
274 |
return self[registry].object_by_id(oid) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
275 |
|
2788
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2771
diff
changeset
|
276 |
@deprecated('[3.4] use vreg[registry].select(oid, *args, **kwargs)') |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
277 |
def select(self, registry, oid, *args, **kwargs): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
278 |
"""return the most specific object in <registry>.<oid> according to |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
279 |
the given context |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
280 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
281 |
raise `ObjectNotFound` if not object with id <oid> in <registry> |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
282 |
raise `NoSelectableObject` if not object apply |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
283 |
""" |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
284 |
return self[registry].select(oid, *args, **kwargs) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
285 |
|
2788
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2771
diff
changeset
|
286 |
@deprecated('[3.4] use vreg[registry].select_or_none(oid, *args, **kwargs)') |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
287 |
def select_object(self, registry, oid, *args, **kwargs): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
288 |
"""return the most specific object in <registry>.<oid> according to |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
289 |
the given context, or None if no object apply |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
290 |
""" |
2770
356e9d7c356d
R propagate registry API changes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2769
diff
changeset
|
291 |
return self[registry].select_or_none(oid, *args, **kwargs) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
292 |
|
2788
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2771
diff
changeset
|
293 |
@deprecated('[3.4] use vreg[registry].possible_objects(*args, **kwargs)') |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
294 |
def possible_objects(self, registry, *args, **kwargs): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
295 |
"""return an iterator on possible objects in <registry> for the given |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
296 |
context |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
297 |
""" |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
298 |
return self[registry].possible_objects(*args, **kwargs) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
299 |
|
665
1305da1ce3f9
reorganize a bit, some cleanup and fixes
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
300 |
# methods for explicit (un)registration ################################### |
668
61b2328f9ed9
rename registration callback, clear argument to register
sylvain.thenault@logilab.fr
parents:
665
diff
changeset
|
301 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
302 |
# default class, when no specific class set |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
303 |
REGISTRY_FACTORY = {None: Registry} |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
304 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
305 |
def registry_class(self, regid): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
306 |
try: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
307 |
return self.REGISTRY_FACTORY[regid] |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
308 |
except KeyError: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
309 |
return self.REGISTRY_FACTORY[None] |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
310 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
311 |
def setdefault(self, regid): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
312 |
try: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
313 |
return self[regid] |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
314 |
except KeyError: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
315 |
self[regid] = self.registry_class(regid)(self.config) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
316 |
return self[regid] |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
317 |
|
668
61b2328f9ed9
rename registration callback, clear argument to register
sylvain.thenault@logilab.fr
parents:
665
diff
changeset
|
318 |
# def clear(self, key): |
61b2328f9ed9
rename registration callback, clear argument to register
sylvain.thenault@logilab.fr
parents:
665
diff
changeset
|
319 |
# regname, oid = key.split('.') |
61b2328f9ed9
rename registration callback, clear argument to register
sylvain.thenault@logilab.fr
parents:
665
diff
changeset
|
320 |
# self[regname].pop(oid, None) |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2035
diff
changeset
|
321 |
|
695 | 322 |
def register_all(self, objects, modname, butclasses=()): |
5143
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
323 |
"""register all `objects` given. Objects which are not from the module |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
324 |
`modname` or which are in `butclasses` won't be registered. |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
325 |
|
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
326 |
Typical usage is: |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
327 |
|
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
328 |
.. sourcecode:: python |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
329 |
|
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
330 |
vreg.register_all(globals().values(), __name__, (ClassIWantToRegisterExplicitly,)) |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
331 |
|
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
332 |
So you get partially automatic registration, keeping manual registration |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
333 |
for some object (to use |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
334 |
:meth:`~cubicweb.cwvreg.CubicWebRegistry.register_and_replace` for |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
335 |
instance) |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
336 |
""" |
695 | 337 |
for obj in objects: |
338 |
try: |
|
339 |
if obj.__module__ != modname or obj in butclasses: |
|
340 |
continue |
|
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2821
diff
changeset
|
341 |
oid = class_regid(obj) |
695 | 342 |
except AttributeError: |
343 |
continue |
|
2587
79bbc5045288
[vreg] consider __abstract__ in register_all
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2308
diff
changeset
|
344 |
if oid and not '__abstract__' in obj.__dict__: |
5093
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
345 |
self.register(obj, oid=oid) |
1433 | 346 |
|
668
61b2328f9ed9
rename registration callback, clear argument to register
sylvain.thenault@logilab.fr
parents:
665
diff
changeset
|
347 |
def register(self, obj, registryname=None, oid=None, clear=False): |
5143
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
348 |
"""register `obj` application object into `registryname` or |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
349 |
`obj.__registry__` if not specified, with identifier `oid` or |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
350 |
`obj.__regid__` if not specified. |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
351 |
|
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
352 |
If `clear` is true, all objects with the same identifier will be |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
353 |
previously unregistered. |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
354 |
""" |
707 | 355 |
assert not '__abstract__' in obj.__dict__ |
665
1305da1ce3f9
reorganize a bit, some cleanup and fixes
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
356 |
try: |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
357 |
vname = obj.__name__ |
665
1305da1ce3f9
reorganize a bit, some cleanup and fixes
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
358 |
except AttributeError: |
5096
e25979a6d795
[cleanup] add some notes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5095
diff
changeset
|
359 |
# XXX may occurs? |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
360 |
vname = obj.__class__.__name__ |
5093
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
361 |
for registryname in class_registries(obj, registryname): |
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
362 |
registry = self.setdefault(registryname) |
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
363 |
registry.register(obj, oid=oid, clear=clear) |
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
364 |
self.debug('registered appobject %s in registry %s with id %s', |
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
365 |
vname, registryname, oid or class_regid(obj)) |
2844
4657d6e16e0c
use class_regid / classid functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2838
diff
changeset
|
366 |
self._loadedmods[obj.__module__][classid(obj)] = obj |
665
1305da1ce3f9
reorganize a bit, some cleanup and fixes
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
367 |
|
1305da1ce3f9
reorganize a bit, some cleanup and fixes
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
368 |
def unregister(self, obj, registryname=None): |
5143
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
369 |
"""unregister `obj` application object from the registry `registryname` or |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
370 |
`obj.__registry__` if not specified. |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
371 |
""" |
5093
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
372 |
for registryname in class_registries(obj, registryname): |
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
373 |
self[registryname].unregister(obj) |
1433 | 374 |
|
665
1305da1ce3f9
reorganize a bit, some cleanup and fixes
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
375 |
def register_and_replace(self, obj, replaced, registryname=None): |
5143
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
376 |
"""register `obj` application object into `registryname` or |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
377 |
`obj.__registry__` if not specified. If found, the `replaced` object |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
378 |
will be unregistered first (else a warning will be issued as it's |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
379 |
generally unexpected). |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5103
diff
changeset
|
380 |
""" |
5093
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
381 |
for registryname in class_registries(obj, registryname): |
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
382 |
self[registryname].register_and_replace(obj, replaced) |
665
1305da1ce3f9
reorganize a bit, some cleanup and fixes
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
383 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
384 |
# initialization methods ################################################### |
1433 | 385 |
|
2035
946ed7349e1a
bugfix: extrapath is optional arg for init_registration
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2025
diff
changeset
|
386 |
def init_registration(self, path, extrapath=None): |
1316
6d71d38822ee
introduce init_registration method and call it in repo initialization
sylvain.thenault@logilab.fr
parents:
1310
diff
changeset
|
387 |
# compute list of all modules that have to be loaded |
2025
010a4b0fe855
fix lookup of files to load when using CW_CUBES_PATH
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
388 |
self._toloadmods, filemods = _toload_info(path, extrapath) |
2651
3ad936634d2a
[registry] when a source file is changed, reset and reload the whole registry
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2589
diff
changeset
|
389 |
# XXX is _loadedmods still necessary ? It seems like it's useful |
3ad936634d2a
[registry] when a source file is changed, reset and reload the whole registry
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2589
diff
changeset
|
390 |
# to avoid loading same module twice, especially with the |
3ad936634d2a
[registry] when a source file is changed, reset and reload the whole registry
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2589
diff
changeset
|
391 |
# _load_ancestors_then_object logic but this needs to be checked |
1316
6d71d38822ee
introduce init_registration method and call it in repo initialization
sylvain.thenault@logilab.fr
parents:
1310
diff
changeset
|
392 |
self._loadedmods = {} |
6d71d38822ee
introduce init_registration method and call it in repo initialization
sylvain.thenault@logilab.fr
parents:
1310
diff
changeset
|
393 |
return filemods |
1433 | 394 |
|
2760
30063071aee0
fix reloading, new .reset prototype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2689
diff
changeset
|
395 |
def register_objects(self, path, force_reload, extrapath=None): |
0 | 396 |
# need to clean sys.path this to avoid import confusion pb (i.e. |
397 |
# having the same module loaded as 'cubicweb.web.views' subpackage and |
|
398 |
# as views' or 'web.views' subpackage |
|
399 |
# this is mainly for testing purpose, we should'nt need this in |
|
400 |
# production environment |
|
401 |
for webdir in (join(dirname(realpath(__file__)), 'web'), |
|
402 |
join(dirname(__file__), 'web')): |
|
403 |
if webdir in sys.path: |
|
404 |
sys.path.remove(webdir) |
|
405 |
if CW_SOFTWARE_ROOT in sys.path: |
|
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
406 |
sys.path.remove(CW_SOFTWARE_ROOT) |
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2381
diff
changeset
|
407 |
# load views from each directory in the instance's path |
2025
010a4b0fe855
fix lookup of files to load when using CW_CUBES_PATH
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
408 |
filemods = self.init_registration(path, extrapath) |
0 | 409 |
change = False |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
410 |
for filepath, modname in filemods: |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
411 |
if self.load_file(filepath, modname, force_reload): |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
412 |
change = True |
4490
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
413 |
if change: |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
414 |
self.initialization_completed() |
0 | 415 |
return change |
1433 | 416 |
|
4490
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
417 |
def initialization_completed(self): |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
418 |
for regname, reg in self.iteritems(): |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
419 |
reg.initialization_completed() |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
420 |
|
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
421 |
def load_file(self, filepath, modname, force_reload=False): |
2651
3ad936634d2a
[registry] when a source file is changed, reset and reload the whole registry
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2589
diff
changeset
|
422 |
"""load app objects from a python file""" |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
423 |
from logilab.common.modutils import load_module_from_name |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
424 |
if modname in self._loadedmods: |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
425 |
return |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
426 |
self._loadedmods[modname] = {} |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
427 |
try: |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
428 |
modified_on = stat(filepath)[-2] |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
429 |
except OSError: |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
430 |
# this typically happens on emacs backup files (.#foo.py) |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
431 |
self.warning('Unable to load %s. It is likely to be a backup file', |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
432 |
filepath) |
0 | 433 |
return False |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
434 |
if filepath in self._lastmodifs: |
0 | 435 |
# only load file if it was modified |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
436 |
if modified_on <= self._lastmodifs[filepath]: |
0 | 437 |
return |
2651
3ad936634d2a
[registry] when a source file is changed, reset and reload the whole registry
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2589
diff
changeset
|
438 |
# if it was modified, raise RegistryOutOfDate to reload everything |
3ad936634d2a
[registry] when a source file is changed, reset and reload the whole registry
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2589
diff
changeset
|
439 |
self.info('File %s changed since last visit', filepath) |
3ad936634d2a
[registry] when a source file is changed, reset and reload the whole registry
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2589
diff
changeset
|
440 |
raise RegistryOutOfDate() |
3565
4db55832e8a9
[vreg] fix reloading pb w/ module level error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3071
diff
changeset
|
441 |
# set update time before module loading, else we get some reloading |
4db55832e8a9
[vreg] fix reloading pb w/ module level error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3071
diff
changeset
|
442 |
# weirdness in case of syntax error or other error while importing the |
4db55832e8a9
[vreg] fix reloading pb w/ module level error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3071
diff
changeset
|
443 |
# module |
4db55832e8a9
[vreg] fix reloading pb w/ module level error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3071
diff
changeset
|
444 |
self._lastmodifs[filepath] = modified_on |
0 | 445 |
# load the module |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
446 |
module = load_module_from_name(modname, use_sys=not force_reload) |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
447 |
self.load_module(module) |
0 | 448 |
return True |
449 |
||
450 |
def load_module(self, module): |
|
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
451 |
self.info('loading %s', module) |
668
61b2328f9ed9
rename registration callback, clear argument to register
sylvain.thenault@logilab.fr
parents:
665
diff
changeset
|
452 |
if hasattr(module, 'registration_callback'): |
61b2328f9ed9
rename registration callback, clear argument to register
sylvain.thenault@logilab.fr
parents:
665
diff
changeset
|
453 |
module.registration_callback(self) |
660
5233a9457f6b
work in progress, draft for manual registration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
652
diff
changeset
|
454 |
else: |
5233a9457f6b
work in progress, draft for manual registration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
652
diff
changeset
|
455 |
for objname, obj in vars(module).items(): |
5233a9457f6b
work in progress, draft for manual registration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
652
diff
changeset
|
456 |
if objname.startswith('_'): |
5233a9457f6b
work in progress, draft for manual registration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
652
diff
changeset
|
457 |
continue |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
458 |
self._load_ancestors_then_object(module.__name__, obj) |
1433 | 459 |
|
4491
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
460 |
def _load_ancestors_then_object(self, modname, appobjectcls): |
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
461 |
"""handle automatic appobject class registration: |
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
462 |
|
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
463 |
- first ensure parent classes are already registered |
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
464 |
|
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
465 |
- class with __abstract__ == True in their local dictionnary or |
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
466 |
with a name starting starting by an underscore are not registered |
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
467 |
|
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
468 |
- appobject class needs to have __registry__ and __regid__ attributes |
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
469 |
set to a non empty string to be registered. |
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
470 |
""" |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
471 |
# imported classes |
4491
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
472 |
objmodname = getattr(appobjectcls, '__module__', None) |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
473 |
if objmodname != modname: |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
474 |
if objmodname in self._toloadmods: |
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
475 |
self.load_file(self._toloadmods[objmodname], objmodname) |
0 | 476 |
return |
477 |
# skip non registerable object |
|
478 |
try: |
|
4491
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
479 |
if not issubclass(appobjectcls, AppObject): |
0 | 480 |
return |
481 |
except TypeError: |
|
482 |
return |
|
4491
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
483 |
clsid = classid(appobjectcls) |
2844
4657d6e16e0c
use class_regid / classid functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2838
diff
changeset
|
484 |
if clsid in self._loadedmods[modname]: |
0 | 485 |
return |
4491
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
486 |
self._loadedmods[modname][clsid] = appobjectcls |
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
487 |
for parent in appobjectcls.__bases__: |
1310
99dfced5673e
fix vobjects registration to deal with objects inter-dependancy
sylvain.thenault@logilab.fr
parents:
1282
diff
changeset
|
488 |
self._load_ancestors_then_object(modname, parent) |
4491
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
489 |
if (appobjectcls.__dict__.get('__abstract__') |
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
490 |
or appobjectcls.__name__[0] == '_' |
5093
8d073d2e089d
[optimization] improve massive write performance by optimizing hooks selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5078
diff
changeset
|
491 |
or not appobjectcls.__registries__ |
4491
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
492 |
or not class_regid(appobjectcls)): |
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
493 |
return |
0 | 494 |
try: |
4491
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
495 |
self.register(appobjectcls) |
0 | 496 |
except Exception, ex: |
497 |
if self.config.mode in ('test', 'dev'): |
|
498 |
raise |
|
4491
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
499 |
self.exception('appobject %s registration failed: %s', |
a0f48c31b58a
kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
500 |
appobjectcls, ex) |
1433 | 501 |
|
502 |
||
503 |
# init logging |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
504 |
set_log_methods(VRegistry, getLogger('cubicweb.vreg')) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
505 |
set_log_methods(Registry, getLogger('cubicweb.registry')) |
0 | 506 |
|
507 |
||
835
7dcb11dd443e
fix relation_possible, ensure we return int
sylvain.thenault@logilab.fr
parents:
827
diff
changeset
|
508 |
# XXX bw compat functions ##################################################### |
693
cf0817dfc787
reimplements chainall/chainfirst using [And/Or], implemenent search_selector function on Selector base class
sylvain.thenault@logilab.fr
parents:
686
diff
changeset
|
509 |
|
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
510 |
from cubicweb.appobject import objectify_selector, AndSelector, OrSelector, Selector |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
511 |
|
2788
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2771
diff
changeset
|
512 |
objectify_selector = deprecated('[3.4] objectify_selector has been moved to appobject module')(objectify_selector) |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
513 |
|
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
514 |
Selector = class_moved(Selector) |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
515 |
|
2788
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2771
diff
changeset
|
516 |
@deprecated('[3.4] use & operator (binary and)') |
693
cf0817dfc787
reimplements chainall/chainfirst using [And/Or], implemenent search_selector function on Selector base class
sylvain.thenault@logilab.fr
parents:
686
diff
changeset
|
517 |
def chainall(*selectors, **kwargs): |
0 | 518 |
"""return a selector chaining given selectors. If one of |
519 |
the selectors fail, selection will fail, else the returned score |
|
520 |
will be the sum of each selector'score |
|
521 |
""" |
|
522 |
assert selectors |
|
759
e044f28372bd
chainall / chainfirst ensures selectors are instantiated
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
741
diff
changeset
|
523 |
# XXX do we need to create the AndSelector here, a tuple might be enough |
780
5b6c93816871
fix selector search and refactor auto-instantiation
sylvain.thenault@logilab.fr
parents:
760
diff
changeset
|
524 |
selector = AndSelector(*selectors) |
693
cf0817dfc787
reimplements chainall/chainfirst using [And/Or], implemenent search_selector function on Selector base class
sylvain.thenault@logilab.fr
parents:
686
diff
changeset
|
525 |
if 'name' in kwargs: |
cf0817dfc787
reimplements chainall/chainfirst using [And/Or], implemenent search_selector function on Selector base class
sylvain.thenault@logilab.fr
parents:
686
diff
changeset
|
526 |
selector.__name__ = kwargs['name'] |
0 | 527 |
return selector |
528 |
||
2788
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2771
diff
changeset
|
529 |
@deprecated('[3.4] use | operator (binary or)') |
693
cf0817dfc787
reimplements chainall/chainfirst using [And/Or], implemenent search_selector function on Selector base class
sylvain.thenault@logilab.fr
parents:
686
diff
changeset
|
530 |
def chainfirst(*selectors, **kwargs): |
0 | 531 |
"""return a selector chaining given selectors. If all |
532 |
the selectors fail, selection will fail, else the returned score |
|
533 |
will be the first non-zero selector score |
|
534 |
""" |
|
535 |
assert selectors |
|
780
5b6c93816871
fix selector search and refactor auto-instantiation
sylvain.thenault@logilab.fr
parents:
760
diff
changeset
|
536 |
selector = OrSelector(*selectors) |
693
cf0817dfc787
reimplements chainall/chainfirst using [And/Or], implemenent search_selector function on Selector base class
sylvain.thenault@logilab.fr
parents:
686
diff
changeset
|
537 |
if 'name' in kwargs: |
cf0817dfc787
reimplements chainall/chainfirst using [And/Or], implemenent search_selector function on Selector base class
sylvain.thenault@logilab.fr
parents:
686
diff
changeset
|
538 |
selector.__name__ = kwargs['name'] |
0 | 539 |
return selector |