B ¨:™`,ã@sºdZddlZddlmZddlmZddlmZejrBddl m Z Gdd „d eƒZ ej ej ed œd d „ZejejejejfZejejejejejfZej ejejed œd d„ZdS)z_Functions that expose information about templates that might be interesting for introspection. éNé)Únodes)Ú CodeGenerator)ÚFrame)Ú EnvironmentcsLeZdZdZdddœ‡fdd„ Zeddœdd „Zedd œ‡fd d „ Z‡Z S) ÚTrackingCodeGeneratorz.We abuse the code generator for introspection.rN)Ú environmentÚreturncstƒ |dd¡tƒ|_dS)Nz)ÚsuperÚ__init__ÚsetÚundeclared_identifiers)Úselfr)Ú __class__©ú>> from jinja2 import Environment, meta >>> env = Environment() >>> ast = env.parse('{% set foo = 42 %}{{ bar + foo }}') >>> meta.find_undeclared_variables(ast) == {'bar'} True .. admonition:: Implementation Internally the code generator is used for finding undeclared variables. This is good to know because the code generator might raise a :exc:`TemplateAssertionError` during compilation and as a matter of fact this function can currently raise that exception as well. )rrÚvisitr )r%ZcodegenrrrÚfind_undeclared_variables!s  r'ccsØxÒ| t¡D]Ä}|j}t|tjƒsvt|tjtjfƒrnx>|jD],}t|tjƒrbt|j t ƒrh|j Vq>> from jinja2 import Environment, meta >>> env = Environment() >>> ast = env.parse('{% extends "layout.html" %}{% include helper %}') >>> list(meta.find_referenced_templates(ast)) ['layout.html', None] This function is useful for dependency tracking. For example if you want to rebuild parts of the website after a layout template has changed. N)Zfind_allÚ _ref_typesÚtemplateÚ isinstancerZConstÚTupleÚListrÚvaluer#ÚIncludeÚtupleÚlist)r%Únoder)Z template_namerrrÚfind_referenced_templates=s&           r2)r"ÚtypingÚtÚrÚcompilerrrÚ TYPE_CHECKINGrrrÚTemplateÚSetr#r'ZExtendsZ FromImportÚImportr.r(ÚUnionZ_RefTypeÚIteratorÚOptionalr2rrrrÚs