
    Vht#                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZ	ddl
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
 Z G d de      Zej3                  dej4                         ej3                  dej6                         ej3                  dej6                          G d deee      Z G d d      Zedk(  r e        yy)GWrapper around yamllint that supports YAML embedded in Ansible modules.    )annotationsN)Resolver)SafeConstructor)MarkedYAMLError)CParser)linter)YamlLintConfigc                     t         j                  dd xs, t         j                  j                         j	                         } t               }|j                  |        |j                          y)zMain program body.   N)sysargvstdinread
splitlinesYamlCheckercheckreport)pathscheckers     h/home/dcms/DCMS/lib/python3.12/site-packages/ansible_test/_util/controller/sanity/yamllint/yamllinter.pymainr      sG    HHQRL9CIINN,779EmGMM%NN    c                      e Zd ZdZd Zy)TestConstructorz4Yaml Safe Constructor that knows about Ansible tags.c                    	 t        |dd      }|t        | d|z        } ||      }|S # t        $ r | j                  }Y !w xY w)zConstruct an unsafe tag.idobjectzconstruct_%s)getattrAttributeErrorconstruct_object)selfnodeconstructorvalues       r   construct_yaml_unsafez%TestConstructor.construct_yaml_unsafe    sY    	0!$h7K&%dN[,HI D!  	0//K	0s   * AAN)__name__
__module____qualname____doc__r&    r   r   r   r      s
    >r   r   z!unsafez!vaultz!vault-encryptedc                      e Zd ZdZd Zy)
TestLoaderz7Custom YAML loader that recognizes custom Ansible tags.c                    t        j                  | |       t        j                  |        t        j                  |        y N)r   __init__r   r   )r"   streams     r   r0   zTestLoader.__init__?   s.    v&  &$r   N)r'   r(   r)   r*   r0   r+   r   r   r-   r-   =   s
    A r   r-   c                  T    e Zd ZdZd Zd Zd Zd Zd ZddZ	e
dd       Zd	 Zd
 Zy)r   r   c                    g | _         y r/   messages)r"   s    r   r0   zYamlChecker.__init__G   s	    r   c                r    t        | j                        }t        t        j                  |dd             y)z Print yamllint report to stdout.r4      T)indent	sort_keysN)dictr5   printjsondumps)r"   r   s     r   r   zYamlChecker.reportJ   s*    ]]
 	djjT:;r   c                <   t         j                  j                  t         j                  j                  t         j                  j	                  t
                    d      }t        t         j                  j                  |d            }t        t         j                  j                  |d            }t        t         j                  j                  |d            }|D ]  }t         j                  j                  |      d   }t        |d      5 }|j                         }	d	d	d	       |d
v r| j                  ||	       c|dk(  r;|j                  d      s|j                  d      r|}
n|}
| j                  |
|	       t        d|z         y	# 1 sw Y   qxY w)zCheck the specified paths.configzdefault.yml)filezmodules.ymlzplugins.ymlr   zutf-8)encodingN)z.ymlz.yamlz.pylib/ansible/modules/zplugins/modules/zunsupported extension: %s)ospathjoindirnameabspath__file__r
   splitextopenr   
check_yaml
startswithcheck_module	Exception)r"   r   config_path	yaml_confmodule_confplugin_confrD   	extensionr@   contentsconfs              r   r   zYamlChecker.checkR   s:   ggll277??277??83L#MxX"[-(PQ	$"'',,{M*RS$"'',,{M*RS 	ID((.q1IdW- '99;' --	4:e#??#9:dooN`>a&D&D!!$h7 ;i GHH!	I' 's   FF	c           	         | j                  ||       | xj                  t        j                  |||      D cg c]  }| j	                  ||       c}z  c_        yc c}w )zCheck the given YAML.N)check_parsabler5   r	   runresult_to_message)r"   rU   rD   rT   rs        r   rK   zYamlChecker.check_yamll   sJ    D(+6::hX\^bCcda$00D9ddds   Ac                   | j                  ||      }|j                         D ]  \  }}|d   }|d   }|d   }	|	dk7  r|j                  d      r
|dd }|dz  }dg}
| j                  |||||
v |       t	        t        j                  |||            }| xj                  |D cg c]  }| j                  |||dz
  |       c}z  c_         yc c}w )zCheck the given module.yamllinenofmt
