diff options
author | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:16:14 +0300 |
---|---|---|
committer | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:43:30 +0300 |
commit | b8cf9e88f4c5c64d9406af533d8948deb050d695 (patch) | |
tree | 218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py2/twisted/persisted/crefutil.py | |
parent | 523f645a83a0ec97a0332dbc3863bb354c92a328 (diff) | |
download | ydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz |
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py2/twisted/persisted/crefutil.py')
-rw-r--r-- | contrib/python/Twisted/py2/twisted/persisted/crefutil.py | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py2/twisted/persisted/crefutil.py b/contrib/python/Twisted/py2/twisted/persisted/crefutil.py new file mode 100644 index 0000000000..fd2e6b9bf4 --- /dev/null +++ b/contrib/python/Twisted/py2/twisted/persisted/crefutil.py @@ -0,0 +1,159 @@ +# -*- test-case-name: twisted.test.test_persisted -*- + +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. + + +""" +Utility classes for dealing with circular references. +""" + +from __future__ import division, absolute_import + +from twisted.python import log, reflect +from twisted.python.compat import range, _constructMethod + + +class NotKnown: + def __init__(self): + self.dependants = [] + self.resolved = 0 + + def addDependant(self, mutableObject, key): + assert not self.resolved + self.dependants.append( (mutableObject, key) ) + + resolvedObject = None + + def resolveDependants(self, newObject): + self.resolved = 1 + self.resolvedObject = newObject + for mut, key in self.dependants: + mut[key] = newObject + + + def __hash__(self): + assert 0, "I am not to be used as a dictionary key." + + + +class _Container(NotKnown): + """ + Helper class to resolve circular references on container objects. + """ + + def __init__(self, l, containerType): + """ + @param l: The list of object which may contain some not yet referenced + objects. + + @param containerType: A type of container objects (e.g., C{tuple} or + C{set}). + """ + NotKnown.__init__(self) + self.containerType = containerType + self.l = l + self.locs = list(range(len(l))) + for idx in range(len(l)): + if not isinstance(l[idx], NotKnown): + self.locs.remove(idx) + else: + l[idx].addDependant(self, idx) + if not self.locs: + self.resolveDependants(self.containerType(self.l)) + + + def __setitem__(self, n, obj): + """ + Change the value of one contained objects, and resolve references if + all objects have been referenced. + """ + self.l[n] = obj + if not isinstance(obj, NotKnown): + self.locs.remove(n) + if not self.locs: + self.resolveDependants(self.containerType(self.l)) + + + +class _Tuple(_Container): + """ + Manage tuple containing circular references. Deprecated: use C{_Container} + instead. + """ + + def __init__(self, l): + """ + @param l: The list of object which may contain some not yet referenced + objects. + """ + _Container.__init__(self, l, tuple) + + + +class _InstanceMethod(NotKnown): + def __init__(self, im_name, im_self, im_class): + NotKnown.__init__(self) + self.my_class = im_class + self.name = im_name + # im_self _must_ be a NotKnown + im_self.addDependant(self, 0) + + def __call__(self, *args, **kw): + import traceback + log.msg('instance method %s.%s' % (reflect.qual(self.my_class), self.name)) + log.msg('being called with %r %r' % (args, kw)) + traceback.print_stack(file=log.logfile) + assert 0 + + def __setitem__(self, n, obj): + assert n == 0, "only zero index allowed" + if not isinstance(obj, NotKnown): + method = _constructMethod(self.my_class, self.name, obj) + self.resolveDependants(method) + +class _DictKeyAndValue: + def __init__(self, dict): + self.dict = dict + def __setitem__(self, n, obj): + if n not in (1, 0): + raise RuntimeError("DictKeyAndValue should only ever be called with 0 or 1") + if n: # value + self.value = obj + else: + self.key = obj + if hasattr(self, "key") and hasattr(self, "value"): + self.dict[self.key] = self.value + + +class _Dereference(NotKnown): + def __init__(self, id): + NotKnown.__init__(self) + self.id = id + + + +from twisted.internet.defer import Deferred + +class _Defer(Deferred, NotKnown): + def __init__(self): + Deferred.__init__(self) + NotKnown.__init__(self) + self.pause() + + wasset = 0 + + def __setitem__(self, n, obj): + if self.wasset: + raise RuntimeError('setitem should only be called once, setting %r to %r' % (n, obj)) + else: + self.wasset = 1 + self.callback(obj) + + def addDependant(self, dep, key): + # by the time I'm adding a dependant, I'm *not* adding any more + # callbacks + NotKnown.addDependant(self, dep, key) + self.unpause() + resovd = self.result + self.resolveDependants(resovd) |