
    Vh/;                        d dl mZ d dlmZmZmZ d dlmZ d dlm	Z
 d dlmZ d dlmZmZ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  e       Zd Zd ZddZddZ ddZ!ddZ"d Z#d Z$d Z%d Z&y)    )annotations)MutableMapping
MutableSetMutableSequence)Path)	constants)__version__)AnsibleErrorAnsibleParserErrorAnsiblePluginNotFound)string_types)	to_native)read_docstring)AnsibleLoader)Displayc                ^   |j                         D ]  \  }}|| v rt        | |   t              r|j                  | |          ndt        | |   t              r|j                  | |          n<t        | |   t              rt        t        || |   z               }nt        d|z        || |<    y )Nz?Attempt to extend a documentation fragment, invalid type for %s)
items
isinstancer   updater   addr   sorted	frozenset	Exception)targetsourcekeyvalues       I/home/dcms/DCMS/lib/python3.12/site-packages/ansible/utils/plugin_docs.pymerge_fragmentr      s    lln 
U&=&+~6VC[)F3K4		&+&F3K9y)<=> adg ghhs    c                   dfd	fdfdfdfd}| sy |r	 |        y d| v r
 | dd       t        | j                  d      t              r | d   d	
       t        | j                  d      t              r | d          t        | j                  d      t              r || d          y y )Nc                    |rdnd}t        | t              sy s|rd| v r
 | d|       d| v r
 | d|       s|sd| v r | d|       y y y y )Nremoved_from_collectioncollection_name
removed_inremoved_at_dateversion)r   r   )deprecation	top_levelr$   callback	is_modules      r   process_deprecationz8_process_versions_and_dates.<locals>.process_deprecation&   sj    7@3FW+~6(C[,@+["3_EYI,D[)_= -EY	r    c                    | D ]L  }t        |t              sd|v r
 |dd       t        |j                  d      t              sB |d          N y )Nversion_addedversion_added_collection
deprecated)r   r   get)
specifiers	specifierr*   r,   s     r   process_option_specifiersz>_process_versions_and_dates.<locals>.process_option_specifiers1   sT    # 	=Ii8)+O5OP)--5~F#Il$;<	=r    c                   | j                         D ]  }t        |t              sd|v r
 |dd       st        |j                  d      t              r |d          t        |j                  d      t              r |d          t        |j                  d      t              r |d          t        |j                  d      t              r |d          t        |j                  d      t              s |d           y )Nr.   r/   envinivarsr0   
suboptions)valuesr   r   r1   list)optionsoptionr*   r+   r,   r4   process_optionss     r   r>   z4_process_versions_and_dates.<locals>.process_options:   s    nn& 	6Ffn5&(2LMfjj/6-fUm<fjj/6-fUm<fjj0$7-fVn=fjj6G'|(<=&**\2NC| 45	6r    c                    | j                         D ]L  }t        |t              sd|v r
 |dd       t        |j                  d      t              sB |d          N y )Nr.   r/   contains)r:   r   r   r1   )return_valuesreturn_valuer*   process_return_valuess     r   rC   z:_process_versions_and_dates.<locals>.process_return_valuesL   sa    )002 	@LlN;,.8RS,**:6G%l:&>?	@r    c                p    | j                         D ]"  }t        |t              sd|v s |dd       $ y )Nr.   r/   )r:   r   r   )
