Best Python code snippet using slash
test_declarations.py
Source:test_declarations.py
...847class Test_alsoProvides(unittest.TestCase):848 def _callFUT(self, *args, **kw):849 from zope.interface.declarations import alsoProvides850 return alsoProvides(*args, **kw)851 def test_wo_existing_provides(self):852 from zope.interface.declarations import ProvidesClass853 from zope.interface.interface import InterfaceClass854 IFoo = InterfaceClass("IFoo")855 class Foo(object):856 pass857 obj = Foo()858 self._callFUT(obj, IFoo)859 self.assertTrue(isinstance(obj.__provides__, ProvidesClass))860 self.assertEqual(list(obj.__provides__), [IFoo])861 def test_w_existing_provides(self):862 from zope.interface.declarations import directlyProvides863 from zope.interface.declarations import ProvidesClass864 from zope.interface.interface import InterfaceClass865 IFoo = InterfaceClass("IFoo")866 IBar = InterfaceClass("IBar")867 class Foo(object):868 pass869 obj = Foo()870 directlyProvides(obj, IFoo)871 self._callFUT(obj, IBar)872 self.assertTrue(isinstance(obj.__provides__, ProvidesClass))873 self.assertEqual(list(obj.__provides__), [IFoo, IBar])874class Test_noLongerProvides(unittest.TestCase):875 def _callFUT(self, *args, **kw):876 from zope.interface.declarations import noLongerProvides877 return noLongerProvides(*args, **kw)878 def test_wo_existing_provides(self):879 from zope.interface.interface import InterfaceClass880 IFoo = InterfaceClass("IFoo")881 class Foo(object):882 pass883 obj = Foo()884 self._callFUT(obj, IFoo)885 self.assertEqual(list(obj.__provides__), [])886 def test_w_existing_provides_hit(self):887 from zope.interface.declarations import directlyProvides888 from zope.interface.interface import InterfaceClass889 IFoo = InterfaceClass("IFoo")890 class Foo(object):891 pass892 obj = Foo()893 directlyProvides(obj, IFoo)894 self._callFUT(obj, IFoo)895 self.assertEqual(list(obj.__provides__), [])896 def test_w_existing_provides_miss(self):897 from zope.interface.declarations import directlyProvides898 from zope.interface.interface import InterfaceClass899 IFoo = InterfaceClass("IFoo")900 IBar = InterfaceClass("IBar")901 class Foo(object):902 pass903 obj = Foo()904 directlyProvides(obj, IFoo)905 self._callFUT(obj, IBar)906 self.assertEqual(list(obj.__provides__), [IFoo])907 def test_w_iface_implemented_by_class(self):908 from zope.interface.declarations import implementer909 from zope.interface.interface import InterfaceClass910 IFoo = InterfaceClass("IFoo")911 @implementer(IFoo)912 class Foo(object):913 pass914 obj = Foo()915 self.assertRaises(ValueError, self._callFUT, obj, IFoo)916class ClassProvidesBaseFallbackTests(unittest.TestCase):917 def _getTargetClass(self):918 from zope.interface.declarations import ClassProvidesBaseFallback919 return ClassProvidesBaseFallback920 def _makeOne(self, klass, implements):921 # Don't instantiate directly: the C version can't have attributes922 # assigned.923 class Derived(self._getTargetClass()):924 def __init__(self, k, i):925 self._cls = k926 self._implements = i927 return Derived(klass, implements)928 def test_w_same_class_via_class(self):929 from zope.interface.interface import InterfaceClass930 IFoo = InterfaceClass("IFoo")931 class Foo(object):932 pass933 cpbp = Foo.__provides__ = self._makeOne(Foo, IFoo)934 self.assertTrue(Foo.__provides__ is cpbp)935 def test_w_same_class_via_instance(self):936 from zope.interface.interface import InterfaceClass937 IFoo = InterfaceClass("IFoo")938 class Foo(object):939 pass940 foo = Foo()941 cpbp = Foo.__provides__ = self._makeOne(Foo, IFoo)942 self.assertTrue(foo.__provides__ is IFoo)943 def test_w_different_class(self):944 from zope.interface.interface import InterfaceClass945 IFoo = InterfaceClass("IFoo")946 class Foo(object):947 pass948 class Bar(Foo):949 pass950 bar = Bar()951 cpbp = Foo.__provides__ = self._makeOne(Foo, IFoo)952 self.assertRaises(AttributeError, getattr, Bar, '__provides__')953 self.assertRaises(AttributeError, getattr, bar, '__provides__')954class ClassProvidesBaseTests(ClassProvidesBaseFallbackTests):955 # Repeat tests for C optimizations956 def _getTargetClass(self):957 from zope.interface.declarations import ClassProvidesBase958 return ClassProvidesBase959class ClassProvidesTests(unittest.TestCase):960 def _getTargetClass(self):961 from zope.interface.declarations import ClassProvides962 return ClassProvides963 def _makeOne(self, *args, **kw):964 return self._getTargetClass()(*args, **kw)965 def test_w_simple_metaclass(self):966 from zope.interface.declarations import implementer967 from zope.interface.interface import InterfaceClass968 IFoo = InterfaceClass("IFoo")969 IBar = InterfaceClass("IBar")970 @implementer(IFoo)971 class Foo(object):972 pass973 cp = Foo.__provides__ = self._makeOne(Foo, type(Foo), IBar)974 self.assertTrue(Foo.__provides__ is cp)975 self.assertEqual(list(Foo().__provides__), [IFoo])976 def test___reduce__(self):977 from zope.interface.declarations import implementer978 from zope.interface.interface import InterfaceClass979 IFoo = InterfaceClass("IFoo")980 IBar = InterfaceClass("IBar")981 @implementer(IFoo)982 class Foo(object):983 pass984 cp = Foo.__provides__ = self._makeOne(Foo, type(Foo), IBar)985 self.assertEqual(cp.__reduce__(),986 (self._getTargetClass(), (Foo, type(Foo), IBar)))987class Test_directlyProvidedBy(unittest.TestCase):988 def _callFUT(self, *args, **kw):989 from zope.interface.declarations import directlyProvidedBy990 return directlyProvidedBy(*args, **kw)991 def test_wo_declarations_in_class_or_instance(self):992 class Foo(object):993 pass994 foo = Foo()995 self.assertEqual(list(self._callFUT(foo)), [])996 def test_w_declarations_in_class_but_not_instance(self):997 from zope.interface.declarations import implementer998 from zope.interface.interface import InterfaceClass999 IFoo = InterfaceClass("IFoo")1000 @implementer(IFoo)1001 class Foo(object):1002 pass1003 foo = Foo()1004 self.assertEqual(list(self._callFUT(foo)), [])1005 def test_w_declarations_in_instance_but_not_class(self):1006 from zope.interface.declarations import directlyProvides1007 from zope.interface.interface import InterfaceClass1008 IFoo = InterfaceClass("IFoo")1009 class Foo(object):1010 pass1011 foo = Foo()1012 directlyProvides(foo, IFoo)1013 self.assertEqual(list(self._callFUT(foo)), [IFoo])1014 def test_w_declarations_in_instance_and_class(self):1015 from zope.interface.declarations import directlyProvides1016 from zope.interface.declarations import implementer1017 from zope.interface.interface import InterfaceClass1018 IFoo = InterfaceClass("IFoo")1019 IBar = InterfaceClass("IBar")1020 @implementer(IFoo)1021 class Foo(object):1022 pass1023 foo = Foo()1024 directlyProvides(foo, IBar)1025 self.assertEqual(list(self._callFUT(foo)), [IBar])1026class Test_classProvides(unittest.TestCase, _Py3ClassAdvice):1027 def _getFUT(self):1028 from zope.interface.declarations import classProvides1029 return classProvides1030 def test_called_from_function(self):1031 import warnings1032 from zope.interface.declarations import classProvides1033 from zope.interface.interface import InterfaceClass1034 from zope.interface._compat import PYTHON31035 IFoo = InterfaceClass("IFoo")1036 globs = {'classProvides': classProvides, 'IFoo': IFoo}1037 locs = {}1038 CODE = "\n".join([1039 'def foo():',1040 ' classProvides(IFoo)'1041 ])1042 exec(CODE, globs, locs)1043 foo = locs['foo']1044 with warnings.catch_warnings(record=True) as log:1045 warnings.resetwarnings()1046 self.assertRaises(TypeError, foo)1047 if not PYTHON3:1048 self.assertEqual(len(log), 0) # no longer warn1049 def test_called_twice_from_class(self):1050 import warnings1051 from zope.interface.declarations import classProvides1052 from zope.interface.interface import InterfaceClass1053 from zope.interface._compat import PYTHON31054 IFoo = InterfaceClass("IFoo")1055 IBar = InterfaceClass("IBar")1056 globs = {'classProvides': classProvides, 'IFoo': IFoo, 'IBar': IBar}1057 locs = {}1058 CODE = "\n".join([1059 'class Foo(object):',1060 ' classProvides(IFoo)',1061 ' classProvides(IBar)',1062 ])1063 with warnings.catch_warnings(record=True) as log:1064 warnings.resetwarnings()1065 try:1066 exec(CODE, globs, locs)1067 except TypeError:1068 if not PYTHON3:1069 self.assertEqual(len(log), 0) # no longer warn1070 else:1071 self.fail("Didn't raise TypeError")1072 def test_called_once_from_class(self):1073 from zope.interface.declarations import classProvides1074 from zope.interface.interface import InterfaceClass1075 IFoo = InterfaceClass("IFoo")1076 globs = {'classProvides': classProvides, 'IFoo': IFoo}1077 locs = {}1078 CODE = "\n".join([1079 'class Foo(object):',1080 ' classProvides(IFoo)',1081 ])1082 if self._run_generated_code(CODE, globs, locs):1083 Foo = locs['Foo']1084 spec = Foo.__providedBy__1085 self.assertEqual(list(spec), [IFoo])1086# Test _classProvides_advice through classProvides, its only caller.1087class Test_provider(unittest.TestCase):1088 def _getTargetClass(self):1089 from zope.interface.declarations import provider1090 return provider1091 def _makeOne(self, *args, **kw):1092 return self._getTargetClass()(*args, **kw)1093 def test_w_class(self):1094 from zope.interface.declarations import ClassProvides1095 from zope.interface.interface import InterfaceClass1096 IFoo = InterfaceClass("IFoo")1097 @self._makeOne(IFoo)1098 class Foo(object):1099 pass1100 self.assertTrue(isinstance(Foo.__provides__, ClassProvides))1101 self.assertEqual(list(Foo.__provides__), [IFoo])1102class Test_moduleProvides(unittest.TestCase):1103 def _getFUT(self):1104 from zope.interface.declarations import moduleProvides1105 return moduleProvides1106 def test_called_from_function(self):1107 from zope.interface.declarations import moduleProvides1108 from zope.interface.interface import InterfaceClass1109 IFoo = InterfaceClass("IFoo")1110 globs = {'__name__': 'zope.interface.tests.foo',1111 'moduleProvides': moduleProvides, 'IFoo': IFoo}1112 locs = {}1113 CODE = "\n".join([1114 'def foo():',1115 ' moduleProvides(IFoo)'1116 ])1117 exec(CODE, globs, locs)1118 foo = locs['foo']1119 self.assertRaises(TypeError, foo)1120 def test_called_from_class(self):1121 from zope.interface.declarations import moduleProvides1122 from zope.interface.interface import InterfaceClass1123 IFoo = InterfaceClass("IFoo")1124 globs = {'__name__': 'zope.interface.tests.foo',1125 'moduleProvides': moduleProvides, 'IFoo': IFoo}1126 locs = {}1127 CODE = "\n".join([1128 'class Foo(object):',1129 ' moduleProvides(IFoo)',1130 ])1131 try:1132 exec(CODE, globs, locs)1133 except TypeError:1134 pass1135 else:1136 assert False, 'TypeError not raised'1137 def test_called_once_from_module_scope(self):1138 from zope.interface.declarations import moduleProvides1139 from zope.interface.interface import InterfaceClass1140 IFoo = InterfaceClass("IFoo")1141 globs = {'__name__': 'zope.interface.tests.foo',1142 'moduleProvides': moduleProvides, 'IFoo': IFoo}1143 CODE = "\n".join([1144 'moduleProvides(IFoo)',1145 ])1146 exec(CODE, globs)1147 spec = globs['__provides__']1148 self.assertEqual(list(spec), [IFoo])1149 def test_called_twice_from_module_scope(self):1150 from zope.interface.declarations import moduleProvides1151 from zope.interface.interface import InterfaceClass1152 IFoo = InterfaceClass("IFoo")1153 globs = {'__name__': 'zope.interface.tests.foo',1154 'moduleProvides': moduleProvides, 'IFoo': IFoo}1155 locs = {}1156 CODE = "\n".join([1157 'moduleProvides(IFoo)',1158 'moduleProvides(IFoo)',1159 ])1160 try:1161 exec(CODE, globs)1162 except TypeError:1163 pass1164 else:1165 assert False, 'TypeError not raised'1166class Test_getObjectSpecificationFallback(unittest.TestCase):1167 def _callFUT(self, *args, **kw):1168 from zope.interface.declarations import getObjectSpecificationFallback1169 return getObjectSpecificationFallback(*args, **kw)1170 def test_wo_existing_provides_classless(self):1171 the_dict = {}1172 class Foo(object):1173 def __getattribute__(self, name):1174 # Emulate object w/o any class1175 if name == '__class__':1176 raise AttributeError(name)1177 try:1178 return the_dict[name]1179 except KeyError:1180 raise AttributeError(name)1181 def __setattr__(self, name, value):1182 the_dict[name] = value1183 foo = Foo()1184 spec = self._callFUT(foo)1185 self.assertEqual(list(spec), [])1186 def test_existing_provides_is_spec(self):1187 from zope.interface.declarations import directlyProvides1188 from zope.interface.interface import InterfaceClass1189 IFoo = InterfaceClass("IFoo")1190 def foo():1191 pass1192 directlyProvides(foo, IFoo)1193 spec = self._callFUT(foo)1194 self.assertTrue(spec is foo.__provides__)1195 def test_existing_provides_is_not_spec(self):1196 def foo():1197 pass1198 foo.__provides__ = object() # not a valid spec1199 spec = self._callFUT(foo)1200 self.assertEqual(list(spec), [])1201 def test_existing_provides(self):1202 from zope.interface.declarations import directlyProvides1203 from zope.interface.interface import InterfaceClass1204 IFoo = InterfaceClass("IFoo")1205 class Foo(object):1206 pass1207 foo = Foo()1208 directlyProvides(foo, IFoo)1209 spec = self._callFUT(foo)1210 self.assertEqual(list(spec), [IFoo])1211 def test_wo_provides_on_class_w_implements(self):1212 from zope.interface.declarations import implementer1213 from zope.interface.interface import InterfaceClass1214 IFoo = InterfaceClass("IFoo")1215 @implementer(IFoo)1216 class Foo(object):1217 pass1218 foo = Foo()1219 spec = self._callFUT(foo)1220 self.assertEqual(list(spec), [IFoo])1221 def test_wo_provides_on_class_wo_implements(self):1222 class Foo(object):1223 pass1224 foo = Foo()1225 spec = self._callFUT(foo)1226 self.assertEqual(list(spec), [])1227class Test_getObjectSpecification(Test_getObjectSpecificationFallback):1228 # Repeat tests for C optimizations1229 def _callFUT(self, *args, **kw):1230 from zope.interface.declarations import getObjectSpecification1231 return getObjectSpecification(*args, **kw)1232class Test_providedByFallback(unittest.TestCase):1233 def _callFUT(self, *args, **kw):1234 from zope.interface.declarations import providedByFallback1235 return providedByFallback(*args, **kw)1236 def test_wo_providedBy_on_class_wo_implements(self):1237 class Foo(object):1238 pass1239 foo = Foo()1240 spec = self._callFUT(foo)1241 self.assertEqual(list(spec), [])1242 def test_w_providedBy_valid_spec(self):1243 from zope.interface.declarations import Provides1244 from zope.interface.interface import InterfaceClass1245 IFoo = InterfaceClass("IFoo")1246 class Foo(object):1247 pass1248 foo = Foo()1249 foo.__providedBy__ = Provides(Foo, IFoo)1250 spec = self._callFUT(foo)1251 self.assertEqual(list(spec), [IFoo])1252 def test_w_providedBy_invalid_spec(self):1253 class Foo(object):1254 pass1255 foo = Foo()1256 foo.__providedBy__ = object()1257 spec = self._callFUT(foo)1258 self.assertEqual(list(spec), [])1259 def test_w_providedBy_invalid_spec_class_w_implements(self):1260 from zope.interface.declarations import implementer1261 from zope.interface.interface import InterfaceClass1262 IFoo = InterfaceClass("IFoo")1263 @implementer(IFoo)1264 class Foo(object):1265 pass1266 foo = Foo()1267 foo.__providedBy__ = object()1268 spec = self._callFUT(foo)1269 self.assertEqual(list(spec), [IFoo])1270 def test_w_providedBy_invalid_spec_w_provides_no_provides_on_class(self):1271 class Foo(object):1272 pass1273 foo = Foo()1274 foo.__providedBy__ = object()1275 expected = foo.__provides__ = object()1276 spec = self._callFUT(foo)1277 self.assertTrue(spec is expected)1278 def test_w_providedBy_invalid_spec_w_provides_diff_provides_on_class(self):1279 class Foo(object):1280 pass1281 foo = Foo()1282 foo.__providedBy__ = object()1283 expected = foo.__provides__ = object()1284 Foo.__provides__ = object()1285 spec = self._callFUT(foo)1286 self.assertTrue(spec is expected)1287 def test_w_providedBy_invalid_spec_w_provides_same_provides_on_class(self):1288 from zope.interface.declarations import implementer1289 from zope.interface.interface import InterfaceClass1290 IFoo = InterfaceClass("IFoo")1291 @implementer(IFoo)1292 class Foo(object):1293 pass1294 foo = Foo()1295 foo.__providedBy__ = object()1296 foo.__provides__ = Foo.__provides__ = object()1297 spec = self._callFUT(foo)1298 self.assertEqual(list(spec), [IFoo])1299class Test_providedBy(Test_providedByFallback):1300 # Repeat tests for C optimizations1301 def _callFUT(self, *args, **kw):1302 from zope.interface.declarations import providedBy1303 return providedBy(*args, **kw)1304class ObjectSpecificationDescriptorFallbackTests(unittest.TestCase):1305 def _getTargetClass(self):1306 from zope.interface.declarations \1307 import ObjectSpecificationDescriptorFallback1308 return ObjectSpecificationDescriptorFallback1309 def _makeOne(self, *args, **kw):1310 return self._getTargetClass()(*args, **kw)1311 def test_accessed_via_class(self):1312 from zope.interface.declarations import Provides1313 from zope.interface.interface import InterfaceClass1314 IFoo = InterfaceClass("IFoo")1315 class Foo(object):1316 pass1317 Foo.__provides__ = Provides(Foo, IFoo)1318 Foo.__providedBy__ = self._makeOne()1319 self.assertEqual(list(Foo.__providedBy__), [IFoo])1320 def test_accessed_via_inst_wo_provides(self):1321 from zope.interface.declarations import implementer1322 from zope.interface.declarations import Provides1323 from zope.interface.interface import InterfaceClass1324 IFoo = InterfaceClass("IFoo")1325 IBar = InterfaceClass("IBar")1326 @implementer(IFoo)1327 class Foo(object):1328 pass1329 Foo.__provides__ = Provides(Foo, IBar)1330 Foo.__providedBy__ = self._makeOne()1331 foo = Foo()1332 self.assertEqual(list(foo.__providedBy__), [IFoo])1333 def test_accessed_via_inst_w_provides(self):1334 from zope.interface.declarations import directlyProvides1335 from zope.interface.declarations import implementer1336 from zope.interface.declarations import Provides1337 from zope.interface.interface import InterfaceClass1338 IFoo = InterfaceClass("IFoo")1339 IBar = InterfaceClass("IBar")1340 IBaz = InterfaceClass("IBaz")1341 @implementer(IFoo)1342 class Foo(object):1343 pass1344 Foo.__provides__ = Provides(Foo, IBar)1345 Foo.__providedBy__ = self._makeOne()1346 foo = Foo()1347 directlyProvides(foo, IBaz)...
declarations.py
Source:declarations.py
1##############################################################################2# Copyright (c) 2003 Zope Corporation and Contributors.3# All Rights Reserved.4#5# This software is subject to the provisions of the Zope Public License,6# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.7# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED8# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED9# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS10# FOR A PARTICULAR PURPOSE.11##############################################################################12"""Implementation of interface declarations13There are three flavors of declarations:14 - Declarations are used to simply name declared interfaces.15 - ImplementsDeclarations are used to express the interfaces that a16 class implements (that instances of the class provides).17 Implements specifications support inheriting interfaces.18 - ProvidesDeclarations are used to express interfaces directly19 provided by objects.20$Id: declarations.py 72236 2007-01-26 16:50:29Z alga $21"""22__docformat__ = 'restructuredtext'23import sys24import weakref25from zope.interface.interface import InterfaceClass, Specification26from ro import mergeOrderings, ro27import exceptions28from types import ClassType, ModuleType29from zope.interface.advice import addClassAdvisor30# Registry of class-implementation specifications31BuiltinImplementationSpecifications = {}32class Declaration(Specification):33 """Interface declarations"""34 def __init__(self, *interfaces):35 Specification.__init__(self, _normalizeargs(interfaces))36 def changed(self, originally_changed):37 Specification.changed(self, originally_changed)38 try:39 del self._v_attrs40 except AttributeError:41 pass42 def __contains__(self, interface):43 """Test whether an interface is in the specification44 for example:45 >>> from zope.interface import Interface46 >>> class I1(Interface): pass47 ...48 >>> class I2(I1): pass49 ...50 >>> class I3(Interface): pass51 ...52 >>> class I4(I3): pass53 ...54 >>> spec = Declaration(I2, I3)55 >>> spec = Declaration(I4, spec)56 >>> int(I1 in spec)57 058 >>> int(I2 in spec)59 160 >>> int(I3 in spec)61 162 >>> int(I4 in spec)63 164 """65 return self.extends(interface) and interface in self.interfaces()66 def __iter__(self):67 """Return an iterator for the interfaces in the specification68 for example:69 >>> from zope.interface import Interface70 >>> class I1(Interface): pass71 ...72 >>> class I2(I1): pass73 ...74 >>> class I3(Interface): pass75 ...76 >>> class I4(I3): pass77 ...78 >>> spec = Declaration(I2, I3)79 >>> spec = Declaration(I4, spec)80 >>> i = iter(spec)81 >>> i.next().getName()82 'I4'83 >>> i.next().getName()84 'I2'85 >>> i.next().getName()86 'I3'87 >>> list(i)88 []89 """90 return self.interfaces()91 def flattened(self):92 """Return an iterator of all included and extended interfaces93 for example:94 >>> from zope.interface import Interface95 >>> class I1(Interface): pass96 ...97 >>> class I2(I1): pass98 ...99 >>> class I3(Interface): pass100 ...101 >>> class I4(I3): pass102 ...103 >>> spec = Declaration(I2, I3)104 >>> spec = Declaration(I4, spec)105 >>> i = spec.flattened()106 >>> i.next().getName()107 'I4'108 >>> i.next().getName()109 'I2'110 >>> i.next().getName()111 'I1'112 >>> i.next().getName()113 'I3'114 >>> i.next().getName()115 'Interface'116 >>> list(i)117 []118 """119 return iter(self.__iro__)120 def __sub__(self, other):121 """Remove interfaces from a specification122 Examples:123 >>> from zope.interface import Interface124 >>> class I1(Interface): pass125 ...126 >>> class I2(I1): pass127 ...128 >>> class I3(Interface): pass129 ...130 >>> class I4(I3): pass131 ...132 >>> spec = Declaration()133 >>> [iface.getName() for iface in spec]134 []135 >>> spec -= I1136 >>> [iface.getName() for iface in spec]137 []138 >>> spec -= Declaration(I1, I2)139 >>> [iface.getName() for iface in spec]140 []141 >>> spec = Declaration(I2, I4)142 >>> [iface.getName() for iface in spec]143 ['I2', 'I4']144 >>> [iface.getName() for iface in spec - I4]145 ['I2']146 >>> [iface.getName() for iface in spec - I1]147 ['I4']148 >>> [iface.getName() for iface149 ... in spec - Declaration(I3, I4)]150 ['I2']151 """152 return Declaration(153 *[i for i in self.interfaces()154 if not [j for j in other.interfaces()155 if i.extends(j, 0)]156 ]157 )158 def __add__(self, other):159 """Add two specifications or a specification and an interface160 Examples:161 >>> from zope.interface import Interface162 >>> class I1(Interface): pass163 ...164 >>> class I2(I1): pass165 ...166 >>> class I3(Interface): pass167 ...168 >>> class I4(I3): pass169 ...170 >>> spec = Declaration()171 >>> [iface.getName() for iface in spec]172 []173 >>> [iface.getName() for iface in spec+I1]174 ['I1']175 >>> [iface.getName() for iface in I1+spec]176 ['I1']177 >>> spec2 = spec178 >>> spec += I1179 >>> [iface.getName() for iface in spec]180 ['I1']181 >>> [iface.getName() for iface in spec2]182 []183 >>> spec2 += Declaration(I3, I4)184 >>> [iface.getName() for iface in spec2]185 ['I3', 'I4']186 >>> [iface.getName() for iface in spec+spec2]187 ['I1', 'I3', 'I4']188 >>> [iface.getName() for iface in spec2+spec]189 ['I3', 'I4', 'I1']190 """191 seen = {}192 result = []193 for i in self.interfaces():194 if i not in seen:195 seen[i] = 1196 result.append(i)197 for i in other.interfaces():198 if i not in seen:199 seen[i] = 1200 result.append(i)201 return Declaration(*result)202 __radd__ = __add__203##############################################################################204#205# Implementation specifications206#207# These specify interfaces implemented by instances of classes208class Implements(Declaration):209 # class whose specification should be used as additional base210 inherit = None211 # interfaces actually declared for a class212 declared = ()213 __name__ = '?'214 def __repr__(self):215 return '<implementedBy %s>' % (self.__name__)216 def __reduce__(self):217 return implementedBy, (self.inherit, )218def implementedByFallback(cls):219 """Return the interfaces implemented for a class' instances220 The value returned is an IDeclaration.221 for example:222 >>> from zope.interface import Interface223 >>> class I1(Interface): pass224 ...225 >>> class I2(I1): pass226 ...227 >>> class I3(Interface): pass228 ...229 >>> class I4(I3): pass230 ...231 >>> class C1(object):232 ... implements(I2)233 >>> class C2(C1):234 ... implements(I3)235 >>> [i.getName() for i in implementedBy(C2)]236 ['I3', 'I2']237 Really, any object should be able to receive a successful answer, even238 an instance:239 >>> class Callable(object):240 ... def __call__(self):241 ... return self242 >>> implementedBy(Callable())243 <implementedBy zope.interface.declarations.?>244 Note that the name of the spec ends with a '?', because the `Callable`245 instance does not have a `__name__` attribute.246 """247 # This also manages storage of implementation specifications248 try:249 spec = cls.__dict__.get('__implemented__')250 except AttributeError:251 # we can't get the class dict. This is probably due to a252 # security proxy. If this is the case, then probably no253 # descriptor was installed for the class.254 # We don't want to depend directly on zope.security in255 # zope.interface, but we'll try to make reasonable256 # accommodations in an indirect way.257 # We'll check to see if there's an implements:258 spec = getattr(cls, '__implemented__', None)259 if spec is None:260 # There's no spec stred in the class. Maybe its a builtin:261 spec = BuiltinImplementationSpecifications.get(cls)262 if spec is not None:263 return spec264 return _empty265 if spec.__class__ == Implements:266 # we defaulted to _empty or there was a spec. Good enough.267 # Return it.268 return spec269 # TODO: need old style __implements__ compatibility?270 # Hm, there's an __implemented__, but it's not a spec. Must be271 # an old-style declaration. Just compute a spec for it272 return Declaration(*_normalizeargs((spec, )))273 if isinstance(spec, Implements):274 return spec275 if spec is None:276 spec = BuiltinImplementationSpecifications.get(cls)277 if spec is not None:278 return spec279 # TODO: need old style __implements__ compatibility?280 if spec is not None:281 # old-style __implemented__ = foo declaration282 spec = (spec, ) # tuplefy, as it might be just an int283 spec = Implements(*_normalizeargs(spec))284 spec.inherit = None # old-style implies no inherit285 del cls.__implemented__ # get rid of the old-style declaration286 else:287 try:288 bases = cls.__bases__289 except AttributeError:290 if not callable(cls):291 raise TypeError("ImplementedBy called for non-factory", cls)292 bases = ()293 spec = Implements(*[implementedBy(c) for c in bases])294 spec.inherit = cls295 spec.__name__ = (getattr(cls, '__module__', '?') or '?') + \296 '.' + (getattr(cls, '__name__', '?') or '?')297 try:298 cls.__implemented__ = spec299 if not hasattr(cls, '__providedBy__'):300 cls.__providedBy__ = objectSpecificationDescriptor301 if (isinstance(cls, DescriptorAwareMetaClasses)302 and303 '__provides__' not in cls.__dict__):304 # Make sure we get a __provides__ descriptor305 cls.__provides__ = ClassProvides(306 cls,307 getattr(cls, '__class__', type(cls)),308 )309 except TypeError:310 if not isinstance(cls, type):311 raise TypeError("ImplementedBy called for non-type", cls)312 BuiltinImplementationSpecifications[cls] = spec313 return spec314implementedBy = implementedByFallback315def classImplementsOnly(cls, *interfaces):316 """Declare the only interfaces implemented by instances of a class317 The arguments after the class are one or more interfaces or interface318 specifications (``IDeclaration`` objects).319 The interfaces given (including the interfaces in the specifications)320 replace any previous declarations.321 Consider the following example:322 >>> from zope.interface import Interface323 >>> class I1(Interface): pass324 ...325 >>> class I2(Interface): pass326 ...327 >>> class I3(Interface): pass328 ...329 >>> class I4(Interface): pass330 ...331 >>> class A(object):332 ... implements(I3)333 >>> class B(object):334 ... implements(I4)335 >>> class C(A, B):336 ... pass337 >>> classImplementsOnly(C, I1, I2)338 >>> [i.getName() for i in implementedBy(C)]339 ['I1', 'I2']340 Instances of ``C`` provide only ``I1``, ``I2``, and regardless of341 whatever interfaces instances of ``A`` and ``B`` implement.342 """343 spec = implementedBy(cls)344 spec.declared = ()345 spec.inherit = None346 classImplements(cls, *interfaces)347def classImplements(cls, *interfaces):348 """Declare additional interfaces implemented for instances of a class349 The arguments after the class are one or more interfaces or350 interface specifications (``IDeclaration`` objects).351 The interfaces given (including the interfaces in the specifications)352 are added to any interfaces previously declared.353 Consider the following example:354 >>> from zope.interface import Interface355 >>> class I1(Interface): pass356 ...357 >>> class I2(Interface): pass358 ...359 >>> class I3(Interface): pass360 ...361 >>> class I4(Interface): pass362 ...363 >>> class I5(Interface): pass364 ...365 >>> class A(object):366 ... implements(I3)367 >>> class B(object):368 ... implements(I4)369 >>> class C(A, B):370 ... pass371 >>> classImplements(C, I1, I2)372 >>> [i.getName() for i in implementedBy(C)]373 ['I1', 'I2', 'I3', 'I4']374 >>> classImplements(C, I5)375 >>> [i.getName() for i in implementedBy(C)]376 ['I1', 'I2', 'I5', 'I3', 'I4']377 Instances of ``C`` provide ``I1``, ``I2``, ``I5``, and whatever378 interfaces instances of ``A`` and ``B`` provide.379 """380 spec = implementedBy(cls)381 spec.declared += tuple(_normalizeargs(interfaces))382 # compute the bases383 bases = []384 seen = {}385 for b in spec.declared:386 if b not in seen:387 seen[b] = 1388 bases.append(b)389 if spec.inherit is not None:390 for c in spec.inherit.__bases__:391 b = implementedBy(c)392 if b not in seen:393 seen[b] = 1394 bases.append(b)395 spec.__bases__ = tuple(bases)396def _implements_advice(cls):397 interfaces, classImplements = cls.__dict__['__implements_advice_data__']398 del cls.__implements_advice_data__399 classImplements(cls, *interfaces)400 return cls401class implementer:402 def __init__(self, *interfaces):403 self.interfaces = interfaces404 def __call__(self, ob):405 if isinstance(ob, DescriptorAwareMetaClasses):406 raise TypeError("Can't use implementer with classes. Use one of "407 "the class-declaration functions instead."408 )409 spec = Implements(*self.interfaces)410 try:411 ob.__implemented__ = spec412 except AttributeError:413 raise TypeError("Can't declare implements", ob)414 return ob415def _implements(name, interfaces, classImplements):416 frame = sys._getframe(2)417 locals = frame.f_locals418 # Try to make sure we were called from a class def. In 2.2.0 we can't419 # check for __module__ since it doesn't seem to be added to the locals420 # until later on.421 if (locals is frame.f_globals) or (422 ('__module__' not in locals) and sys.version_info[:3] > (2, 2, 0)):423 raise TypeError(name+" can be used only from a class definition.")424 if '__implements_advice_data__' in locals:425 raise TypeError(name+" can be used only once in a class definition.")426 locals['__implements_advice_data__'] = interfaces, classImplements427 addClassAdvisor(_implements_advice, depth=3)428def implements(*interfaces):429 """Declare interfaces implemented by instances of a class430 This function is called in a class definition.431 The arguments are one or more interfaces or interface432 specifications (IDeclaration objects).433 The interfaces given (including the interfaces in the434 specifications) are added to any interfaces previously435 declared.436 Previous declarations include declarations for base classes437 unless implementsOnly was used.438 This function is provided for convenience. It provides a more439 convenient way to call classImplements. For example::440 implements(I1)441 is equivalent to calling::442 classImplements(C, I1)443 after the class has been created.444 Consider the following example::445 >>> from zope.interface import Interface446 >>> class IA1(Interface): pass447 ...448 >>> class IA2(Interface): pass449 ...450 >>> class IB(Interface): pass451 ...452 >>> class IC(Interface): pass453 ...454 >>> class A(object): implements(IA1, IA2)455 ...456 >>> class B(object): implements(IB)457 ...458 >>> class C(A, B):459 ... implements(IC)460 >>> ob = C()461 >>> int(IA1 in providedBy(ob))462 1463 >>> int(IA2 in providedBy(ob))464 1465 >>> int(IB in providedBy(ob))466 1467 >>> int(IC in providedBy(ob))468 1469 Instances of ``C`` implement ``I1``, ``I2``, and whatever interfaces470 instances of ``A`` and ``B`` implement.471 """472 _implements("implements", interfaces, classImplements)473def implementsOnly(*interfaces):474 """Declare the only interfaces implemented by instances of a class475 This function is called in a class definition.476 The arguments are one or more interfaces or interface477 specifications (IDeclaration objects).478 Previous declarations including declarations for base classes479 are overridden.480 This function is provided for convenience. It provides a more481 convenient way to call classImplementsOnly. For example::482 implementsOnly(I1)483 is equivalent to calling::484 classImplementsOnly(I1)485 after the class has been created.486 Consider the following example::487 >>> from zope.interface import Interface488 >>> class IA1(Interface): pass489 ...490 >>> class IA2(Interface): pass491 ...492 >>> class IB(Interface): pass493 ...494 >>> class IC(Interface): pass495 ...496 >>> class A(object): implements(IA1, IA2)497 ...498 >>> class B(object): implements(IB)499 ...500 >>> class C(A, B):501 ... implementsOnly(IC)502 >>> ob = C()503 >>> int(IA1 in providedBy(ob))504 0505 >>> int(IA2 in providedBy(ob))506 0507 >>> int(IB in providedBy(ob))508 0509 >>> int(IC in providedBy(ob))510 1511 Instances of ``C`` implement ``IC``, regardless of what512 instances of ``A`` and ``B`` implement.513 """514 _implements("implementsOnly", interfaces, classImplementsOnly)515##############################################################################516#517# Instance declarations518class Provides(Declaration): # Really named ProvidesClass519 """Implement __provides__, the instance-specific specification520 When an object is pickled, we pickle the interfaces that it implements.521 """522 def __init__(self, cls, *interfaces):523 self.__args = (cls, ) + interfaces524 self._cls = cls525 Declaration.__init__(self, *(interfaces + (implementedBy(cls), )))526 def __reduce__(self):527 return Provides, self.__args528 __module__ = 'zope.interface'529 def __get__(self, inst, cls):530 """Make sure that a class __provides__ doesn't leak to an instance531 For example:532 >>> from zope.interface import Interface533 >>> class IFooFactory(Interface): pass534 ...535 >>> class C(object):536 ... pass537 >>> C.__provides__ = ProvidesClass(C, IFooFactory)538 >>> [i.getName() for i in C.__provides__]539 ['IFooFactory']540 >>> getattr(C(), '__provides__', 0)541 0542 """543 if inst is None and cls is self._cls:544 # We were accessed through a class, so we are the class'545 # provides spec. Just return this object, but only if we are546 # being called on the same class that we were defined for:547 return self548 raise AttributeError('__provides__')549ProvidesClass = Provides550# Registry of instance declarations551# This is a memory optimization to allow objects to share specifications.552InstanceDeclarations = weakref.WeakValueDictionary()553def Provides(*interfaces):554 """Cache instance declarations555 Instance declarations are shared among instances that have the same556 declaration. The declarations are cached in a weak value dictionary.557 (Note that, in the examples below, we are going to make assertions about558 the size of the weakvalue dictionary. For the assertions to be559 meaningful, we need to force garbage collection to make sure garbage560 objects are, indeed, removed from the system. Depending on how Python561 is run, we may need to make multiple calls to be sure. We provide a562 collect function to help with this:563 >>> import gc564 >>> def collect():565 ... for i in range(4):566 ... gc.collect()567 )568 >>> collect()569 >>> before = len(InstanceDeclarations)570 >>> class C(object):571 ... pass572 >>> from zope.interface import Interface573 >>> class I(Interface):574 ... pass575 >>> c1 = C()576 >>> c2 = C()577 >>> len(InstanceDeclarations) == before578 1579 >>> directlyProvides(c1, I)580 >>> len(InstanceDeclarations) == before + 1581 1582 >>> directlyProvides(c2, I)583 >>> len(InstanceDeclarations) == before + 1584 1585 >>> del c1586 >>> collect()587 >>> len(InstanceDeclarations) == before + 1588 1589 >>> del c2590 >>> collect()591 >>> len(InstanceDeclarations) == before592 1593 """594 spec = InstanceDeclarations.get(interfaces)595 if spec is None:596 spec = ProvidesClass(*interfaces)597 InstanceDeclarations[interfaces] = spec598 return spec599Provides.__safe_for_unpickling__ = True600DescriptorAwareMetaClasses = ClassType, type601def directlyProvides(object, *interfaces):602 """Declare interfaces declared directly for an object603 The arguments after the object are one or more interfaces or interface604 specifications (``IDeclaration`` objects).605 The interfaces given (including the interfaces in the specifications)606 replace interfaces previously declared for the object.607 Consider the following example:608 >>> from zope.interface import Interface609 >>> class I1(Interface): pass610 ...611 >>> class I2(Interface): pass612 ...613 >>> class IA1(Interface): pass614 ...615 >>> class IA2(Interface): pass616 ...617 >>> class IB(Interface): pass618 ...619 >>> class IC(Interface): pass620 ...621 >>> class A(object): implements(IA1, IA2)622 ...623 >>> class B(object): implements(IB)624 ...625 >>> class C(A, B):626 ... implements(IC)627 >>> ob = C()628 >>> directlyProvides(ob, I1, I2)629 >>> int(I1 in providedBy(ob))630 1631 >>> int(I2 in providedBy(ob))632 1633 >>> int(IA1 in providedBy(ob))634 1635 >>> int(IA2 in providedBy(ob))636 1637 >>> int(IB in providedBy(ob))638 1639 >>> int(IC in providedBy(ob))640 1641 The object, ``ob`` provides ``I1``, ``I2``, and whatever interfaces642 instances have been declared for instances of ``C``.643 To remove directly provided interfaces, use ``directlyProvidedBy`` and644 subtract the unwanted interfaces. For example:645 >>> directlyProvides(ob, directlyProvidedBy(ob)-I2)646 >>> int(I1 in providedBy(ob))647 1648 >>> int(I2 in providedBy(ob))649 0650 removes I2 from the interfaces directly provided by ``ob``. The object,651 ``ob`` no longer directly provides ``I2``, although it might still652 provide ``I2`` if it's class implements ``I2``.653 To add directly provided interfaces, use ``directlyProvidedBy`` and654 include additional interfaces. For example:655 >>> int(I2 in providedBy(ob))656 0657 >>> directlyProvides(ob, directlyProvidedBy(ob), I2)658 adds ``I2`` to the interfaces directly provided by ob::659 >>> int(I2 in providedBy(ob))660 1661 """662 # We need to avoid setting this attribute on meta classes that663 # don't support descriptors.664 # We can do away with this check when we get rid of the old EC665 cls = getattr(object, '__class__', None)666 if cls is not None and getattr(cls, '__class__', None) is cls:667 # It's a meta class (well, at least it it could be an extension class)668 if not isinstance(object, DescriptorAwareMetaClasses):669 raise TypeError("Attempt to make an interface declaration on a "670 "non-descriptor-aware class")671 interfaces = _normalizeargs(interfaces)672 if cls is None:673 cls = type(object)674 issub = False675 for damc in DescriptorAwareMetaClasses:676 if issubclass(cls, damc):677 issub = True678 break679 if issub:680 # we have a class or type. We'll use a special descriptor681 # that provides some extra caching682 object.__provides__ = ClassProvides(object, cls, *interfaces)683 else:684 object.__provides__ = Provides(cls, *interfaces)685def alsoProvides(object, *interfaces):686 """Declare interfaces declared directly for an object687 The arguments after the object are one or more interfaces or interface688 specifications (``IDeclaration`` objects).689 The interfaces given (including the interfaces in the specifications) are690 added to the interfaces previously declared for the object.691 Consider the following example:692 >>> from zope.interface import Interface693 >>> class I1(Interface): pass694 ...695 >>> class I2(Interface): pass696 ...697 >>> class IA1(Interface): pass698 ...699 >>> class IA2(Interface): pass700 ...701 >>> class IB(Interface): pass702 ...703 >>> class IC(Interface): pass704 ...705 >>> class A(object): implements(IA1, IA2)706 ...707 >>> class B(object): implements(IB)708 ...709 >>> class C(A, B):710 ... implements(IC)711 >>> ob = C()712 >>> directlyProvides(ob, I1)713 >>> int(I1 in providedBy(ob))714 1715 >>> int(I2 in providedBy(ob))716 0717 >>> int(IA1 in providedBy(ob))718 1719 >>> int(IA2 in providedBy(ob))720 1721 >>> int(IB in providedBy(ob))722 1723 >>> int(IC in providedBy(ob))724 1725 >>> alsoProvides(ob, I2)726 >>> int(I1 in providedBy(ob))727 1728 >>> int(I2 in providedBy(ob))729 1730 >>> int(IA1 in providedBy(ob))731 1732 >>> int(IA2 in providedBy(ob))733 1734 >>> int(IB in providedBy(ob))735 1736 >>> int(IC in providedBy(ob))737 1738 The object, ``ob`` provides ``I1``, ``I2``, and whatever interfaces739 instances have been declared for instances of ``C``. Notice that the740 alsoProvides just extends the provided interfaces.741 """742 directlyProvides(object, directlyProvidedBy(object), *interfaces)743def noLongerProvides(object, interface):744 """745 This removes a directly provided interface from an object.746 Consider the following two interfaces:747 >>> from zope.interface import Interface748 >>> class I1(Interface): pass749 ...750 >>> class I2(Interface): pass751 ...752 ``I1`` is provided through the class, ``I2`` is directly provided753 by the object:754 755 >>> class C(object):756 ... implements(I1)757 >>> c = C()758 >>> alsoProvides(c, I2)759 >>> I2.providedBy(c)760 True761 Remove I2 from c again:762 763 >>> noLongerProvides(c, I2)764 >>> I2.providedBy(c)765 False766 Removing an interface that is provided through the class is not possible:767 >>> noLongerProvides(c, I1)768 Traceback (most recent call last):769 ...770 ValueError: Can only remove directly provided interfaces.771 """772 directlyProvides(object, directlyProvidedBy(object)-interface)773 if interface.providedBy(object):774 raise ValueError("Can only remove directly provided interfaces.")775class ClassProvidesBasePy(object):776 def __get__(self, inst, cls):777 if cls is self._cls:778 # We only work if called on the class we were defined for779 if inst is None:780 # We were accessed through a class, so we are the class'781 # provides spec. Just return this object as is:782 return self783 return self._implements784 raise AttributeError('__provides__')785ClassProvidesBase = ClassProvidesBasePy786# Try to get C base:787try:788 import _zope_interface_coptimizations789except ImportError:790 pass791else:792 from _zope_interface_coptimizations import ClassProvidesBase793class ClassProvides(Declaration, ClassProvidesBase):794 """Special descriptor for class __provides__795 The descriptor caches the implementedBy info, so that796 we can get declarations for objects without instance-specific797 interfaces a bit quicker.798 For example:799 >>> from zope.interface import Interface800 >>> class IFooFactory(Interface):801 ... pass802 >>> class IFoo(Interface):803 ... pass804 >>> class C(object):805 ... implements(IFoo)806 ... classProvides(IFooFactory)807 >>> [i.getName() for i in C.__provides__]808 ['IFooFactory']809 >>> [i.getName() for i in C().__provides__]810 ['IFoo']811 """812 def __init__(self, cls, metacls, *interfaces):813 self._cls = cls814 self._implements = implementedBy(cls)815 self.__args = (cls, metacls, ) + interfaces816 Declaration.__init__(self, *(interfaces + (implementedBy(metacls), )))817 def __reduce__(self):818 return self.__class__, self.__args819 # Copy base-class method for speed820 __get__ = ClassProvidesBase.__get__821def directlyProvidedBy(object):822 """Return the interfaces directly provided by the given object823 The value returned is an ``IDeclaration``.824 """825 provides = getattr(object, "__provides__", None)826 if (provides is None # no spec827 or828 # We might have gotten the implements spec, as an829 # optimization. If so, it's like having only one base, that we830 # lop off to exclude class-supplied declarations:831 isinstance(provides, Implements)832 ):833 return _empty834 # Strip off the class part of the spec:835 return Declaration(provides.__bases__[:-1])836def classProvides(*interfaces):837 """Declare interfaces provided directly by a class838 This function is called in a class definition.839 The arguments are one or more interfaces or interface specifications840 (``IDeclaration`` objects).841 The given interfaces (including the interfaces in the specifications)842 are used to create the class's direct-object interface specification.843 An error will be raised if the module class has an direct interface844 specification. In other words, it is an error to call this function more845 than once in a class definition.846 Note that the given interfaces have nothing to do with the interfaces847 implemented by instances of the class.848 This function is provided for convenience. It provides a more convenient849 way to call directlyProvides for a class. For example::850 classProvides(I1)851 is equivalent to calling::852 directlyProvides(theclass, I1)853 after the class has been created.854 For example:855 >>> from zope.interface import Interface856 >>> class IFoo(Interface): pass857 ...858 >>> class IFooFactory(Interface): pass859 ...860 >>> class C(object):861 ... implements(IFoo)862 ... classProvides(IFooFactory)863 >>> [i.getName() for i in C.__providedBy__]864 ['IFooFactory']865 >>> [i.getName() for i in C().__providedBy__]866 ['IFoo']867 if equivalent to:868 >>> from zope.interface import Interface869 >>> class IFoo(Interface): pass870 ...871 >>> class IFooFactory(Interface): pass872 ...873 >>> class C(object):874 ... implements(IFoo)875 >>> directlyProvides(C, IFooFactory)876 >>> [i.getName() for i in C.__providedBy__]877 ['IFooFactory']878 >>> [i.getName() for i in C().__providedBy__]879 ['IFoo']880 If classProvides is called outside of a class definition, it fails.881 >>> classProvides(IFooFactory)882 Traceback (most recent call last):883 ...884 TypeError: classProvides can be used only from a class definition.885 """886 frame = sys._getframe(1)887 locals = frame.f_locals888 # Try to make sure we were called from a class def889 if (locals is frame.f_globals) or ('__module__' not in locals):890 raise TypeError("classProvides can be used only from a class definition.")891 if '__provides__' in locals:892 raise TypeError(893 "classProvides can only be used once in a class definition.")894 locals["__provides__"] = _normalizeargs(interfaces)895 addClassAdvisor(_classProvides_advice, depth=2)896def _classProvides_advice(cls):897 interfaces = cls.__dict__['__provides__']898 del cls.__provides__899 directlyProvides(cls, *interfaces)900 return cls901def moduleProvides(*interfaces):902 """Declare interfaces provided by a module903 This function is used in a module definition.904 The arguments are one or more interfaces or interface specifications905 (``IDeclaration`` objects).906 The given interfaces (including the interfaces in the specifications) are907 used to create the module's direct-object interface specification. An908 error will be raised if the module already has an interface specification.909 In other words, it is an error to call this function more than once in a910 module definition.911 This function is provided for convenience. It provides a more convenient912 way to call directlyProvides. For example::913 moduleImplements(I1)914 is equivalent to::915 directlyProvides(sys.modules[__name__], I1)916 """917 frame = sys._getframe(1)918 locals = frame.f_locals919 # Try to make sure we were called from a class def920 if (locals is not frame.f_globals) or ('__name__' not in locals):921 raise TypeError(922 "moduleProvides can only be used from a module definition.")923 if '__provides__' in locals:924 raise TypeError(925 "moduleProvides can only be used once in a module definition.")926 locals["__provides__"] = Provides(ModuleType,927 *_normalizeargs(interfaces))928##############################################################################929#930# Declaration querying support931def ObjectSpecification(direct, cls):932 """Provide object specifications933 These combine information for the object and for it's classes.934 For example:935 >>> from zope.interface import Interface936 >>> class I1(Interface): pass937 ...938 >>> class I2(Interface): pass939 ...940 >>> class I3(Interface): pass941 ...942 >>> class I31(I3): pass943 ...944 >>> class I4(Interface): pass945 ...946 >>> class I5(Interface): pass947 ...948 >>> class A(object): implements(I1)949 ...950 >>> class B(object): __implemented__ = I2951 ...952 >>> class C(A, B): implements(I31)953 ...954 >>> c = C()955 >>> directlyProvides(c, I4)956 >>> [i.getName() for i in providedBy(c)]957 ['I4', 'I31', 'I1', 'I2']958 >>> [i.getName() for i in providedBy(c).flattened()]959 ['I4', 'I31', 'I3', 'I1', 'I2', 'Interface']960 >>> int(I1 in providedBy(c))961 1962 >>> int(I3 in providedBy(c))963 0964 >>> int(providedBy(c).extends(I3))965 1966 >>> int(providedBy(c).extends(I31))967 1968 >>> int(providedBy(c).extends(I5))969 0970 >>> class COnly(A, B): implementsOnly(I31)971 ...972 >>> class D(COnly): implements(I5)973 ...974 >>> c = D()975 >>> directlyProvides(c, I4)976 >>> [i.getName() for i in providedBy(c)]977 ['I4', 'I5', 'I31']978 >>> [i.getName() for i in providedBy(c).flattened()]979 ['I4', 'I5', 'I31', 'I3', 'Interface']980 >>> int(I1 in providedBy(c))981 0982 >>> int(I3 in providedBy(c))983 0984 >>> int(providedBy(c).extends(I3))985 1986 >>> int(providedBy(c).extends(I1))987 0988 >>> int(providedBy(c).extends(I31))989 1990 >>> int(providedBy(c).extends(I5))991 1992 """993 return Provides(cls, direct)994def getObjectSpecification(ob):995 provides = getattr(ob, '__provides__', None)996 if provides is not None:997 return provides998 try:999 cls = ob.__class__1000 except AttributeError:1001 # We can't get the class, so just consider provides1002 return _empty1003 return implementedBy(cls)1004def providedBy(ob):1005 # Here we have either a special object, an old-style declaration1006 # or a descriptor1007 # Try to get __providedBy__1008 try:1009 r = ob.__providedBy__1010 except AttributeError:1011 # Not set yet. Fall back to lower-level thing that computes it1012 return getObjectSpecification(ob)1013 try:1014 # We might have gotten a descriptor from an instance of a1015 # class (like an ExtensionClass) that doesn't support1016 # descriptors. We'll make sure we got one by trying to get1017 # the only attribute, which all specs have.1018 r.extends1019 except AttributeError:1020 # The object's class doesn't understand descriptors.1021 # Sigh. We need to get an object descriptor, but we have to be1022 # careful. We want to use the instance's __provides__, if1023 # there is one, but only if it didn't come from the class.1024 try:1025 r = ob.__provides__1026 except AttributeError:1027 # No __provides__, so just fall back to implementedBy1028 return implementedBy(ob.__class__)1029 # We need to make sure we got the __provides__ from the1030 # instance. We'll do this by making sure we don't get the same1031 # thing from the class:1032 try:1033 cp = ob.__class__.__provides__1034 except AttributeError:1035 # The ob doesn't have a class or the class has no1036 # provides, assume we're done:1037 return r1038 if r is cp:1039 # Oops, we got the provides from the class. This means1040 # the object doesn't have it's own. We should use implementedBy1041 return implementedBy(ob.__class__)1042 return r1043class ObjectSpecificationDescriptorPy(object):1044 """Implement the `__providedBy__` attribute1045 The `__providedBy__` attribute computes the interfaces peovided by1046 an object.1047 """1048 def __get__(self, inst, cls):1049 """Get an object specification for an object1050 For example:1051 >>> from zope.interface import Interface1052 >>> class IFoo(Interface): pass1053 ...1054 >>> class IFooFactory(Interface): pass1055 ...1056 >>> class C(object):1057 ... implements(IFoo)1058 ... classProvides(IFooFactory)1059 >>> [i.getName() for i in C.__providedBy__]1060 ['IFooFactory']1061 >>> [i.getName() for i in C().__providedBy__]1062 ['IFoo']1063 """1064 # Get an ObjectSpecification bound to either an instance or a class,1065 # depending on how we were accessed.1066 if inst is None:1067 return getObjectSpecification(cls)1068 provides = getattr(inst, '__provides__', None)1069 if provides is not None:1070 return provides1071 return implementedBy(cls)1072ObjectSpecificationDescriptor = ObjectSpecificationDescriptorPy1073##############################################################################1074def _normalizeargs(sequence, output = None):1075 """Normalize declaration arguments1076 Normalization arguments might contain Declarions, tuples, or single1077 interfaces.1078 Anything but individial interfaces or implements specs will be expanded.1079 """1080 if output is None:1081 output = []1082 cls = sequence.__class__1083 if InterfaceClass in cls.__mro__ or Implements in cls.__mro__:1084 output.append(sequence)1085 else:1086 for v in sequence:1087 _normalizeargs(v, output)1088 return output1089_empty = Declaration()1090try:1091 import _zope_interface_coptimizations1092except ImportError:1093 pass1094else:1095 from _zope_interface_coptimizations import implementedBy, providedBy1096 from _zope_interface_coptimizations import getObjectSpecification1097 from _zope_interface_coptimizations import ObjectSpecificationDescriptor...
test_flow_dependencies.py
Source:test_flow_dependencies.py
...211 flow = lf.Flow('lf', utils.TaskOneArgOneReturn('rt', requires='x',212 provides='x'))213 self.assertEqual(set('x'), flow.requires)214 self.assertEqual(set('x'), flow.provides)215 def test_retry_in_linear_flow_no_requirements_no_provides(self):216 flow = lf.Flow('lf', retry.AlwaysRevert('rt'))217 self.assertEqual(set(), flow.requires)218 self.assertEqual(set(), flow.provides)219 def test_retry_in_linear_flow_with_requirements(self):220 flow = lf.Flow('lf', retry.AlwaysRevert('rt', requires=['x', 'y']))221 self.assertEqual(set(['x', 'y']), flow.requires)222 self.assertEqual(set(), flow.provides)223 def test_retry_in_linear_flow_with_provides(self):224 flow = lf.Flow('lf', retry.AlwaysRevert('rt', provides=['x', 'y']))225 self.assertEqual(set(), flow.requires)226 self.assertEqual(set(['x', 'y']), flow.provides)227 def test_retry_in_linear_flow_requires_and_provides(self):228 flow = lf.Flow('lf', retry.AlwaysRevert('rt',229 requires=['x', 'y'],230 provides=['a', 'b']))231 self.assertEqual(set(['x', 'y']), flow.requires)232 self.assertEqual(set(['a', 'b']), flow.provides)233 def test_retry_requires_and_provides_same_value(self):234 flow = lf.Flow('lf', retry.AlwaysRevert('rt',235 requires=['x', 'y'],236 provides=['x', 'y']))237 self.assertEqual(set(['x', 'y']), flow.requires)238 self.assertEqual(set(['x', 'y']), flow.provides)239 def test_retry_in_unordered_flow_no_requirements_no_provides(self):240 flow = uf.Flow('uf', retry.AlwaysRevert('rt'))241 self.assertEqual(set(), flow.requires)242 self.assertEqual(set(), flow.provides)243 def test_retry_in_unordered_flow_with_requirements(self):244 flow = uf.Flow('uf', retry.AlwaysRevert('rt', requires=['x', 'y']))245 self.assertEqual(set(['x', 'y']), flow.requires)246 self.assertEqual(set(), flow.provides)247 def test_retry_in_unordered_flow_with_provides(self):248 flow = uf.Flow('uf', retry.AlwaysRevert('rt', provides=['x', 'y']))249 self.assertEqual(set(), flow.requires)250 self.assertEqual(set(['x', 'y']), flow.provides)251 def test_retry_in_unordered_flow_requires_and_provides(self):252 flow = uf.Flow('uf', retry.AlwaysRevert('rt',253 requires=['x', 'y'],254 provides=['a', 'b']))255 self.assertEqual(set(['x', 'y']), flow.requires)256 self.assertEqual(set(['a', 'b']), flow.provides)257 def test_retry_in_graph_flow_no_requirements_no_provides(self):258 flow = gf.Flow('gf', retry.AlwaysRevert('rt'))259 self.assertEqual(set(), flow.requires)260 self.assertEqual(set(), flow.provides)261 def test_retry_in_graph_flow_with_requirements(self):262 flow = gf.Flow('gf', retry.AlwaysRevert('rt', requires=['x', 'y']))263 self.assertEqual(set(['x', 'y']), flow.requires)264 self.assertEqual(set(), flow.provides)265 def test_retry_in_graph_flow_with_provides(self):266 flow = gf.Flow('gf', retry.AlwaysRevert('rt', provides=['x', 'y']))267 self.assertEqual(set(), flow.requires)268 self.assertEqual(set(['x', 'y']), flow.provides)269 def test_retry_in_graph_flow_requires_and_provides(self):270 flow = gf.Flow('gf', retry.AlwaysRevert('rt',271 requires=['x', 'y'],272 provides=['a', 'b']))273 self.assertEqual(set(['x', 'y']), flow.requires)274 self.assertEqual(set(['a', 'b']), flow.provides)275 def test_linear_flow_retry_and_task(self):276 flow = lf.Flow('lf', retry.AlwaysRevert('rt',277 requires=['x', 'y'],278 provides=['a', 'b']))279 flow.add(utils.TaskMultiArgOneReturn(rebind=['a', 'x', 'c'],280 provides=['z']))281 self.assertEqual(set(['x', 'y', 'c']), flow.requires)282 self.assertEqual(set(['a', 'b', 'z']), flow.provides)283 def test_unordered_flow_retry_and_task(self):284 flow = uf.Flow('uf', retry.AlwaysRevert('rt',285 requires=['x', 'y'],286 provides=['a', 'b']))287 flow.add(utils.TaskMultiArgOneReturn(rebind=['a', 'x', 'c'],288 provides=['z']))289 self.assertEqual(set(['x', 'y', 'c']), flow.requires)290 self.assertEqual(set(['a', 'b', 'z']), flow.provides)291 def test_unordered_flow_retry_and_task_same_requires_provides(self):292 flow = uf.Flow('uf', retry.AlwaysRevert('rt', requires=['x']))293 flow.add(utils.TaskOneReturn(provides=['x']))294 self.assertEqual(set(['x']), flow.requires)295 self.assertEqual(set(['x']), flow.provides)296 def test_unordered_flow_retry_and_task_provide_same_value(self):297 flow = uf.Flow('uf', retry.AlwaysRevert('rt', provides=['x']))298 flow.add(utils.TaskOneReturn('t1', provides=['x']))299 self.assertEqual(set(['x']), flow.provides)300 def test_unordered_flow_retry_two_tasks_provide_same_value(self):301 flow = uf.Flow('uf', retry.AlwaysRevert('rt', provides=['y']))302 flow.add(utils.TaskOneReturn('t1', provides=['x']),303 utils.TaskOneReturn('t2', provides=['x']))304 self.assertEqual(set(['x', 'y']), flow.provides)305 def test_graph_flow_retry_and_task(self):...
test_amphora_flows.py
Source:test_amphora_flows.py
1# Copyright 2015 Hewlett-Packard Development Company, L.P.2#3# Licensed under the Apache License, Version 2.0 (the "License"); you may4# not use this file except in compliance with the License. You may obtain5# a copy of the License at6#7# http://www.apache.org/licenses/LICENSE-2.08#9# Unless required by applicable law or agreed to in writing, software10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the12# License for the specific language governing permissions and limitations13# under the License.14#15import mock16from oslo_config import cfg17from oslo_config import fixture as oslo_fixture18from taskflow.patterns import linear_flow as flow19from octavia.common import constants20from octavia.controller.worker.flows import amphora_flows21import octavia.tests.unit.base as base22AUTH_VERSION = '2'23# NOTE: We patch the get_network_driver for all the calls so we don't24# inadvertently make real calls.25@mock.patch('octavia.common.utils.get_network_driver')26class TestAmphoraFlows(base.TestCase):27 def setUp(self):28 super(TestAmphoraFlows, self).setUp()29 self.conf = self.useFixture(oslo_fixture.Config(cfg.CONF))30 self.conf.config(31 group="controller_worker",32 amphora_driver='amphora_haproxy_rest_driver')33 self.conf.config(group="nova", enable_anti_affinity=False)34 self.AmpFlow = amphora_flows.AmphoraFlows()35 def test_get_create_amphora_flow(self, mock_get_net_driver):36 amp_flow = self.AmpFlow.get_create_amphora_flow()37 self.assertIsInstance(amp_flow, flow.Flow)38 self.assertIn(constants.AMPHORA, amp_flow.provides)39 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)40 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)41 self.assertIn(constants.SERVER_PEM, amp_flow.provides)42 self.assertEqual(5, len(amp_flow.provides))43 self.assertEqual(1, len(amp_flow.requires))44 def test_get_create_amphora_flow_cert(self, mock_get_net_driver):45 self.AmpFlow = amphora_flows.AmphoraFlows()46 amp_flow = self.AmpFlow.get_create_amphora_flow()47 self.assertIsInstance(amp_flow, flow.Flow)48 self.assertIn(constants.AMPHORA, amp_flow.provides)49 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)50 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)51 self.assertEqual(5, len(amp_flow.provides))52 self.assertEqual(1, len(amp_flow.requires))53 def test_get_create_amphora_for_lb_flow(self, mock_get_net_driver):54 amp_flow = self.AmpFlow._get_create_amp_for_lb_subflow(55 'SOMEPREFIX', constants.ROLE_STANDALONE)56 self.assertIsInstance(amp_flow, flow.Flow)57 self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)58 self.assertIn(constants.AMPHORA, amp_flow.provides)59 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)60 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)61 self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)62 self.assertIn(constants.SERVER_PEM, amp_flow.provides)63 self.assertEqual(5, len(amp_flow.provides))64 self.assertEqual(2, len(amp_flow.requires))65 def test_get_cert_create_amphora_for_lb_flow(self, mock_get_net_driver):66 self.AmpFlow = amphora_flows.AmphoraFlows()67 amp_flow = self.AmpFlow._get_create_amp_for_lb_subflow(68 'SOMEPREFIX', constants.ROLE_STANDALONE)69 self.assertIsInstance(amp_flow, flow.Flow)70 self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)71 self.assertIn(constants.AMPHORA, amp_flow.provides)72 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)73 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)74 self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)75 self.assertIn(constants.SERVER_PEM, amp_flow.provides)76 self.assertEqual(5, len(amp_flow.provides))77 self.assertEqual(2, len(amp_flow.requires))78 def test_get_cert_master_create_amphora_for_lb_flow(79 self, mock_get_net_driver):80 self.AmpFlow = amphora_flows.AmphoraFlows()81 amp_flow = self.AmpFlow._get_create_amp_for_lb_subflow(82 'SOMEPREFIX', constants.ROLE_MASTER)83 self.assertIsInstance(amp_flow, flow.Flow)84 self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)85 self.assertIn(constants.AMPHORA, amp_flow.provides)86 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)87 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)88 self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)89 self.assertIn(constants.SERVER_PEM, amp_flow.provides)90 self.assertEqual(5, len(amp_flow.provides))91 self.assertEqual(2, len(amp_flow.requires))92 def test_get_cert_master_rest_anti_affinity_create_amphora_for_lb_flow(93 self, mock_get_net_driver):94 self.conf.config(group="nova", enable_anti_affinity=True)95 self.AmpFlow = amphora_flows.AmphoraFlows()96 amp_flow = self.AmpFlow._get_create_amp_for_lb_subflow(97 'SOMEPREFIX', constants.ROLE_MASTER)98 self.assertIsInstance(amp_flow, flow.Flow)99 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)100 self.assertIn(constants.SERVER_GROUP_ID, amp_flow.requires)101 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)102 self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)103 self.assertIn(constants.SERVER_PEM, amp_flow.provides)104 self.assertEqual(5, len(amp_flow.provides))105 self.assertEqual(3, len(amp_flow.requires))106 self.conf.config(group="nova", enable_anti_affinity=False)107 def test_get_cert_backup_create_amphora_for_lb_flow(108 self, mock_get_net_driver):109 self.AmpFlow = amphora_flows.AmphoraFlows()110 amp_flow = self.AmpFlow._get_create_amp_for_lb_subflow(111 'SOMEPREFIX', constants.ROLE_BACKUP)112 self.assertIsInstance(amp_flow, flow.Flow)113 self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)114 self.assertIn(constants.AMPHORA, amp_flow.provides)115 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)116 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)117 self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)118 self.assertIn(constants.SERVER_PEM, amp_flow.provides)119 self.assertEqual(5, len(amp_flow.provides))120 self.assertEqual(2, len(amp_flow.requires))121 def test_get_cert_bogus_create_amphora_for_lb_flow(122 self, mock_get_net_driver):123 self.AmpFlow = amphora_flows.AmphoraFlows()124 amp_flow = self.AmpFlow._get_create_amp_for_lb_subflow(125 'SOMEPREFIX', 'BOGUS_ROLE')126 self.assertIsInstance(amp_flow, flow.Flow)127 self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)128 self.assertIn(constants.AMPHORA, amp_flow.provides)129 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)130 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)131 self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)132 self.assertIn(constants.SERVER_PEM, amp_flow.provides)133 self.assertEqual(5, len(amp_flow.provides))134 self.assertEqual(2, len(amp_flow.requires))135 def test_get_cert_backup_rest_anti_affinity_create_amphora_for_lb_flow(136 self, mock_get_net_driver):137 self.conf.config(group="nova", enable_anti_affinity=True)138 self.AmpFlow = amphora_flows.AmphoraFlows()139 amp_flow = self.AmpFlow._get_create_amp_for_lb_subflow(140 'SOMEPREFIX', constants.ROLE_BACKUP)141 self.assertIsInstance(amp_flow, flow.Flow)142 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)143 self.assertIn(constants.SERVER_GROUP_ID, amp_flow.requires)144 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)145 self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)146 self.assertIn(constants.SERVER_PEM, amp_flow.provides)147 self.assertEqual(5, len(amp_flow.provides))148 self.assertEqual(3, len(amp_flow.requires))149 self.conf.config(group="nova", enable_anti_affinity=False)150 def test_get_delete_amphora_flow(self, mock_get_net_driver):151 amp_flow = self.AmpFlow.get_delete_amphora_flow()152 self.assertIsInstance(amp_flow, flow.Flow)153 self.assertIn(constants.AMPHORA, amp_flow.requires)154 self.assertEqual(0, len(amp_flow.provides))155 self.assertEqual(1, len(amp_flow.requires))156 def test_allocate_amp_to_lb_decider(self, mock_get_net_driver):157 history = mock.MagicMock()158 values = mock.MagicMock(side_effect=[['TEST'], [None]])159 history.values = values160 result = self.AmpFlow._allocate_amp_to_lb_decider(history)161 self.assertTrue(result)162 result = self.AmpFlow._allocate_amp_to_lb_decider(history)163 self.assertFalse(result)164 def test_create_new_amp_for_lb_decider(self, mock_get_net_driver):165 history = mock.MagicMock()166 values = mock.MagicMock(side_effect=[[None], ['TEST']])167 history.values = values168 result = self.AmpFlow._create_new_amp_for_lb_decider(history)169 self.assertTrue(result)170 result = self.AmpFlow._create_new_amp_for_lb_decider(history)171 self.assertFalse(result)172 def test_get_failover_flow_allocated(self, mock_get_net_driver):173 amp_flow = self.AmpFlow.get_failover_flow(174 status=constants.AMPHORA_ALLOCATED)175 self.assertIsInstance(amp_flow, flow.Flow)176 self.assertIn(constants.FAILED_AMPHORA, amp_flow.requires)177 self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)178 self.assertIn(constants.AMP_DATA, amp_flow.provides)179 self.assertIn(constants.AMPHORA, amp_flow.provides)180 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)181 self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, amp_flow.provides)182 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)183 self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)184 self.assertIn(constants.LISTENERS, amp_flow.provides)185 self.assertIn(constants.LOADBALANCER, amp_flow.provides)186 self.assertEqual(3, len(amp_flow.requires))187 self.assertEqual(11, len(amp_flow.provides))188 amp_flow = self.AmpFlow.get_failover_flow(189 role=constants.ROLE_MASTER, status=constants.AMPHORA_ALLOCATED)190 self.assertIsInstance(amp_flow, flow.Flow)191 self.assertIn(constants.FAILED_AMPHORA, amp_flow.requires)192 self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)193 self.assertIn(constants.AMP_DATA, amp_flow.provides)194 self.assertIn(constants.AMPHORA, amp_flow.provides)195 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)196 self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, amp_flow.provides)197 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)198 self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)199 self.assertIn(constants.LISTENERS, amp_flow.provides)200 self.assertIn(constants.LOADBALANCER, amp_flow.provides)201 self.assertEqual(3, len(amp_flow.requires))202 self.assertEqual(11, len(amp_flow.provides))203 amp_flow = self.AmpFlow.get_failover_flow(204 role=constants.ROLE_BACKUP, status=constants.AMPHORA_ALLOCATED)205 self.assertIsInstance(amp_flow, flow.Flow)206 self.assertIn(constants.FAILED_AMPHORA, amp_flow.requires)207 self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)208 self.assertIn(constants.AMP_DATA, amp_flow.provides)209 self.assertIn(constants.AMPHORA, amp_flow.provides)210 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)211 self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, amp_flow.provides)212 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)213 self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)214 self.assertIn(constants.LISTENERS, amp_flow.provides)215 self.assertIn(constants.LOADBALANCER, amp_flow.provides)216 self.assertEqual(3, len(amp_flow.requires))217 self.assertEqual(11, len(amp_flow.provides))218 amp_flow = self.AmpFlow.get_failover_flow(219 role='BOGUSROLE', status=constants.AMPHORA_ALLOCATED)220 self.assertIsInstance(amp_flow, flow.Flow)221 self.assertIn(constants.FAILED_AMPHORA, amp_flow.requires)222 self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)223 self.assertIn(constants.AMP_DATA, amp_flow.provides)224 self.assertIn(constants.AMPHORA, amp_flow.provides)225 self.assertIn(constants.AMPHORA_ID, amp_flow.provides)226 self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, amp_flow.provides)227 self.assertIn(constants.COMPUTE_ID, amp_flow.provides)228 self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)229 self.assertIn(constants.LISTENERS, amp_flow.provides)230 self.assertIn(constants.LOADBALANCER, amp_flow.provides)231 self.assertEqual(3, len(amp_flow.requires))232 self.assertEqual(11, len(amp_flow.provides))233 def test_get_failover_flow_spare(self, mock_get_net_driver):234 amp_flow = self.AmpFlow.get_failover_flow(235 status=constants.AMPHORA_READY)236 self.assertIsInstance(amp_flow, flow.Flow)237 self.assertIn(constants.FAILED_AMPHORA, amp_flow.requires)238 self.assertEqual(1, len(amp_flow.requires))239 self.assertEqual(0, len(amp_flow.provides))240 def test_cert_rotate_amphora_flow(self, mock_get_net_driver):241 self.AmpFlow = amphora_flows.AmphoraFlows()242 amp_rotate_flow = self.AmpFlow.cert_rotate_amphora_flow()243 self.assertIsInstance(amp_rotate_flow, flow.Flow)244 self.assertIn(constants.SERVER_PEM, amp_rotate_flow.provides)245 self.assertIn(constants.AMPHORA, amp_rotate_flow.requires)246 self.assertEqual(1, len(amp_rotate_flow.provides))247 self.assertEqual(2, len(amp_rotate_flow.requires))248 def test_get_vrrp_subflow(self, mock_get_net_driver):249 vrrp_subflow = self.AmpFlow.get_vrrp_subflow('123')250 self.assertIsInstance(vrrp_subflow, flow.Flow)251 self.assertIn(constants.LOADBALANCER, vrrp_subflow.provides)252 self.assertIn(constants.LOADBALANCER, vrrp_subflow.requires)253 self.assertEqual(1, len(vrrp_subflow.provides))254 self.assertEqual(1, len(vrrp_subflow.requires))255 def test_get_post_map_lb_subflow(self, mock_get_net_driver):256 self.AmpFlow = amphora_flows.AmphoraFlows()257 amp_flow = self.AmpFlow._get_post_map_lb_subflow(258 'SOMEPREFIX', constants.ROLE_MASTER)259 self.assertIsInstance(amp_flow, flow.Flow)260 self.assertIn(constants.AMPHORA_ID, amp_flow.requires)261 self.assertIn(constants.AMPHORA, amp_flow.provides)262 self.assertEqual(1, len(amp_flow.provides))263 self.assertEqual(1, len(amp_flow.requires))264 amp_flow = self.AmpFlow._get_post_map_lb_subflow(265 'SOMEPREFIX', constants.ROLE_BACKUP)266 self.assertIsInstance(amp_flow, flow.Flow)267 self.assertIn(constants.AMPHORA_ID, amp_flow.requires)268 self.assertIn(constants.AMPHORA, amp_flow.provides)269 self.assertEqual(1, len(amp_flow.provides))270 self.assertEqual(1, len(amp_flow.requires))271 amp_flow = self.AmpFlow._get_post_map_lb_subflow(272 'SOMEPREFIX', constants.ROLE_STANDALONE)273 self.assertIsInstance(amp_flow, flow.Flow)274 self.assertIn(constants.AMPHORA_ID, amp_flow.requires)275 self.assertIn(constants.AMPHORA, amp_flow.provides)276 self.assertEqual(1, len(amp_flow.provides))277 self.assertEqual(1, len(amp_flow.requires))278 amp_flow = self.AmpFlow._get_post_map_lb_subflow(279 'SOMEPREFIX', 'BOGUS_ROLE')280 self.assertIsInstance(amp_flow, flow.Flow)281 self.assertIn(constants.AMPHORA_ID, amp_flow.requires)282 self.assertIn(constants.AMPHORA, amp_flow.provides)283 self.assertEqual(1, len(amp_flow.provides))...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!