# dependencies URL: /api/analysis/dependencies/ Section: analysis -------------------------------------------------------------------------------- dependencies - Kida window.BENGAL_THEME_DEFAULTS = { appearance: 'light', palette: 'brown-bengal' }; window.Bengal = window.Bengal || {}; window.Bengal.enhanceBaseUrl = '/kida/assets/js/enhancements'; window.Bengal.watchDom = true; window.Bengal.debug = false; window.Bengal.enhanceUrls = { 'toc': '/kida/assets/js/enhancements/toc.632a9783.js', 'docs-nav': '/kida/assets/js/enhancements/docs-nav.57e4b129.js', 'tabs': '/kida/assets/js/enhancements/tabs.aac9e817.js', 'lightbox': '/kida/assets/js/enhancements/lightbox.1ca22aa1.js', 'interactive': '/kida/assets/js/enhancements/interactive.fc077855.js', 'mobile-nav': '/kida/assets/js/enhancements/mobile-nav.d991657f.js', 'action-bar': '/kida/assets/js/enhancements/action-bar.d62417f4.js', 'copy-link': '/kida/assets/js/enhancements/copy-link.7d9a5c29.js', 'data-table': '/kida/assets/js/enhancements/data-table.1f5bc1eb.js', 'lazy-loaders': '/kida/assets/js/enhancements/lazy-loaders.a5c38245.js', 'holo': '/kida/assets/js/enhancements/holo.ee13c841.js', 'link-previews': '/kida/assets/js/enhancements/link-previews.8d906535.js' }; (function () { try { var defaults = window.BENGAL_THEME_DEFAULTS || { appearance: 'system', palette: '' }; var defaultAppearance = defaults.appearance; if (defaultAppearance === 'system') { defaultAppearance = (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'; } var storedTheme = localStorage.getItem('bengal-theme'); var storedPalette = localStorage.getItem('bengal-palette'); var theme = storedTheme ? (storedTheme === 'system' ? defaultAppearance : storedTheme) : defaultAppearance; var palette = storedPalette ?? defaults.palette; document.documentElement.setAttribute('data-theme', theme); if (palette) { document.documentElement.setAttribute('data-palette', palette); } } catch (e) { document.documentElement.setAttribute('data-theme', 'light'); } })(); { "prerender": [ { "where": { "and": [ { "href_matches": "/docs/*" }, { "not": { "selector_matches": "[data-external], [target=_blank], .external" } } ] }, "eagerness": "conservative" } ], "prefetch": [ { "where": { "and": [ { "href_matches": "/*" }, { "not": { "selector_matches": "[data-external], [target=_blank], .external" } } ] }, "eagerness": "conservative" } ] } Skip to main content Magnifying Glass ESC Recent Clear Magnifying Glass No results for "" Start typing to search... ↑↓ Navigate ↵ Open ESC Close Powered by Lunr )彡 DocumentationInfoAboutArrow ClockwiseGet StartedCodeSyntaxTerminalUsageNoteTutorialsStarburstExtendingBookmarkReferenceTroubleshootingReleasesDevGitHubKida API Reference Magnifying Glass Search ⌘K Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal List )彡 Magnifying Glass Search X Close Documentation Caret Down Info About Arrow Clockwise Get Started Code Syntax Terminal Usage Note Tutorials Starburst Extending Bookmark Reference Troubleshooting Releases Dev Caret Down GitHub Kida API Reference Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal Kida API Reference Caret Right Analysis analyzer cache config dependencies landmarks metadata purity roles Caret Right Compiler Caret Right Statements basic control_flow functions special_blocks template_structure variables _protocols coalescing core expressions utils Caret Right Environment core exceptions filters loaders protocols registry tests Caret Right Parser Caret Right Blocks control_flow core functions special_blocks template_structure variables _protocols core errors expressions statements tokens Caret Right Utils html lru_cache workers _types bytecode_cache kida lexer nodes template tstring Kida API ReferenceAnalysis ᗢ Caret Down Link Copy URL External Open LLM text Copy Copy LLM text Share with AI Ask Claude Ask ChatGPT Ask Gemini Ask Copilot Module analysis.dependencies Dependency analysis for template introspection. Extracts context variable dependencies from AST expressions and blocks. Produces a conservative superset — may include unused paths but never excludes paths that are actually used. 1Class Classes DependencyWalker 66 ▼ Extract context variable dependencies from AST expressions. Walks the AST and collects all context… Extract context variable dependencies from AST expressions. Walks the AST and collects all context paths (e.g., "page.title", "site.pages") that an expression or block may access. Produces a conservative superset: may include paths not actually used at runtime, but never excludes paths that are used. Thread-safe: Creates new state for each analyze() call. Scope Handling: Loop variables ({% for x in items %}) are excluded With bindings ({% with expr as x %}) are excluded Function arguments ({% def fn(x) %}) are excluded Set/let assignments create local scope Methods analyze 1 frozenset[str] ▼ Analyze a node and return all context dependencies. def analyze(self, node: Node) -> frozenset[str] Parameters Name Type Description node — AST node to analyze (Block, Template, expression, etc.) Returns frozenset[str] Frozen set of context paths (e.g., {"page.title", "site.pages"}) Internal Methods 65 ▼ __init__ 0 ▼ Initialize walker (stateless until analyze() is called). def __init__(self) -> None _visit 1 ▼ Visit a node and its children. def _visit(self, node: Any) -> None Parameters Name Type Description node — _visit_children 1 ▼ Visit all child nodes (generic handler). def _visit_children(self, node: Any) -> None Parameters Name Type Description node — _visit_name 1 ▼ Handle variable reference. def _visit_name(self, node: Any) -> None Parameters Name Type Description node — _visit_getattr 1 ▼ Handle attribute access: obj.attr def _visit_getattr(self, node: Any) -> None Parameters Name Type Description node — _visit_optionalgetattr 1 ▼ Handle optional attribute access: obj?.attr def _visit_optionalgetattr(self, node: Any) -> None Parameters Name Type Description node — _visit_getitem 1 ▼ Handle subscript access: obj[key] def _visit_getitem(self, node: Any) -> None Parameters Name Type Description node — _visit_optionalgetitem 1 ▼ Handle optional subscript access: obj?[key] def _visit_optionalgetitem(self, node: Any) -> None Parameters Name Type Description node — _visit_for 1 ▼ Handle for loop: push loop variable into scope. def _visit_for(self, node: Any) -> None Parameters Name Type Description node — _visit_asyncfor 1 ▼ Handle async for loop (same as regular for). def _visit_asyncfor(self, node: Any) -> None Parameters Name Type Description node — _visit_while 1 ▼ Handle while loop. def _visit_while(self, node: Any) -> None Parameters Name Type Description node — _visit_with 1 ▼ Handle with block: {% with x = expr %}...{% end %} def _visit_with(self, node: Any) -> None Parameters Name Type Description node — _visit_withconditional 1 ▼ Handle conditional with: {% with expr as target %} def _visit_withconditional(self, node: Any) -> None Parameters Name Type Description node — _visit_def 1 ▼ Handle function definition: push args into scope. def _visit_def(self, node: Any) -> None Parameters Name Type Description node — _visit_macro 1 ▼ Handle macro definition (same as def). def _visit_macro(self, node: Any) -> None Parameters Name Type Description node — _visit_set 1 ▼ Handle set statement. def _visit_set(self, node: Any) -> None Parameters Name Type Description node — _visit_let 1 ▼ Handle let statement (template-scoped). def _visit_let(self, node: Any) -> None Parameters Name Type Description node — _visit_export 1 ▼ Handle export statement. def _visit_export(self, node: Any) -> None Parameters Name Type Description node — _visit_capture 1 ▼ Handle capture block: {% capture name %}...{% end %} def _visit_capture(self, node: Any) -> None Parameters Name Type Description node — _visit_filter 1 ▼ Handle filter expression. def _visit_filter(self, node: Any) -> None Parameters Name Type Description node — _visit_pipeline 1 ▼ Handle pipeline expression: expr |> filter1 |> filter2 def _visit_pipeline(self, node: Any) -> None Parameters Name Type Description node — _visit_funccall 1 ▼ Handle function call. def _visit_funccall(self, node: Any) -> None Parameters Name Type Description node — _visit_nullcoalesce 1 ▼ Handle null coalescing: a ?? b def _visit_nullcoalesce(self, node: Any) -> None Parameters Name Type Description node — _visit_condexpr 1 ▼ Handle conditional expression: a if cond else b def _visit_condexpr(self, node: Any) -> None Parameters Name Type Description node — _visit_boolop 1 ▼ Handle boolean operations: a and b, a or b def _visit_boolop(self, node: Any) -> None Parameters Name Type Description node — _visit_binop 1 ▼ Handle binary operations: a + b, a - b, etc. def _visit_binop(self, node: Any) -> None Parameters Name Type Description node — _visit_unaryop 1 ▼ Handle unary operations: -a, not a def _visit_unaryop(self, node: Any) -> None Parameters Name Type Description node — _visit_compare 1 ▼ Handle comparisons: a < b < c def _visit_compare(self, node: Any) -> None Parameters Name Type Description node — _visit_range 1 ▼ Handle range literal: start..end or start...end def _visit_range(self, node: Any) -> None Parameters Name Type Description node — _visit_slice 1 ▼ Handle slice expression: [start:stop:step] def _visit_slice(self, node: Any) -> None Parameters Name Type Description node — _visit_concat 1 ▼ Handle string concatenation: a ~ b ~ c def _visit_concat(self, node: Any) -> None Parameters Name Type Description node — _visit_list 1 ▼ Handle list literal: [a, b, c] def _visit_list(self, node: Any) -> None Parameters Name Type Description node — _visit_tuple 1 ▼ Handle tuple literal: (a, b, c) def _visit_tuple(self, node: Any) -> None Parameters Name Type Description node — _visit_dict 1 ▼ Handle dict literal: {a: b, c: d} def _visit_dict(self, node: Any) -> None Parameters Name Type Description node — _visit_test 1 ▼ Handle test expression: x is defined def _visit_test(self, node: Any) -> None Parameters Name Type Description node — _visit_match 1 ▼ Handle match statement. def _visit_match(self, node: Any) -> None Parameters Name Type Description node — _visit_cache 1 ▼ Handle cache block: {% cache key %}...{% end %} def _visit_cache(self, node: Any) -> None Parameters Name Type Description node — _visit_include 1 ▼ Handle include statement. def _visit_include(self, node: Any) -> None Parameters Name Type Description node — _visit_import 1 ▼ Handle import statement. def _visit_import(self, node: Any) -> None Parameters Name Type Description node — _visit_fromimport 1 ▼ Handle from...import statement. def _visit_fromimport(self, node: Any) -> None Parameters Name Type Description node — _visit_if 1 ▼ Handle if statement. def _visit_if(self, node: Any) -> None Parameters Name Type Description node — _visit_output 1 ▼ Handle output: {{ expr }} def _visit_output(self, node: Any) -> None Parameters Name Type Description node — _visit_block 1 ▼ Handle block: {% block name %}...{% end %} def _visit_block(self, node: Any) -> None Parameters Name Type Description node — _visit_extends 1 ▼ Handle extends: {% extends 'base.html' %} def _visit_extends(self, node: Any) -> None Parameters Name Type Description node — _visit_template 1 ▼ Handle template root node. def _visit_template(self, node: Any) -> None Parameters Name Type Description node — _visit_filterblock 1 ▼ Handle filter block: {% filter upper %}...{% end %} def _visit_filterblock(self, node: Any) -> None Parameters Name Type Description node — _visit_callblock 1 ▼ Handle call block: {% call name(args) %}body{% end %} def _visit_callblock(self, node: Any) -> None Parameters Name Type Description node — _visit_spaceless 1 ▼ Handle spaceless block. def _visit_spaceless(self, node: Any) -> None Parameters Name Type Description node — _visit_autoescape 1 ▼ Handle autoescape block. def _visit_autoescape(self, node: Any) -> None Parameters Name Type Description node — _visit_trim 1 ▼ Handle trim block. def _visit_trim(self, node: Any) -> None Parameters Name Type Description node — _visit_embed 1 ▼ Handle embed: {% embed 'card.html' %}...{% end %} def _visit_embed(self, node: Any) -> None Parameters Name Type Description node — _visit_await 1 ▼ Handle await expression. def _visit_await(self, node: Any) -> None Parameters Name Type Description node — _visit_marksafe 1 ▼ Handle safe marker. def _visit_marksafe(self, node: Any) -> None Parameters Name Type Description node — _visit_inlinedfilter 1 ▼ Handle inlined filter (optimization). def _visit_inlinedfilter(self, node: Any) -> None Parameters Name Type Description node — _visit_const 1 ▼ Constants have no dependencies. def _visit_const(self, node: Any) -> None Parameters Name Type Description node — _visit_data 1 ▼ Static data has no dependencies. def _visit_data(self, node: Any) -> None Parameters Name Type Description node — _visit_raw 1 ▼ Raw blocks have no dependencies. def _visit_raw(self, node: Any) -> None Parameters Name Type Description node — _visit_slot 1 ▼ Slots have no dependencies. def _visit_slot(self, node: Any) -> None Parameters Name Type Description node — _visit_break 1 ▼ Break has no dependencies. def _visit_break(self, node: Any) -> None Parameters Name Type Description node — _visit_continue 1 ▼ Continue has no dependencies. def _visit_continue(self, node: Any) -> None Parameters Name Type Description node — _visit_do 1 ▼ Handle do statement. def _visit_do(self, node: Any) -> None Parameters Name Type Description node — _visit_loopvar 1 ▼ Loop variable access (loop.index, etc.) - no context deps. def _visit_loopvar(self, node: Any) -> None Parameters Name Type Description node — _build_path 1 str | None ▼ Build dotted path from chained attribute/item access. Returns None if the path… def _build_path(self, node: Any) -> str | None Build dotted path from chained attribute/item access. Returns None if the path can't be determined statically (e.g., dynamic keys, local variables). Parameters Name Type Description node — Returns str | None _extract_targets 1 set[str] ▼ Extract variable names from assignment target. def _extract_targets(self, node: Any) -> set[str] Parameters Name Type Description node — Returns set[str] _is_local 1 bool ▼ Check if a name is in local scope. def _is_local(self, name: str) -> bool Parameters Name Type Description name — Returns bool ← Previous config Next → landmarks List © 2026 Kida built in ᓚᘏᗢ { "linkPreviews": { "enabled": true, "hoverDelay": 200, "hideDelay": 150, "showSection": true, "showReadingTime": true, "showWordCount": true, "showDate": true, "showTags": true, "maxTags": 3, "includeSelectors": [".prose"], "excludeSelectors": ["nav", ".toc", ".breadcrumb", ".pagination", ".card", "[class*='-card']", ".tab-nav", "[class*='-widget']", ".child-items", ".content-tiles"], "allowedHosts": [], "allowedSchemes": ["https"], "hostFailureThreshold": 3 } } window.BENGAL_LAZY_ASSETS = { tabulator: '/kida/assets/js/tabulator.min.js', dataTable: '/kida/assets/js/data-table.js', mermaidToolbar: '/kida/assets/js/mermaid-toolbar.9de5abba.js', mermaidTheme: '/kida/assets/js/mermaid-theme.344822c5.js', graphMinimap: '/kida/assets/js/graph-minimap.ff04e939.js', graphContextual: '/kida/assets/js/graph-contextual.355458ba.js' }; window.BENGAL_ICONS = { close: '/kida/assets/icons/close.911d4fe1.svg', enlarge: '/kida/assets/icons/enlarge.652035e5.svg', copy: '/kida/assets/icons/copy.3d56e945.svg', 'download-svg': '/kida/assets/icons/download.04f07e1b.svg', 'download-png': '/kida/assets/icons/image.c34dfd40.svg', 'zoom-in': '/kida/assets/icons/zoom-in.237b4a83.svg', 'zoom-out': '/kida/assets/icons/zoom-out.38857c77.svg', reset: '/kida/assets/icons/reset.d26dba29.svg' }; Arrow Up -------------------------------------------------------------------------------- Metadata: - Word Count: 2056 - Reading Time: 10 minutes