attributes	attributer*   s     r   process_attributesz7_process_versions_and_dates.<locals>.process_attributesU   s?    #**, 	QIi8)+O5OP		Qr    r.   r/   r0   T)r)   r<   rE   F)r   r1   r   )	fragmentr+   return_docsr*   rG   r,   r4   r>   rC   s	    ` ` @@@@r   _process_versions_and_datesrK   %   s    	>=6 6$@Q h'("?,FG(,,|,n=H\2dC(,,y)>:+,(,,|,n=8L12 >r    c                ,    fd}t        | |||       y )Nc                    || vr| |<   y y N r<   r=   collection_name_fieldr$   s      r   r   z1add_collection_to_versions_and_dates.<locals>.addn   s     /-<G)* 0r    rK   )rI   r$   r+   rJ   r   s    `   r   $add_collection_to_versions_and_datesrS   m   s    =  )[#Fr    c                ,    fd}t        | |||       y )Nc                6    | j                  |      k(  r| |= y y rN   )r1   rP   s      r   removezAremove_current_collection_from_versions_and_dates.<locals>.removev   s$    ;;,-@-. Ar    rR   )rI   r$   r+   rJ   rV   s    `   r   1remove_current_collection_from_versions_and_datesrW   u   s    /  )[&Ir    c                D   | j                  dg       }t        |t              r|j                  d      }g }|D ]  }|j	                         }d}|j                  |      }	|	?d|v r;|j                  dd      }
|
d   }|
d   j                         }|j                  |      }	|	|j                  |       |t        |	|d       }||dk7  r|j                  |       d}t        ||      j                         }t        |	d	      }d|v r#dj                  |j                  d      dd
       nd}t        |||       d|v r0|j                  d      }|rd| vrg | d<   | d   j                  |       d|v r0|j                  d      }|rd| vrg | d<   | d   j                  |       d|vrd|vrt        d|d|      dD ]?  }||v s|| v r 	 t!        | |   |j                  |             ,|j                  |      | |<   A 	 t!        | |        |r3t#        dj'                  |t%        dj                  |                        y # t        $ r$}t#        t%        |      d|d|d|      d }~ww xY w# t        $ r!}t#        t%        |      d|d|      d }~ww xY w)Nextends_documentation_fragment,DOCUMENTATION.   r   z{})	file_nameansible_name    r+   notesseealsor<   rE   z+missing options or attributes in fragment (z), possibly misformatted?: )r<   rE     (z) of unknown type: z(unknown doc_fragment(s) in file {0}: {1}z, )popr   r   splitstripr1   rsplitupperappendgetattrr   get_single_datajoinrS   extendr   r   r
   r   format)docfilenamefragment_loaderr+   	fragmentsunknown_fragmentsfragment_slugfragment_namefragment_varfragment_class	splitnamefragment_yamlrI   real_fragment_namereal_collection_namerc   rd   doc_keyes                      r   add_fragmentsr   }   s   8"=I)\*OOC(	 # >h%++-&(,,];!c]&:%,,S!4I%aLM$Q<--/L,00?N!$$]3dC .!((7 $ (CSSU$^^DORVhOhsxx(:(@(@(Ea(JKnp,X7KW`ahLL)E#%#%CLG##E* ll9-GC'%'C	NI%%g.H$X)Ely  |D  E  F  F 1 	9G("c>@&s7|X\\'5JK $,<<#8CL	9	h3)y>h@ ELLXW`aeajajk|a}W~  A  	A  % @*yYZ|]dfsu}+~@  	h	!m]efgg	hs0   
I I5	I2I--I25	J>JJNc                   ||d}n|dk(  }n	 t        | ||      }|j                  dd      r%|t        |d   ||       t        |d   | ||       |j                  dd      r|t        |d   ||d	       |d   |d
   |d   |d   fS )z
    DOCUMENTATION can be extended using documentation fragments loaded by the PluginLoader from the doc_fragments plugins.
    Fmodule)verboseignore_errorsrr   rb   )rt   r+   
