|
1 | 1 | import ast |
2 | 2 | import atexit |
| 3 | +import contextlib |
3 | 4 | import copy |
4 | 5 | import errno |
5 | 6 | import json |
@@ -69,8 +70,29 @@ class NonAnonymousLoginWithoutPassword(RuntimeError): |
69 | 70 | pass |
70 | 71 |
|
71 | 72 |
|
| 73 | +@contextlib.contextmanager |
| 74 | +def attr_changed(obj, attrname, value): |
| 75 | + old = getattr(obj, attrname, None) |
| 76 | + try: |
| 77 | + setattr(obj, attrname, value) |
| 78 | + yield |
| 79 | + finally: |
| 80 | + setattr(obj, attrname, old) |
| 81 | + |
| 82 | + |
| 83 | +def _raw_server_version( session ): |
| 84 | + import irods.connection |
| 85 | + s = session.clone() |
| 86 | + with attr_changed(s.pool, '_need_auth', False): |
| 87 | + conn = irods.connection.Connection(s.pool, s.pool.account) |
| 88 | + return conn.server_version |
| 89 | + |
| 90 | + |
72 | 91 | class iRODSSession: |
73 | 92 |
|
| 93 | + def raw_server_version(self): |
| 94 | + return _raw_server_version(self) |
| 95 | + |
74 | 96 | def library_features(self): |
75 | 97 | irods_version_needed = (4, 3, 1) |
76 | 98 | if self.server_version < irods_version_needed: |
@@ -354,11 +376,15 @@ def port(self): |
354 | 376 | return self.pool.account.port |
355 | 377 |
|
356 | 378 | @property |
357 | | - def server_version(self): |
| 379 | + def server_version(self): return self._server_version() |
| 380 | + |
| 381 | + RAW_SERVER_VERSION = staticmethod(lambda s:s.raw_server_version()) |
| 382 | + |
| 383 | + def _server_version(self, f = None): |
358 | 384 | reported_vsn = os.environ.get("PYTHON_IRODSCLIENT_REPORTED_SERVER_VERSION", "") |
359 | 385 | if reported_vsn: |
360 | 386 | return tuple(ast.literal_eval(reported_vsn)) |
361 | | - return self.__server_version() |
| 387 | + return self.__server_version() if f is None else f(self) |
362 | 388 |
|
363 | 389 | def __server_version(self): |
364 | 390 | try: |
|
0 commit comments