3 =\>@sLddlZddlZddlmZddlmZddlZddlZGddde Z dS)N) ScannerError)PrintMsgc@sheZdZejdZdddZddZddZd d Z e dd d Z ddZ ddZ ddZdddZdS)Lintz^([WER][0-9]*:)cCs6tjt||_tjjggg|_||_|j |_ dS)z Lints templates using cfn_python_lint. Uses config file to define regions and templates to test. Recurses into child templates, excluding submodules. :param config: path to tascat ci config file N) yamlZ safe_loadopen_configcfnlintcoreZ get_rules_rules_path_lintlints)selfconfigpathri/private/var/folders/pf/wv4htv3x0qs2c2mp0dnn0kchsvlck3/T/pip-install-emcbgzcf/taskcat/taskcat/cfn_lint.py__init__ sz Lint.__init__cCs<|jr"d|j|jd|dfSd|jd|dSdS)Nz%s/templates/%stests template_filez templates/%s)r r)rtestrrr_get_template_pathszLint._get_template_pathcCsFd|jd|jkr.|j|jd|dS|j|jddSdS)Nregionsrglobal)rkeys_filter_unsupported_regions)rrrrr_get_test_regionsszLint._get_test_regionscCsTttjj}t|j|r|St|j|}t|j|}ttj d|t |S)NzTThe following regions are not supported by cfn-python-lint and will not be linted %s) setr r ZREGIONSissubset intersection differenceprintrERRORlist)rrZ lint_regions supported unsupportedrrrr%s z Lint._filter_unsupported_regionsFcCsytjjj|Stk rX}z.|sHttjd||j|j j |j j fWYdd}~Xn@t k r}z$|sttjd|t |fWYdd}~XnXdS)Nz9Linter failed to load template %s "%s" line %s, column %sz&Linter failed to load template %s "%s")r decodeZcfn_yamlloadrr"rr#ZproblemZ problem_marklinecolumnFileNotFoundErrorstr)Z template_pathquieterrr_parse_template.s,zLint._parse_templatec CsBi}i}x2|jdjD]}i||<|j|||d<|j|}|||d<||jkrt|j|t|jd||<i||d<||j|t}x||D]}|j|dd}|ry,t j j |||j ||d||d|<Wqt j j k r}z|jtjt|WYdd}~XqXqWx|D]}t|q(WqW|S)Nrrr) parent_pathresultsT)r-)rrrr_get_child_templatesrr addr/r r Z run_checksr ZCfnLintExitExceptionrr#r,r") rrZ templatesrrZ lint_errorsttemplater.rrrr :s.    &* z Lint._lintcCsx|jjD]}x|j|djD]z}t|j|d|dkrZttjd||fnttjd||fx,|j|d|D]}t|j|||qWq$Wq WdS)zd Prints lint results to terminal using taskcat console formatting :return: r1rz'Lint passed for test %s on template %s:z0Lint detected issues for test %s on template %s:N)rrlenr"rINFOr#_format_message)rrr4rrrroutput_resultsUszLint.output_resultsc Cs*|jjd}|d}tjj|ddd}|jdd}d}t|jddkr`|jdd}d|d |d }d ddt|} | jtj dj|jdddd t| d }||}|dkrt j |S|dkrd|dddd|j |d|Dkr&t j |Snt jd|SdS)N[r r:z line z [z] [ EWcSsg|]}|jjdqS)r;)__str__lstrip).0r9rrr ssz(Lint._format_message..r1zlinter produced unkown output: rI)rErFr _code_regexfindallsplitr6jointextwrapwraprr#rr7DEBUG) rmessagerr4ZsevcoderZline_noprefixindentrrrr8ds"2  . zLint._format_messagecCs>|j|}|s|Sx$|djD]}d}|d|ddkr|d|dd}t|trd|jkrt|dtr|djdd}q|dd jdd}qd t|jd kr|d d d}n*t|trd |krd j|jd dd}|r"|jd  r"|rd||f}|j ||j |j |||dq"W|S)NZ ResourcesrTypezAWS::CloudFormation::StackZ PropertiesZ TemplateURLzFn::Sub}r<rzFn::Joinz submodules//r?z%s/%s)r0rIrIrIrJ) r/r isinstancedictr,rMr$rN startswithr3unionr2)rfilenamechildrenr0r5resourceZ child_nameZ template_urlrrrr2xs.      zLint._get_child_templatesN)r)F)r)__name__ __module__ __qualname__recompilerKrrrr staticmethodr/r r:r8r2rrrrr s    r) rOZ cfnlint.corer Z yaml.scannerrZtaskcat.colored_consolerrrcobjectrrrrrs