
    Vh@              
          d dl mZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ  G d de
eeeee      Zy)    )annotationsN)AnsibleParserError)NonInheritableFieldAttribute)Base)Conditional)CollectionSearch)Delegatable)load_list_of_tasks)
Notifiable)Role)Taggable)Sentinelc                      e Zd Z ede      Z ede      Z ede      Zd fd	Zd Z	d Z
d Zd Zedd       Zed	        Z fd
Zd Zd Zd Zd ZeZd Zd fd	Zd Zd Zd ZddZd Zd Zd Zd Zd Z d Z! xZ"S )Blocklist)isadefaultc                    || _         || _        d | _        d | _        || _        || _        |r|| _        n	|r|| _        t        t        | #          y N)	_play_role_parent
_dep_chain_use_handlers	_implicitsuperr   __init__)selfplayparent_blockroletask_includeuse_handlersimplicit	__class__s          F/home/dcms/DCMS/lib/python3.12/site-packages/ansible/playbook/block.pyr   zBlock.__init__-   sO    

)!'DL'DLeT#%    c                T    d| j                   dt        |       d| j                  dS )NzBLOCK(uuid=z)(id=z	)(parent=))_uuididr   r   s    r&   __repr__zBlock.__repr__<   s    59ZZD4<<XXr'   c                4    | j                   |j                   k(  S z object comparison based on _uuidr*   r   others     r&   __eq__zBlock.__eq__?       zzU[[((r'   c                4    | j                   |j                   k7  S r/   r0   r1   s     r&   __ne__zBlock.__ne__C   r4   r'   c                    i }| j                   r|| j                   j                         z  }|| j                  j                         z  }|S )z
        Blocks do not store variables directly, however they may be a member
        of a role or task include which does, so return those if present.
        )r   get_varsvarscopy)r   all_varss     r&   r8   zBlock.get_varsG   sA     <<--//HDIINN$$r'   c                x    t         j                  |        }t        ||||||      }	|	j                  | ||      S )N)r   r    r!   r"   r#   r$   )variable_managerloader)r   is_block	load_data)
datar   r    r!   r"   r#   r=   r>   r$   bs
             r&   loadz
Block.loadV   sG    ~~d++t,TP\kw  CK  L{{42B6{RRr'   c                J    d}t        | t              rdD ]  }|| v sd} |S  |S )NFblockrescuealwaysT)
isinstancedict)dsr?   attrs      r&   r?   zBlock.is_block\   s;    b$5 2:#H	 r'   c                    t         j                  |      sKt        |t              rt        t         |   t        |            S t        t         |   t        |g            S t        t         |   |      S )z
        If a simple task is given, an implicit block for that single task
        is created, which goes in the main portion of the block
        )rF   )r   r?   rI   r   r   preprocess_datarJ   )r   rK   r%   s     r&   rN   zBlock.preprocess_dataf   s\     ~~b!"d#UD9$R.IIUD9$bT:JKKUD1"55r'   c           
         	 t        || j                  | | j                  d | j                  | j                  | j
                        S # t        $ r}t        d| j                  |      d }~ww xY w)Nr   rF   r!   r"   r=   r>   r#   z7A malformed block was encountered while loading a blockobjorig_exc	r
   r   r   _variable_manager_loaderr   AssertionErrorr   _dsr   rL   rK   es       r&   _load_blockzBlock._load_blockt   q    	z%ZZZZ!!%!7!7||!//	 	  	z$%^dhdldlwxyy	z   AA 	A-A((A-c           
         	 t        || j                  | | j                  d | j                  | j                  | j
                        S # t        $ r}t        d| j                  |      d }~ww xY w)NrP   z7A malformed block was encountered while loading rescue.rQ   rT   rY   s       r&   _load_rescuezBlock._load_rescue   r\   r]   c           
         	 t        || j                  | | j                  d | j                  | j                  | j
                        S # t        $ r}t        d| j                  |      d }~ww xY w)NrP   z6A malformed block was encountered while loading alwaysrQ   rT   rY   s       r&   _load_alwayszBlock._load_always   sq    	y%ZZZZ!!%!7!7||!//	 	  	y$%]cgckckvwxx	yr]   c                V    |r'| j                   st        d|z  | j                        y y )Nz+'%s' keyword cannot be used without 'block')rR   )rF   r   rX   )r   rL   namevalues       r&   _validate_alwayszBlock._validate_always   s-    $%RUY%Y_c_g_ghh $5r'   c                    | j                   '| j                  r| j                  j                         S y | j                   d d  S r   )r   r   get_dep_chainr,   s    r&   rg   zBlock.get_dep_chain   s8    ??"||||1133??1%%r'   c                6   d }t         t        |          }| j                  |_        | j                  |_        | j
                  | j
                  d d  |_        d |_        | j                  r#|s!| j                  j                  d      |_        |sT || j                  xs g |      |_         || j                  xs g |      |_         || j                  xs g |      |_	        d |_
        | j                  r| j                  |_
        |j                          |S )Nc                   g }| D ]  }|j                  d      }|j                  r|j                  j                  d      |_        |j                  |k(  r||_        n^|j                  }|j                  r7|j                  |k7  r(|j                  }|j                  r|j                  |k7  r(||_        n||_        |j                  |        |S )NT)exclude_parentexclude_tasks)r:   r   append)	task_list	new_blocknew_task_listtasknew_taskcur_objs         r&   _dupe_task_listz#Block.copy.<locals>._dupe_task_list   s    M! /99D99<<'+||'8'8t'8'LH$||y0+4( #+"2"2%oo'//Y2N&-ooG &oo'//Y2N +4'0H$$$X.!/" ! r'   Trk   )r   r   r:   r   r   r   r   rF   rG   rH   r   validate)r   rj   rl   rt   new_mer%   s        r&   r:   z
