d i f f   - - g i t   a / a i o p u l s e / c a l l b a c k s . p y   b / a i o p u l s e / c a l l b a c k s . p y 
 
 n e w   f i l e   m o d e   1 0 0 6 4 4 
 
 i n d e x   0 0 0 0 0 0 0 . . 7 2 a d 9 4 2 
 
 - - -   / d e v / n u l l 
 
 + + +   b / a i o p u l s e / c a l l b a c k s . p y 
 
 @ @   - 0 , 0   + 1 , 5 7   @ @ 
 
 + " " " C a l l b a c k   m i x i n   f o r   h u b   e n t i t i e s . " " " 
 
 + f r o m   _ _ f u t u r e _ _   i m p o r t   a n n o t a t i o n s 
 
 + 
 
 + i m p o r t   a s y n c i o 
 
 + i m p o r t   f u n c t o o l s 
 
 + i m p o r t   l o g g i n g 
 
 + f r o m   c o l l e c t i o n s . a b c   i m p o r t   C a l l a b l e 
 
 + f r o m   t y p i n g   i m p o r t   A n y 
 
 + 
 
 + _ L O G G E R   =   l o g g i n g . g e t L o g g e r ( _ _ n a m e _ _ ) 
 
 + 
 
 + 
 
 + c l a s s   C a l l b a c k M i x i n : 
 
 +         " " " M i x i n   f o r   e n t i t i e s   t h a t   s u p p o r t   u p d a t e   c a l l b a c k s . " " " 
 
 + 
 
 +         d e f   _ _ i n i t _ _ ( s e l f )   - >   N o n e : 
 
 +                 " " " I n i t i a l i z e   c a l l b a c k   l i s t . " " " 
 
 +                 s e l f . _ u p d a t e _ c a l l b a c k s :   l i s t [ C a l l a b l e [ . . . ,   N o n e ] ]   =   [ ] 
 
 + 
 
 +         d e f   c a l l b a c k _ s u b s c r i b e ( s e l f ,   c a l l b a c k :   C a l l a b l e [ . . . ,   N o n e ] )   - >   N o n e : 
 
 +                 " " " A d d   a   c a l l b a c k   f o r   u p d a t e s . " " " 
 
 +                 s e l f . _ u p d a t e _ c a l l b a c k s . a p p e n d ( c a l l b a c k ) 
 
 + 
 
 +         d e f   c a l l b a c k _ u n s u b s c r i b e ( s e l f ,   c a l l b a c k :   C a l l a b l e [ . . . ,   N o n e ] )   - >   N o n e : 
 
 +                 " " " R e m o v e   a   c a l l b a c k   f o r   u p d a t e s . " " " 
 
 +                 i f   c a l l b a c k   i n   s e l f . _ u p d a t e _ c a l l b a c k s : 
 
 +                         s e l f . _ u p d a t e _ c a l l b a c k s . r e m o v e ( c a l l b a c k ) 
 
 + 
 
 +         d e f   n o t i f y _ c a l l b a c k ( s e l f ,   * a r g s :   A n y )   - >   N o n e : 
 
 +                 " " " N o t i f y   a l l   c a l l b a c k s   o f   a n   u p d a t e . " " " 
 
 +                 f o r   c a l l b a c k   i n   s e l f . _ u p d a t e _ c a l l b a c k s : 
 
 +                         s e l f . _ s c h e d u l e _ c a l l b a c k ( c a l l b a c k ,   * a r g s ) 
 
 + 
 
 +         d e f   _ s c h e d u l e _ c a l l b a c k ( 
 
 +                 s e l f ,   t a r g e t :   C a l l a b l e [ . . . ,   A n y ] ,   * a r g s :   A n y 
 
 +         )   - >   a s y n c i o . T a s k   |   N o n e : 
 
 +                 " " " S c h e d u l e   a   c a l l b a c k   t o   r u n   a s y n c h r o n o u s l y . 
 
 + 
 
 +                 M u s t   b e   c a l l e d   f r o m   w i t h i n   t h e   e v e n t   l o o p . 
 
 +                 " " " 
 
 +                 t r y : 
 
 +                         l o o p   =   a s y n c i o . g e t _ r u n n i n g _ l o o p ( ) 
 
 +                 e x c e p t   R u n t i m e E r r o r : 
 
 +                         _ L O G G E R . w a r n i n g ( " N o   r u n n i n g   e v e n t   l o o p ,   c a l l b a c k   n o t   s c h e d u l e d " ) 
 
 +                         r e t u r n   N o n e 
 
 + 
 
 +                 #   C h e c k   f o r   p a r t i a l s   t o   p r o p e r l y   d e t e r m i n e   i f   c o r o u t i n e   f u n c t i o n 
 
 +                 c h e c k _ t a r g e t   =   t a r g e t 
 
 +                 w h i l e   i s i n s t a n c e ( c h e c k _ t a r g e t ,   f u n c t o o l s . p a r t i a l ) : 
 
 +                         c h e c k _ t a r g e t   =   c h e c k _ t a r g e t . f u n c 
 
 + 
 
 +                 i f   a s y n c i o . i s c o r o u t i n e ( c h e c k _ t a r g e t ) : 
 
 +                         r e t u r n   l o o p . c r e a t e _ t a s k ( t a r g e t )     #   t y p e :   i g n o r e 
 
 +                 e l i f   a s y n c i o . i s c o r o u t i n e f u n c t i o n ( c h e c k _ t a r g e t ) : 
 
 +                         r e t u r n   l o o p . c r e a t e _ t a s k ( t a r g e t ( * a r g s ) ) 
 
 +                 e l s e : 
 
 +                         r e t u r n   l o o p . r u n _ i n _ e x e c u t o r ( N o n e ,   t a r g e t ,   * a r g s )     #   t y p e :   i g n o r e 
 
 d i f f   - - g i t   a / t e s t s / t e s t _ c a l l b a c k s . p y   b / t e s t s / t e s t _ c a l l b a c k s . p y 
 
 n e w   f i l e   m o d e   1 0 0 6 4 4 
 
 i n d e x   0 0 0 0 0 0 0 . . 9 f 2 0 1 3 c 
 
 - - -   / d e v / n u l l 
 
 + + +   b / t e s t s / t e s t _ c a l l b a c k s . p y 
 
 @ @   - 0 , 0   + 1 , 9 3   @ @ 
 
 + i m p o r t   a s y n c i o 
 
 + f r o m   u n i t t e s t . m o c k   i m p o r t   A s y n c M o c k ,   M a g i c M o c k 
 
 + 
 
 + i m p o r t   p y t e s t 
 
 + 
 
 + f r o m   a i o p u l s e . c a l l b a c k s   i m p o r t   C a l l b a c k M i x i n 
 
 + 
 
 + 
 
 + c l a s s   C o n c r e t e C a l l b a c k E n t i t y ( C a l l b a c k M i x i n ) : 
 
 +         " " " C o n c r e t e   i m p l e m e n t a t i o n   f o r   t e s t i n g . " " " 
 
 + 
 
 +         p a s s 
 
 + 
 
 + 
 
 + c l a s s   T e s t C a l l b a c k M i x i n : 
 
 +         @ p y t e s t . f i x t u r e 
 
 +         d e f   e n t i t y ( s e l f ) : 
 
 +                 r e t u r n   C o n c r e t e C a l l b a c k E n t i t y ( ) 
 
 + 
 
 +         d e f   t e s t _ i n i t _ e m p t y _ c a l l b a c k s ( s e l f ,   e n t i t y ) : 
 
 +                 a s s e r t   e n t i t y . _ u p d a t e _ c a l l b a c k s   = =   [ ] 
 
 + 
 
 +         d e f   t e s t _ c a l l b a c k _ s u b s c r i b e ( s e l f ,   e n t i t y ) : 
 
 +                 c a l l b a c k   =   M a g i c M o c k ( ) 
 
 +                 e n t i t y . c a l l b a c k _ s u b s c r i b e ( c a l l b a c k ) 
 
 +                 a s s e r t   c a l l b a c k   i n   e n t i t y . _ u p d a t e _ c a l l b a c k s 
 
 + 
 
 +         d e f   t e s t _ c a l l b a c k _ u n s u b s c r i b e ( s e l f ,   e n t i t y ) : 
 
 +                 c a l l b a c k   =   M a g i c M o c k ( ) 
 
 +                 e n t i t y . _ u p d a t e _ c a l l b a c k s . a p p e n d ( c a l l b a c k ) 
 
 +                 e n t i t y . c a l l b a c k _ u n s u b s c r i b e ( c a l l b a c k ) 
 
 +                 a s s e r t   c a l l b a c k   n o t   i n   e n t i t y . _ u p d a t e _ c a l l b a c k s 
 
 + 
 
 +         d e f   t e s t _ c a l l b a c k _ u n s u b s c r i b e _ n o t _ f o u n d ( s e l f ,   e n t i t y ) : 
 
 +                 c a l l b a c k   =   M a g i c M o c k ( ) 
 
 +                 e n t i t y . c a l l b a c k _ u n s u b s c r i b e ( c a l l b a c k ) 
 
 +                 a s s e r t   e n t i t y . _ u p d a t e _ c a l l b a c k s   = =   [ ] 
 
 + 
 
 +         d e f   t e s t _ c a l l b a c k _ m u l t i p l e _ s u b s c r i b e r s ( s e l f ,   e n t i t y ) : 
 
 +                 c a l l b a c k 1   =   M a g i c M o c k ( ) 
 
 +                 c a l l b a c k 2   =   M a g i c M o c k ( ) 
 
 +                 e n t i t y . c a l l b a c k _ s u b s c r i b e ( c a l l b a c k 1 ) 
 
 +                 e n t i t y . c a l l b a c k _ s u b s c r i b e ( c a l l b a c k 2 ) 
 
 +                 a s s e r t   l e n ( e n t i t y . _ u p d a t e _ c a l l b a c k s )   = =   2 
 
 +                 a s s e r t   c a l l b a c k 1   i n   e n t i t y . _ u p d a t e _ c a l l b a c k s 
 
 +                 a s s e r t   c a l l b a c k 2   i n   e n t i t y . _ u p d a t e _ c a l l b a c k s 
 
 + 
 
 +         @ p y t e s t . m a r k . a s y n c i o 
 
 +         a s y n c   d e f   t e s t _ n o t i f y _ c a l l b a c k _ s y n c ( s e l f ,   e n t i t y ) : 
 
 +                 c a l l b a c k   =   M a g i c M o c k ( ) 
 
 +                 e n t i t y . _ u p d a t e _ c a l l b a c k s . a p p e n d ( c a l l b a c k ) 
 
 +                 e n t i t y . n o t i f y _ c a l l b a c k ( ) 
 
 +                 a w a i t   a s y n c i o . s l e e p ( 0 . 1 ) 
 
 +                 c a l l b a c k . a s s e r t _ c a l l e d _ o n c e ( ) 
 
 + 
 
 +         @ p y t e s t . m a r k . a s y n c i o 
 
 +         a s y n c   d e f   t e s t _ n o t i f y _ c a l l b a c k _ w i t h _ a r g s ( s e l f ,   e n t i t y ) : 
 
 +                 c a l l b a c k   =   M a g i c M o c k ( ) 
 
 +                 e n t i t y . _ u p d a t e _ c a l l b a c k s . a p p e n d ( c a l l b a c k ) 
 
 +                 e n t i t y . n o t i f y _ c a l l b a c k ( " a r g 1 " ,   " a r g 2 " ) 
 
 +                 a w a i t   a s y n c i o . s l e e p ( 0 . 1 ) 
 
 +                 c a l l b a c k . a s s e r t _ c a l l e d _ o n c e _ w i t h ( " a r g 1 " ,   " a r g 2 " ) 
 
 + 
 
 +         @ p y t e s t . m a r k . a s y n c i o 
 
 +         a s y n c   d e f   t e s t _ n o t i f y _ c a l l b a c k _ m u l t i p l e ( s e l f ,   e n t i t y ) : 
 
 +                 c a l l b a c k 1   =   M a g i c M o c k ( ) 
 
 +                 c a l l b a c k 2   =   M a g i c M o c k ( ) 
 
 +                 e n t i t y . _ u p d a t e _ c a l l b a c k s . a p p e n d ( c a l l b a c k 1 ) 
 
 +                 e n t i t y . _ u p d a t e _ c a l l b a c k s . a p p e n d ( c a l l b a c k 2 ) 
 
 +                 e n t i t y . n o t i f y _ c a l l b a c k ( ) 
 
 +                 a w a i t   a s y n c i o . s l e e p ( 0 . 1 ) 
 
 +                 c a l l b a c k 1 . a s s e r t _ c a l l e d _ o n c e ( ) 
 
 +                 c a l l b a c k 2 . a s s e r t _ c a l l e d _ o n c e ( ) 
 
 + 
 
 +         @ p y t e s t . m a r k . a s y n c i o 
 
 +         a s y n c   d e f   t e s t _ n o t i f y _ c a l l b a c k _ a s y n c ( s e l f ,   e n t i t y ) : 
 
 +                 c a l l b a c k   =   A s y n c M o c k ( ) 
 
 +                 e n t i t y . _ u p d a t e _ c a l l b a c k s . a p p e n d ( c a l l b a c k ) 
 
 +                 e n t i t y . n o t i f y _ c a l l b a c k ( ) 
 
 +                 a w a i t   a s y n c i o . s l e e p ( 0 . 1 ) 
 
 +                 c a l l b a c k . a s s e r t _ c a l l e d _ o n c e ( ) 
 
 + 
 
 +         d e f   t e s t _ n o t i f y _ c a l l b a c k _ c o r o u t i n e ( s e l f ,   e n t i t y ) : 
 
 +                 c a l l e d   =   F a l s e 
 
 + 
 
 +                 a s y n c   d e f   c a l l b a c k ( ) : 
 
 +                         n o n l o c a l   c a l l e d 
 
 +                         c a l l e d   =   T r u e 
 
 + 
 
 +                 e n t i t y . _ u p d a t e _ c a l l b a c k s . a p p e n d ( c a l l b a c k ) 
 
 +                 e n t i t y . n o t i f y _ c a l l b a c k ( ) 
 
 +                 #   N o t e :   c o r o u t i n e   w o n ' t   e x e c u t e   w i t h o u t   e v e n t   l o o p   r u n n i n g 
 
 +                 #   T h i s   t e s t s   t h a t   i t   d o e s n ' t   r a i s e 
 
 