Ϫf^dZddlZddlmZddlmZGddZdZdZGd d eZ y) zt Tests for miscellaneous behaviors of the top-level L{twisted} package (ie, for the code in C{twisted/__init__.py}. N) ModuleType)TestCasec(eZdZdZdZdZdZdZy)SetAsideModulez L{SetAsideModule} is a context manager for temporarily removing a module from C{sys.modules}. @ivar name: The name of the module to remove. c||_yN)name)selfr s ;/usr/lib/python3/dist-packages/twisted/test/test_twisted.py__init__zSetAsideModule.__init__s  cttjjDcic]5\}}||jk(s|j |jdzr||7}}}|D]}tj|=|Scc}}w)z Find the given module and all of its hierarchically inferior modules in C{sys.modules}, remove them from it, and return whatever was found. .)listsysmodulesitemsr startswith)r r moduleNamemodulers r _unimportzSetAsideModule._unimports)-S[[->->-@(A $Vdii':+@+@S+Q     "D D! " s:BcD|j|j|_yr)rr r)r s r __enter__zSetAsideModule.__enter__+s~~dii0 r c|j|jtjj |jyr)rr rrupdate)r excTypeexcValue tracebacks r __exit__zSetAsideModule.__exit__.s( tyy! 4<<(r N)__name__ __module__ __qualname____doc__r rrrr r rrs 1)r rc`i}td||tjj|y)a Take a mapping defining a package and turn it into real C{ModuleType} instances in C{sys.modules}. Consider these example:: a = {"foo": "bar"} b = {"twisted": {"__version__": "42.6"}} c = {"twisted": {"plugin": {"getPlugins": stub}}} C{_install(a)} will place an item into C{sys.modules} with C{"foo"} as the key and C{"bar" as the value. C{_install(b)} will place an item into C{sys.modules} with C{"twisted"} as the key. The value will be a new module object. The module will have a C{"__version__"} attribute with C{"42.6"} as the value. C{_install(c)} will place an item into C{sys.modules} with C{"twisted"} as the key. The value will be a new module object with a C{"plugin"} attribute. An item will also be placed into C{sys.modules} with the key C{"twisted.plugin"} which refers to that module object. That module will have an attribute C{"getPlugins"} with a value of C{stub}. @param modules: A mapping from names to definitions of modules. The names are native strings like C{"twisted"} or C{"unittest"}. Values may be arbitrary objects. Any value which is not a dictionary will be added to C{sys.modules} unmodified. Any dictionary value indicates the value is a new module and its items define the attributes of that module. The definition of this structure is recursive, so a value in the dictionary may be a dictionary to trigger another level of processing. @return: L{None} N) _makePackagesrrr)rresults r _installr(3s(DF$(KKvr ci}t|jD]\}}|Mt|tr7t |}|j j t||||||<O|||<Ut|tr\t |jdz|z}|j j t||||||jdz|z<|||<|||<|S)a Construct module objects (for either modules or packages). @param parent: L{None} or a module object which is the Python package containing all of the modules being created by this function call. Its name will be prepended to the name of all created modules. @param attributes: A mapping giving the attributes of the particular module object this call is creating. @param result: A mapping which is populated with all created module names. This is suitable for use in updating C{sys.modules}. @return: A mapping of all of the attributes created by this call. This is suitable for populating the dictionary of C{parent}. @see: L{_install}. r) rr isinstancedictr__dict__rr&r )parent attributesr'attrsr valuers r r&r&Zs& EJ,,./$ e >%&#D)&&}VUF'KL%t $t %&#FOOc$9D$@A&&}VUF'KL7=v,t34$d #d $ Lr c"eZdZdZdZdZdZy)MakePackagesTestszh Tests for L{_makePackages}, a helper for populating C{sys.modules} with fictional modules. cni}tdtd||j|tdy)z A non-C{dict} value in the attributes dictionary passed to L{_makePackages} is preserved unchanged in the return value. Nreactor)r4)r&r+ assertEqualr rs r test_nonModulez MakePackagesTests.test_nonModules/ dD3W= $y"9:r c$i}tdttd||j|t|j|dt|j d|dj |j d|dj y)z A C{dict} value in the attributes dictionary passed to L{_makePackages} is turned into a L{ModuleType} instance with attributes populated from the items of that C{dict} value. N123versiontwistedr=)r&r+assertIsInstancerr5r r;r6s r test_moduleWithAttributez*MakePackagesTests.test_moduleWithAttributesz dDe)<=wG gt, gi0*= GI$6$?$?@  2 : :;r c i}tdtttd||j|t|j|dt|j d|dj |j|dj t|j d|dj j |j d|dj jy)z Processing of the attributes dictionary is recursive, so a C{dict} value it contains may itself contain a C{dict} value to the same effect. N321r:)webr<r=z twisted.web)r&r+r>rr5r rBr;r6s r test_packageWithModulez(MakePackagesTests.test_packageWithModules dD$u2E)FGQ gt, gi0*= GI$6$?$?@ gi044jA  (:(>(>(G(GH  2 6 6 > >?r N)r r!r"r#r7r?rCr$r r r2r2s ; < @r r2) r#rtypesrtwisted.trial.unittestrrr(r&r2r$r r rFs:  + ))B$N$N(@(@r