Block.copy   s    	!* ud(*zz#11??& $ 2F<<!\\..T.BFN*4::+;VDFL+DKK,=2vFFM+DKK,=2vFFM::::FLr'   c                   t               }| j                  D ]  }|dvst        | |      ||<    | j                         |d<   | j                  | j                  j                         |d<   | j                  P| j                  j                  d      j                         |d<   | j                  j                  j                  |d<   |S )z
        Override of the default serialize method, since when we're serializing
        a task we don't want to include the attribute list of tasks.
        rE   	dep_chainr!   Trk   parentparent_type)
rJ   fattributesgetattrrg   r   	serializer   r:   r%   __name__)r   rA   rL   s      r&   r}   zBlock.serialize   s     v$$ 	1D88$T40T
	1 !..0[::!:://1DL<<#!\\..T.BLLNDN"&,,"8"8"A"ADr'   c                ,   ddl m} ddlm} | j                  D ](  }||v s|dvst        | ||j                  |             * |j                  dd      | _        |j                  d      }|r"t               }|j                  |       || _
        |j                  d      }|rr|j                  d	      }|d
k(  rt               }	n|dk(  r |       }	n|dk(  r |       }		j                  |       |	| _        | j                  j                         | _        yy)zt
        Override of the default deserialize method, to match the above overridden
        serialize method
        r   TaskInclude)HandlerTaskIncluderE   rx   Nr!   ry   rz   r   r   r   )ansible.playbook.task_includer   %ansible.playbook.handler_task_includer   r{   setattrgetr   r   deserializer   r   r   rg   )
r   rA   r   r   rL   	role_datarparent_datarz   ps
             r&   r   zBlock.deserialize   s     	>L $$ 	4Dt|,I IdDHHTN3	4 ((;5 HHV$	AMM)$DJhhx(((=1Kg%G-M 44&(MM+&DL"ll88:DO r'   c                   || _         | j                  r| j                  j                  |       n'| j                  r| j                  j                  |       | j	                         }|r|D ]  }|j                  |        y y r   )rV   r   
set_loaderr   rg   )r   r>   rx   deps       r&   r   zBlock.set_loader  sl    <<LL##F+ZZJJ!!&)&&(	  'v&' r'   c                j   | j                   |   }|j                  }|j                  }	 |rt        }nt	        | d| t              }t	        | j
                  dd      r| j
                  }n| j
                  j
                  }|rb|t        u s|rX	 t	        |dd      rJt        |d      r|j                  |      }nt	        |d| t              }|r| j                  |||      }n|}| j                  r|t        u s|r	 t	        | j                  d| t              }|r| j                  |||      }n|}| j                         }	|	rZ|t        u s|rP|	j                          |	D ];  }
t	        |
d| t              }|r| j                  |||      }n|}|t        us8|r; n | j                  rK|t        u s|rA	 t	        | j                  d| t              }|t        ur|r| j                  |||      }n|}|S |S # t        $ r Y w xY w# t        $ r Y tw xY w# t        $ r Y |S w xY w# t        $ r Y S w xY w)z[
        Generic logic to get the attribute or parent attribute for a block value.
        _statically_loadedT_get_parent_attribute)r{   extendprependr   r|   r   hasattrr   _extend_valueAttributeErrorr   rg   reverser   KeyError)r   rL   omitfattrr   r   rd   r   parent_valuerx   r   	dep_value
