
    3j                    t    d dl mZ d dlZd dlZ G d d      Zd Zd Zd Zd Zd	 Z	d
 Z
edk(  r		  e        yy)    )annotationsNc                  "    e Zd ZddZddZd Zy)TreeYielderNc                    g | _         d| _        || _        g | _        t        t
        t        t        d      t        g| _	        y)z
        `yieldValue` should be a lambda function that
        returns True/False or a function/method call that
        will be passed the value of a current attribute
        N)
currentStackmemo
yieldValue	stackValsintstrfloattypeboolnonIterables)selfr	   s     C/DATA/.local/lib/python3.12/site-packages/music21/test/treeYield.py__init__zTreeYielder.__init__   s;     	$ #"DJ6    c              #  
  K   |i }|| _         t        |      | j                   v r!| j                   t        |      xx   dz  cc<   yd| j                   t        |      <   | j                  |      du r| | j                  j	                  |       t        |      }|| j                  v rnj|t        u rb|D ][  }d|f}| j                  j	                  |       ||   }| j                  ||      E d{    | j                  j                          ] n |t        t        fv rht        |      D ]Y  \  }}d|f}| j                  j	                  |       | j                  ||      E d{    | j                  j                          [ n	 t        j                  |d      }	|	D ]n  }	 t        j                  ||      }
d|f}| j                  j	                  |       	 | j                  |
|      E d{    | j                  j                          p | j                  j                          y7 >7 # t         $ r Y yw xY w# t"        $ r Y w xY w7 ^# t$        $ r"}t'        d	| j)                                |d}~ww xY ww)
a>  
        traverse all attributes of an object looking
        for subObjects that meet a certain criteria.
        yield them.

        `memo` is a dictionary to keep track of objects
        that have already been seen

        The original object is added to the memo and
        also checked for yieldValue
        N   Tdict)r   listLike__dict__getattrzMaximum recursion on:
)r   idr	   r   appendr   r   r   r
   runpoplisttuple	enumerateobject__getattribute__AttributeError	ExceptionRuntimeError
ValueErrorcurrentLevel)r   objr   tObjkeyX	dictTuplexi	listTupleinstance_dictgotValueobjTuplerunErrors                r   r   zTreeYielder.run!   s[     <D	c7diiIIbg!#!"DIIbg??34'I 	  %Cy4$$$T\#TN	%%i0I88AD8111""$  dE]"!#1'O	%%i088AD8111""$	 ' & 7 7Z H
 #%66sA>H &q>%%h/$#xxtx<<<
 ""$ #  	E 2 2 "  ! 
 =# $$1$2C2C2E1FG#$$s   C0J2H03A6J)H3*!JH5 "J(I>JI4I5I98J3J5	I>J IJ	IJIJI	J I;;J  Jc                   d}| j                   D ]s  \  }}|dk(  r1t        |t              r|d|z   dz   z  }'|dt        |      z   dz   z  }<|dk(  r|dt        |      z   dz   z  }V|dk(  r|d	|z   d
z   z  }gt        d|       |S )N r   z['z'][]r   r   z.__getattribute__('z')z#Cannot get attribute for stackType )r
   
isinstancer   r'   )r   
currentStr	stackType
stackValues       r   r(   zTreeYielder.currentLevelh   s    
%)^^!IzF"j#.$"3d"::J#J"7#"==Jj(cC
O3c99
i'3j@4GG
 #Fym!TUU &4 r   N)__name__
__module____qualname__r   r   r(    r   r   r   r      s    6E Nr   r   c            	          G fdd      d } g d}ddg ddd	d
 |      dd |      g}|j                  |       t        |       }|j                  |      D ]  }t        ||j	                                 y )Nc                      e Zd Zd fd	Zy)testCode.<locals>.Mockc                l    d| _         || _        ||dg| _        d | _        |du r |d      | _        y y )N   (   TF)	embedMock)abbymockermockListembeddedMock)r   	mockThingrG   Mocks      r   r   ztestCode.<locals>.Mock.__init__{   sC    DI#DK&	26DM $DD $(e$D! !r   N)T)r=   r>   r?   r   )rM   s   r   rM   rC   z   s	    	Er   rM   c                4    | j                   j                  dk(  S )NrM   )	__class__r=   r-   s    r   mockTypeztestCode.<locals>.mockType   s    {{##v--r   )d   <         )rU         rE   
      )hellogoodbyemocki)r   r   r   printr(   )rQ   subListmyListtyvalrM   s        @r   testCoderc   y   s{    E E. G["r4=A3WWF
MM&	X	Bvvf~c2??$% r   c                 :   ddl m}  ddl m} ddl m} |j	                         dz  dz  dz  }| j                  |      }|j                  |      }|j                          d }t        |      }|j                  |      D ]  }t        ||j                                 y )	Nr   )	converter)common)
freezeThawmiditestPrimitivez
test03.midc                6    t        | t        j                        S r<   )r8   weakrefReferenceTyperP   s    r   rQ   ztestMIDIParse.<locals>.mockType   s    !W2233r   )music21re   rf   rg   getSourceFilePathparseStreamFreezersetupSerializationScaffoldr   r   r^   r(   )	re   rf   rg   acvrQ   ra   rb   s	            r   testMIDIParseru      s    !" 	  "V+o=LA 	A  #A  "4 
X	Bvvayc2??$% r   c                     t        d       S )Nc                J    t        | t        j                  j                        S r<   )
issubclassrm   exceptions21Music21Exceptionmms    r   <lambda>z3find_all_exception_classes_in_m21.<locals>.<lambda>   s    :b'"6"6"G"GHr   find_all_classes_by_criteriar@   r   r   !find_all_exception_classes_in_m21r      s    'H r   c                     d } t        |       S )Nc                    t        | t        j                  j                        sy	  |        h y# t        $ r}dt        |      v cY d }~S d }~ww xY w)NF
unhashable)rx   rm   baseMusic21Object	TypeErrorr   )r|   tes     r   is_unhashablez7find_all_non_hashable_m21objects.<locals>.is_unhashable   sK    "gll889	+TF   	+3r7**	+s   0 	AAAAr~   )r   s    r    find_all_non_hashable_m21objectsr      s     (66r   c                     d } t        |       S )Nc                |    t        | t        j                  j                        sy	  |         y# t        $ r Y yw xY w)NFT)rx   rm   r   r   r   r{   s    r   needs_attributeszGfind_all_non_default_instantiation_m21objects.<locals>.needs_attributes   s<    "gll889	D   		s   / 	;;r~   )r   s    r   -find_all_non_default_instantiation_m21objectsr      s     ((899r   c                   ddl m} dd l} |t        g      }t	               }t	               }|r|j                         }||v rt        |       t        |      D ]y  }t        ||      }t        ||j                        r%||vr!dt        |dd      v r|j                  |       Jt        |t              s[||vs` | |      si|j                  |       { |j                  |       |r|S )Nr   )dequerm   __file__r5   )collectionsr   typesrm   setpopleftr^   dirr   r8   
ModuleTyper   r   add)	criteriar   r   dseenmatchesmmm_namer|   s	            r   r   r      s    !wiA5DeG
IIK9a1vGG$B2u//0$!WRR%@@B%"D.Xb\B  	  Nr   __main__)
__future__r   rk   rm   r   rc   ru   r   r   r   r   r=   r@   r   r   <module>r      sR    #  c cL&.&6

7:2 zO r   