
    Vh/                       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mZ ddl	Z	ddl
mZmZmZmZ ddl
mZmZmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ d ZddZddZd Z d Z!d Z"ddZ#d Z$e%dk(  r e$        yy)zaSchema validation of ansible-core's ansible_builtin_runtime.yml and collection's meta/runtime.yml    )annotationsN)partial)AllAnyMultipleInvalidPREVENT_EXTRA)RequiredSchemaInvalid)humanize_error)StrictVersionLooseVersion)string_types)AnsibleCollectionRef)SemanticVersionc                |    t        | t              st        d      t        j                  |       st        d      | S )zValidate a FQCR.zMust be a string that is a FQCRzMust be a FQCR)
isinstancer   r   r   is_valid_fqcrvalues    p/home/dcms/DCMS/lib/python3.12/site-packages/ansible_test/_util/controller/sanity/code-smell/runtime-metadata.pyfqcrr      s7    e\*788--e4&''L    c                   t        | t        j                        r| }nmd}t        | t              st	        |      t        j                  d|       st	        |      	 t        j                  j                  | d      j                         }t        j                  j                         }|r||k  rt	        d|d|d      | S |r||kD  rt	        d|d|d      | S # t        $ r t	        |      w xY w)	z1Validate a datetime.date or ISO 8601 date string.z8Expected ISO 8601 date string (YYYY-MM-DD), or YAML datez^[0-9]{4}-[0-9]{2}-[0-9]{2}$z%Y-%m-%dzThe tombstone removal_date (z) must not be after today ()zThe deprecation removal_date (z) must be after today ()
r   datetimedater   r   rematchstrptime
ValueErrortoday)r   check_deprecation_dateis_tombstoneremoval_datemsgr"   s         r   isodater'       s     %' I%.#, xx6>#,	#,,55eZHMMOL MM!E<R^`efh h L "el&:P\^cdf fL  	#,	s   .C C4c                   |rdnd}t        | t              st        |      	 |r't               }|j	                  |        t        |       }nWt               }|j	                  |        |j                  dk7  r-|j                  dk7  s|j                  dk7  rt        d| d      |0|r||kD  r)t        d| d|d      ||k  rt        d	| d
|d      | S # t        $ r t        |      w xY w)z"Validate a removal version string.z Removal version must be a stringz@Removal version must be a semantic version (https://semver.org/)r   zremoval_version (zb) must be a major release, not a minor or patch release (see specification at https://semver.org/)zThe tombstone removal_version (z)) must not be after the current version (r   z!The deprecation removal_version (z%) must be after the current version ()r   r   r   r   parser   r   majorminorpatchr!   )r   
is_ansiblecurrent_versionr$   r&   versions         r   removal_versionr0   B   s    /9*J  e\*cl#oGMM% "5)G%'GMM% }}!w}}'9W]]a=ONSW X X&_,!<A?#T U U o-!<A?#T U U L  cls   B2C C,c                    | S )zAccepts anything. r   s    r   	any_valuer3   e   s    Lr   c                 f    ddl m}  t        dj                  | j	                  d      dd             S )z#Return current ansible-core versionr   __version__.N   )ansible.releaser6   r   joinsplitr5   s    r   get_ansible_versionr<   j   s+    +!2!23!7!;<==r   c            	     t   ddl } t        j                  j                  t        j                  j	                  t        j                  j	                  t        j                  j	                  t
                          dd      }| j                  j                  d|      }| j                  j                  |      }|t        j                  d<   |j                  j                  |       	 |j                  d      xs |j                  d      }t               }|j!                  |d          |S # t"        $ r Y yw xY w)zAReturn current collection version, or None if it is not availabler   Ntoolszcollection_detail.pycollection_detailr7   r/   )importlib.utilospathr:   dirname__file__utilspec_from_file_locationmodule_from_specsysmodulesloaderexec_moduleread_manifest_jsonread_galaxy_ymlr   r)   	Exception)	importlibcollection_detail_pathcollection_detail_specr?   resultr/   s         r   get_collection_versionrS   q   s    WW\\"''//"''//"''//ZbJc:d*egn  qG  H&^^CCDWYop!778NO'8CKK#$!!--.?@"55c:d>O>_>_`c>d!#fY'(  s   'AD+ +	D76D7c                ,	   	 t        | dd      5 }t        j                  |      }ddd       |rt               }n
t               }t        t!        t#        d
      t$        dt$        it#        d      t$        dt$        i      t&              }t)        t        t+        t,        ||      t+        t.        |      t!        t0         d      |      }t)        t        t+        t,        ||d      t+        t.        d      t!        t0         d      |      }	t        t!        |      t!        |	      t2        dt&              }
t!        |
      }t!        |