r   NEXAMPLES)	get_module_docsitemsrL   rW   listr	   rX   r5   rY   )r"   rU   rD   rT   docskeyr%   	yaml_datar]   r^   multiple_docs_allowedr5   rZ   s                r   rM   zYamlChecker.check_moduleq   s    ##D(3**, 	bJCfI8_F,Cf}##D)%abM	! %! i#AV:VY\]FJJy$=>HMMX`aSTd44Qfqj#NaaM'	b& bs   #C
c           
        |r| dnd}	 t        t        t        j                  |t                          }|dkD  r$|s!| xj
                  d| d||dddgz  c_        yyy# t        $ rv}| xj
                  d	| |j                  d
    d|j                  d    ||j                  j                  |z   |j                  j                  dz   ddgz  c_        Y d}~yd}~ww xY w)z>Check the given contents to verify they can be parsed as YAML.z:  )Loaderr   zmultiple-yaml-documentsz(expected a single document in the streamerrorcodemessagerD   linecolumnlevelzunparsable-with-libyamlr   z -    N)lenrc   r\   load_allr-   r5   r   argsproblem_markro   rp   )r"   rD   rT   r]   allow_multipleprefix	documentsexs           r   rW   zYamlChecker.check_parsable   s    "(F82b	"Dx
!KLMI1}^+D178`.a+/+1-.,3#% "& & &4}  	"MM'@-3HRWWQZLBGGAJ<*P'+')';';f'D)+)?)?!)C(/! " "MM	"s   AA" "	C!+A,CC!c                    |rd|z  }t        | j                  xs | j                  || j                  z   || j                  |z   | j
                  | j                        S )z7Convert the given result to a dictionary and return it.z%s: rl   )r:   rulerq   descro   rp   )resultrD   line_offsetrx   s       r   rY   zYamlChecker.result_to_message   sV     f_F,V[[({*==,,
 	
r   c                  
 g d}i 
t        j                  d      d

fd	}| j                  ||      }|si S |j                  d      xs$ |j                  d      xs |j                  d      }|j                  d      xs |j                  d      }|r9|s7|j                  D ]&  }t        |t        j                        s |||       ( 
S |rb|j                  D ]Q  }t        |t        j                        s|j                  D ]%  }	t        |	t        j                        s ||	       ' S 
S t        d	|z        )z>Return the module documentation for the given module contents.)DOCUMENTATIONr`   RETURNz^# fmt:\s+(\S+)c           
        | j                   D ]  }t        |t        j                        s|r|j                  |vr/j                  | j                  j                  j                               }d}|r|j                  d      }t        | j                  j                  | j                  | j                  t        | j                  j                  j                               z   |j                               |j                  <    y)z9Check the given statement for a documentation assignment.r\   r   )r\   r]   
end_linenor^   N)targets
isinstanceastNamer   matchr%   lstripgroupr:   r]   rs   r   lower)	statement	doc_typestarget	fmt_matchr^   rd   fmt_res        r   check_assignmentz5YamlChecker.get_module_docs.<locals>.check_assignment   s    #++ !&#((3)!;"LL)>)>)E)E)GH	#//!,C"&"..$++(//#ioo6K6K6V6V6X2YY			#VYYr   rB   zlib/ansible/plugins/zplugins/z"lib/ansible/plugins/doc_fragments/zplugins/doc_fragments/zunsupported path: %sr/   )
recompileparse_modulerL   bodyr   r   AssignClassDefrN   )r"   rD   rT   module_doc_typesr   
module_ast	is_pluginis_doc_fragmentbody_statementclass_statementrd   r   s             @@r   ra   zYamlChecker.get_module_docs   sF   
 ./	* &&tX6
IOO$:;  FtOe?f  Fjnjyjy  {E  kF	//*NO|SWSbSbc{S|_",// Gncjj9$^5EFG  ",// >ncll;+9+>+> >%oszzB,_=>>  2T9::r   c                p   	 t        j                  |      S # t        $ rQ}| j                  j	                  t        dt        |      ||j                  |j                  d             Y d}~yd}~wt        $ r=}| j                  j	                  t        dt        |      |ddd             Y d}~yd}~ww xY w)zRParse the given contents and return a module if successful, otherwise return None.zpython-syntax-errorrk   rl   Nzpython-parse-errorr   )
r   parseSyntaxErrorr5   appendr:   strr]   offsetrN   )r"   rD   rT   rz   s       r   r   zYamlChecker.parse_module   s    	99X&& 	MM  *BYYyy"  $   	MM  )B"   	s!    	B5AA,,B583B00B5N)r   Fri   )r   ri   )r'   r(   r)   r*   r0   r   r   rK   rM   rW   staticmethodrY   ra   r   r+   r   r   r   r   E   sE    Q<I4e
b2", 
 
6pr   r   __main__)r*   
__future__r   r   r<   rC   r   r   typingtr\   yaml.resolverr   yaml.constructorr   
yaml.errorr   
yaml.cyamlr   yamllintr	   yamllint.configr
   r   r   add_constructorr&   construct_yaml_strr-   r   r'   r+   r   r   <module>r      s    M " 
  	 	 
   " , &   *o     ))+
   &&(
   &&(
 /8  y yx zF r   