play_values                r&   r   zBlock._get_parent_attribute$  sN      &--<	 $j(; t||%8$?,,,,..EX-w(;TB"7,CD+2+H+H+NL+27avJ+QL!$($6$6ulG$TE$0E zzu0F#*4::4&z8#LL $ 2 25, P , $ 2 2 4I ex&76!))+#, &C(/qZ(JI%(,(:(:5)W(U(1$H4V %& zzu0F!(qZ!JJ!1!$($6$6uj'$RE$.E uK & , &  &   		s   A#H% AG6 $H% ;BH H H H% 4>H 6	H?H% HH% 	HH% HH% 	H"H% !H""H% %	H21H2c                2      fdfd        S )zR
        Creates a new block, with task lists filtered based on the tags.
        c                |   g }| D ]  }t        |t              r+ |      }|j                         s,|j                  |       >|j                  t
        j                  v r|j                  s=|j                  j                  j                  j                  j                        s|j                  |        |S )N)r;   )rI   r   	has_tasksrm   actionC_ACTION_METAr$   evaluate_tagsr   	only_tags	skip_tags)targettmp_listrq   filtered_blockr;   evaluate_blockr   s       r&   evaluate_and_append_taskz;Block.filter_tagged_tasks.<locals>.evaluate_and_append_taskr  s    H *dE*%3D%9N%//1 7{{ann4**4::+?+?AUAU`h*iOOD)* Or'   c                    | j                  dd      }| j                  |_         | j                        |_         | j                        |_         | j                        |_        |S )NT)rj   rl   )r:   r   rF   rG   rH   )rF   ro   r   s     r&   r   z1Block.filter_tagged_tasks.<locals>.evaluate_block~  sY    

$d
KI %I6u{{CIO7EI7EIr'    )r   r;   r   r   s   ``@@r&   filter_tagged_taskszBlock.filter_tagged_tasksm  s    

		 d##r'   c                *    fdfd |       S )Nc                    g }| D ];  }t        |t              r|j                   |             +|j                  |       = |S r   )rI   r   r   rm   )r   r   rq   r   s      r&   r   z1Block.get_tasks.<locals>.evaluate_and_append_task  sE    H *dE*OON4$89OOD)	*
 Or'   c                     | j                         }|j                   | j                               |j                   | j                               |S r   )rF   r   rG   rH   )rF   rvr   s     r&   r   z'Block.get_tasks.<locals>.evaluate_block  sB    )%++6BII.u||<=II.u||<=Ir'   r   )r   r   r   s    @@r&   	get_taskszBlock.get_tasks  s    		 d##r'   c                    t        | j                        dkD  xs2 t        | j                        dkD  xs t        | j                        dkD  S )Nr   )lenrF   rG   rH   r,   s    r&   r   zBlock.has_tasks  s<    4::"Rc$++&6&:Rc$++>NQR>RRr'   c                b    | j                   r| j                   j                         S t               S r   )r   get_include_paramsrJ   r,   s    r&   r   zBlock.get_include_params  s#    <<<<22446Mr'   c                    ddl m} | j                  rGt        | j                  |      r| j                  j                  sy| j                  j                         S y)a7  
        Determine if all of the parents of this block were statically loaded
        or not. Since Task/TaskInclude objects may be in the chain, they simply
        call their parents all_parents_static() method. Only Block objects in
        the chain check the statically_loaded value of the parent.
        r   r   FT)r   r   r   rI   r   all_parents_staticr   r   s     r&   r   zBlock.all_parents_static  sA     	><<$,,4T\\=[=[<<2244r'   c                    ddl m} | j                  r<t        | j                  |      r| j                  S | j                  j	                         S y )Nr   r   )r   r   r   rI   get_first_parent_includer   s     r&   r   zBlock.get_first_parent_include  s:    =<<$,,4||#<<88::r'   )NNNNFF)NNNNFNN)FF)F)#r~   
__module____qualname__r   r   rF   rG   rH   r   r-   r3   r6   r8   staticmethodrC   r?   rN   r[   r_   ra   re   _validate_rescuerg   r:   r}   r   r   r   r   r   r   r   r   r   __classcell__)r%   s   @r&   r   r   "   s     )VTBE)fdCF)fdCF&Y)) S S
  6zzyi (&+Z*$;L
'GR$6$$Sr'   r   )
__future__r   ansible.constants	constantsr   ansible.errorsr   ansible.playbook.attributer   ansible.playbook.baser   ansible.playbook.conditionalr   !ansible.playbook.collectionsearchr   ansible.playbook.delegatabler	   ansible.playbook.helpersr
   ansible.playbook.notifiabler   ansible.playbook.roler   ansible.playbook.taggabler   ansible.utils.sentinelr   r   r   r'   r&   <module>r      sG   $ #  - C & 4 > 4 7 2 & . +VD+/:{ Vr'   