3 Dใ\.!ใ@svdZddlZddlZddlmZddlZejeƒZGdd„de ƒZ dd„Z dd „Z d d „Z e eƒZe eƒZe eƒZdS) aผ Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ้N)ฺdeepcopyc@seZdZdZdS)ฺTemplateAttributeErrorz: Custom error to capture Attribute Errors in the Template N)ฺ__name__ฺ __module__ฺ __qualname__ฺ__doc__ฉrr๚m/private/var/folders/pf/wv4htv3x0qs2c2mp0dnn0kchsvlck3/T/pip-install-emcbgzcf/cfn-lint/cfnlint/decode/node.pyrsrcs$G‡fdd„dˆƒ}dˆj|_|S)z" Create string node class cs@eZdZdZ‡fdd„Z‡fdd„Zdd„Zdd „Zd d „Zd S) z)create_str_node_class..node_classz+Node class created based on the input classc s@yˆj||ƒWntk r.ˆj|ƒYnX||_||_dS)N)ฺ__init__ฺ TypeErrorฺ start_markฺend_mark)ฺselfฺxr r )ฺclsrr r #s z2create_str_node_class..node_class.__init__csBtjdkrˆj||ƒSt|tjƒr6ˆj||jddƒƒSˆj||ƒS)N้rฺasciiฺignore)rr)ฺsysฺ version_infoฺ__new__ฺ isinstanceฺsixฺ string_typesฺencode)rrr r )rrr r,s    z1create_str_node_class..node_class.__new__cSstd|jj|fƒ‚dS)Nz%s.%s is invalid)rฺ __class__r)rฺnamerrr ฺ __getattr__5sz5create_str_node_class..node_class.__getattr__cSs t||j|jƒ}||t|ƒ<|S)N)ฺstr_noder r ฺid)rฺmemoฺresultrrr ฺ __deepcopy__8s z6create_str_node_class..node_class.__deepcopy__cSs|S)Nr)rrrr ฺ__copy__=sz2create_str_node_class..node_class.__copy__N) rrrrr rrr"r#r)rrr ฺ node_class!s  r$z%s_node)r)rr$r)rr ฺcreate_str_node_classs r%cs&G‡‡fdd„dˆƒ‰dˆjˆ_ˆS)z# Create dynamic node class cspeZdZdZ‡fdd„Zdd„Zdd„Zdd d „Zd‡‡fd d „ Zddffd d„Z dffdd„Z dd„Z ‡Z S)z*create_dict_node_class..node_classz+Node class created based on the input classc sHyˆj||ƒWntk r.ˆj|ƒYnX||_||_dg|_dS)NzFn::If)r r r r ฺcondition_functions)rrr r )rrr r Jsz3create_dict_node_class..node_class.__init__cSsHt||j|jƒ}||t|ƒ<x&|jƒD]\}}t||ƒ|t|ƒ<q&W|S)N)ฺ dict_noder r rฺitemsr)rr r!ฺkฺvrrr r"Ss  z7create_dict_node_class..node_class.__deepcopy__cSs|S)Nr)rrrr r#[sz3create_dict_node_class..node_class.__copy__NcSsˆ|pi}t|ƒdkr„xn|jƒD]b\}}|dkrt|tƒrt|ƒdkr|d}t|tƒrt|ƒdkrx|jƒD]}|dkrldSqlWqWdS)a> Check if an object is using a function that could return an object Return True when Fn::Select: - 0 # or any number - !FindInMap [mapname, key, value] # or any mapname, key, value Otherwise False ้๚ Fn::Select้z Fn::FindInMapTF)r,)ฺlenr(rฺlistฺdictฺkeys)rZmappingsr)r*Zp_vZl_krrr ฺis_function_returning_object^s       zGcreate_dict_node_class..node_class.is_function_returning_objectcs,t|tƒrt||j|jƒ}tˆ|ƒj||ƒS)z Override the default get )rr0r'r r ฺsuperฺget)rฺkeyฺdefault)rr$rr r4vs z.create_dict_node_class..node_class.getc SsŠ|pg}|j||ƒ}t|tƒsFt||ƒs.| rF||dd…|gfgSg}x:|j||gƒD]&\}}t||ƒst| r\|j||fƒq\W|S)z2 Get values in format N)r4rr0ฺ items_safeฺappend) rr5r6ฺpathฺtype_tฺvalueฺresultsZsub_vZsub_pathrrr ฺget_safe|s  z3create_dict_node_class..node_class.get_safec ss’|pg}t|ƒdkrhxt|jƒD]>\}}|dkr,t|tƒrbt|ƒdkrbxุt|dd…ƒD]ฤ\}}t|tƒrผxฐ|j|dd…||dgƒD]"\}}t||ƒsฌ| r”||fVq”Wqbt|tƒr๖t||ƒsึ| r๔||dd…||dgfVqbt||ƒs| rb||dd…||dgfVqbWq"|dko<|dks"t||ƒsP| r"||dd…fVq"Wn&t||ƒs|| rŽ||dd…fVdS)zGet items while handling IFsr+zFn::IfrNZRefz AWS::NoValue)r.r(rr/ฺ enumerater0r7) rr9r:r)r*ฺiZif_vr(ฺprrr r7s*   (  $z5create_dict_node_class..node_class.items_safecSstd|jj|fƒ‚dS)Nz%s.%s is invalid)rrr)rrrrr rฉsz6create_dict_node_class..node_class.__getattr__)N)N) rrrrr r"r#r2r4r=r7rฺ __classcell__r)rr$)rr r$Hs  r$z%s_node)r)rr)rr$r ฺcreate_dict_node_classDsd rBcs$G‡fdd„dˆƒ}dˆj|_|S)z# Create dynamic list class csBeZdZdZ‡fdd„Zdd„Zdd„Zdffd d „Zd d „ZdS) z*create_dict_list_class..node_classz+Node class created based on the input classc sHyˆj||ƒWntk r.ˆj|ƒYnX||_||_dg|_dS)NzFn::If)r r r r r&)rrr r )rrr r ถsz3create_dict_list_class..node_class.__init__cSsFtg|j|jƒ}||t|ƒ<x$t|ƒD]\}}|jt||ƒƒq&W|S)N)ฺ list_noder r rr>r8r)rr r!ฺ_r*rrr r"ฟs  z7create_dict_list_class..node_class.__deepcopy__cSs|S)Nr)rrrr r#วsz3create_dict_list_class..node_class.__copy__Ncss–|pg}xˆt|ƒD]|\}}t|tƒrfxh|j|dd…|gƒD]"\}}t||ƒsV| r>||fVq>Wqt||ƒsv| r||dd…|gfVqWdS)zGet items while handling IFsN)r>rr0r7)rr9r:r?r*r(r@rrr r7สs "z5create_dict_list_class..node_class.items_safecSstd|jj|fƒ‚dS)Nz%s.%s is invalid)rrr)rrrrr rึsz6create_dict_list_class..node_class.__getattr__) rrrrr r"r#r7rr)rrr r$ดs   r$z%s_node)r)rr$r)rr ฺcreate_dict_list_classฐs% rE)rrฺloggingฺcopyrrฺ getLoggerrฺLOGGERฺAttributeErrorrr%rBrEฺstrrr0r'r/rCrrrr ฺs  'l-