returndocsT)r+   rJ   plainexamplesmetadata)r   r1   rS   r   )rs   rt   r   r   r$   r+   plugin_typedatas           r   get_docstringr      s    
 I$0I 	(G=QDxxu&0eoYbc 	d5k8_Xabxxe$&0l1C_`iw{|;_-tL/A4
CSSSr    c                j   t        |       } 	 t        j                  j                  d      }|j	                  d      s|dz  }| j                  d      r| dd } t        j                  d      t              dk  rt        dj                  t                    dj                  d	   d         }d
   j                  d      r+t        fddD              st              dkD  r	dd   v rd}dj                  |||       S # t        $ r%}dj                  | t        |            cY d}~S d}~ww xY w)a  
    returns a versioned documentation link for the current Ansible major.minor version; used to generate
    in-product warning/error links to the configured DOCSITE_ROOT_URL
    (eg, https://docs.ansible.com/ansible/2.8/somepath/doc.html)

    :param path: relative path to a document under docs/docsite/rst;
    :return: absolute URL to the specified doc for the current version of Ansible
    DOCSITE_ROOT_URL/r]   Nr\      zinvalid version ({0})z{0}.{1}r   r`   0c              3  ,   K   | ]  }|d    v   yw)r`   NrO   ).0pre	split_vers     r   	<genexpr>z(get_versioned_doclink.<locals>.<genexpr>	  s     ?SC9Q<'?s   )abdevdevelz
{0}{1}/{2}z7(unable to create versioned doc link for path {0}: {1}))r   Cconfigget_config_valueendswith
startswithansible_versionrh   lenRuntimeErrorrq   anyr   )pathbase_urldoc_versionexr   s       @r   get_versioned_doclinkr      s(    T?De88,,-?@  %OH??38D#))#.	y>A6==oNOO&&y|Yq\B Q<""3'?J??3y>TUCUZ_clmncoZo%""8[$?? eHOOPTV_`bVcddes   C5D 	D2D-'D2-D2c                   t        |       }|j                  d      d   }|j                  |k7  r|j                  |      }g }|D ]D  }|j	                  |      }||k(  r|j                         s+|j                  t        |             F |S )Nr\   )r   rh   stem	with_namewith_suffixexistsrl   r   )r   plugin
extensionsadjacentplugin_base_namepathsext	candidates           r   _find_adjacentr     s    DzH||C(,}}((%%&67E /((-	 LL9-./ Lr    c                   |j                  | dd      }|r|j                  s|dv r|j                  |       \  }}|r|j                  st        d| z  |      t	        |j
                        }|j                  t        j                  vr%t        || t        j                        }|r|d   nd}nt        |      }|t        d	| z        ||fS )
zn  if the plugin lives in a non-python file (eg, win_X.ps1), require the corresponding 'sidecar' file for docs FT)ignore_deprecatedcheck_aliases)filtertestz%s was not found)plugin_load_contextr   NzO%s cannot contain DOCUMENTATION nor does it have a companion documentation file)find_plugin_with_contextresolvedget_with_contextr   r   plugin_resolved_pathsuffixr   DOC_EXTENSIONSr   r   r
   )r   r   loadercontext
plugin_objdocfile	filenamesrs   s           r   find_plugin_docfiler   &  s     --f]a-bG7++@R1R$55f=
G'**#$6&$AW^__7//0G~~Q---"7FA4D4DE	#,9Q<$W%lpvwxxWr    c           	        g }t        | ||      \  }}|j                  }	 t        |||||      }|d   s:t        || t        j                        D ]  }
	 t        |
||||      }|
}|d    n |d   t	        d| d|d      ||d   d	<   ||d   d
<   |j                  |d   d<   |S # t        $ r}	t	        | d|d|	      d }	~	ww xY w# t        $ r}	t	        d| d|d|	      d }	~	ww xY w)N)r   r$   r   z, did not contain a DOCUMENTATION attribute ())orig_excr   zAdjacent file zNo documentation available for rf   rs   
collectionplugin_name)	r   plugin_resolved_collectionr   r   r   r   r   r   resolved_fqcn)r   r   r   rt   r   docsrs   r   r$   r   newfiles              r   get_plugin_docsr   ?  sU   D ,FKHHg88OwXYh  wB  C
 7%h8H8HI 	MGM$Wow`o  ~I  J"7& '		M Aw VU]!^__&Q
 /Q!(!6!6QK-  w X^`h!ituvvw  M(ntv~)  KL  M  MMs/   B* C*	C3CC	C0C++C0rH   )FFNNN)'
__future__r   collections.abcr   r   r   pathlibr   ansibler   r   ansible.releaser	   r   ansible.errorsr
   r   r   ansible.module_utils.sixr   +ansible.module_utils.common.text.convertersr   ansible.parsing.plugin_docsr   ansible.parsing.yaml.loaderr   ansible.utils.displayr   displayr   rK   rS   rW   r   r   r   r   r   r   rO   r    r   <module>r      sr    # G G  " : R R 1 A 6 5 )
) E3PGJOAdT@eD*2!r    