test_registry.py 111 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057
  1. ##############################################################################
  2. #
  3. # Copyright (c) 2001, 2002, 2009 Zope Foundation and Contributors.
  4. # All Rights Reserved.
  5. #
  6. # This software is subject to the provisions of the Zope Public License,
  7. # Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
  8. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
  9. # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  10. # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
  11. # FOR A PARTICULAR PURPOSE.
  12. #
  13. ##############################################################################
  14. """Component Registry Tests"""
  15. # pylint:disable=protected-access
  16. import unittest
  17. from zope.interface import Interface
  18. from zope.interface.adapter import VerifyingAdapterRegistry
  19. from zope.interface.registry import Components
  20. class ComponentsTests(unittest.TestCase):
  21. def _getTargetClass(self):
  22. return Components
  23. def _makeOne(self, name='test', *args, **kw):
  24. return self._getTargetClass()(name, *args, **kw)
  25. def _wrapEvents(self):
  26. from zope.interface import registry
  27. _events = []
  28. def _notify(*args, **kw):
  29. _events.append((args, kw))
  30. _monkey = _Monkey(registry, notify=_notify)
  31. return _monkey, _events
  32. def test_ctor_no_bases(self):
  33. from zope.interface.adapter import AdapterRegistry
  34. comp = self._makeOne('testing')
  35. self.assertEqual(comp.__name__, 'testing')
  36. self.assertEqual(comp.__bases__, ())
  37. self.assertTrue(isinstance(comp.adapters, AdapterRegistry))
  38. self.assertTrue(isinstance(comp.utilities, AdapterRegistry))
  39. self.assertEqual(comp.adapters.__bases__, ())
  40. self.assertEqual(comp.utilities.__bases__, ())
  41. self.assertEqual(comp._utility_registrations, {})
  42. self.assertEqual(comp._adapter_registrations, {})
  43. self.assertEqual(comp._subscription_registrations, [])
  44. self.assertEqual(comp._handler_registrations, [])
  45. def test_ctor_w_base(self):
  46. base = self._makeOne('base')
  47. comp = self._makeOne('testing', (base,))
  48. self.assertEqual(comp.__name__, 'testing')
  49. self.assertEqual(comp.__bases__, (base,))
  50. self.assertEqual(comp.adapters.__bases__, (base.adapters,))
  51. self.assertEqual(comp.utilities.__bases__, (base.utilities,))
  52. def test___repr__(self):
  53. comp = self._makeOne('testing')
  54. self.assertEqual(repr(comp), '<Components testing>')
  55. # test _init_registries / _init_registrations via only caller, __init__.
  56. def test_assign_to___bases__(self):
  57. base1 = self._makeOne('base1')
  58. base2 = self._makeOne('base2')
  59. comp = self._makeOne()
  60. comp.__bases__ = (base1, base2)
  61. self.assertEqual(comp.__bases__, (base1, base2))
  62. self.assertEqual(comp.adapters.__bases__,
  63. (base1.adapters, base2.adapters))
  64. self.assertEqual(comp.utilities.__bases__,
  65. (base1.utilities, base2.utilities))
  66. def test_registerUtility_with_component_name(self):
  67. from zope.interface.declarations import named, InterfaceClass
  68. class IFoo(InterfaceClass):
  69. pass
  70. ifoo = IFoo('IFoo')
  71. @named(u'foo')
  72. class Foo(object):
  73. pass
  74. foo = Foo()
  75. _info = u'info'
  76. comp = self._makeOne()
  77. comp.registerUtility(foo, ifoo, info=_info)
  78. self.assertEqual(
  79. comp._utility_registrations[ifoo, u'foo'],
  80. (foo, _info, None))
  81. def test_registerUtility_both_factory_and_component(self):
  82. def _factory():
  83. raise NotImplementedError()
  84. _to_reg = object()
  85. comp = self._makeOne()
  86. self.assertRaises(TypeError, comp.registerUtility,
  87. component=_to_reg, factory=_factory)
  88. def test_registerUtility_w_component(self):
  89. from zope.interface.declarations import InterfaceClass
  90. from zope.interface.interfaces import Registered
  91. from zope.interface.registry import UtilityRegistration
  92. class IFoo(InterfaceClass):
  93. pass
  94. ifoo = IFoo('IFoo')
  95. _info = u'info'
  96. _name = u'name'
  97. _to_reg = object()
  98. comp = self._makeOne()
  99. _monkey, _events = self._wrapEvents()
  100. with _monkey:
  101. comp.registerUtility(_to_reg, ifoo, _name, _info)
  102. self.assertTrue(comp.utilities._adapters[0][ifoo][_name] is _to_reg)
  103. self.assertEqual(comp._utility_registrations[ifoo, _name],
  104. (_to_reg, _info, None))
  105. self.assertEqual(comp.utilities._subscribers[0][ifoo][''], (_to_reg,))
  106. self.assertEqual(len(_events), 1)
  107. args, kw = _events[0]
  108. event, = args
  109. self.assertEqual(kw, {})
  110. self.assertTrue(isinstance(event, Registered))
  111. self.assertTrue(isinstance(event.object, UtilityRegistration))
  112. self.assertTrue(event.object.registry is comp)
  113. self.assertTrue(event.object.provided is ifoo)
  114. self.assertTrue(event.object.name is _name)
  115. self.assertTrue(event.object.component is _to_reg)
  116. self.assertTrue(event.object.info is _info)
  117. self.assertTrue(event.object.factory is None)
  118. def test_registerUtility_w_factory(self):
  119. from zope.interface.declarations import InterfaceClass
  120. from zope.interface.interfaces import Registered
  121. from zope.interface.registry import UtilityRegistration
  122. class IFoo(InterfaceClass):
  123. pass
  124. ifoo = IFoo('IFoo')
  125. _info = u'info'
  126. _name = u'name'
  127. _to_reg = object()
  128. def _factory():
  129. return _to_reg
  130. comp = self._makeOne()
  131. _monkey, _events = self._wrapEvents()
  132. with _monkey:
  133. comp.registerUtility(None, ifoo, _name, _info, factory=_factory)
  134. self.assertEqual(len(_events), 1)
  135. args, kw = _events[0]
  136. event, = args
  137. self.assertEqual(kw, {})
  138. self.assertTrue(isinstance(event, Registered))
  139. self.assertTrue(isinstance(event.object, UtilityRegistration))
  140. self.assertTrue(event.object.registry is comp)
  141. self.assertTrue(event.object.provided is ifoo)
  142. self.assertTrue(event.object.name is _name)
  143. self.assertTrue(event.object.component is _to_reg)
  144. self.assertTrue(event.object.info is _info)
  145. self.assertTrue(event.object.factory is _factory)
  146. def test_registerUtility_no_provided_available(self):
  147. class Foo(object):
  148. pass
  149. _info = u'info'
  150. _name = u'name'
  151. _to_reg = Foo()
  152. comp = self._makeOne()
  153. self.assertRaises(TypeError,
  154. comp.registerUtility, _to_reg, None, _name, _info)
  155. def test_registerUtility_wo_provided(self):
  156. from zope.interface.declarations import directlyProvides
  157. from zope.interface.declarations import InterfaceClass
  158. from zope.interface.interfaces import Registered
  159. from zope.interface.registry import UtilityRegistration
  160. class IFoo(InterfaceClass):
  161. pass
  162. class Foo(object):
  163. pass
  164. ifoo = IFoo('IFoo')
  165. _info = u'info'
  166. _name = u'name'
  167. _to_reg = Foo()
  168. directlyProvides(_to_reg, ifoo)
  169. comp = self._makeOne()
  170. _monkey, _events = self._wrapEvents()
  171. with _monkey:
  172. comp.registerUtility(_to_reg, None, _name, _info)
  173. self.assertEqual(len(_events), 1)
  174. args, kw = _events[0]
  175. event, = args
  176. self.assertEqual(kw, {})
  177. self.assertTrue(isinstance(event, Registered))
  178. self.assertTrue(isinstance(event.object, UtilityRegistration))
  179. self.assertTrue(event.object.registry is comp)
  180. self.assertTrue(event.object.provided is ifoo)
  181. self.assertTrue(event.object.name is _name)
  182. self.assertTrue(event.object.component is _to_reg)
  183. self.assertTrue(event.object.info is _info)
  184. self.assertTrue(event.object.factory is None)
  185. def test_registerUtility_duplicates_existing_reg(self):
  186. from zope.interface.declarations import InterfaceClass
  187. class IFoo(InterfaceClass):
  188. pass
  189. ifoo = IFoo('IFoo')
  190. _info = u'info'
  191. _name = u'name'
  192. _to_reg = object()
  193. comp = self._makeOne()
  194. comp.registerUtility(_to_reg, ifoo, _name, _info)
  195. _monkey, _events = self._wrapEvents()
  196. with _monkey:
  197. comp.registerUtility(_to_reg, ifoo, _name, _info)
  198. self.assertEqual(len(_events), 0)
  199. def test_registerUtility_w_different_info(self):
  200. from zope.interface.declarations import InterfaceClass
  201. class IFoo(InterfaceClass):
  202. pass
  203. ifoo = IFoo('IFoo')
  204. _info1 = u'info1'
  205. _info2 = u'info2'
  206. _name = u'name'
  207. _to_reg = object()
  208. comp = self._makeOne()
  209. comp.registerUtility(_to_reg, ifoo, _name, _info1)
  210. _monkey, _events = self._wrapEvents()
  211. with _monkey:
  212. comp.registerUtility(_to_reg, ifoo, _name, _info2)
  213. self.assertEqual(len(_events), 2) # unreg, reg
  214. self.assertEqual(comp._utility_registrations[(ifoo, _name)],
  215. (_to_reg, _info2, None)) # replaced
  216. self.assertEqual(comp.utilities._subscribers[0][ifoo][u''],
  217. (_to_reg,))
  218. def test_registerUtility_w_different_names_same_component(self):
  219. from zope.interface.declarations import InterfaceClass
  220. class IFoo(InterfaceClass):
  221. pass
  222. ifoo = IFoo('IFoo')
  223. _info = u'info'
  224. _name1 = u'name1'
  225. _name2 = u'name2'
  226. _other_reg = object()
  227. _to_reg = object()
  228. comp = self._makeOne()
  229. comp.registerUtility(_other_reg, ifoo, _name1, _info)
  230. _monkey, _events = self._wrapEvents()
  231. with _monkey:
  232. comp.registerUtility(_to_reg, ifoo, _name2, _info)
  233. self.assertEqual(len(_events), 1) # reg
  234. self.assertEqual(comp._utility_registrations[(ifoo, _name1)],
  235. (_other_reg, _info, None))
  236. self.assertEqual(comp._utility_registrations[(ifoo, _name2)],
  237. (_to_reg, _info, None))
  238. self.assertEqual(comp.utilities._subscribers[0][ifoo][u''],
  239. (_other_reg, _to_reg,))
  240. def test_registerUtility_replaces_existing_reg(self):
  241. from zope.interface.declarations import InterfaceClass
  242. from zope.interface.interfaces import Unregistered
  243. from zope.interface.interfaces import Registered
  244. from zope.interface.registry import UtilityRegistration
  245. class IFoo(InterfaceClass):
  246. pass
  247. ifoo = IFoo('IFoo')
  248. _info = u'info'
  249. _name = u'name'
  250. _before, _after = object(), object()
  251. comp = self._makeOne()
  252. comp.registerUtility(_before, ifoo, _name, _info)
  253. _monkey, _events = self._wrapEvents()
  254. with _monkey:
  255. comp.registerUtility(_after, ifoo, _name, _info)
  256. self.assertEqual(len(_events), 2)
  257. args, kw = _events[0]
  258. event, = args
  259. self.assertEqual(kw, {})
  260. self.assertTrue(isinstance(event, Unregistered))
  261. self.assertTrue(isinstance(event.object, UtilityRegistration))
  262. self.assertTrue(event.object.registry is comp)
  263. self.assertTrue(event.object.provided is ifoo)
  264. self.assertTrue(event.object.name is _name)
  265. self.assertTrue(event.object.component is _before)
  266. self.assertTrue(event.object.info is _info)
  267. self.assertTrue(event.object.factory is None)
  268. args, kw = _events[1]
  269. event, = args
  270. self.assertEqual(kw, {})
  271. self.assertTrue(isinstance(event, Registered))
  272. self.assertTrue(isinstance(event.object, UtilityRegistration))
  273. self.assertTrue(event.object.registry is comp)
  274. self.assertTrue(event.object.provided is ifoo)
  275. self.assertTrue(event.object.name is _name)
  276. self.assertTrue(event.object.component is _after)
  277. self.assertTrue(event.object.info is _info)
  278. self.assertTrue(event.object.factory is None)
  279. def test_registerUtility_w_existing_subscr(self):
  280. from zope.interface.declarations import InterfaceClass
  281. class IFoo(InterfaceClass):
  282. pass
  283. ifoo = IFoo('IFoo')
  284. _info = u'info'
  285. _name1 = u'name1'
  286. _name2 = u'name2'
  287. _to_reg = object()
  288. comp = self._makeOne()
  289. comp.registerUtility(_to_reg, ifoo, _name1, _info)
  290. _monkey, _events = self._wrapEvents()
  291. with _monkey:
  292. comp.registerUtility(_to_reg, ifoo, _name2, _info)
  293. self.assertEqual(comp.utilities._subscribers[0][ifoo][''], (_to_reg,))
  294. def test_registerUtility_wo_event(self):
  295. from zope.interface.declarations import InterfaceClass
  296. class IFoo(InterfaceClass):
  297. pass
  298. ifoo = IFoo('IFoo')
  299. _info = u'info'
  300. _name = u'name'
  301. _to_reg = object()
  302. comp = self._makeOne()
  303. _monkey, _events = self._wrapEvents()
  304. with _monkey:
  305. comp.registerUtility(_to_reg, ifoo, _name, _info, False)
  306. self.assertEqual(len(_events), 0)
  307. def test_registerUtility_changes_object_identity_after(self):
  308. # If a subclass changes the identity of the _utility_registrations,
  309. # the cache is updated and the right thing still happens.
  310. class CompThatChangesAfter1Reg(self._getTargetClass()):
  311. reg_count = 0
  312. def registerUtility(self, *args):
  313. self.reg_count += 1
  314. super(CompThatChangesAfter1Reg, self).registerUtility(*args)
  315. if self.reg_count == 1:
  316. self._utility_registrations = dict(self._utility_registrations)
  317. comp = CompThatChangesAfter1Reg()
  318. comp.registerUtility(object(), Interface)
  319. self.assertEqual(len(list(comp.registeredUtilities())), 1)
  320. class IFoo(Interface):
  321. pass
  322. comp.registerUtility(object(), IFoo)
  323. self.assertEqual(len(list(comp.registeredUtilities())), 2)
  324. def test_registerUtility_changes_object_identity_before(self):
  325. # If a subclass changes the identity of the _utility_registrations,
  326. # the cache is updated and the right thing still happens.
  327. class CompThatChangesAfter2Reg(self._getTargetClass()):
  328. reg_count = 0
  329. def registerUtility(self, *args):
  330. self.reg_count += 1
  331. if self.reg_count == 2:
  332. self._utility_registrations = dict(self._utility_registrations)
  333. super(CompThatChangesAfter2Reg, self).registerUtility(*args)
  334. comp = CompThatChangesAfter2Reg()
  335. comp.registerUtility(object(), Interface)
  336. self.assertEqual(len(list(comp.registeredUtilities())), 1)
  337. class IFoo(Interface):
  338. pass
  339. comp.registerUtility(object(), IFoo)
  340. self.assertEqual(len(list(comp.registeredUtilities())), 2)
  341. class IBar(Interface):
  342. pass
  343. comp.registerUtility(object(), IBar)
  344. self.assertEqual(len(list(comp.registeredUtilities())), 3)
  345. def test_unregisterUtility_neither_factory_nor_component_nor_provided(self):
  346. comp = self._makeOne()
  347. self.assertRaises(TypeError, comp.unregisterUtility,
  348. component=None, provided=None, factory=None)
  349. def test_unregisterUtility_both_factory_and_component(self):
  350. def _factory():
  351. raise NotImplementedError()
  352. _to_reg = object()
  353. comp = self._makeOne()
  354. self.assertRaises(TypeError, comp.unregisterUtility,
  355. component=_to_reg, factory=_factory)
  356. def test_unregisterUtility_w_component_miss(self):
  357. from zope.interface.declarations import InterfaceClass
  358. class IFoo(InterfaceClass):
  359. pass
  360. ifoo = IFoo('IFoo')
  361. _name = u'name'
  362. _to_reg = object()
  363. comp = self._makeOne()
  364. _monkey, _events = self._wrapEvents()
  365. with _monkey:
  366. unreg = comp.unregisterUtility(_to_reg, ifoo, _name)
  367. self.assertFalse(unreg)
  368. self.assertFalse(_events)
  369. def test_unregisterUtility_w_component(self):
  370. from zope.interface.declarations import InterfaceClass
  371. from zope.interface.interfaces import Unregistered
  372. from zope.interface.registry import UtilityRegistration
  373. class IFoo(InterfaceClass):
  374. pass
  375. ifoo = IFoo('IFoo')
  376. _name = u'name'
  377. _to_reg = object()
  378. comp = self._makeOne()
  379. comp.registerUtility(_to_reg, ifoo, _name)
  380. _monkey, _events = self._wrapEvents()
  381. with _monkey:
  382. unreg = comp.unregisterUtility(_to_reg, ifoo, _name)
  383. self.assertTrue(unreg)
  384. self.assertFalse(comp.utilities._adapters) # all erased
  385. self.assertFalse((ifoo, _name) in comp._utility_registrations)
  386. self.assertFalse(comp.utilities._subscribers)
  387. self.assertEqual(len(_events), 1)
  388. args, kw = _events[0]
  389. event, = args
  390. self.assertEqual(kw, {})
  391. self.assertTrue(isinstance(event, Unregistered))
  392. self.assertTrue(isinstance(event.object, UtilityRegistration))
  393. self.assertTrue(event.object.registry is comp)
  394. self.assertTrue(event.object.provided is ifoo)
  395. self.assertTrue(event.object.name is _name)
  396. self.assertTrue(event.object.component is _to_reg)
  397. self.assertTrue(event.object.factory is None)
  398. def test_unregisterUtility_w_factory(self):
  399. from zope.interface.declarations import InterfaceClass
  400. from zope.interface.interfaces import Unregistered
  401. from zope.interface.registry import UtilityRegistration
  402. class IFoo(InterfaceClass):
  403. pass
  404. ifoo = IFoo('IFoo')
  405. _info = u'info'
  406. _name = u'name'
  407. _to_reg = object()
  408. def _factory():
  409. return _to_reg
  410. comp = self._makeOne()
  411. comp.registerUtility(None, ifoo, _name, _info, factory=_factory)
  412. _monkey, _events = self._wrapEvents()
  413. with _monkey:
  414. unreg = comp.unregisterUtility(None, ifoo, _name, factory=_factory)
  415. self.assertTrue(unreg)
  416. self.assertEqual(len(_events), 1)
  417. args, kw = _events[0]
  418. event, = args
  419. self.assertEqual(kw, {})
  420. self.assertTrue(isinstance(event, Unregistered))
  421. self.assertTrue(isinstance(event.object, UtilityRegistration))
  422. self.assertTrue(event.object.registry is comp)
  423. self.assertTrue(event.object.provided is ifoo)
  424. self.assertTrue(event.object.name is _name)
  425. self.assertTrue(event.object.component is _to_reg)
  426. self.assertTrue(event.object.factory is _factory)
  427. def test_unregisterUtility_wo_explicit_provided(self):
  428. from zope.interface.declarations import directlyProvides
  429. from zope.interface.declarations import InterfaceClass
  430. from zope.interface.interfaces import Unregistered
  431. from zope.interface.registry import UtilityRegistration
  432. class IFoo(InterfaceClass):
  433. pass
  434. class Foo(object):
  435. pass
  436. ifoo = IFoo('IFoo')
  437. _info = u'info'
  438. _name = u'name'
  439. _to_reg = Foo()
  440. directlyProvides(_to_reg, ifoo)
  441. comp = self._makeOne()
  442. comp.registerUtility(_to_reg, ifoo, _name, _info)
  443. _monkey, _events = self._wrapEvents()
  444. with _monkey:
  445. unreg = comp.unregisterUtility(_to_reg, None, _name)
  446. self.assertTrue(unreg)
  447. self.assertEqual(len(_events), 1)
  448. args, kw = _events[0]
  449. event, = args
  450. self.assertEqual(kw, {})
  451. self.assertTrue(isinstance(event, Unregistered))
  452. self.assertTrue(isinstance(event.object, UtilityRegistration))
  453. self.assertTrue(event.object.registry is comp)
  454. self.assertTrue(event.object.provided is ifoo)
  455. self.assertTrue(event.object.name is _name)
  456. self.assertTrue(event.object.component is _to_reg)
  457. self.assertTrue(event.object.info is _info)
  458. self.assertTrue(event.object.factory is None)
  459. def test_unregisterUtility_wo_component_or_factory(self):
  460. from zope.interface.declarations import directlyProvides
  461. from zope.interface.declarations import InterfaceClass
  462. from zope.interface.interfaces import Unregistered
  463. from zope.interface.registry import UtilityRegistration
  464. class IFoo(InterfaceClass):
  465. pass
  466. class Foo(object):
  467. pass
  468. ifoo = IFoo('IFoo')
  469. _info = u'info'
  470. _name = u'name'
  471. _to_reg = Foo()
  472. directlyProvides(_to_reg, ifoo)
  473. comp = self._makeOne()
  474. comp.registerUtility(_to_reg, ifoo, _name, _info)
  475. _monkey, _events = self._wrapEvents()
  476. with _monkey:
  477. # Just pass the interface / name
  478. unreg = comp.unregisterUtility(provided=ifoo, name=_name)
  479. self.assertTrue(unreg)
  480. self.assertEqual(len(_events), 1)
  481. args, kw = _events[0]
  482. event, = args
  483. self.assertEqual(kw, {})
  484. self.assertTrue(isinstance(event, Unregistered))
  485. self.assertTrue(isinstance(event.object, UtilityRegistration))
  486. self.assertTrue(event.object.registry is comp)
  487. self.assertTrue(event.object.provided is ifoo)
  488. self.assertTrue(event.object.name is _name)
  489. self.assertTrue(event.object.component is _to_reg)
  490. self.assertTrue(event.object.info is _info)
  491. self.assertTrue(event.object.factory is None)
  492. def test_unregisterUtility_w_existing_subscr(self):
  493. from zope.interface.declarations import InterfaceClass
  494. class IFoo(InterfaceClass):
  495. pass
  496. ifoo = IFoo('IFoo')
  497. _info = u'info'
  498. _name1 = u'name1'
  499. _name2 = u'name2'
  500. _to_reg = object()
  501. comp = self._makeOne()
  502. comp.registerUtility(_to_reg, ifoo, _name1, _info)
  503. comp.registerUtility(_to_reg, ifoo, _name2, _info)
  504. _monkey, _events = self._wrapEvents()
  505. with _monkey:
  506. comp.unregisterUtility(_to_reg, ifoo, _name2)
  507. self.assertEqual(comp.utilities._subscribers[0][ifoo][''], (_to_reg,))
  508. def test_unregisterUtility_w_existing_subscr_non_hashable(self):
  509. from zope.interface.declarations import InterfaceClass
  510. class IFoo(InterfaceClass):
  511. pass
  512. ifoo = IFoo('IFoo')
  513. _info = u'info'
  514. _name1 = u'name1'
  515. _name2 = u'name2'
  516. _to_reg = dict()
  517. comp = self._makeOne()
  518. comp.registerUtility(_to_reg, ifoo, _name1, _info)
  519. comp.registerUtility(_to_reg, ifoo, _name2, _info)
  520. _monkey, _events = self._wrapEvents()
  521. with _monkey:
  522. comp.unregisterUtility(_to_reg, ifoo, _name2)
  523. self.assertEqual(comp.utilities._subscribers[0][ifoo][''], (_to_reg,))
  524. def test_unregisterUtility_w_existing_subscr_non_hashable_fresh_cache(self):
  525. # We correctly populate the cache of registrations if it has gone away
  526. # (for example, the Components was unpickled)
  527. from zope.interface.declarations import InterfaceClass
  528. from zope.interface.registry import _UtilityRegistrations
  529. class IFoo(InterfaceClass):
  530. pass
  531. ifoo = IFoo('IFoo')
  532. _info = u'info'
  533. _name1 = u'name1'
  534. _name2 = u'name2'
  535. _to_reg = dict()
  536. comp = self._makeOne()
  537. comp.registerUtility(_to_reg, ifoo, _name1, _info)
  538. comp.registerUtility(_to_reg, ifoo, _name2, _info)
  539. _monkey, _events = self._wrapEvents()
  540. with _monkey:
  541. comp.unregisterUtility(_to_reg, ifoo, _name2)
  542. self.assertEqual(comp.utilities._subscribers[0][ifoo][''], (_to_reg,))
  543. def test_unregisterUtility_w_existing_subscr_non_hashable_reinitted(self):
  544. # We correctly populate the cache of registrations if the base objects change
  545. # out from under us
  546. from zope.interface.declarations import InterfaceClass
  547. class IFoo(InterfaceClass):
  548. pass
  549. ifoo = IFoo('IFoo')
  550. _info = u'info'
  551. _name1 = u'name1'
  552. _name2 = u'name2'
  553. _to_reg = dict()
  554. comp = self._makeOne()
  555. comp.registerUtility(_to_reg, ifoo, _name1, _info)
  556. comp.registerUtility(_to_reg, ifoo, _name2, _info)
  557. # zope.component.testing does this
  558. comp.__init__('base')
  559. comp.registerUtility(_to_reg, ifoo, _name2, _info)
  560. _monkey, _events = self._wrapEvents()
  561. with _monkey:
  562. # Nothing to do, but we don't break either
  563. comp.unregisterUtility(_to_reg, ifoo, _name2)
  564. self.assertEqual(0, len(comp.utilities._subscribers))
  565. def test_unregisterUtility_w_existing_subscr_other_component(self):
  566. from zope.interface.declarations import InterfaceClass
  567. class IFoo(InterfaceClass):
  568. pass
  569. ifoo = IFoo('IFoo')
  570. _info = u'info'
  571. _name1 = u'name1'
  572. _name2 = u'name2'
  573. _other_reg = object()
  574. _to_reg = object()
  575. comp = self._makeOne()
  576. comp.registerUtility(_other_reg, ifoo, _name1, _info)
  577. comp.registerUtility(_to_reg, ifoo, _name2, _info)
  578. _monkey, _events = self._wrapEvents()
  579. with _monkey:
  580. comp.unregisterUtility(_to_reg, ifoo, _name2)
  581. self.assertEqual(comp.utilities._subscribers[0][ifoo][''],
  582. (_other_reg,))
  583. def test_unregisterUtility_w_existing_subscr_other_component_mixed_hash(self):
  584. from zope.interface.declarations import InterfaceClass
  585. class IFoo(InterfaceClass):
  586. pass
  587. ifoo = IFoo('IFoo')
  588. _info = u'info'
  589. _name1 = u'name1'
  590. _name2 = u'name2'
  591. # First register something hashable
  592. _other_reg = object()
  593. # Then it transfers to something unhashable
  594. _to_reg = dict()
  595. comp = self._makeOne()
  596. comp.registerUtility(_other_reg, ifoo, _name1, _info)
  597. comp.registerUtility(_to_reg, ifoo, _name2, _info)
  598. _monkey, _events = self._wrapEvents()
  599. with _monkey:
  600. comp.unregisterUtility(_to_reg, ifoo, _name2)
  601. self.assertEqual(comp.utilities._subscribers[0][ifoo][''],
  602. (_other_reg,))
  603. def test_registeredUtilities_empty(self):
  604. comp = self._makeOne()
  605. self.assertEqual(list(comp.registeredUtilities()), [])
  606. def test_registeredUtilities_notempty(self):
  607. from zope.interface.declarations import InterfaceClass
  608. from zope.interface.registry import UtilityRegistration
  609. class IFoo(InterfaceClass):
  610. pass
  611. ifoo = IFoo('IFoo')
  612. _info = u'info'
  613. _name1 = u'name1'
  614. _name2 = u'name2'
  615. _to_reg = object()
  616. comp = self._makeOne()
  617. comp.registerUtility(_to_reg, ifoo, _name1, _info)
  618. comp.registerUtility(_to_reg, ifoo, _name2, _info)
  619. reg = sorted(comp.registeredUtilities(), key=lambda r: r.name)
  620. self.assertEqual(len(reg), 2)
  621. self.assertTrue(isinstance(reg[0], UtilityRegistration))
  622. self.assertTrue(reg[0].registry is comp)
  623. self.assertTrue(reg[0].provided is ifoo)
  624. self.assertTrue(reg[0].name is _name1)
  625. self.assertTrue(reg[0].component is _to_reg)
  626. self.assertTrue(reg[0].info is _info)
  627. self.assertTrue(reg[0].factory is None)
  628. self.assertTrue(isinstance(reg[1], UtilityRegistration))
  629. self.assertTrue(reg[1].registry is comp)
  630. self.assertTrue(reg[1].provided is ifoo)
  631. self.assertTrue(reg[1].name is _name2)
  632. self.assertTrue(reg[1].component is _to_reg)
  633. self.assertTrue(reg[1].info is _info)
  634. self.assertTrue(reg[1].factory is None)
  635. def test_queryUtility_miss_no_default(self):
  636. from zope.interface.declarations import InterfaceClass
  637. class IFoo(InterfaceClass):
  638. pass
  639. ifoo = IFoo('IFoo')
  640. comp = self._makeOne()
  641. self.assertTrue(comp.queryUtility(ifoo) is None)
  642. def test_queryUtility_miss_w_default(self):
  643. from zope.interface.declarations import InterfaceClass
  644. class IFoo(InterfaceClass):
  645. pass
  646. ifoo = IFoo('IFoo')
  647. comp = self._makeOne()
  648. _default = object()
  649. self.assertTrue(comp.queryUtility(ifoo, default=_default) is _default)
  650. def test_queryUtility_hit(self):
  651. from zope.interface.declarations import InterfaceClass
  652. class IFoo(InterfaceClass):
  653. pass
  654. ifoo = IFoo('IFoo')
  655. _to_reg = object()
  656. comp = self._makeOne()
  657. comp.registerUtility(_to_reg, ifoo)
  658. self.assertTrue(comp.queryUtility(ifoo) is _to_reg)
  659. def test_getUtility_miss(self):
  660. from zope.interface.declarations import InterfaceClass
  661. from zope.interface.interfaces import ComponentLookupError
  662. class IFoo(InterfaceClass):
  663. pass
  664. ifoo = IFoo('IFoo')
  665. comp = self._makeOne()
  666. self.assertRaises(ComponentLookupError, comp.getUtility, ifoo)
  667. def test_getUtility_hit(self):
  668. from zope.interface.declarations import InterfaceClass
  669. class IFoo(InterfaceClass):
  670. pass
  671. ifoo = IFoo('IFoo')
  672. _to_reg = object()
  673. comp = self._makeOne()
  674. comp.registerUtility(_to_reg, ifoo)
  675. self.assertTrue(comp.getUtility(ifoo) is _to_reg)
  676. def test_getUtilitiesFor_miss(self):
  677. from zope.interface.declarations import InterfaceClass
  678. class IFoo(InterfaceClass):
  679. pass
  680. ifoo = IFoo('IFoo')
  681. comp = self._makeOne()
  682. self.assertEqual(list(comp.getUtilitiesFor(ifoo)), [])
  683. def test_getUtilitiesFor_hit(self):
  684. from zope.interface.declarations import InterfaceClass
  685. class IFoo(InterfaceClass):
  686. pass
  687. ifoo = IFoo('IFoo')
  688. _name1 = u'name1'
  689. _name2 = u'name2'
  690. _to_reg = object()
  691. comp = self._makeOne()
  692. comp.registerUtility(_to_reg, ifoo, name=_name1)
  693. comp.registerUtility(_to_reg, ifoo, name=_name2)
  694. self.assertEqual(sorted(comp.getUtilitiesFor(ifoo)),
  695. [(_name1, _to_reg), (_name2, _to_reg)])
  696. def test_getAllUtilitiesRegisteredFor_miss(self):
  697. from zope.interface.declarations import InterfaceClass
  698. class IFoo(InterfaceClass):
  699. pass
  700. ifoo = IFoo('IFoo')
  701. comp = self._makeOne()
  702. self.assertEqual(list(comp.getAllUtilitiesRegisteredFor(ifoo)), [])
  703. def test_getAllUtilitiesRegisteredFor_hit(self):
  704. from zope.interface.declarations import InterfaceClass
  705. class IFoo(InterfaceClass):
  706. pass
  707. ifoo = IFoo('IFoo')
  708. _name1 = u'name1'
  709. _name2 = u'name2'
  710. _to_reg = object()
  711. comp = self._makeOne()
  712. comp.registerUtility(_to_reg, ifoo, name=_name1)
  713. comp.registerUtility(_to_reg, ifoo, name=_name2)
  714. self.assertEqual(list(comp.getAllUtilitiesRegisteredFor(ifoo)),
  715. [_to_reg])
  716. def test_registerAdapter_with_component_name(self):
  717. from zope.interface.declarations import named, InterfaceClass
  718. class IFoo(InterfaceClass):
  719. pass
  720. ifoo = IFoo('IFoo')
  721. ibar = IFoo('IBar')
  722. @named(u'foo')
  723. class Foo(object):
  724. pass
  725. _info = u'info'
  726. comp = self._makeOne()
  727. comp.registerAdapter(Foo, (ibar,), ifoo, info=_info)
  728. self.assertEqual(
  729. comp._adapter_registrations[(ibar,), ifoo, u'foo'],
  730. (Foo, _info))
  731. def test_registerAdapter_w_explicit_provided_and_required(self):
  732. from zope.interface.declarations import InterfaceClass
  733. from zope.interface.interfaces import Registered
  734. from zope.interface.registry import AdapterRegistration
  735. class IFoo(InterfaceClass):
  736. pass
  737. ifoo = IFoo('IFoo')
  738. ibar = IFoo('IBar')
  739. _info = u'info'
  740. _name = u'name'
  741. def _factory(context):
  742. raise NotImplementedError()
  743. comp = self._makeOne()
  744. _monkey, _events = self._wrapEvents()
  745. with _monkey:
  746. comp.registerAdapter(_factory, (ibar,), ifoo, _name, _info)
  747. self.assertTrue(comp.adapters._adapters[1][ibar][ifoo][_name]
  748. is _factory)
  749. self.assertEqual(comp._adapter_registrations[(ibar,), ifoo, _name],
  750. (_factory, _info))
  751. self.assertEqual(len(_events), 1)
  752. args, kw = _events[0]
  753. event, = args
  754. self.assertEqual(kw, {})
  755. self.assertTrue(isinstance(event, Registered))
  756. self.assertTrue(isinstance(event.object, AdapterRegistration))
  757. self.assertTrue(event.object.registry is comp)
  758. self.assertTrue(event.object.provided is ifoo)
  759. self.assertEqual(event.object.required, (ibar,))
  760. self.assertTrue(event.object.name is _name)
  761. self.assertTrue(event.object.info is _info)
  762. self.assertTrue(event.object.factory is _factory)
  763. def test_registerAdapter_no_provided_available(self):
  764. from zope.interface.declarations import InterfaceClass
  765. class IFoo(InterfaceClass):
  766. pass
  767. ibar = IFoo('IBar')
  768. _info = u'info'
  769. _name = u'name'
  770. class _Factory(object):
  771. pass
  772. comp = self._makeOne()
  773. self.assertRaises(TypeError, comp.registerAdapter, _Factory, (ibar,),
  774. name=_name, info=_info)
  775. def test_registerAdapter_wo_explicit_provided(self):
  776. from zope.interface.declarations import InterfaceClass
  777. from zope.interface.declarations import implementer
  778. from zope.interface.interfaces import Registered
  779. from zope.interface.registry import AdapterRegistration
  780. class IFoo(InterfaceClass):
  781. pass
  782. ifoo = IFoo('IFoo')
  783. ibar = IFoo('IBar')
  784. _info = u'info'
  785. _name = u'name'
  786. _to_reg = object()
  787. @implementer(ifoo)
  788. class _Factory(object):
  789. pass
  790. comp = self._makeOne()
  791. _monkey, _events = self._wrapEvents()
  792. with _monkey:
  793. comp.registerAdapter(_Factory, (ibar,), name=_name, info=_info)
  794. self.assertTrue(comp.adapters._adapters[1][ibar][ifoo][_name]
  795. is _Factory)
  796. self.assertEqual(comp._adapter_registrations[(ibar,), ifoo, _name],
  797. (_Factory, _info))
  798. self.assertEqual(len(_events), 1)
  799. args, kw = _events[0]
  800. event, = args
  801. self.assertEqual(kw, {})
  802. self.assertTrue(isinstance(event, Registered))
  803. self.assertTrue(isinstance(event.object, AdapterRegistration))
  804. self.assertTrue(event.object.registry is comp)
  805. self.assertTrue(event.object.provided is ifoo)
  806. self.assertEqual(event.object.required, (ibar,))
  807. self.assertTrue(event.object.name is _name)
  808. self.assertTrue(event.object.info is _info)
  809. self.assertTrue(event.object.factory is _Factory)
  810. def test_registerAdapter_no_required_available(self):
  811. from zope.interface.declarations import InterfaceClass
  812. class IFoo(InterfaceClass):
  813. pass
  814. ifoo = IFoo('IFoo')
  815. _info = u'info'
  816. _name = u'name'
  817. class _Factory(object):
  818. pass
  819. comp = self._makeOne()
  820. self.assertRaises(TypeError, comp.registerAdapter, _Factory,
  821. provided=ifoo, name=_name, info=_info)
  822. def test_registerAdapter_w_invalid_required(self):
  823. from zope.interface.declarations import InterfaceClass
  824. class IFoo(InterfaceClass):
  825. pass
  826. ifoo = IFoo('IFoo')
  827. ibar = IFoo('IBar')
  828. _info = u'info'
  829. _name = u'name'
  830. class _Factory(object):
  831. pass
  832. comp = self._makeOne()
  833. self.assertRaises(TypeError, comp.registerAdapter, _Factory,
  834. ibar, provided=ifoo, name=_name, info=_info)
  835. def test_registerAdapter_w_required_containing_None(self):
  836. from zope.interface.declarations import InterfaceClass
  837. from zope.interface.interface import Interface
  838. from zope.interface.interfaces import Registered
  839. from zope.interface.registry import AdapterRegistration
  840. class IFoo(InterfaceClass):
  841. pass
  842. ifoo = IFoo('IFoo')
  843. _info = u'info'
  844. _name = u'name'
  845. class _Factory(object):
  846. pass
  847. comp = self._makeOne()
  848. _monkey, _events = self._wrapEvents()
  849. with _monkey:
  850. comp.registerAdapter(_Factory, [None], provided=ifoo,
  851. name=_name, info=_info)
  852. self.assertTrue(comp.adapters._adapters[1][Interface][ifoo][_name]
  853. is _Factory)
  854. self.assertEqual(comp._adapter_registrations[(Interface,), ifoo, _name],
  855. (_Factory, _info))
  856. self.assertEqual(len(_events), 1)
  857. args, kw = _events[0]
  858. event, = args
  859. self.assertEqual(kw, {})
  860. self.assertTrue(isinstance(event, Registered))
  861. self.assertTrue(isinstance(event.object, AdapterRegistration))
  862. self.assertTrue(event.object.registry is comp)
  863. self.assertTrue(event.object.provided is ifoo)
  864. self.assertEqual(event.object.required, (Interface,))
  865. self.assertTrue(event.object.name is _name)
  866. self.assertTrue(event.object.info is _info)
  867. self.assertTrue(event.object.factory is _Factory)
  868. def test_registerAdapter_w_required_containing_class(self):
  869. from zope.interface.declarations import InterfaceClass
  870. from zope.interface.declarations import implementer
  871. from zope.interface.declarations import implementedBy
  872. from zope.interface.interfaces import Registered
  873. from zope.interface.registry import AdapterRegistration
  874. class IFoo(InterfaceClass):
  875. pass
  876. ifoo = IFoo('IFoo')
  877. ibar = IFoo('IBar')
  878. _info = u'info'
  879. _name = u'name'
  880. class _Factory(object):
  881. pass
  882. @implementer(ibar)
  883. class _Context(object):
  884. pass
  885. _ctx_impl = implementedBy(_Context)
  886. comp = self._makeOne()
  887. _monkey, _events = self._wrapEvents()
  888. with _monkey:
  889. comp.registerAdapter(_Factory, [_Context], provided=ifoo,
  890. name=_name, info=_info)
  891. self.assertTrue(comp.adapters._adapters[1][_ctx_impl][ifoo][_name]
  892. is _Factory)
  893. self.assertEqual(comp._adapter_registrations[(_ctx_impl,), ifoo, _name],
  894. (_Factory, _info))
  895. self.assertEqual(len(_events), 1)
  896. args, kw = _events[0]
  897. event, = args
  898. self.assertEqual(kw, {})
  899. self.assertTrue(isinstance(event, Registered))
  900. self.assertTrue(isinstance(event.object, AdapterRegistration))
  901. self.assertTrue(event.object.registry is comp)
  902. self.assertTrue(event.object.provided is ifoo)
  903. self.assertEqual(event.object.required, (_ctx_impl,))
  904. self.assertTrue(event.object.name is _name)
  905. self.assertTrue(event.object.info is _info)
  906. self.assertTrue(event.object.factory is _Factory)
  907. def test_registerAdapter_w_required_containing_junk(self):
  908. from zope.interface.declarations import InterfaceClass
  909. class IFoo(InterfaceClass):
  910. pass
  911. ifoo = IFoo('IFoo')
  912. _info = u'info'
  913. _name = u'name'
  914. class _Factory(object):
  915. pass
  916. comp = self._makeOne()
  917. self.assertRaises(TypeError, comp.registerAdapter, _Factory, [object()],
  918. provided=ifoo, name=_name, info=_info)
  919. def test_registerAdapter_wo_explicit_required(self):
  920. from zope.interface.declarations import InterfaceClass
  921. from zope.interface.interfaces import Registered
  922. from zope.interface.registry import AdapterRegistration
  923. class IFoo(InterfaceClass):
  924. pass
  925. ifoo = IFoo('IFoo')
  926. ibar = IFoo('IBar')
  927. _info = u'info'
  928. _name = u'name'
  929. class _Factory(object):
  930. __component_adapts__ = (ibar,)
  931. comp = self._makeOne()
  932. _monkey, _events = self._wrapEvents()
  933. with _monkey:
  934. comp.registerAdapter(_Factory, provided=ifoo, name=_name,
  935. info=_info)
  936. self.assertTrue(comp.adapters._adapters[1][ibar][ifoo][_name]
  937. is _Factory)
  938. self.assertEqual(comp._adapter_registrations[(ibar,), ifoo, _name],
  939. (_Factory, _info))
  940. self.assertEqual(len(_events), 1)
  941. args, kw = _events[0]
  942. event, = args
  943. self.assertEqual(kw, {})
  944. self.assertTrue(isinstance(event, Registered))
  945. self.assertTrue(isinstance(event.object, AdapterRegistration))
  946. self.assertTrue(event.object.registry is comp)
  947. self.assertTrue(event.object.provided is ifoo)
  948. self.assertEqual(event.object.required, (ibar,))
  949. self.assertTrue(event.object.name is _name)
  950. self.assertTrue(event.object.info is _info)
  951. self.assertTrue(event.object.factory is _Factory)
  952. def test_registerAdapter_wo_event(self):
  953. from zope.interface.declarations import InterfaceClass
  954. class IFoo(InterfaceClass):
  955. pass
  956. ifoo = IFoo('IFoo')
  957. ibar = IFoo('IBar')
  958. _info = u'info'
  959. _name = u'name'
  960. def _factory(context):
  961. raise NotImplementedError()
  962. comp = self._makeOne()
  963. _monkey, _events = self._wrapEvents()
  964. with _monkey:
  965. comp.registerAdapter(_factory, (ibar,), ifoo, _name, _info,
  966. event=False)
  967. self.assertEqual(len(_events), 0)
  968. def test_unregisterAdapter_neither_factory_nor_provided(self):
  969. comp = self._makeOne()
  970. self.assertRaises(TypeError, comp.unregisterAdapter,
  971. factory=None, provided=None)
  972. def test_unregisterAdapter_neither_factory_nor_required(self):
  973. from zope.interface.declarations import InterfaceClass
  974. class IFoo(InterfaceClass):
  975. pass
  976. ifoo = IFoo('IFoo')
  977. comp = self._makeOne()
  978. self.assertRaises(TypeError, comp.unregisterAdapter,
  979. factory=None, provided=ifoo, required=None)
  980. def test_unregisterAdapter_miss(self):
  981. from zope.interface.declarations import InterfaceClass
  982. class IFoo(InterfaceClass):
  983. pass
  984. ifoo = IFoo('IFoo')
  985. ibar = IFoo('IBar')
  986. class _Factory(object):
  987. pass
  988. comp = self._makeOne()
  989. _monkey, _events = self._wrapEvents()
  990. with _monkey:
  991. unreg = comp.unregisterAdapter(_Factory, (ibar,), ifoo)
  992. self.assertFalse(unreg)
  993. def test_unregisterAdapter_hit_w_explicit_provided_and_required(self):
  994. from zope.interface.declarations import InterfaceClass
  995. from zope.interface.interfaces import Unregistered
  996. from zope.interface.registry import AdapterRegistration
  997. class IFoo(InterfaceClass):
  998. pass
  999. ifoo = IFoo('IFoo')
  1000. ibar = IFoo('IBar')
  1001. class _Factory(object):
  1002. pass
  1003. comp = self._makeOne()
  1004. comp.registerAdapter(_Factory, (ibar,), ifoo)
  1005. _monkey, _events = self._wrapEvents()
  1006. with _monkey:
  1007. unreg = comp.unregisterAdapter(_Factory, (ibar,), ifoo)
  1008. self.assertTrue(unreg)
  1009. self.assertFalse(comp.adapters._adapters)
  1010. self.assertFalse(comp._adapter_registrations)
  1011. self.assertEqual(len(_events), 1)
  1012. args, kw = _events[0]
  1013. event, = args
  1014. self.assertEqual(kw, {})
  1015. self.assertTrue(isinstance(event, Unregistered))
  1016. self.assertTrue(isinstance(event.object, AdapterRegistration))
  1017. self.assertTrue(event.object.registry is comp)
  1018. self.assertTrue(event.object.provided is ifoo)
  1019. self.assertEqual(event.object.required, (ibar,))
  1020. self.assertEqual(event.object.name, '')
  1021. self.assertEqual(event.object.info, '')
  1022. self.assertTrue(event.object.factory is _Factory)
  1023. def test_unregisterAdapter_wo_explicit_provided(self):
  1024. from zope.interface.declarations import InterfaceClass
  1025. from zope.interface.declarations import implementer
  1026. from zope.interface.interfaces import Unregistered
  1027. from zope.interface.registry import AdapterRegistration
  1028. class IFoo(InterfaceClass):
  1029. pass
  1030. ifoo = IFoo('IFoo')
  1031. ibar = IFoo('IBar')
  1032. @implementer(ifoo)
  1033. class _Factory(object):
  1034. pass
  1035. comp = self._makeOne()
  1036. comp.registerAdapter(_Factory, (ibar,), ifoo)
  1037. _monkey, _events = self._wrapEvents()
  1038. with _monkey:
  1039. unreg = comp.unregisterAdapter(_Factory, (ibar,))
  1040. self.assertTrue(unreg)
  1041. self.assertEqual(len(_events), 1)
  1042. args, kw = _events[0]
  1043. event, = args
  1044. self.assertEqual(kw, {})
  1045. self.assertTrue(isinstance(event, Unregistered))
  1046. self.assertTrue(isinstance(event.object, AdapterRegistration))
  1047. self.assertTrue(event.object.registry is comp)
  1048. self.assertTrue(event.object.provided is ifoo)
  1049. self.assertEqual(event.object.required, (ibar,))
  1050. self.assertEqual(event.object.name, '')
  1051. self.assertEqual(event.object.info, '')
  1052. self.assertTrue(event.object.factory is _Factory)
  1053. def test_unregisterAdapter_wo_explicit_required(self):
  1054. from zope.interface.declarations import InterfaceClass
  1055. from zope.interface.interfaces import Unregistered
  1056. from zope.interface.registry import AdapterRegistration
  1057. class IFoo(InterfaceClass):
  1058. pass
  1059. ifoo = IFoo('IFoo')
  1060. ibar = IFoo('IBar')
  1061. class _Factory(object):
  1062. __component_adapts__ = (ibar,)
  1063. comp = self._makeOne()
  1064. comp.registerAdapter(_Factory, (ibar,), ifoo)
  1065. _monkey, _events = self._wrapEvents()
  1066. with _monkey:
  1067. unreg = comp.unregisterAdapter(_Factory, provided=ifoo)
  1068. self.assertTrue(unreg)
  1069. self.assertEqual(len(_events), 1)
  1070. args, kw = _events[0]
  1071. event, = args
  1072. self.assertEqual(kw, {})
  1073. self.assertTrue(isinstance(event, Unregistered))
  1074. self.assertTrue(isinstance(event.object, AdapterRegistration))
  1075. self.assertTrue(event.object.registry is comp)
  1076. self.assertTrue(event.object.provided is ifoo)
  1077. self.assertEqual(event.object.required, (ibar,))
  1078. self.assertEqual(event.object.name, '')
  1079. self.assertEqual(event.object.info, '')
  1080. self.assertTrue(event.object.factory is _Factory)
  1081. def test_registeredAdapters_empty(self):
  1082. comp = self._makeOne()
  1083. self.assertEqual(list(comp.registeredAdapters()), [])
  1084. def test_registeredAdapters_notempty(self):
  1085. from zope.interface.declarations import InterfaceClass
  1086. from zope.interface.registry import AdapterRegistration
  1087. class IFoo(InterfaceClass):
  1088. pass
  1089. ifoo = IFoo('IFoo')
  1090. ibar = IFoo('IFoo')
  1091. _info = u'info'
  1092. _name1 = u'name1'
  1093. _name2 = u'name2'
  1094. class _Factory(object):
  1095. pass
  1096. comp = self._makeOne()
  1097. comp.registerAdapter(_Factory, (ibar,), ifoo, _name1, _info)
  1098. comp.registerAdapter(_Factory, (ibar,), ifoo, _name2, _info)
  1099. reg = sorted(comp.registeredAdapters(), key=lambda r: r.name)
  1100. self.assertEqual(len(reg), 2)
  1101. self.assertTrue(isinstance(reg[0], AdapterRegistration))
  1102. self.assertTrue(reg[0].registry is comp)
  1103. self.assertTrue(reg[0].provided is ifoo)
  1104. self.assertEqual(reg[0].required, (ibar,))
  1105. self.assertTrue(reg[0].name is _name1)
  1106. self.assertTrue(reg[0].info is _info)
  1107. self.assertTrue(reg[0].factory is _Factory)
  1108. self.assertTrue(isinstance(reg[1], AdapterRegistration))
  1109. self.assertTrue(reg[1].registry is comp)
  1110. self.assertTrue(reg[1].provided is ifoo)
  1111. self.assertEqual(reg[1].required, (ibar,))
  1112. self.assertTrue(reg[1].name is _name2)
  1113. self.assertTrue(reg[1].info is _info)
  1114. self.assertTrue(reg[1].factory is _Factory)
  1115. def test_queryAdapter_miss_no_default(self):
  1116. from zope.interface.declarations import InterfaceClass
  1117. class IFoo(InterfaceClass):
  1118. pass
  1119. ifoo = IFoo('IFoo')
  1120. comp = self._makeOne()
  1121. _context = object()
  1122. self.assertTrue(comp.queryAdapter(_context, ifoo) is None)
  1123. def test_queryAdapter_miss_w_default(self):
  1124. from zope.interface.declarations import InterfaceClass
  1125. class IFoo(InterfaceClass):
  1126. pass
  1127. ifoo = IFoo('IFoo')
  1128. comp = self._makeOne()
  1129. _context = object()
  1130. _default = object()
  1131. self.assertTrue(
  1132. comp.queryAdapter(_context, ifoo, default=_default) is _default)
  1133. def test_queryAdapter_hit(self):
  1134. from zope.interface.declarations import InterfaceClass
  1135. from zope.interface.declarations import implementer
  1136. class IFoo(InterfaceClass):
  1137. pass
  1138. ifoo = IFoo('IFoo')
  1139. ibar = IFoo('IBar')
  1140. class _Factory(object):
  1141. def __init__(self, context):
  1142. self.context = context
  1143. @implementer(ibar)
  1144. class _Context(object):
  1145. pass
  1146. _context = _Context()
  1147. comp = self._makeOne()
  1148. comp.registerAdapter(_Factory, (ibar,), ifoo)
  1149. adapter = comp.queryAdapter(_context, ifoo)
  1150. self.assertTrue(isinstance(adapter, _Factory))
  1151. self.assertTrue(adapter.context is _context)
  1152. def test_getAdapter_miss(self):
  1153. from zope.interface.declarations import InterfaceClass
  1154. from zope.interface.declarations import implementer
  1155. from zope.interface.interfaces import ComponentLookupError
  1156. class IFoo(InterfaceClass):
  1157. pass
  1158. ifoo = IFoo('IFoo')
  1159. ibar = IFoo('IBar')
  1160. @implementer(ibar)
  1161. class _Context(object):
  1162. pass
  1163. _context = _Context()
  1164. comp = self._makeOne()
  1165. self.assertRaises(ComponentLookupError,
  1166. comp.getAdapter, _context, ifoo)
  1167. def test_getAdapter_hit(self):
  1168. from zope.interface.declarations import InterfaceClass
  1169. from zope.interface.declarations import implementer
  1170. class IFoo(InterfaceClass):
  1171. pass
  1172. ifoo = IFoo('IFoo')
  1173. ibar = IFoo('IBar')
  1174. class _Factory(object):
  1175. def __init__(self, context):
  1176. self.context = context
  1177. @implementer(ibar)
  1178. class _Context(object):
  1179. pass
  1180. _context = _Context()
  1181. comp = self._makeOne()
  1182. comp.registerAdapter(_Factory, (ibar,), ifoo)
  1183. adapter = comp.getAdapter(_context, ifoo)
  1184. self.assertIsInstance(adapter, _Factory)
  1185. self.assertIs(adapter.context, _context)
  1186. def test_getAdapter_hit_super(self):
  1187. from zope.interface import Interface
  1188. from zope.interface.declarations import implementer
  1189. class IBase(Interface):
  1190. pass
  1191. class IDerived(IBase):
  1192. pass
  1193. class IFoo(Interface):
  1194. pass
  1195. @implementer(IBase)
  1196. class Base(object):
  1197. pass
  1198. @implementer(IDerived)
  1199. class Derived(Base):
  1200. pass
  1201. class AdapterBase(object):
  1202. def __init__(self, context):
  1203. self.context = context
  1204. class AdapterDerived(object):
  1205. def __init__(self, context):
  1206. self.context = context
  1207. comp = self._makeOne()
  1208. comp.registerAdapter(AdapterDerived, (IDerived,), IFoo)
  1209. comp.registerAdapter(AdapterBase, (IBase,), IFoo)
  1210. self._should_not_change(comp)
  1211. derived = Derived()
  1212. adapter = comp.getAdapter(derived, IFoo)
  1213. self.assertIsInstance(adapter, AdapterDerived)
  1214. self.assertIs(adapter.context, derived)
  1215. supe = super(Derived, derived)
  1216. adapter = comp.getAdapter(supe, IFoo)
  1217. self.assertIsInstance(adapter, AdapterBase)
  1218. self.assertIs(adapter.context, derived)
  1219. def test_getAdapter_hit_super_when_parent_implements_interface_diamond(self):
  1220. from zope.interface import Interface
  1221. from zope.interface.declarations import implementer
  1222. class IBase(Interface):
  1223. pass
  1224. class IDerived(IBase):
  1225. pass
  1226. class IFoo(Interface):
  1227. pass
  1228. class Base(object):
  1229. pass
  1230. class Child1(Base):
  1231. pass
  1232. @implementer(IBase)
  1233. class Child2(Base):
  1234. pass
  1235. @implementer(IDerived)
  1236. class Derived(Child1, Child2):
  1237. pass
  1238. class AdapterBase(object):
  1239. def __init__(self, context):
  1240. self.context = context
  1241. class AdapterDerived(object):
  1242. def __init__(self, context):
  1243. self.context = context
  1244. comp = self._makeOne()
  1245. comp.registerAdapter(AdapterDerived, (IDerived,), IFoo)
  1246. comp.registerAdapter(AdapterBase, (IBase,), IFoo)
  1247. self._should_not_change(comp)
  1248. derived = Derived()
  1249. adapter = comp.getAdapter(derived, IFoo)
  1250. self.assertIsInstance(adapter, AdapterDerived)
  1251. self.assertIs(adapter.context, derived)
  1252. supe = super(Derived, derived)
  1253. adapter = comp.getAdapter(supe, IFoo)
  1254. self.assertIsInstance(adapter, AdapterBase)
  1255. self.assertIs(adapter.context, derived)
  1256. def test_queryMultiAdapter_miss(self):
  1257. from zope.interface.declarations import InterfaceClass
  1258. from zope.interface.declarations import implementer
  1259. class IFoo(InterfaceClass):
  1260. pass
  1261. ifoo = IFoo('IFoo')
  1262. ibar = IFoo('IBar')
  1263. ibaz = IFoo('IBaz')
  1264. @implementer(ibar)
  1265. class _Context1(object):
  1266. pass
  1267. @implementer(ibaz)
  1268. class _Context2(object):
  1269. pass
  1270. _context1 = _Context1()
  1271. _context2 = _Context2()
  1272. comp = self._makeOne()
  1273. self.assertEqual(comp.queryMultiAdapter((_context1, _context2), ifoo),
  1274. None)
  1275. def test_queryMultiAdapter_miss_w_default(self):
  1276. from zope.interface.declarations import InterfaceClass
  1277. from zope.interface.declarations import implementer
  1278. class IFoo(InterfaceClass):
  1279. pass
  1280. ifoo = IFoo('IFoo')
  1281. ibar = IFoo('IBar')
  1282. ibaz = IFoo('IBaz')
  1283. @implementer(ibar)
  1284. class _Context1(object):
  1285. pass
  1286. @implementer(ibaz)
  1287. class _Context2(object):
  1288. pass
  1289. _context1 = _Context1()
  1290. _context2 = _Context2()
  1291. _default = object()
  1292. comp = self._makeOne()
  1293. self.assertTrue(
  1294. comp.queryMultiAdapter((_context1, _context2), ifoo,
  1295. default=_default) is _default)
  1296. def test_queryMultiAdapter_hit(self):
  1297. from zope.interface.declarations import InterfaceClass
  1298. from zope.interface.declarations import implementer
  1299. class IFoo(InterfaceClass):
  1300. pass
  1301. ifoo = IFoo('IFoo')
  1302. ibar = IFoo('IBar')
  1303. ibaz = IFoo('IBaz')
  1304. @implementer(ibar)
  1305. class _Context1(object):
  1306. pass
  1307. @implementer(ibaz)
  1308. class _Context2(object):
  1309. pass
  1310. _context1 = _Context1()
  1311. _context2 = _Context2()
  1312. class _Factory(object):
  1313. def __init__(self, context1, context2):
  1314. self.context = context1, context2
  1315. comp = self._makeOne()
  1316. comp.registerAdapter(_Factory, (ibar, ibaz), ifoo)
  1317. adapter = comp.queryMultiAdapter((_context1, _context2), ifoo)
  1318. self.assertTrue(isinstance(adapter, _Factory))
  1319. self.assertEqual(adapter.context, (_context1, _context2))
  1320. def test_getMultiAdapter_miss(self):
  1321. from zope.interface.declarations import InterfaceClass
  1322. from zope.interface.declarations import implementer
  1323. from zope.interface.interfaces import ComponentLookupError
  1324. class IFoo(InterfaceClass):
  1325. pass
  1326. ifoo = IFoo('IFoo')
  1327. ibar = IFoo('IBar')
  1328. ibaz = IFoo('IBaz')
  1329. @implementer(ibar)
  1330. class _Context1(object):
  1331. pass
  1332. @implementer(ibaz)
  1333. class _Context2(object):
  1334. pass
  1335. _context1 = _Context1()
  1336. _context2 = _Context2()
  1337. comp = self._makeOne()
  1338. self.assertRaises(ComponentLookupError,
  1339. comp.getMultiAdapter, (_context1, _context2), ifoo)
  1340. def test_getMultiAdapter_hit(self):
  1341. from zope.interface.declarations import InterfaceClass
  1342. from zope.interface.declarations import implementer
  1343. class IFoo(InterfaceClass):
  1344. pass
  1345. ifoo = IFoo('IFoo')
  1346. ibar = IFoo('IBar')
  1347. ibaz = IFoo('IBaz')
  1348. @implementer(ibar)
  1349. class _Context1(object):
  1350. pass
  1351. @implementer(ibaz)
  1352. class _Context2(object):
  1353. pass
  1354. _context1 = _Context1()
  1355. _context2 = _Context2()
  1356. class _Factory(object):
  1357. def __init__(self, context1, context2):
  1358. self.context = context1, context2
  1359. comp = self._makeOne()
  1360. comp.registerAdapter(_Factory, (ibar, ibaz), ifoo)
  1361. adapter = comp.getMultiAdapter((_context1, _context2), ifoo)
  1362. self.assertTrue(isinstance(adapter, _Factory))
  1363. self.assertEqual(adapter.context, (_context1, _context2))
  1364. def _should_not_change(self, comp):
  1365. # Be sure that none of the underlying structures
  1366. # get told that they have changed during this process
  1367. # because that invalidates caches.
  1368. def no_changes(*args):
  1369. self.fail("Nothing should get changed")
  1370. comp.changed = no_changes
  1371. comp.adapters.changed = no_changes
  1372. comp.adapters._v_lookup.changed = no_changes
  1373. def test_getMultiAdapter_hit_super(self):
  1374. from zope.interface import Interface
  1375. from zope.interface.declarations import implementer
  1376. class IBase(Interface):
  1377. pass
  1378. class IDerived(IBase):
  1379. pass
  1380. class IFoo(Interface):
  1381. pass
  1382. @implementer(IBase)
  1383. class Base(object):
  1384. pass
  1385. @implementer(IDerived)
  1386. class Derived(Base):
  1387. pass
  1388. class AdapterBase(object):
  1389. def __init__(self, context1, context2):
  1390. self.context1 = context1
  1391. self.context2 = context2
  1392. class AdapterDerived(AdapterBase):
  1393. pass
  1394. comp = self._makeOne()
  1395. comp.registerAdapter(AdapterDerived, (IDerived, IDerived), IFoo)
  1396. comp.registerAdapter(AdapterBase, (IBase, IDerived), IFoo)
  1397. self._should_not_change(comp)
  1398. derived = Derived()
  1399. adapter = comp.getMultiAdapter((derived, derived), IFoo)
  1400. self.assertIsInstance(adapter, AdapterDerived)
  1401. self.assertIs(adapter.context1, derived)
  1402. self.assertIs(adapter.context2, derived)
  1403. supe = super(Derived, derived)
  1404. adapter = comp.getMultiAdapter((supe, derived), IFoo)
  1405. self.assertIsInstance(adapter, AdapterBase)
  1406. self.assertNotIsInstance(adapter, AdapterDerived)
  1407. self.assertIs(adapter.context1, derived)
  1408. self.assertIs(adapter.context2, derived)
  1409. def test_getAdapters_empty(self):
  1410. from zope.interface.declarations import InterfaceClass
  1411. from zope.interface.declarations import implementer
  1412. class IFoo(InterfaceClass):
  1413. pass
  1414. ifoo = IFoo('IFoo')
  1415. ibar = IFoo('IBar')
  1416. ibaz = IFoo('IBaz')
  1417. @implementer(ibar)
  1418. class _Context1(object):
  1419. pass
  1420. @implementer(ibaz)
  1421. class _Context2(object):
  1422. pass
  1423. _context1 = _Context1()
  1424. _context2 = _Context2()
  1425. comp = self._makeOne()
  1426. self.assertEqual(
  1427. list(comp.getAdapters((_context1, _context2), ifoo)), [])
  1428. def test_getAdapters_factory_returns_None(self):
  1429. from zope.interface.declarations import InterfaceClass
  1430. from zope.interface.declarations import implementer
  1431. class IFoo(InterfaceClass):
  1432. pass
  1433. ifoo = IFoo('IFoo')
  1434. ibar = IFoo('IBar')
  1435. ibaz = IFoo('IBaz')
  1436. @implementer(ibar)
  1437. class _Context1(object):
  1438. pass
  1439. @implementer(ibaz)
  1440. class _Context2(object):
  1441. pass
  1442. _context1 = _Context1()
  1443. _context2 = _Context2()
  1444. comp = self._makeOne()
  1445. _called_with = []
  1446. def _side_effect_only(context1, context2):
  1447. _called_with.append((context1, context2))
  1448. return None
  1449. comp.registerAdapter(_side_effect_only, (ibar, ibaz), ifoo)
  1450. self.assertEqual(
  1451. list(comp.getAdapters((_context1, _context2), ifoo)), [])
  1452. self.assertEqual(_called_with, [(_context1, _context2)])
  1453. def test_getAdapters_non_empty(self):
  1454. from zope.interface.declarations import InterfaceClass
  1455. from zope.interface.declarations import implementer
  1456. class IFoo(InterfaceClass):
  1457. pass
  1458. ifoo = IFoo('IFoo')
  1459. ibar = IFoo('IBar')
  1460. ibaz = IFoo('IBaz')
  1461. @implementer(ibar)
  1462. class _Context1(object):
  1463. pass
  1464. @implementer(ibaz)
  1465. class _Context2(object):
  1466. pass
  1467. _context1 = _Context1()
  1468. _context2 = _Context2()
  1469. class _Factory1(object):
  1470. def __init__(self, context1, context2):
  1471. self.context = context1, context2
  1472. class _Factory2(object):
  1473. def __init__(self, context1, context2):
  1474. self.context = context1, context2
  1475. _name1 = u'name1'
  1476. _name2 = u'name2'
  1477. comp = self._makeOne()
  1478. comp.registerAdapter(_Factory1, (ibar, ibaz), ifoo, name=_name1)
  1479. comp.registerAdapter(_Factory2, (ibar, ibaz), ifoo, name=_name2)
  1480. found = sorted(comp.getAdapters((_context1, _context2), ifoo))
  1481. self.assertEqual(len(found), 2)
  1482. self.assertEqual(found[0][0], _name1)
  1483. self.assertTrue(isinstance(found[0][1], _Factory1))
  1484. self.assertEqual(found[1][0], _name2)
  1485. self.assertTrue(isinstance(found[1][1], _Factory2))
  1486. def test_registerSubscriptionAdapter_w_nonblank_name(self):
  1487. from zope.interface.declarations import InterfaceClass
  1488. class IFoo(InterfaceClass):
  1489. pass
  1490. ifoo = IFoo('IFoo')
  1491. ibar = IFoo('IBar')
  1492. _name = u'name'
  1493. _info = u'info'
  1494. def _factory(context):
  1495. raise NotImplementedError()
  1496. comp = self._makeOne()
  1497. self.assertRaises(TypeError, comp.registerSubscriptionAdapter,
  1498. _factory, (ibar,), ifoo, _name, _info)
  1499. def test_registerSubscriptionAdapter_w_explicit_provided_and_required(self):
  1500. from zope.interface.declarations import InterfaceClass
  1501. from zope.interface.interfaces import Registered
  1502. from zope.interface.registry import SubscriptionRegistration
  1503. class IFoo(InterfaceClass):
  1504. pass
  1505. ifoo = IFoo('IFoo')
  1506. ibar = IFoo('IBar')
  1507. _blank = u''
  1508. _info = u'info'
  1509. def _factory(context):
  1510. raise NotImplementedError()
  1511. comp = self._makeOne()
  1512. _monkey, _events = self._wrapEvents()
  1513. with _monkey:
  1514. comp.registerSubscriptionAdapter(_factory, (ibar,), ifoo,
  1515. info=_info)
  1516. reg = comp.adapters._subscribers[1][ibar][ifoo][_blank]
  1517. self.assertEqual(len(reg), 1)
  1518. self.assertTrue(reg[0] is _factory)
  1519. self.assertEqual(comp._subscription_registrations,
  1520. [((ibar,), ifoo, _blank, _factory, _info)])
  1521. self.assertEqual(len(_events), 1)
  1522. args, kw = _events[0]
  1523. event, = args
  1524. self.assertEqual(kw, {})
  1525. self.assertTrue(isinstance(event, Registered))
  1526. self.assertTrue(isinstance(event.object, SubscriptionRegistration))
  1527. self.assertTrue(event.object.registry is comp)
  1528. self.assertTrue(event.object.provided is ifoo)
  1529. self.assertEqual(event.object.required, (ibar,))
  1530. self.assertEqual(event.object.name, _blank)
  1531. self.assertTrue(event.object.info is _info)
  1532. self.assertTrue(event.object.factory is _factory)
  1533. def test_registerSubscriptionAdapter_wo_explicit_provided(self):
  1534. from zope.interface.declarations import InterfaceClass
  1535. from zope.interface.declarations import implementer
  1536. from zope.interface.interfaces import Registered
  1537. from zope.interface.registry import SubscriptionRegistration
  1538. class IFoo(InterfaceClass):
  1539. pass
  1540. ifoo = IFoo('IFoo')
  1541. ibar = IFoo('IBar')
  1542. _info = u'info'
  1543. _blank = u''
  1544. @implementer(ifoo)
  1545. class _Factory(object):
  1546. pass
  1547. comp = self._makeOne()
  1548. _monkey, _events = self._wrapEvents()
  1549. with _monkey:
  1550. comp.registerSubscriptionAdapter(_Factory, (ibar,), info=_info)
  1551. reg = comp.adapters._subscribers[1][ibar][ifoo][_blank]
  1552. self.assertEqual(len(reg), 1)
  1553. self.assertTrue(reg[0] is _Factory)
  1554. self.assertEqual(comp._subscription_registrations,
  1555. [((ibar,), ifoo, _blank, _Factory, _info)])
  1556. self.assertEqual(len(_events), 1)
  1557. args, kw = _events[0]
  1558. event, = args
  1559. self.assertEqual(kw, {})
  1560. self.assertTrue(isinstance(event, Registered))
  1561. self.assertTrue(isinstance(event.object, SubscriptionRegistration))
  1562. self.assertTrue(event.object.registry is comp)
  1563. self.assertTrue(event.object.provided is ifoo)
  1564. self.assertEqual(event.object.required, (ibar,))
  1565. self.assertEqual(event.object.name, _blank)
  1566. self.assertTrue(event.object.info is _info)
  1567. self.assertTrue(event.object.factory is _Factory)
  1568. def test_registerSubscriptionAdapter_wo_explicit_required(self):
  1569. from zope.interface.declarations import InterfaceClass
  1570. from zope.interface.interfaces import Registered
  1571. from zope.interface.registry import SubscriptionRegistration
  1572. class IFoo(InterfaceClass):
  1573. pass
  1574. ifoo = IFoo('IFoo')
  1575. ibar = IFoo('IBar')
  1576. _info = u'info'
  1577. _blank = u''
  1578. class _Factory(object):
  1579. __component_adapts__ = (ibar,)
  1580. comp = self._makeOne()
  1581. _monkey, _events = self._wrapEvents()
  1582. with _monkey:
  1583. comp.registerSubscriptionAdapter(
  1584. _Factory, provided=ifoo, info=_info)
  1585. reg = comp.adapters._subscribers[1][ibar][ifoo][_blank]
  1586. self.assertEqual(len(reg), 1)
  1587. self.assertTrue(reg[0] is _Factory)
  1588. self.assertEqual(comp._subscription_registrations,
  1589. [((ibar,), ifoo, _blank, _Factory, _info)])
  1590. self.assertEqual(len(_events), 1)
  1591. args, kw = _events[0]
  1592. event, = args
  1593. self.assertEqual(kw, {})
  1594. self.assertTrue(isinstance(event, Registered))
  1595. self.assertTrue(isinstance(event.object, SubscriptionRegistration))
  1596. self.assertTrue(event.object.registry is comp)
  1597. self.assertTrue(event.object.provided is ifoo)
  1598. self.assertEqual(event.object.required, (ibar,))
  1599. self.assertEqual(event.object.name, _blank)
  1600. self.assertTrue(event.object.info is _info)
  1601. self.assertTrue(event.object.factory is _Factory)
  1602. def test_registerSubscriptionAdapter_wo_event(self):
  1603. from zope.interface.declarations import InterfaceClass
  1604. class IFoo(InterfaceClass):
  1605. pass
  1606. ifoo = IFoo('IFoo')
  1607. ibar = IFoo('IBar')
  1608. _blank = u''
  1609. _info = u'info'
  1610. def _factory(context):
  1611. raise NotImplementedError()
  1612. comp = self._makeOne()
  1613. _monkey, _events = self._wrapEvents()
  1614. with _monkey:
  1615. comp.registerSubscriptionAdapter(_factory, (ibar,), ifoo,
  1616. info=_info, event=False)
  1617. self.assertEqual(len(_events), 0)
  1618. def test_registeredSubscriptionAdapters_empty(self):
  1619. comp = self._makeOne()
  1620. self.assertEqual(list(comp.registeredSubscriptionAdapters()), [])
  1621. def test_registeredSubscriptionAdapters_notempty(self):
  1622. from zope.interface.declarations import InterfaceClass
  1623. from zope.interface.registry import SubscriptionRegistration
  1624. class IFoo(InterfaceClass):
  1625. pass
  1626. ifoo = IFoo('IFoo')
  1627. ibar = IFoo('IFoo')
  1628. _info = u'info'
  1629. _blank = u''
  1630. class _Factory(object):
  1631. pass
  1632. comp = self._makeOne()
  1633. comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo, info=_info)
  1634. comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo, info=_info)
  1635. reg = list(comp.registeredSubscriptionAdapters())
  1636. self.assertEqual(len(reg), 2)
  1637. self.assertTrue(isinstance(reg[0], SubscriptionRegistration))
  1638. self.assertTrue(reg[0].registry is comp)
  1639. self.assertTrue(reg[0].provided is ifoo)
  1640. self.assertEqual(reg[0].required, (ibar,))
  1641. self.assertEqual(reg[0].name, _blank)
  1642. self.assertTrue(reg[0].info is _info)
  1643. self.assertTrue(reg[0].factory is _Factory)
  1644. self.assertTrue(isinstance(reg[1], SubscriptionRegistration))
  1645. self.assertTrue(reg[1].registry is comp)
  1646. self.assertTrue(reg[1].provided is ifoo)
  1647. self.assertEqual(reg[1].required, (ibar,))
  1648. self.assertEqual(reg[1].name, _blank)
  1649. self.assertTrue(reg[1].info is _info)
  1650. self.assertTrue(reg[1].factory is _Factory)
  1651. def test_unregisterSubscriptionAdapter_w_nonblank_name(self):
  1652. from zope.interface.declarations import InterfaceClass
  1653. class IFoo(InterfaceClass):
  1654. pass
  1655. ifoo = IFoo('IFoo')
  1656. ibar = IFoo('IBar')
  1657. _nonblank = u'nonblank'
  1658. comp = self._makeOne()
  1659. self.assertRaises(TypeError, comp.unregisterSubscriptionAdapter,
  1660. required=ifoo, provided=ibar, name=_nonblank)
  1661. def test_unregisterSubscriptionAdapter_neither_factory_nor_provided(self):
  1662. comp = self._makeOne()
  1663. self.assertRaises(TypeError, comp.unregisterSubscriptionAdapter,
  1664. factory=None, provided=None)
  1665. def test_unregisterSubscriptionAdapter_neither_factory_nor_required(self):
  1666. from zope.interface.declarations import InterfaceClass
  1667. class IFoo(InterfaceClass):
  1668. pass
  1669. ifoo = IFoo('IFoo')
  1670. comp = self._makeOne()
  1671. self.assertRaises(TypeError, comp.unregisterSubscriptionAdapter,
  1672. factory=None, provided=ifoo, required=None)
  1673. def test_unregisterSubscriptionAdapter_miss(self):
  1674. from zope.interface.declarations import InterfaceClass
  1675. class IFoo(InterfaceClass):
  1676. pass
  1677. ifoo = IFoo('IFoo')
  1678. ibar = IFoo('IBar')
  1679. class _Factory(object):
  1680. pass
  1681. comp = self._makeOne()
  1682. _monkey, _events = self._wrapEvents()
  1683. with _monkey:
  1684. unreg = comp.unregisterSubscriptionAdapter(_Factory, (ibar,), ifoo)
  1685. self.assertFalse(unreg)
  1686. self.assertFalse(_events)
  1687. def test_unregisterSubscriptionAdapter_hit_wo_factory(self):
  1688. from zope.interface.declarations import InterfaceClass
  1689. from zope.interface.interfaces import Unregistered
  1690. from zope.interface.registry import SubscriptionRegistration
  1691. class IFoo(InterfaceClass):
  1692. pass
  1693. ifoo = IFoo('IFoo')
  1694. ibar = IFoo('IBar')
  1695. class _Factory(object):
  1696. pass
  1697. comp = self._makeOne()
  1698. comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo)
  1699. _monkey, _events = self._wrapEvents()
  1700. with _monkey:
  1701. unreg = comp.unregisterSubscriptionAdapter(None, (ibar,), ifoo)
  1702. self.assertTrue(unreg)
  1703. self.assertFalse(comp.adapters._subscribers)
  1704. self.assertFalse(comp._subscription_registrations)
  1705. self.assertEqual(len(_events), 1)
  1706. args, kw = _events[0]
  1707. event, = args
  1708. self.assertEqual(kw, {})
  1709. self.assertTrue(isinstance(event, Unregistered))
  1710. self.assertTrue(isinstance(event.object, SubscriptionRegistration))
  1711. self.assertTrue(event.object.registry is comp)
  1712. self.assertTrue(event.object.provided is ifoo)
  1713. self.assertEqual(event.object.required, (ibar,))
  1714. self.assertEqual(event.object.name, '')
  1715. self.assertEqual(event.object.info, '')
  1716. self.assertTrue(event.object.factory is None)
  1717. def test_unregisterSubscriptionAdapter_hit_w_factory(self):
  1718. from zope.interface.declarations import InterfaceClass
  1719. from zope.interface.interfaces import Unregistered
  1720. from zope.interface.registry import SubscriptionRegistration
  1721. class IFoo(InterfaceClass):
  1722. pass
  1723. ifoo = IFoo('IFoo')
  1724. ibar = IFoo('IBar')
  1725. class _Factory(object):
  1726. pass
  1727. comp = self._makeOne()
  1728. comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo)
  1729. _monkey, _events = self._wrapEvents()
  1730. with _monkey:
  1731. unreg = comp.unregisterSubscriptionAdapter(_Factory, (ibar,), ifoo)
  1732. self.assertTrue(unreg)
  1733. self.assertFalse(comp.adapters._subscribers)
  1734. self.assertFalse(comp._subscription_registrations)
  1735. self.assertEqual(len(_events), 1)
  1736. args, kw = _events[0]
  1737. event, = args
  1738. self.assertEqual(kw, {})
  1739. self.assertTrue(isinstance(event, Unregistered))
  1740. self.assertTrue(isinstance(event.object, SubscriptionRegistration))
  1741. self.assertTrue(event.object.registry is comp)
  1742. self.assertTrue(event.object.provided is ifoo)
  1743. self.assertEqual(event.object.required, (ibar,))
  1744. self.assertEqual(event.object.name, '')
  1745. self.assertEqual(event.object.info, '')
  1746. self.assertTrue(event.object.factory is _Factory)
  1747. def test_unregisterSubscriptionAdapter_wo_explicit_provided(self):
  1748. from zope.interface.declarations import InterfaceClass
  1749. from zope.interface.declarations import implementer
  1750. from zope.interface.interfaces import Unregistered
  1751. from zope.interface.registry import SubscriptionRegistration
  1752. class IFoo(InterfaceClass):
  1753. pass
  1754. ifoo = IFoo('IFoo')
  1755. ibar = IFoo('IBar')
  1756. @implementer(ifoo)
  1757. class _Factory(object):
  1758. pass
  1759. comp = self._makeOne()
  1760. comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo)
  1761. _monkey, _events = self._wrapEvents()
  1762. with _monkey:
  1763. unreg = comp.unregisterSubscriptionAdapter(_Factory, (ibar,))
  1764. self.assertTrue(unreg)
  1765. self.assertEqual(len(_events), 1)
  1766. args, kw = _events[0]
  1767. event, = args
  1768. self.assertEqual(kw, {})
  1769. self.assertTrue(isinstance(event, Unregistered))
  1770. self.assertTrue(isinstance(event.object, SubscriptionRegistration))
  1771. self.assertTrue(event.object.registry is comp)
  1772. self.assertTrue(event.object.provided is ifoo)
  1773. self.assertEqual(event.object.required, (ibar,))
  1774. self.assertEqual(event.object.name, '')
  1775. self.assertEqual(event.object.info, '')
  1776. self.assertTrue(event.object.factory is _Factory)
  1777. def test_unregisterSubscriptionAdapter_wo_explicit_required(self):
  1778. from zope.interface.declarations import InterfaceClass
  1779. from zope.interface.interfaces import Unregistered
  1780. from zope.interface.registry import SubscriptionRegistration
  1781. class IFoo(InterfaceClass):
  1782. pass
  1783. ifoo = IFoo('IFoo')
  1784. ibar = IFoo('IBar')
  1785. class _Factory(object):
  1786. __component_adapts__ = (ibar,)
  1787. comp = self._makeOne()
  1788. comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo)
  1789. _monkey, _events = self._wrapEvents()
  1790. with _monkey:
  1791. unreg = comp.unregisterSubscriptionAdapter(_Factory, provided=ifoo)
  1792. self.assertTrue(unreg)
  1793. self.assertEqual(len(_events), 1)
  1794. args, kw = _events[0]
  1795. event, = args
  1796. self.assertEqual(kw, {})
  1797. self.assertTrue(isinstance(event, Unregistered))
  1798. self.assertTrue(isinstance(event.object, SubscriptionRegistration))
  1799. self.assertTrue(event.object.registry is comp)
  1800. self.assertTrue(event.object.provided is ifoo)
  1801. self.assertEqual(event.object.required, (ibar,))
  1802. self.assertEqual(event.object.name, '')
  1803. self.assertEqual(event.object.info, '')
  1804. self.assertTrue(event.object.factory is _Factory)
  1805. def test_subscribers_empty(self):
  1806. from zope.interface.declarations import InterfaceClass
  1807. from zope.interface.declarations import implementer
  1808. class IFoo(InterfaceClass):
  1809. pass
  1810. ifoo = IFoo('IFoo')
  1811. ibar = IFoo('IBar')
  1812. comp = self._makeOne()
  1813. @implementer(ibar)
  1814. class Bar(object):
  1815. pass
  1816. bar = Bar()
  1817. self.assertEqual(list(comp.subscribers((bar,), ifoo)), [])
  1818. def test_subscribers_non_empty(self):
  1819. from zope.interface.declarations import InterfaceClass
  1820. from zope.interface.declarations import implementer
  1821. class IFoo(InterfaceClass):
  1822. pass
  1823. ifoo = IFoo('IFoo')
  1824. ibar = IFoo('IBar')
  1825. class _Factory(object):
  1826. __component_adapts__ = (ibar,)
  1827. def __init__(self, context):
  1828. self._context = context
  1829. class _Derived(_Factory):
  1830. pass
  1831. comp = self._makeOne()
  1832. comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo)
  1833. comp.registerSubscriptionAdapter(_Derived, (ibar,), ifoo)
  1834. @implementer(ibar)
  1835. class Bar(object):
  1836. pass
  1837. bar = Bar()
  1838. subscribers = comp.subscribers((bar,), ifoo)
  1839. def _klassname(x):
  1840. return x.__class__.__name__
  1841. subscribers = sorted(subscribers, key=_klassname)
  1842. self.assertEqual(len(subscribers), 2)
  1843. self.assertTrue(isinstance(subscribers[0], _Derived))
  1844. self.assertTrue(isinstance(subscribers[1], _Factory))
  1845. def test_registerHandler_w_nonblank_name(self):
  1846. from zope.interface.declarations import InterfaceClass
  1847. class IFoo(InterfaceClass):
  1848. pass
  1849. ifoo = IFoo('IFoo')
  1850. _nonblank = u'nonblank'
  1851. comp = self._makeOne()
  1852. def _factory(context):
  1853. raise NotImplementedError()
  1854. self.assertRaises(TypeError, comp.registerHandler, _factory,
  1855. required=ifoo, name=_nonblank)
  1856. def test_registerHandler_w_explicit_required(self):
  1857. from zope.interface.declarations import InterfaceClass
  1858. from zope.interface.interfaces import Registered
  1859. from zope.interface.registry import HandlerRegistration
  1860. class IFoo(InterfaceClass):
  1861. pass
  1862. ifoo = IFoo('IFoo')
  1863. _blank = u''
  1864. _info = u'info'
  1865. def _factory(context):
  1866. raise NotImplementedError()
  1867. comp = self._makeOne()
  1868. _monkey, _events = self._wrapEvents()
  1869. with _monkey:
  1870. comp.registerHandler(_factory, (ifoo,), info=_info)
  1871. reg = comp.adapters._subscribers[1][ifoo][None][_blank]
  1872. self.assertEqual(len(reg), 1)
  1873. self.assertTrue(reg[0] is _factory)
  1874. self.assertEqual(comp._handler_registrations,
  1875. [((ifoo,), _blank, _factory, _info)])
  1876. self.assertEqual(len(_events), 1)
  1877. args, kw = _events[0]
  1878. event, = args
  1879. self.assertEqual(kw, {})
  1880. self.assertTrue(isinstance(event, Registered))
  1881. self.assertTrue(isinstance(event.object, HandlerRegistration))
  1882. self.assertTrue(event.object.registry is comp)
  1883. self.assertEqual(event.object.required, (ifoo,))
  1884. self.assertEqual(event.object.name, _blank)
  1885. self.assertTrue(event.object.info is _info)
  1886. self.assertTrue(event.object.factory is _factory)
  1887. def test_registerHandler_wo_explicit_required_no_event(self):
  1888. from zope.interface.declarations import InterfaceClass
  1889. class IFoo(InterfaceClass):
  1890. pass
  1891. ifoo = IFoo('IFoo')
  1892. _info = u'info'
  1893. _blank = u''
  1894. class _Factory(object):
  1895. __component_adapts__ = (ifoo,)
  1896. pass
  1897. comp = self._makeOne()
  1898. _monkey, _events = self._wrapEvents()
  1899. with _monkey:
  1900. comp.registerHandler(_Factory, info=_info, event=False)
  1901. reg = comp.adapters._subscribers[1][ifoo][None][_blank]
  1902. self.assertEqual(len(reg), 1)
  1903. self.assertTrue(reg[0] is _Factory)
  1904. self.assertEqual(comp._handler_registrations,
  1905. [((ifoo,), _blank, _Factory, _info)])
  1906. self.assertEqual(len(_events), 0)
  1907. def test_registeredHandlers_empty(self):
  1908. comp = self._makeOne()
  1909. self.assertFalse(list(comp.registeredHandlers()))
  1910. def test_registeredHandlers_non_empty(self):
  1911. from zope.interface.declarations import InterfaceClass
  1912. from zope.interface.registry import HandlerRegistration
  1913. class IFoo(InterfaceClass):
  1914. pass
  1915. ifoo = IFoo('IFoo')
  1916. def _factory1(context):
  1917. raise NotImplementedError()
  1918. def _factory2(context):
  1919. raise NotImplementedError()
  1920. comp = self._makeOne()
  1921. comp.registerHandler(_factory1, (ifoo,))
  1922. comp.registerHandler(_factory2, (ifoo,))
  1923. def _factory_name(x):
  1924. return x.factory.__code__.co_name
  1925. subscribers = sorted(comp.registeredHandlers(), key=_factory_name)
  1926. self.assertEqual(len(subscribers), 2)
  1927. self.assertTrue(isinstance(subscribers[0], HandlerRegistration))
  1928. self.assertEqual(subscribers[0].required, (ifoo,))
  1929. self.assertEqual(subscribers[0].name, '')
  1930. self.assertEqual(subscribers[0].factory, _factory1)
  1931. self.assertEqual(subscribers[0].info, '')
  1932. self.assertTrue(isinstance(subscribers[1], HandlerRegistration))
  1933. self.assertEqual(subscribers[1].required, (ifoo,))
  1934. self.assertEqual(subscribers[1].name, '')
  1935. self.assertEqual(subscribers[1].factory, _factory2)
  1936. self.assertEqual(subscribers[1].info, '')
  1937. def test_unregisterHandler_w_nonblank_name(self):
  1938. from zope.interface.declarations import InterfaceClass
  1939. class IFoo(InterfaceClass):
  1940. pass
  1941. ifoo = IFoo('IFoo')
  1942. _nonblank = u'nonblank'
  1943. comp = self._makeOne()
  1944. self.assertRaises(TypeError, comp.unregisterHandler,
  1945. required=(ifoo,), name=_nonblank)
  1946. def test_unregisterHandler_neither_factory_nor_required(self):
  1947. comp = self._makeOne()
  1948. self.assertRaises(TypeError, comp.unregisterHandler)
  1949. def test_unregisterHandler_miss(self):
  1950. from zope.interface.declarations import InterfaceClass
  1951. class IFoo(InterfaceClass):
  1952. pass
  1953. ifoo = IFoo('IFoo')
  1954. comp = self._makeOne()
  1955. unreg = comp.unregisterHandler(required=(ifoo,))
  1956. self.assertFalse(unreg)
  1957. def test_unregisterHandler_hit_w_factory_and_explicit_provided(self):
  1958. from zope.interface.declarations import InterfaceClass
  1959. from zope.interface.interfaces import Unregistered
  1960. from zope.interface.registry import HandlerRegistration
  1961. class IFoo(InterfaceClass):
  1962. pass
  1963. ifoo = IFoo('IFoo')
  1964. comp = self._makeOne()
  1965. def _factory(context):
  1966. raise NotImplementedError()
  1967. comp = self._makeOne()
  1968. comp.registerHandler(_factory, (ifoo,))
  1969. _monkey, _events = self._wrapEvents()
  1970. with _monkey:
  1971. unreg = comp.unregisterHandler(_factory, (ifoo,))
  1972. self.assertTrue(unreg)
  1973. self.assertEqual(len(_events), 1)
  1974. args, kw = _events[0]
  1975. event, = args
  1976. self.assertEqual(kw, {})
  1977. self.assertTrue(isinstance(event, Unregistered))
  1978. self.assertTrue(isinstance(event.object, HandlerRegistration))
  1979. self.assertTrue(event.object.registry is comp)
  1980. self.assertEqual(event.object.required, (ifoo,))
  1981. self.assertEqual(event.object.name, '')
  1982. self.assertTrue(event.object.factory is _factory)
  1983. def test_unregisterHandler_hit_w_only_explicit_provided(self):
  1984. from zope.interface.declarations import InterfaceClass
  1985. from zope.interface.interfaces import Unregistered
  1986. from zope.interface.registry import HandlerRegistration
  1987. class IFoo(InterfaceClass):
  1988. pass
  1989. ifoo = IFoo('IFoo')
  1990. comp = self._makeOne()
  1991. def _factory(context):
  1992. raise NotImplementedError()
  1993. comp = self._makeOne()
  1994. comp.registerHandler(_factory, (ifoo,))
  1995. _monkey, _events = self._wrapEvents()
  1996. with _monkey:
  1997. unreg = comp.unregisterHandler(required=(ifoo,))
  1998. self.assertTrue(unreg)
  1999. self.assertEqual(len(_events), 1)
  2000. args, kw = _events[0]
  2001. event, = args
  2002. self.assertEqual(kw, {})
  2003. self.assertTrue(isinstance(event, Unregistered))
  2004. self.assertTrue(isinstance(event.object, HandlerRegistration))
  2005. self.assertTrue(event.object.registry is comp)
  2006. self.assertEqual(event.object.required, (ifoo,))
  2007. self.assertEqual(event.object.name, '')
  2008. self.assertTrue(event.object.factory is None)
  2009. def test_unregisterHandler_wo_explicit_required(self):
  2010. from zope.interface.declarations import InterfaceClass
  2011. from zope.interface.interfaces import Unregistered
  2012. from zope.interface.registry import HandlerRegistration
  2013. class IFoo(InterfaceClass):
  2014. pass
  2015. ifoo = IFoo('IFoo')
  2016. class _Factory(object):
  2017. __component_adapts__ = (ifoo,)
  2018. comp = self._makeOne()
  2019. comp.registerHandler(_Factory)
  2020. _monkey, _events = self._wrapEvents()
  2021. with _monkey:
  2022. unreg = comp.unregisterHandler(_Factory)
  2023. self.assertTrue(unreg)
  2024. self.assertEqual(len(_events), 1)
  2025. args, kw = _events[0]
  2026. event, = args
  2027. self.assertEqual(kw, {})
  2028. self.assertTrue(isinstance(event, Unregistered))
  2029. self.assertTrue(isinstance(event.object, HandlerRegistration))
  2030. self.assertTrue(event.object.registry is comp)
  2031. self.assertEqual(event.object.required, (ifoo,))
  2032. self.assertEqual(event.object.name, '')
  2033. self.assertEqual(event.object.info, '')
  2034. self.assertTrue(event.object.factory is _Factory)
  2035. def test_handle_empty(self):
  2036. from zope.interface.declarations import InterfaceClass
  2037. from zope.interface.declarations import implementer
  2038. class IFoo(InterfaceClass):
  2039. pass
  2040. ifoo = IFoo('IFoo')
  2041. comp = self._makeOne()
  2042. @implementer(ifoo)
  2043. class Bar(object):
  2044. pass
  2045. bar = Bar()
  2046. comp.handle((bar,)) # doesn't raise
  2047. def test_handle_non_empty(self):
  2048. from zope.interface.declarations import InterfaceClass
  2049. from zope.interface.declarations import implementer
  2050. class IFoo(InterfaceClass):
  2051. pass
  2052. ifoo = IFoo('IFoo')
  2053. _called_1 = []
  2054. def _factory_1(context):
  2055. _called_1.append(context)
  2056. _called_2 = []
  2057. def _factory_2(context):
  2058. _called_2.append(context)
  2059. comp = self._makeOne()
  2060. comp.registerHandler(_factory_1, (ifoo,))
  2061. comp.registerHandler(_factory_2, (ifoo,))
  2062. @implementer(ifoo)
  2063. class Bar(object):
  2064. pass
  2065. bar = Bar()
  2066. comp.handle(bar)
  2067. self.assertEqual(_called_1, [bar])
  2068. self.assertEqual(_called_2, [bar])
  2069. def test_register_unregister_identical_objects_provided(self, identical=True):
  2070. # https://github.com/zopefoundation/zope.interface/issues/227
  2071. class IFoo(Interface):
  2072. pass
  2073. comp = self._makeOne()
  2074. first = object()
  2075. second = first if identical else object()
  2076. comp.registerUtility(first, provided=IFoo)
  2077. comp.registerUtility(second, provided=IFoo, name='bar')
  2078. self.assertEqual(len(comp.utilities._subscribers), 1)
  2079. self.assertEqual(comp.utilities._subscribers, [{
  2080. IFoo: {'': (first, ) if identical else (first, second)}
  2081. }])
  2082. self.assertEqual(comp.utilities._provided, {
  2083. IFoo: 3 if identical else 4
  2084. })
  2085. res = comp.unregisterUtility(first, provided=IFoo)
  2086. self.assertTrue(res)
  2087. res = comp.unregisterUtility(second, provided=IFoo, name='bar')
  2088. self.assertTrue(res)
  2089. self.assertEqual(comp.utilities._provided, {})
  2090. self.assertEqual(len(comp.utilities._subscribers), 0)
  2091. def test_register_unregister_nonequal_objects_provided(self):
  2092. self.test_register_unregister_identical_objects_provided(identical=False)
  2093. def test_rebuildUtilityRegistryFromLocalCache(self):
  2094. class IFoo(Interface):
  2095. "Does nothing"
  2096. class UtilityImplementingFoo(object):
  2097. "Does nothing"
  2098. comps = self._makeOne()
  2099. for i in range(30):
  2100. comps.registerUtility(UtilityImplementingFoo(), IFoo, name=u'%s' % (i,))
  2101. orig_generation = comps.utilities._generation
  2102. orig_adapters = comps.utilities._adapters
  2103. self.assertEqual(len(orig_adapters), 1)
  2104. self.assertEqual(len(orig_adapters[0]), 1)
  2105. self.assertEqual(len(orig_adapters[0][IFoo]), 30)
  2106. orig_subscribers = comps.utilities._subscribers
  2107. self.assertEqual(len(orig_subscribers), 1)
  2108. self.assertEqual(len(orig_subscribers[0]), 1)
  2109. self.assertEqual(len(orig_subscribers[0][IFoo]), 1)
  2110. self.assertEqual(len(orig_subscribers[0][IFoo][u'']), 30)
  2111. # Blow a bunch of them away, creating artificial corruption
  2112. new_adapters = comps.utilities._adapters = type(orig_adapters)()
  2113. new_adapters.append({})
  2114. d = new_adapters[0][IFoo] = {}
  2115. for name in range(10):
  2116. name = type(u'')(str(name))
  2117. d[name] = orig_adapters[0][IFoo][name]
  2118. self.assertNotEqual(orig_adapters, new_adapters)
  2119. new_subscribers = comps.utilities._subscribers = type(orig_subscribers)()
  2120. new_subscribers.append({})
  2121. d = new_subscribers[0][IFoo] = {}
  2122. d[u''] = ()
  2123. for name in range(5, 12): # 12 - 5 = 7
  2124. name = type(u'')(str(name))
  2125. comp = orig_adapters[0][IFoo][name]
  2126. d[u''] += (comp,)
  2127. # We can preflight (by default) and nothing changes
  2128. rebuild_results_preflight = comps.rebuildUtilityRegistryFromLocalCache()
  2129. self.assertEqual(comps.utilities._generation, orig_generation)
  2130. self.assertEqual(rebuild_results_preflight, {
  2131. 'did_not_register': 10,
  2132. 'needed_registered': 20,
  2133. 'did_not_subscribe': 7,
  2134. 'needed_subscribed': 23,
  2135. })
  2136. # Now for real
  2137. rebuild_results = comps.rebuildUtilityRegistryFromLocalCache(rebuild=True)
  2138. # The generation only got incremented once
  2139. self.assertEqual(comps.utilities._generation, orig_generation + 1)
  2140. # The result was the same
  2141. self.assertEqual(rebuild_results_preflight, rebuild_results)
  2142. self.assertEqual(new_adapters, orig_adapters)
  2143. self.assertEqual(
  2144. len(new_subscribers[0][IFoo][u'']),
  2145. len(orig_subscribers[0][IFoo][u'']))
  2146. for orig_subscriber in orig_subscribers[0][IFoo][u'']:
  2147. self.assertIn(orig_subscriber, new_subscribers[0][IFoo][u''])
  2148. # Preflighting, rebuilding again produce no changes.
  2149. preflight_after = comps.rebuildUtilityRegistryFromLocalCache()
  2150. self.assertEqual(preflight_after, {
  2151. 'did_not_register': 30,
  2152. 'needed_registered': 0,
  2153. 'did_not_subscribe': 30,
  2154. 'needed_subscribed': 0,
  2155. })
  2156. rebuild_after = comps.rebuildUtilityRegistryFromLocalCache(rebuild=True)
  2157. self.assertEqual(rebuild_after, preflight_after)
  2158. self.assertEqual(comps.utilities._generation, orig_generation + 1)
  2159. class UnhashableComponentsTests(ComponentsTests):
  2160. def _getTargetClass(self):
  2161. # Mimic what pyramid does to create an unhashable
  2162. # registry
  2163. class Components(super(UnhashableComponentsTests, self)._getTargetClass(), dict):
  2164. pass
  2165. return Components
  2166. # Test _getUtilityProvided, _getAdapterProvided, _getAdapterRequired via their
  2167. # callers (Component.registerUtility, Component.registerAdapter).
  2168. class UtilityRegistrationTests(unittest.TestCase):
  2169. def _getTargetClass(self):
  2170. from zope.interface.registry import UtilityRegistration
  2171. return UtilityRegistration
  2172. def _makeOne(self, component=None, factory=None):
  2173. from zope.interface.declarations import InterfaceClass
  2174. class InterfaceClassSubclass(InterfaceClass):
  2175. pass
  2176. ifoo = InterfaceClassSubclass('IFoo')
  2177. class _Registry(object):
  2178. def __repr__(self):
  2179. return '_REGISTRY'
  2180. registry = _Registry()
  2181. name = u'name'
  2182. doc = 'DOCSTRING'
  2183. klass = self._getTargetClass()
  2184. return (klass(registry, ifoo, name, component, doc, factory),
  2185. registry,
  2186. name,
  2187. )
  2188. def test_class_conforms_to_IUtilityRegistration(self):
  2189. from zope.interface.verify import verifyClass
  2190. from zope.interface.interfaces import IUtilityRegistration
  2191. verifyClass(IUtilityRegistration, self._getTargetClass())
  2192. def test_instance_conforms_to_IUtilityRegistration(self):
  2193. from zope.interface.verify import verifyObject
  2194. from zope.interface.interfaces import IUtilityRegistration
  2195. ur, _, _ = self._makeOne()
  2196. verifyObject(IUtilityRegistration, ur)
  2197. def test___repr__(self):
  2198. class _Component(object):
  2199. __name__ = 'TEST'
  2200. _component = _Component()
  2201. ur, _registry, _name = self._makeOne(_component)
  2202. self.assertEqual(repr(ur),
  2203. "UtilityRegistration(_REGISTRY, IFoo, %r, TEST, None, 'DOCSTRING')"
  2204. % (_name))
  2205. def test___repr___provided_wo_name(self):
  2206. class _Component(object):
  2207. def __repr__(self):
  2208. return 'TEST'
  2209. _component = _Component()
  2210. ur, _registry, _name = self._makeOne(_component)
  2211. ur.provided = object()
  2212. self.assertEqual(repr(ur),
  2213. "UtilityRegistration(_REGISTRY, None, %r, TEST, None, 'DOCSTRING')"
  2214. % (_name))
  2215. def test___repr___component_wo_name(self):
  2216. class _Component(object):
  2217. def __repr__(self):
  2218. return 'TEST'
  2219. _component = _Component()
  2220. ur, _registry, _name = self._makeOne(_component)
  2221. ur.provided = object()
  2222. self.assertEqual(repr(ur),
  2223. "UtilityRegistration(_REGISTRY, None, %r, TEST, None, 'DOCSTRING')"
  2224. % (_name))
  2225. def test___hash__(self):
  2226. _component = object()
  2227. ur, _registry, _name = self._makeOne(_component)
  2228. self.assertEqual(ur.__hash__(), id(ur))
  2229. def test___eq___identity(self):
  2230. _component = object()
  2231. ur, _registry, _name = self._makeOne(_component)
  2232. self.assertTrue(ur == ur)
  2233. def test___eq___hit(self):
  2234. _component = object()
  2235. ur, _registry, _name = self._makeOne(_component)
  2236. ur2, _, _ = self._makeOne(_component)
  2237. self.assertTrue(ur == ur2)
  2238. def test___eq___miss(self):
  2239. _component = object()
  2240. _component2 = object()
  2241. ur, _registry, _name = self._makeOne(_component)
  2242. ur2, _, _ = self._makeOne(_component2)
  2243. self.assertFalse(ur == ur2)
  2244. def test___ne___identity(self):
  2245. _component = object()
  2246. ur, _registry, _name = self._makeOne(_component)
  2247. self.assertFalse(ur != ur)
  2248. def test___ne___hit(self):
  2249. _component = object()
  2250. ur, _registry, _name = self._makeOne(_component)
  2251. ur2, _, _ = self._makeOne(_component)
  2252. self.assertFalse(ur != ur2)
  2253. def test___ne___miss(self):
  2254. _component = object()
  2255. _component2 = object()
  2256. ur, _registry, _name = self._makeOne(_component)
  2257. ur2, _, _ = self._makeOne(_component2)
  2258. self.assertTrue(ur != ur2)
  2259. def test___lt___identity(self):
  2260. _component = object()
  2261. ur, _registry, _name = self._makeOne(_component)
  2262. self.assertFalse(ur < ur)
  2263. def test___lt___hit(self):
  2264. _component = object()
  2265. ur, _registry, _name = self._makeOne(_component)
  2266. ur2, _, _ = self._makeOne(_component)
  2267. self.assertFalse(ur < ur2)
  2268. def test___lt___miss(self):
  2269. _component = object()
  2270. _component2 = object()
  2271. ur, _registry, _name = self._makeOne(_component)
  2272. ur2, _, _ = self._makeOne(_component2)
  2273. ur2.name = _name + '2'
  2274. self.assertTrue(ur < ur2)
  2275. def test___le___identity(self):
  2276. _component = object()
  2277. ur, _registry, _name = self._makeOne(_component)
  2278. self.assertTrue(ur <= ur)
  2279. def test___le___hit(self):
  2280. _component = object()
  2281. ur, _registry, _name = self._makeOne(_component)
  2282. ur2, _, _ = self._makeOne(_component)
  2283. self.assertTrue(ur <= ur2)
  2284. def test___le___miss(self):
  2285. _component = object()
  2286. _component2 = object()
  2287. ur, _registry, _name = self._makeOne(_component)
  2288. ur2, _, _ = self._makeOne(_component2)
  2289. ur2.name = _name + '2'
  2290. self.assertTrue(ur <= ur2)
  2291. def test___gt___identity(self):
  2292. _component = object()
  2293. ur, _registry, _name = self._makeOne(_component)
  2294. self.assertFalse(ur > ur)
  2295. def test___gt___hit(self):
  2296. _component = object()
  2297. _component2 = object()
  2298. ur, _registry, _name = self._makeOne(_component)
  2299. ur2, _, _ = self._makeOne(_component2)
  2300. ur2.name = _name + '2'
  2301. self.assertTrue(ur2 > ur)
  2302. def test___gt___miss(self):
  2303. _component = object()
  2304. ur, _registry, _name = self._makeOne(_component)
  2305. ur2, _, _ = self._makeOne(_component)
  2306. self.assertFalse(ur2 > ur)
  2307. def test___ge___identity(self):
  2308. _component = object()
  2309. ur, _registry, _name = self._makeOne(_component)
  2310. self.assertTrue(ur >= ur)
  2311. def test___ge___miss(self):
  2312. _component = object()
  2313. _component2 = object()
  2314. ur, _registry, _name = self._makeOne(_component)
  2315. ur2, _, _ = self._makeOne(_component2)
  2316. ur2.name = _name + '2'
  2317. self.assertFalse(ur >= ur2)
  2318. def test___ge___hit(self):
  2319. _component = object()
  2320. ur, _registry, _name = self._makeOne(_component)
  2321. ur2, _, _ = self._makeOne(_component)
  2322. ur2.name = _name + '2'
  2323. self.assertTrue(ur2 >= ur)
  2324. class AdapterRegistrationTests(unittest.TestCase):
  2325. def _getTargetClass(self):
  2326. from zope.interface.registry import AdapterRegistration
  2327. return AdapterRegistration
  2328. def _makeOne(self, component=None):
  2329. from zope.interface.declarations import InterfaceClass
  2330. class IFoo(InterfaceClass):
  2331. pass
  2332. ifoo = IFoo('IFoo')
  2333. ibar = IFoo('IBar')
  2334. class _Registry(object):
  2335. def __repr__(self):
  2336. return '_REGISTRY'
  2337. registry = _Registry()
  2338. name = u'name'
  2339. doc = 'DOCSTRING'
  2340. klass = self._getTargetClass()
  2341. return (klass(registry, (ibar,), ifoo, name, component, doc),
  2342. registry,
  2343. name,
  2344. )
  2345. def test_class_conforms_to_IAdapterRegistration(self):
  2346. from zope.interface.verify import verifyClass
  2347. from zope.interface.interfaces import IAdapterRegistration
  2348. verifyClass(IAdapterRegistration, self._getTargetClass())
  2349. def test_instance_conforms_to_IAdapterRegistration(self):
  2350. from zope.interface.verify import verifyObject
  2351. from zope.interface.interfaces import IAdapterRegistration
  2352. ar, _, _ = self._makeOne()
  2353. verifyObject(IAdapterRegistration, ar)
  2354. def test___repr__(self):
  2355. class _Component(object):
  2356. __name__ = 'TEST'
  2357. _component = _Component()
  2358. ar, _registry, _name = self._makeOne(_component)
  2359. self.assertEqual(repr(ar),
  2360. ("AdapterRegistration(_REGISTRY, [IBar], IFoo, %r, TEST, "
  2361. + "'DOCSTRING')") % (_name))
  2362. def test___repr___provided_wo_name(self):
  2363. class _Component(object):
  2364. def __repr__(self):
  2365. return 'TEST'
  2366. _component = _Component()
  2367. ar, _registry, _name = self._makeOne(_component)
  2368. ar.provided = object()
  2369. self.assertEqual(repr(ar),
  2370. ("AdapterRegistration(_REGISTRY, [IBar], None, %r, TEST, "
  2371. + "'DOCSTRING')") % (_name))
  2372. def test___repr___component_wo_name(self):
  2373. class _Component(object):
  2374. def __repr__(self):
  2375. return 'TEST'
  2376. _component = _Component()
  2377. ar, _registry, _name = self._makeOne(_component)
  2378. ar.provided = object()
  2379. self.assertEqual(repr(ar),
  2380. ("AdapterRegistration(_REGISTRY, [IBar], None, %r, TEST, "
  2381. + "'DOCSTRING')") % (_name))
  2382. def test___hash__(self):
  2383. _component = object()
  2384. ar, _registry, _name = self._makeOne(_component)
  2385. self.assertEqual(ar.__hash__(), id(ar))
  2386. def test___eq___identity(self):
  2387. _component = object()
  2388. ar, _registry, _name = self._makeOne(_component)
  2389. self.assertTrue(ar == ar)
  2390. def test___eq___hit(self):
  2391. _component = object()
  2392. ar, _registry, _name = self._makeOne(_component)
  2393. ar2, _, _ = self._makeOne(_component)
  2394. self.assertTrue(ar == ar2)
  2395. def test___eq___miss(self):
  2396. _component = object()
  2397. _component2 = object()
  2398. ar, _registry, _name = self._makeOne(_component)
  2399. ar2, _, _ = self._makeOne(_component2)
  2400. self.assertFalse(ar == ar2)
  2401. def test___ne___identity(self):
  2402. _component = object()
  2403. ar, _registry, _name = self._makeOne(_component)
  2404. self.assertFalse(ar != ar)
  2405. def test___ne___miss(self):
  2406. _component = object()
  2407. ar, _registry, _name = self._makeOne(_component)
  2408. ar2, _, _ = self._makeOne(_component)
  2409. self.assertFalse(ar != ar2)
  2410. def test___ne___hit_component(self):
  2411. _component = object()
  2412. _component2 = object()
  2413. ar, _registry, _name = self._makeOne(_component)
  2414. ar2, _, _ = self._makeOne(_component2)
  2415. self.assertTrue(ar != ar2)
  2416. def test___ne___hit_provided(self):
  2417. from zope.interface.declarations import InterfaceClass
  2418. class IFoo(InterfaceClass):
  2419. pass
  2420. ibaz = IFoo('IBaz')
  2421. _component = object()
  2422. ar, _registry, _name = self._makeOne(_component)
  2423. ar2, _, _ = self._makeOne(_component)
  2424. ar2.provided = ibaz
  2425. self.assertTrue(ar != ar2)
  2426. def test___ne___hit_required(self):
  2427. from zope.interface.declarations import InterfaceClass
  2428. class IFoo(InterfaceClass):
  2429. pass
  2430. ibaz = IFoo('IBaz')
  2431. _component = object()
  2432. _component2 = object()
  2433. ar, _registry, _name = self._makeOne(_component)
  2434. ar2, _, _ = self._makeOne(_component2)
  2435. ar2.required = (ibaz,)
  2436. self.assertTrue(ar != ar2)
  2437. def test___lt___identity(self):
  2438. _component = object()
  2439. ar, _registry, _name = self._makeOne(_component)
  2440. self.assertFalse(ar < ar)
  2441. def test___lt___hit(self):
  2442. _component = object()
  2443. ar, _registry, _name = self._makeOne(_component)
  2444. ar2, _, _ = self._makeOne(_component)
  2445. self.assertFalse(ar < ar2)
  2446. def test___lt___miss(self):
  2447. _component = object()
  2448. _component2 = object()
  2449. ar, _registry, _name = self._makeOne(_component)
  2450. ar2, _, _ = self._makeOne(_component2)
  2451. ar2.name = _name + '2'
  2452. self.assertTrue(ar < ar2)
  2453. def test___le___identity(self):
  2454. _component = object()
  2455. ar, _registry, _name = self._makeOne(_component)
  2456. self.assertTrue(ar <= ar)
  2457. def test___le___hit(self):
  2458. _component = object()
  2459. ar, _registry, _name = self._makeOne(_component)
  2460. ar2, _, _ = self._makeOne(_component)
  2461. self.assertTrue(ar <= ar2)
  2462. def test___le___miss(self):
  2463. _component = object()
  2464. _component2 = object()
  2465. ar, _registry, _name = self._makeOne(_component)
  2466. ar2, _, _ = self._makeOne(_component2)
  2467. ar2.name = _name + '2'
  2468. self.assertTrue(ar <= ar2)
  2469. def test___gt___identity(self):
  2470. _component = object()
  2471. ar, _registry, _name = self._makeOne(_component)
  2472. self.assertFalse(ar > ar)
  2473. def test___gt___hit(self):
  2474. _component = object()
  2475. _component2 = object()
  2476. ar, _registry, _name = self._makeOne(_component)
  2477. ar2, _, _ = self._makeOne(_component2)
  2478. ar2.name = _name + '2'
  2479. self.assertTrue(ar2 > ar)
  2480. def test___gt___miss(self):
  2481. _component = object()
  2482. ar, _registry, _name = self._makeOne(_component)
  2483. ar2, _, _ = self._makeOne(_component)
  2484. self.assertFalse(ar2 > ar)
  2485. def test___ge___identity(self):
  2486. _component = object()
  2487. ar, _registry, _name = self._makeOne(_component)
  2488. self.assertTrue(ar >= ar)
  2489. def test___ge___miss(self):
  2490. _component = object()
  2491. _component2 = object()
  2492. ar, _registry, _name = self._makeOne(_component)
  2493. ar2, _, _ = self._makeOne(_component2)
  2494. ar2.name = _name + '2'
  2495. self.assertFalse(ar >= ar2)
  2496. def test___ge___hit(self):
  2497. _component = object()
  2498. ar, _registry, _name = self._makeOne(_component)
  2499. ar2, _, _ = self._makeOne(_component)
  2500. ar2.name = _name + '2'
  2501. self.assertTrue(ar2 >= ar)
  2502. class SubscriptionRegistrationTests(unittest.TestCase):
  2503. def _getTargetClass(self):
  2504. from zope.interface.registry import SubscriptionRegistration
  2505. return SubscriptionRegistration
  2506. def _makeOne(self, component=None):
  2507. from zope.interface.declarations import InterfaceClass
  2508. class IFoo(InterfaceClass):
  2509. pass
  2510. ifoo = IFoo('IFoo')
  2511. ibar = IFoo('IBar')
  2512. class _Registry(object):
  2513. def __repr__(self): # pragma: no cover
  2514. return '_REGISTRY'
  2515. registry = _Registry()
  2516. name = u'name'
  2517. doc = 'DOCSTRING'
  2518. klass = self._getTargetClass()
  2519. return (klass(registry, (ibar,), ifoo, name, component, doc),
  2520. registry,
  2521. name,
  2522. )
  2523. def test_class_conforms_to_ISubscriptionAdapterRegistration(self):
  2524. from zope.interface.verify import verifyClass
  2525. from zope.interface.interfaces import ISubscriptionAdapterRegistration
  2526. verifyClass(ISubscriptionAdapterRegistration, self._getTargetClass())
  2527. def test_instance_conforms_to_ISubscriptionAdapterRegistration(self):
  2528. from zope.interface.verify import verifyObject
  2529. from zope.interface.interfaces import ISubscriptionAdapterRegistration
  2530. sar, _, _ = self._makeOne()
  2531. verifyObject(ISubscriptionAdapterRegistration, sar)
  2532. class HandlerRegistrationTests(unittest.TestCase):
  2533. def _getTargetClass(self):
  2534. from zope.interface.registry import HandlerRegistration
  2535. return HandlerRegistration
  2536. def _makeOne(self, component=None):
  2537. from zope.interface.declarations import InterfaceClass
  2538. class IFoo(InterfaceClass):
  2539. pass
  2540. ifoo = IFoo('IFoo')
  2541. class _Registry(object):
  2542. def __repr__(self):
  2543. return '_REGISTRY'
  2544. registry = _Registry()
  2545. name = u'name'
  2546. doc = 'DOCSTRING'
  2547. klass = self._getTargetClass()
  2548. return (klass(registry, (ifoo,), name, component, doc),
  2549. registry,
  2550. name,
  2551. )
  2552. def test_class_conforms_to_IHandlerRegistration(self):
  2553. from zope.interface.verify import verifyClass
  2554. from zope.interface.interfaces import IHandlerRegistration
  2555. verifyClass(IHandlerRegistration, self._getTargetClass())
  2556. def test_instance_conforms_to_IHandlerRegistration(self):
  2557. from zope.interface.verify import verifyObject
  2558. from zope.interface.interfaces import IHandlerRegistration
  2559. hr, _, _ = self._makeOne()
  2560. verifyObject(IHandlerRegistration, hr)
  2561. def test_properties(self):
  2562. def _factory(context):
  2563. raise NotImplementedError()
  2564. hr, _, _ = self._makeOne(_factory)
  2565. self.assertTrue(hr.handler is _factory)
  2566. self.assertTrue(hr.factory is hr.handler)
  2567. self.assertTrue(hr.provided is None)
  2568. def test___repr___factory_w_name(self):
  2569. class _Factory(object):
  2570. __name__ = 'TEST'
  2571. hr, _registry, _name = self._makeOne(_Factory())
  2572. self.assertEqual(repr(hr),
  2573. ("HandlerRegistration(_REGISTRY, [IFoo], %r, TEST, "
  2574. + "'DOCSTRING')") % (_name))
  2575. def test___repr___factory_wo_name(self):
  2576. class _Factory(object):
  2577. def __repr__(self):
  2578. return 'TEST'
  2579. hr, _registry, _name = self._makeOne(_Factory())
  2580. self.assertEqual(repr(hr),
  2581. ("HandlerRegistration(_REGISTRY, [IFoo], %r, TEST, "
  2582. + "'DOCSTRING')") % (_name))
  2583. class PersistentAdapterRegistry(VerifyingAdapterRegistry):
  2584. def __getstate__(self):
  2585. state = self.__dict__.copy()
  2586. for k in list(state):
  2587. if k in self._delegated or k.startswith('_v'):
  2588. state.pop(k)
  2589. state.pop('ro', None)
  2590. return state
  2591. def __setstate__(self, state):
  2592. bases = state.pop('__bases__', ())
  2593. self.__dict__.update(state)
  2594. self._createLookup()
  2595. self.__bases__ = bases
  2596. self._v_lookup.changed(self)
  2597. class PersistentComponents(Components):
  2598. # Mimic zope.component.persistentregistry.PersistentComponents:
  2599. # we should be picklalable, but not persistent.Persistent ourself.
  2600. def _init_registries(self):
  2601. self.adapters = PersistentAdapterRegistry()
  2602. self.utilities = PersistentAdapterRegistry()
  2603. class PersistentDictComponents(PersistentComponents, dict):
  2604. # Like Pyramid's Registry, we subclass Components and dict
  2605. pass
  2606. class PersistentComponentsDict(dict, PersistentComponents):
  2607. # Like the above, but inheritance is flipped
  2608. def __init__(self, name):
  2609. dict.__init__(self)
  2610. PersistentComponents.__init__(self, name)
  2611. class TestPersistentComponents(unittest.TestCase):
  2612. def _makeOne(self):
  2613. return PersistentComponents('test')
  2614. def _check_equality_after_pickle(self, made):
  2615. pass
  2616. def test_pickles_empty(self):
  2617. import pickle
  2618. comp = self._makeOne()
  2619. pickle.dumps(comp)
  2620. comp2 = pickle.loads(pickle.dumps(comp))
  2621. self.assertEqual(comp2.__name__, 'test')
  2622. def test_pickles_with_utility_registration(self):
  2623. import pickle
  2624. comp = self._makeOne()
  2625. utility = object()
  2626. comp.registerUtility(
  2627. utility,
  2628. Interface)
  2629. self.assertIs(utility,
  2630. comp.getUtility(Interface))
  2631. comp2 = pickle.loads(pickle.dumps(comp))
  2632. self.assertEqual(comp2.__name__, 'test')
  2633. # The utility is still registered
  2634. self.assertIsNotNone(comp2.getUtility(Interface))
  2635. # We can register another one
  2636. comp2.registerUtility(
  2637. utility,
  2638. Interface)
  2639. self.assertIs(utility,
  2640. comp2.getUtility(Interface))
  2641. self._check_equality_after_pickle(comp2)
  2642. class TestPersistentDictComponents(TestPersistentComponents):
  2643. def _getTargetClass(self):
  2644. return PersistentDictComponents
  2645. def _makeOne(self):
  2646. comp = self._getTargetClass()(name='test')
  2647. comp['key'] = 42
  2648. return comp
  2649. def _check_equality_after_pickle(self, made):
  2650. self.assertIn('key', made)
  2651. self.assertEqual(made['key'], 42)
  2652. class TestPersistentComponentsDict(TestPersistentDictComponents):
  2653. def _getTargetClass(self):
  2654. return PersistentComponentsDict
  2655. class _Monkey(object):
  2656. # context-manager for replacing module names in the scope of a test.
  2657. def __init__(self, module, **kw):
  2658. self.module = module
  2659. self.to_restore = dict([(key, getattr(module, key)) for key in kw])
  2660. for key, value in kw.items():
  2661. setattr(module, key, value)
  2662. def __enter__(self):
  2663. return self
  2664. def __exit__(self, exc_type, exc_val, exc_tb):
  2665. for key, value in self.to_restore.items():
  2666. setattr(self.module, key, value)