3 ^j@sxddlmZmZddlmZddlmZddlmZddl m Z m Z edd d d gZ ee Zd d ZGddde ZdS)) defaultdict namedtuple)suppress)NoCommon)DiffResultDescriptor) Difference SymbolWrapperZmodified_class added_perms removed_perms matched_permsc Cs>yt|j|Stk r8t|}|t|j|<|SXdS)z| Wrap class from the specified policy. This caches results to prevent duplicate wrapper objects in memory. N) _class_cacheZpolicyKeyErrorr )Zclass_cr /usr/lib64/python3.6/objclass.pyclass_wrapper_factory$s rc@s8eZdZdZedZedZedZddZddZ dS)ObjClassDifferencezN Determine the difference in object classes between two policies. diff_classesc Cs|jjdj||jdd|jjDdd|jjD\|_|_}t |_ x|D]\}}|j }t t ||jj O}WdQRX|j }t t ||jj O}WdQRX|j||dd\}}}|s|rVt||||j |<qVWdS)z?Generate the difference in object classes between the policies.zEGenerating class differences from {0.left_policy} to {0.right_policy}css|]}t|VqdS)N)r ).0rrrr Fsz2ObjClassDifference.diff_classes..css|]}t|VqdS)N)r )rrrrrrGsNF)Zunwrap)loginfoformatZ _set_diffZ left_policyclassesZ right_policy added_classesremoved_classesdictmodified_classesZpermsrrcommonmodified_classes_record) selfZmatched_classesZ left_classZ right_classZ left_permsZ right_permsr r r rrrr?s(    zObjClassDifference.diff_classescCs"|jjdd|_d|_d|_dS)z%Reset diff results on policy changes.z"Resetting object class differencesN)rdebugrrr)r"rrr _reset_diffcs zObjClassDifference._reset_diffN) __name__ __module__ __qualname____doc__rrrrrr$rrrrr4s $rN) collectionsrr contextlibrZ exceptionrZ descriptorsr differencer r r!rrrrrrrrs