clearer names for actions, and infer actions better
[monitor.git] / monitor / Rpyc / ModuleNetProxy.py
1 from NetProxy import NetProxyWrapper\r
2 \r
3 \r
4 class ModuleNetProxy(NetProxyWrapper):\r
5     """a netproxy specialzied for exposing remote modules (first tries to getattr,\r
6     if it fails tries to import)"""\r
7     __doc__ = NetProxyWrapper.__doc__\r
8     \r
9     def __init__(self, proxy, base):\r
10         NetProxyWrapper.__init__(self, proxy)\r
11         self.__dict__["____base"] = base\r
12         self.__dict__["____cache"] = {}\r
13 \r
14     def __request__(self, handler, *args):\r
15         return self.__dict__["____conn"].sync_request(handler, self.__dict__["____oid"], *args)\r
16 \r
17     def __getattr__(self, name):\r
18         if name in self.__dict__["____cache"]:\r
19             return self.__dict__["____cache"][name]\r
20 \r
21         try:\r
22             return self.__request__("handle_getattr", name)\r
23         except AttributeError:\r
24             pass\r
25         \r
26         try:\r
27             fullname = self.__dict__["____base"] + "." + name\r
28             obj = self.__dict__["____conn"].rimport(fullname)\r
29             module = ModuleNetProxy(obj, fullname)\r
30             self.__dict__["____cache"][name] = module\r
31             return module\r
32         except ImportError:\r
33             raise AttributeError("'module' object has not attribute or submodule %r" % (name,))\r
34 \r
35 class RootImporter(object):\r
36     """the root of the interpreter's import hierarchy"""\r
37     \r
38     def __init__(self, conn):\r
39         self.__dict__["____conn"] = conn\r
40     \r
41     def __getitem__(self, name):\r
42         return self.__dict__["____conn"].rimport(name)\r
43 \r
44     def __getattr__(self, name):\r
45         return ModuleNetProxy(self[name], name)\r
46 \r