j5                  dt2        i            }t!        |
j5                  dt!        t0         i            }t0        D cg c]  }||i }}t0        D cg c]  }||i }}t0        D cg c]  }||i }}t        i dt!        dg| dt!        dg| dt!        dg| dt!        dg| dt!        dg| dt!        dg| dt!        dg| dt!        dg| dt!        dg| d t!        dg| d!t!        dg| d"t!        dg| d#t!        dg| d$t!        dg| d%t!        dg| d&t!        dg| d't!        dg| t!        dg| t!        dg| d(t&              }t!        t        dt!        t0         it&                    }t0        D cg c]  }||i }}t        t!        |      t!        dg| t!        t0         t6        d)t&              }	  |       y# 1 sw Y   )xY w# t        j                  j                  $ r}t        d| |j                  r|j                  j                  dz   nd|j                  r|j                  j                  dz   ndt        j                  dd	t        |            fz         Y d}~yd}~wt        $ r:}t        d| ddt        j                  dd	t        |            fz         Y d}~yd}~ww xY wc c}w c c}w c c}w c c}w # t8        $ r7}|j:                  D ]  }t        d*| ddt=        |      fz           Y d}~yd}~ww xY w)+z'Validate explicit runtime metadata filerzutf-8)encodingNz%s:%d:%d: YAML load failed: %s   r   z\s+ r0   warning_textr%   )extra)r-   r.   )r#   )r0   r%   rY   T)r-   r.   r$   )r$   )deprecation	tombstoneredirectaction_pluginr]   actionbecomecachecallbackcliconf
connectiondoc_fragmentsfilterhttpapi	inventorylookupmodule_utilsrI   netconfshellstrategyterminal)testvars)plugin_routingimport_redirectionrequires_ansibleaction_groups%s:%d:%d: %s)openyaml	safe_loaderrorMarkedYAMLErrorprintcontext_marklinecolumnr   substrrN   r<   rS   r
   r   r	   r3   r   r   r   r0   r'   r   r   extenddictr   errorsr   )rB   r-   check_deprecation_datesf_pathroutingexr.   avoid_additional_datadeprecation_schematombstoning_schemaplugins_routing_common_schemaplugin_routing_schemaplugin_routing_schema_modulesplugin_routing_schema_mustr_typelist_dict_plugin_routing_schema"list_dict_plugin_routing_schema_mu'list_dict_plugin_routing_schema_modulesplugin_schemaimport_redirection_schema#list_dict_import_redirection_schemaschemary   s                          r   validate_metadata_filer      s   $g. 	-&nnV,G	- -/02 #*+Y	
 ()			
  #*?z;J$L 'H_ ` #\ 2		
 	 #*?z;JY]$_ 'd C #\ 2		
 	 %+/0-., 	%!   => %(%,,t.% 	
%!  #%,,#|,.. 	
  8D'E+3 )12G'H 'E# 'E ;G*H.6 ,45M*N *H& *H @L/M3; 19:W/X /M+ /M  	C?>?	C?>? 
3t>=> 
c$A!@A	
 
S@ ?@ 
DC#BC 
3tF&EF 
C?>? 
S@ ?@ 
s4B"AB 
C?>? 
#dH%GH 
SH GH 
S@ ?@ 
3t>=>  
c$A!@A!" 
c$A!@A#$ d=<=d=<='( )M0 !$#|,
 	 ! <H+I/7 -56O+P +I' +I
 . #D O+N O!<0 FQw_	- 	-::%% .(*BOO  1$Q*,//BOO""Q&qFF63B(	2
 
 	 	 .$1bffVSRUVXRY>Z1[[\X'E*H/MD+I$  QYY 	QE.D!Qw0N#OOP	QQsj   M MM P?(Q=Q	?QQ MM P<7A:O66P<0P77P<	R-RRc            	         t         j                  dd xs, t         j                  j                         j	                         } d}d}d}| D ]/  }||k(  rt        d|ddd|z  fz         t        ||||fv|	       1 y)
zMain entry point.rW   Nzmeta/routing.ymlzmeta/runtime.ymlFru   r   zShould be called '%s')r-   r   )rH   argvstdinread
splitlinesr{   r   )pathscollection_legacy_filecollection_runtime_filer   rB   s        r   mainr      s    HHQRL9CIINN,779E/0
 $ =)).D!Q1HKb1b#dde$:<S#TT$;	==r   __main__)FF)NF)F)&__doc__
__future__r   r   rA   r   rH   	functoolsr   rw   
voluptuousr   r   r   r   r	   r
   r   voluptuous.humanizer   #ansible.module_utils.compat.versionr   r   ansible.module_utils.sixr   ansible.utils.collection_loaderr   ansible.utils.versionr   r   r'   r0   r3   r<   rS   r   r   __name__r2   r   r   <module>r      sy    g "  	 	 
   ? ? 0 0 . K 1 @ 1D F
>,VQr=. zF r   