
    3j[                        U d Z ddlmZ ddlmZmZ ddlmZmZm	Z	 dZ
ded<   dZded	<    ed
       G d d             Z G d d      Zy)u  anu_v3.callback_track_registry — callback_track_record registry (9-R.2).

Authority: task-2553+17.md §4(2) + §12 9-R.2.

Canonical structure
--------------------
``callback_track_record`` : registry keyed by ``track_id``; each record has
**5 fields**::

    {track_id, task_id, dispatch_cron_id,
     normal_collector_cron_id, fallback_callback_cron_id}

The chair term "callback 4-tuple" = the **callback identity 4 fields**
``{task_id, dispatch_cron_id, normal_collector_cron_id,
fallback_callback_cron_id}`` (track_id is the registry key, not part of the
identity tuple). schema / fixture / regression all align to this single
definition (cardinality identical).
    )annotations)	dataclassasdict)DictListTuple)track_idtask_iddispatch_cron_idnormal_collector_cron_idfallback_callback_cron_idzTuple[str, ...]RECORD_FIELDSr
   r   r   r   IDENTITY_FIELDST)frozenc                  P    e Zd ZU ded<   ded<   ded<   ded<   ded<   d
dZddZy	)CallbackTrackRecordstrr	   r
   r   r   r   c                ^    | j                   | j                  | j                  | j                  fS Nr   selfs    @/home/jay/workspace/scripts/../anu_v3/callback_track_registry.pyidentity_tuplez"CallbackTrackRecord.identity_tuple2   s.    LL!!))**	
 	
    c                    t        |       S r   )r   r   s    r   to_dictzCallbackTrackRecord.to_dict:   s    d|r   N)returnzTuple[str, str, str, str])r   Dict[str, str])__name__
__module____qualname____annotations__r   r    r   r   r   r   *   s(    ML!!""
r   r   c                  d    e Zd ZdZddZddZddZddZddZddZ	ddZ
	 	 	 	 	 	 dd	Zdd
Zy)CallbackTrackRegistryz?track_id-keyed registry of CallbackTrackRecord (5 fields each).c                    i | _         y r   _recordsr   s    r   __init__zCallbackTrackRegistry.__init__A   s	    8:r   c                   |j                   | j                  v rt        d|j                         t        D cg c]  }t	        ||      r| }}|rt        d|j                   d|       || j                  |j                   <   y c c}w )Nzduplicate track_id zrecord z	 missing )r	   r)   
ValueErrorr   getattr)r   recordfmissings       r   registerzCallbackTrackRegistry.registerD   s~    ??dmm+26??2EFGG+F7613E1FFwv&97)LMM)/foo& Gs   BBc                    t        |      t        t              z
  }|rt        dt        |             | j	                  t        di t        D ci c]  }|||   
 c}       y c c}w )Nzunknown record fields r$   )setr   r,   sortedr1   r   )r   dunknownr/   s       r   register_dictz#CallbackTrackRegistry.register_dictL   s[    a&3}--5fWo5FGHH)Mm,LQ!W,LMN,Ls   A&c                     | j                   |   S r   r(   r   r	   s     r   getzCallbackTrackRegistry.getR   s    }}X&&r   c                ,    t        | j                        S r   )listr)   r   s    r   	track_idszCallbackTrackRegistry.track_idsU   s    DMM""r   c                ,    t        | j                        S r   )lenr)   r   s    r   __len__zCallbackTrackRegistry.__len__X   s    4==!!r   c                    || j                   v S r   r(   r9   s     r   __contains__z"CallbackTrackRegistry.__contains__[   s    4==((r   c                    || j                   vry| j                   |   }t        D ]"  }|j                  |      t        ||      k7  s" y y)zReturn (ok, classification).

        Compares an observed callback identity 4-tuple against the
        registered record. Any cron_id / task_id mismatch -> TRACK_MISMATCH.
        )FTRACK_MISMATCH)TIDENTITY_MATCH)r)   r   r:   r-   )r   r	   observed_identityrecr/   s        r   validate_callbackz'CallbackTrackRegistry.validate_callback_   sQ     4==(*mmH%  	/A $$Q'73?:.	/ &r   c                    | j                   j                         D ci c]  \  }}||j                          c}}S c c}}w r   )r)   itemsr   )r   tidrs      r   r   zCallbackTrackRegistry.to_dicto   s2    /3}}/B/B/DEVS!QYY[ EEEs   =N)r   None)r.   r   r   rM   )r5   r   r   rM   )r	   r   r   r   )r   z	List[str])r   int)r	   r   r   bool)r	   r   rF   r   r   zTuple[bool, str])r   zDict[str, Dict[str, str]])r    r!   r"   __doc__r*   r1   r7   r:   r=   r@   rB   rH   r   r$   r   r   r&   r&   >   sL    I;0O'#")&&0>&	& Fr   r&   N)rP   
__future__r   dataclassesr   r   typingr   r   r   r   r#   r   r   r&   r$   r   r   <module>rT      s^   & # ) $ $" $  $  &2F 2Fr   