B @sdZddlZddlmZGdddeZGdddeZGdd d ZGd d d Z Gd d d eZ Gdddej Z e dkredS)zj Support Eiffel-style preconditions and postconditions for functions. An example for Python metaclasses. N) FunctionTypecs(eZdZfddZeddZZS)EiffelBaseMetaClasscs ||tt|||||S)N)convert_methodssuperr__new__)metanamebasesdict) __class__6/opt/alt/python37/lib64/python3.7/Tools/demo/eiffel.pyrs  zEiffelBaseMetaClass.__new__cCsg}xL|D]@\}}|ds*|dr:t|tsNtqt|tr||qWxF|D]>}|d|}|d|}|s|rX|||||||<qXWdS)zReplace functions in dict with EiffelMethod wrappers. The dict is modified in place. If a method ends in _pre or _post, it is removed from the dict regardless of whether there is a corresponding method. _pre_postz%s_prez%s_postN)itemsendswith isinstancefunctionAssertionErrorappendgetmake_eiffel_method)clsr methodskvmprepostr r r rs   z#EiffelBaseMetaClass.convert_methods)__name__ __module__ __qualname__r classmethodr __classcell__r r )r r r s rc@seZdZeddZdS)EiffelMetaClass1cs"fdd}jrj|_|S)Ncs>r|f|||f||}r:||f|||S)Nr )selfargskwargsrv)funcrrr r method/s z3EiffelMetaClass1.make_eiffel_method..method)__doc__)r)rrr*r )r)rrr r-sz#EiffelMetaClass1.make_eiffel_methodN)rr r! staticmethodrr r r r r$*sr$c@seZdZddZddZdS)EiffelMethodWrappercCs||_||_dS)N)_inst_descr)r%instZdescrr r r __init__?szEiffelMethodWrapper.__init__cOs|j|j||S)N)r/ callmethodr.)r%r&r'r r r __call__CszEiffelMethodWrapper.__call__N)rr r!r1r3r r r r r-=sr-c@s$eZdZddZddZddZdS)EiffelDescriptorcCs&||_||_||_|j|_|j|_dS)N)_funcrrrr+)r%r)rrr r r r1Is zEiffelDescriptor.__init__cCs t||S)N)r-)r%objrr r r __get__QszEiffelDescriptor.__get__cCsH|jr|j|f|||j|f||}|jrD|j||f|||S)N)rr5r)r%r0r&r'xr r r r2Ts zEiffelDescriptor.callmethodN)rr r!r1r7r2r r r r r4Gsr4c@seZdZeZdS)EiffelMetaClass2N)rr r!r4rr r r r r9]sr9c@s$eZdZddZddZddZdS)TestscCs|tdS)N)_testr$)r%r r r testEiffelMetaClass1eszTests.testEiffelMetaClass1cCs|tdS)N)r;r9)r%r r r testEiffelMetaClass2hszTests.testEiffelMetaClass2csGddd|d}Gddd|}Gfddd||}||dd ||dd |t|jd }|t|jd|t|jd ||d d dS)Nc@s eZdZdS)zTests._test..EiffelN)rr r!r r r r Eiffellsr>) metaclassc@s,eZdZddZddZddZddZd S) zTests._test..TestcSs|dS)zMake it a little largerr )r%argr r r rpszTests._test..Test.mcSs|dS)zMake it a little largerr@r )r%rAr r r m2tszTests._test..Test.m2cSs|dks tdS)Nr)r)r%rAr r r m2_prexsz Tests._test..Test.m2_precSs||ks tdS)N)r)r%resultrAr r r m2_post{sz!Tests._test..Test.m2_postN)rr r!rrBrCrEr r r r TestosrFcs&eZdZddZfddZZS)zTests._test..SubcSs|dS)Nr )r%rAr r r rBszTests._test..Sub.m2cs"t||||dkstdS)Nd)rrEr)r%ZResultrA)Subr r r rEsz Tests._test..Sub.m2_post)rr r!rBrEr#r )rI)r r rI~srIr@rGr )Z assertEqualrrBZ assertRaisesr)r%r?r>rFtsr )rIr r;ksz Tests._testN)rr r!r<r=r;r r r r r:csr:__main__)r+Zunittesttypesrrtyperr$r-r4r9ZTestCaser:rmainr r r r s  .