django-components/0.112/reference/django_components/util/index.html

716 lines
No EOL
171 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="A way to create simple reusable template components in Django."><link href=https://emilstenstrom.github.io/django-components/latest/reference/django_components/util/ rel=canonical><link href=../urls/ rel=prev><link href=cache/ rel=next><link rel=icon href=../../../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.5.43"><title>Index - Django-Components</title><link rel=stylesheet href=../../../assets/stylesheets/main.0253249f.min.css><link rel=stylesheet href=../../../assets/stylesheets/palette.06af60db.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../../assets/_markdown_exec_pyodide.css><link rel=stylesheet href=../../../assets/_mkdocstrings.css><link rel=stylesheet href=../../../css/timeago.css><script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script><meta property=og:type content=website><meta property=og:title content="Index - Django-Components"><meta property=og:description content="A way to create simple reusable template components in Django."><meta property=og:image content=https://emilstenstrom.github.io/django-components/latest/assets/images/social/reference/django_components/util/index.png><meta property=og:image:type content=image/png><meta property=og:image:width content=1200><meta property=og:image:height content=630><meta content=https://emilstenstrom.github.io/django-components/latest/reference/django_components/util/ property=og:url><meta name=twitter:card content=summary_large_image><meta name=twitter:title content="Index - Django-Components"><meta name=twitter:description content="A way to create simple reusable template components in Django."><meta name=twitter:image content=https://emilstenstrom.github.io/django-components/latest/assets/images/social/reference/django_components/util/index.png></head> <body dir=ltr data-md-color-scheme=default data-md-color-primary=indigo data-md-color-accent=indigo> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#django_components.util class=md-skip> Skip to content </a> </div> <div data-md-component=announce> <aside class=md-banner> <div class="md-banner__inner md-grid md-typeset"> 🚨The documentation is still a work in progress. 🚨 </div> </aside> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=../../.. title=Django-Components class="md-header__button md-logo" aria-label=Django-Components data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> Django-Components </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Index </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media=(prefers-color-scheme) data-md-color-scheme=default data-md-color-primary=indigo data-md-color-accent=indigo aria-label="Switch to light mode" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg> </label> <input class=md-option data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme=default data-md-color-primary=teal data-md-color-accent=indigo aria-label="Switch to dark mode" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Switch to dark mode" for=__palette_2 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg> </label> <input class=md-option data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme=slate data-md-color-primary=teal data-md-color-accent=indigo aria-label="Switch to light mode" type=radio name=__palette id=__palette_2> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg> </label> </form> <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> <label class="md-header__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </label> <nav class=md-search__options aria-label=Search> <a href=javascript:void(0) class="md-search__icon md-icon" title=Share aria-label=Share data-clipboard data-clipboard-text data-md-component=search-share tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg> </a> <button type=reset class="md-search__icon md-icon" title=Clear aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> </button> </nav> <div class=md-search__suggest data-md-component=search-suggest></div> </form> <div class=md-search__output> <div class=md-search__scrollwrap tabindex=0 data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list role=presentation></ol> </div> </div> </div> </div> </div> <div class=md-header__source> <a href=https://github.com/EmilStenstrom/django-components title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 496 512"><!-- Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </div> <div class=md-source__repository> EmilStenstrom/django-components </div> </a> </div> </nav> </header> <div class=md-container data-md-component=container> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=sidebar data-md-type=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=../../.. title=Django-Components class="md-nav__button md-logo" aria-label=Django-Components data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg> </a> Django-Components </label> <div class=md-nav__source> <a href=https://github.com/EmilStenstrom/django-components title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 496 512"><!-- Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </div> <div class=md-source__repository> EmilStenstrom/django-components </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_1> <div class="md-nav__link md-nav__container"> <a href=../../.. class="md-nav__link "> <span class=md-ellipsis> README </span> </a> <label class="md-nav__link " for=__nav_1 id=__nav_1_label tabindex> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_1_label aria-expanded=false> <label class=md-nav__title for=__nav_1> <span class="md-nav__icon md-icon"></span> README </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../CHANGELOG/ class=md-nav__link> <span class=md-ellipsis> Changelog </span> </a> </li> <li class=md-nav__item> <a href=../../../CODE_OF_CONDUCT/ class=md-nav__link> <span class=md-ellipsis> Code of Conduct </span> </a> </li> <li class=md-nav__item> <a href=../../../license/ class=md-nav__link> <span class=md-ellipsis> License </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2 checked> <label class=md-nav__link for=__nav_2 id=__nav_2_label tabindex> <span class=md-ellipsis> Reference </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_2_label aria-expanded=true> <label class=md-nav__title for=__nav_2> <span class="md-nav__icon md-icon"></span> Reference </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_1 checked> <label class=md-nav__link for=__nav_2_1 id=__nav_2_1_label tabindex=0> <span class=md-ellipsis> API Reference </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_2_1_label aria-expanded=true> <label class=md-nav__title for=__nav_2_1> <span class="md-nav__icon md-icon"></span> API Reference </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_1_1 checked> <div class="md-nav__link md-nav__container"> <a href=../ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> django_components </span> </a> <label class="md-nav__link " for=__nav_2_1_1 id=__nav_2_1_1_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=3 aria-labelledby=__nav_2_1_1_label aria-expanded=true> <label class=md-nav__title for=__nav_2_1_1> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> django_components </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../app_settings/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> app_settings </span> </a> </li> <li class=md-nav__item> <a href=../apps/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> apps </span> </a> </li> <li class=md-nav__item> <a href=../attributes/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> attributes </span> </a> </li> <li class=md-nav__item> <a href=../autodiscovery/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> autodiscovery </span> </a> </li> <li class=md-nav__item> <a href=../component/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> component </span> </a> </li> <li class=md-nav__item> <a href=../component_media/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> component_media </span> </a> </li> <li class=md-nav__item> <a href=../component_registry/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> component_registry </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_1_1_9> <div class="md-nav__link md-nav__container"> <a href=../components/ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> components </span> </a> <label class="md-nav__link " for=__nav_2_1_1_9 id=__nav_2_1_1_9_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=4 aria-labelledby=__nav_2_1_1_9_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_1_9> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> components </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../components/dynamic/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> dynamic </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../context/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> context </span> </a> </li> <li class=md-nav__item> <a href=../dependencies/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> dependencies </span> </a> </li> <li class=md-nav__item> <a href=../expression/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> expression </span> </a> </li> <li class=md-nav__item> <a href=../finders/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> finders </span> </a> </li> <li class=md-nav__item> <a href=../library/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> library </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_1_1_15> <div class="md-nav__link md-nav__container"> <a href=../management/ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> management </span> </a> <label class="md-nav__link " for=__nav_2_1_1_15 id=__nav_2_1_1_15_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=4 aria-labelledby=__nav_2_1_1_15_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_1_15> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> management </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_1_1_15_2> <div class="md-nav__link md-nav__container"> <a href=../management/commands/ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> commands </span> </a> <label class="md-nav__link " for=__nav_2_1_1_15_2 id=__nav_2_1_1_15_2_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=5 aria-labelledby=__nav_2_1_1_15_2_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_1_15_2> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> commands </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../management/commands/startcomponent/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> startcomponent </span> </a> </li> <li class=md-nav__item> <a href=../management/commands/upgradecomponent/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> upgradecomponent </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../middleware/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> middleware </span> </a> </li> <li class=md-nav__item> <a href=../node/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> node </span> </a> </li> <li class=md-nav__item> <a href=../provide/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> provide </span> </a> </li> <li class=md-nav__item> <a href=../slots/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> slots </span> </a> </li> <li class=md-nav__item> <a href=../tag_formatter/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> tag_formatter </span> </a> </li> <li class=md-nav__item> <a href=../template/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> template </span> </a> </li> <li class=md-nav__item> <a href=../template_loader/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> template_loader </span> </a> </li> <li class=md-nav__item> <a href=../template_parser/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> template_parser </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_1_1_24> <div class="md-nav__link md-nav__container"> <a href=../templatetags/ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> templatetags </span> </a> <label class="md-nav__link " for=__nav_2_1_1_24 id=__nav_2_1_1_24_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=4 aria-labelledby=__nav_2_1_1_24_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_1_24> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> templatetags </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../templatetags/component_tags/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> component_tags </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../types/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> types </span> </a> </li> <li class=md-nav__item> <a href=../urls/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> urls </span> </a> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_1_1_27 checked> <div class="md-nav__link md-nav__container"> <a href=./ class="md-nav__link md-nav__link--active"> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> util </span> </a> <label class="md-nav__link md-nav__link--active" for=__nav_2_1_1_27 id=__nav_2_1_1_27_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=4 aria-labelledby=__nav_2_1_1_27_label aria-expanded=true> <label class=md-nav__title for=__nav_2_1_1_27> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> util </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=cache/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> cache </span> </a> </li> <li class=md-nav__item> <a href=html/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> html </span> </a> </li> <li class=md-nav__item> <a href=loader/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> loader </span> </a> </li> <li class=md-nav__item> <a href=logger/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> logger </span> </a> </li> <li class=md-nav__item> <a href=misc/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> misc </span> </a> </li> <li class=md-nav__item> <a href=nanoid/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> nanoid </span> </a> </li> <li class=md-nav__item> <a href=tag_parser/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> tag_parser </span> </a> </li> <li class=md-nav__item> <a href=types/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> types </span> </a> </li> <li class=md-nav__item> <a href=validation/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> validation </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_1_2> <div class="md-nav__link md-nav__container"> <a href=../../django_components_js/build/ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> django_components_js </span> </a> </div> <nav class=md-nav data-md-level=3 aria-labelledby=__nav_2_1_2_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_2> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> django_components_js </label> <ul class=md-nav__list data-md-scrollfix> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_1_3> <div class="md-nav__link md-nav__container"> <a href=../../docs/ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> docs </span> </a> <label class="md-nav__link " for=__nav_2_1_3 id=__nav_2_1_3_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=3 aria-labelledby=__nav_2_1_3_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_3> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> docs </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_1_3_2> <div class="md-nav__link md-nav__container"> <a href=../../docs/scripts/ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> scripts </span> </a> <label class="md-nav__link " for=__nav_2_1_3_2 id=__nav_2_1_3_2_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=4 aria-labelledby=__nav_2_1_3_2_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_3_2> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> scripts </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../docs/scripts/reference/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> reference </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> </ul> </nav> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#django_components.util.cache class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;cache </span> </a> <nav class=md-nav aria-label= cache> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.util.cache.lazy_cache class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;lazy_cache </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.util.html class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;html </span> </a> <nav class=md-nav aria-label= html> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.util.html.parse_document_or_nodes class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;parse_document_or_nodes </span> </a> </li> <li class=md-nav__item> <a href=#django_components.util.html.parse_multiroot_html class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;parse_multiroot_html </span> </a> </li> <li class=md-nav__item> <a href=#django_components.util.html.parse_node class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;parse_node </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.util.loader class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;loader </span> </a> <nav class=md-nav aria-label= loader> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.util.loader.ComponentFileEntry class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ComponentFileEntry </span> </a> <nav class=md-nav aria-label= ComponentFileEntry> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.util.loader.ComponentFileEntry.dot_path class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;dot_path </span> </a> </li> <li class=md-nav__item> <a href=#django_components.util.loader.ComponentFileEntry.filepath class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;filepath </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.util.loader.get_component_dirs class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;get_component_dirs </span> </a> </li> <li class=md-nav__item> <a href=#django_components.util.loader.get_component_files class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;get_component_files </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.util.logger class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;logger </span> </a> <nav class=md-nav aria-label= logger> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.util.logger.trace class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;trace </span> </a> </li> <li class=md-nav__item> <a href=#django_components.util.logger.trace_msg class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;trace_msg </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.util.misc class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;misc </span> </a> <nav class=md-nav aria-label= misc> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.util.misc.gen_id class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;gen_id </span> </a> </li> <li class=md-nav__item> <a href=#django_components.util.misc.get_import_path class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;get_import_path </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.util.tag_parser class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;tag_parser </span> </a> <nav class=md-nav aria-label= tag_parser> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.util.tag_parser.TagAttr class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;TagAttr </span> </a> <nav class=md-nav aria-label= TagAttr> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.util.tag_parser.TagAttr.quoted class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;quoted </span> </a> </li> <li class=md-nav__item> <a href=#django_components.util.tag_parser.TagAttr.start_index class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;start_index </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.util.types class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;types </span> </a> <nav class=md-nav aria-label= types> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.util.types.EmptyTuple class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;EmptyTuple </span> </a> </li> <li class=md-nav__item> <a href=#django_components.util.types.EmptyDict class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;EmptyDict </span> </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class=md-content data-md-component=content> <article class="md-content__inner md-typeset"> <a href=https://github.com/EmilStenstrom/django-components/edit/master/src/src/django_components/util/__init__.py title="Edit this page" class="md-content__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg> </a> <a href=https://github.com/EmilStenstrom/django-components/raw/master/src/src/django_components/util/__init__.py title="View source of this page" class="md-content__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg> </a> <div class="doc doc-object doc-module"> <h1 id=django_components.util class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">util</span> <a href=#django_components.util class=headerlink title="Permanent link">¤</a></h1> <div class="doc doc-contents first"> <p><span class=doc-section-title>Modules:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.cache href=../#django_components.util.cache>cache</a></code></b> <div class=doc-md-description> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.html href=../#django_components.util.html>html</a></code></b> <div class=doc-md-description> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.loader href=../#django_components.util.loader>loader</a></code></b> <div class=doc-md-description> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.logger href=../#django_components.util.logger>logger</a></code></b> <div class=doc-md-description> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.misc href=../#django_components.util.misc>misc</a></code></b> <div class=doc-md-description> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.tag_parser href=../#django_components.util.tag_parser>tag_parser</a></code></b> <div class=doc-md-description> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.types href=../#django_components.util.types>types</a></code></b> <div class=doc-md-description> </div> </li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-module"> <h2 id=django_components.util.cache class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">cache</span> <a href=#django_components.util.cache class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p><span class=doc-section-title>Functions:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.cache.lazy_cache href=../#django_components.util.cache.lazy_cache>lazy_cache</a></code></b> <div class=doc-md-description> <p>Decorator that caches the given function similarly to <code>functools.lru_cache</code>.</p> </div> </li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h3 id=django_components.util.cache.lazy_cache class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">lazy_cache</span> <a href=#django_components.util.cache.lazy_cache class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nf>lazy_cache</span><span class=p>(</span><span class=n>make_cache</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Callable href=https://docs.python.org/3.12/library/typing.html#typing.Callable>Callable</a></span><span class=p>[[],</span> <span class=n><a class="autorefs autorefs-external" title=typing.Callable href=https://docs.python.org/3.12/library/typing.html#typing.Callable>Callable</a></span><span class=p>[[</span><span class=n><a class="autorefs autorefs-external" title=typing.Callable href=https://docs.python.org/3.12/library/typing.html#typing.Callable>Callable</a></span><span class=p>],</span> <span class=n><a class="autorefs autorefs-external" title=typing.Callable href=https://docs.python.org/3.12/library/typing.html#typing.Callable>Callable</a></span><span class=p>]])</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Callable href=https://docs.python.org/3.12/library/typing.html#typing.Callable>Callable</a></span><span class=p>[[</span><span class=n><span title=django_components.util.cache.TFunc>TFunc</span></span><span class=p>],</span> <span class=n><span title=django_components.util.cache.TFunc>TFunc</span></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Decorator that caches the given function similarly to <code>functools.lru_cache</code>. But the cache is instantiated only at first invocation.</p> <p><code>cache</code> argument is a function that generates the cache function, e.g. <code>functools.lru_cache()</code>.</p> <details class=quote> <summary>Source code in <code>src/django_components/util/cache.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-7> 7</a></span>
<span class=normal><a href=#__codelineno-0-8> 8</a></span>
<span class=normal><a href=#__codelineno-0-9> 9</a></span>
<span class=normal><a href=#__codelineno-0-10>10</a></span>
<span class=normal><a href=#__codelineno-0-11>11</a></span>
<span class=normal><a href=#__codelineno-0-12>12</a></span>
<span class=normal><a href=#__codelineno-0-13>13</a></span>
<span class=normal><a href=#__codelineno-0-14>14</a></span>
<span class=normal><a href=#__codelineno-0-15>15</a></span>
<span class=normal><a href=#__codelineno-0-16>16</a></span>
<span class=normal><a href=#__codelineno-0-17>17</a></span>
<span class=normal><a href=#__codelineno-0-18>18</a></span>
<span class=normal><a href=#__codelineno-0-19>19</a></span>
<span class=normal><a href=#__codelineno-0-20>20</a></span>
<span class=normal><a href=#__codelineno-0-21>21</a></span>
<span class=normal><a href=#__codelineno-0-22>22</a></span>
<span class=normal><a href=#__codelineno-0-23>23</a></span>
<span class=normal><a href=#__codelineno-0-24>24</a></span>
<span class=normal><a href=#__codelineno-0-25>25</a></span>
<span class=normal><a href=#__codelineno-0-26>26</a></span>
<span class=normal><a href=#__codelineno-0-27>27</a></span>
<span class=normal><a href=#__codelineno-0-28>28</a></span>
<span class=normal><a href=#__codelineno-0-29>29</a></span>
<span class=normal><a href=#__codelineno-0-30>30</a></span>
<span class=normal><a href=#__codelineno-0-31>31</a></span>
<span class=normal><a href=#__codelineno-0-32>32</a></span>
<span class=normal><a href=#__codelineno-0-33>33</a></span>
<span class=normal><a href=#__codelineno-0-34>34</a></span>
<span class=normal><a href=#__codelineno-0-35>35</a></span>
<span class=normal><a href=#__codelineno-0-36>36</a></span>
<span class=normal><a href=#__codelineno-0-37>37</a></span>
<span class=normal><a href=#__codelineno-0-38>38</a></span>
<span class=normal><a href=#__codelineno-0-39>39</a></span>
<span class=normal><a href=#__codelineno-0-40>40</a></span>
<span class=normal><a href=#__codelineno-0-41>41</a></span>
<span class=normal><a href=#__codelineno-0-42>42</a></span>
<span class=normal><a href=#__codelineno-0-43>43</a></span>
<span class=normal><a href=#__codelineno-0-44>44</a></span>
<span class=normal><a href=#__codelineno-0-45>45</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-7 name=__codelineno-0-7></a><span class=k>def</span> <span class=nf>lazy_cache</span><span class=p>(</span>
<a id=__codelineno-0-8 name=__codelineno-0-8></a> <span class=n>make_cache</span><span class=p>:</span> <span class=n>Callable</span><span class=p>[[],</span> <span class=n>Callable</span><span class=p>[[</span><span class=n>Callable</span><span class=p>],</span> <span class=n>Callable</span><span class=p>]],</span>
<a id=__codelineno-0-9 name=__codelineno-0-9></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Callable</span><span class=p>[[</span><span class=n>TFunc</span><span class=p>],</span> <span class=n>TFunc</span><span class=p>]:</span>
<a id=__codelineno-0-10 name=__codelineno-0-10></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-11 name=__codelineno-0-11></a><span class=sd> Decorator that caches the given function similarly to `functools.lru_cache`.</span>
<a id=__codelineno-0-12 name=__codelineno-0-12></a><span class=sd> But the cache is instantiated only at first invocation.</span>
<a id=__codelineno-0-13 name=__codelineno-0-13></a>
<a id=__codelineno-0-14 name=__codelineno-0-14></a><span class=sd> `cache` argument is a function that generates the cache function,</span>
<a id=__codelineno-0-15 name=__codelineno-0-15></a><span class=sd> e.g. `functools.lru_cache()`.</span>
<a id=__codelineno-0-16 name=__codelineno-0-16></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-17 name=__codelineno-0-17></a> <span class=n>_cached_fn</span> <span class=o>=</span> <span class=kc>None</span>
<a id=__codelineno-0-18 name=__codelineno-0-18></a>
<a id=__codelineno-0-19 name=__codelineno-0-19></a> <span class=k>def</span> <span class=nf>decorator</span><span class=p>(</span><span class=n>fn</span><span class=p>:</span> <span class=n>TFunc</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>TFunc</span><span class=p>:</span>
<a id=__codelineno-0-20 name=__codelineno-0-20></a> <span class=nd>@functools</span><span class=o>.</span><span class=n>wraps</span><span class=p>(</span><span class=n>fn</span><span class=p>)</span>
<a id=__codelineno-0-21 name=__codelineno-0-21></a> <span class=k>def</span> <span class=nf>wrapper</span><span class=p>(</span><span class=o>*</span><span class=n>args</span><span class=p>:</span> <span class=n>Any</span><span class=p>,</span> <span class=o>**</span><span class=n>kwargs</span><span class=p>:</span> <span class=n>Any</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Any</span><span class=p>:</span>
<a id=__codelineno-0-22 name=__codelineno-0-22></a> <span class=c1># Lazily initialize the cache</span>
<a id=__codelineno-0-23 name=__codelineno-0-23></a> <span class=k>nonlocal</span> <span class=n>_cached_fn</span>
<a id=__codelineno-0-24 name=__codelineno-0-24></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>_cached_fn</span><span class=p>:</span>
<a id=__codelineno-0-25 name=__codelineno-0-25></a> <span class=c1># E.g. `lambda: functools.lru_cache(maxsize=app_settings.TEMPLATE_CACHE_SIZE)`</span>
<a id=__codelineno-0-26 name=__codelineno-0-26></a> <span class=n>cache</span> <span class=o>=</span> <span class=n>make_cache</span><span class=p>()</span>
<a id=__codelineno-0-27 name=__codelineno-0-27></a> <span class=n>_cached_fn</span> <span class=o>=</span> <span class=n>cache</span><span class=p>(</span><span class=n>fn</span><span class=p>)</span>
<a id=__codelineno-0-28 name=__codelineno-0-28></a>
<a id=__codelineno-0-29 name=__codelineno-0-29></a> <span class=k>return</span> <span class=n>_cached_fn</span><span class=p>(</span><span class=o>*</span><span class=n>args</span><span class=p>,</span> <span class=o>**</span><span class=n>kwargs</span><span class=p>)</span>
<a id=__codelineno-0-30 name=__codelineno-0-30></a>
<a id=__codelineno-0-31 name=__codelineno-0-31></a> <span class=c1># Allow to access the LRU cache methods</span>
<a id=__codelineno-0-32 name=__codelineno-0-32></a> <span class=c1># See https://stackoverflow.com/a/37654201/9788634</span>
<a id=__codelineno-0-33 name=__codelineno-0-33></a> <span class=n>wrapper</span><span class=o>.</span><span class=n>cache_info</span> <span class=o>=</span> <span class=k>lambda</span><span class=p>:</span> <span class=n>_cached_fn</span><span class=o>.</span><span class=n>cache_info</span><span class=p>()</span> <span class=c1># type: ignore</span>
<a id=__codelineno-0-34 name=__codelineno-0-34></a> <span class=n>wrapper</span><span class=o>.</span><span class=n>cache_clear</span> <span class=o>=</span> <span class=k>lambda</span><span class=p>:</span> <span class=n>_cached_fn</span><span class=o>.</span><span class=n>cache_clear</span><span class=p>()</span> <span class=c1># type: ignore</span>
<a id=__codelineno-0-35 name=__codelineno-0-35></a>
<a id=__codelineno-0-36 name=__codelineno-0-36></a> <span class=c1># And allow to remove the cache instance (mostly for tests)</span>
<a id=__codelineno-0-37 name=__codelineno-0-37></a> <span class=k>def</span> <span class=nf>cache_remove</span><span class=p>()</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-38 name=__codelineno-0-38></a> <span class=k>nonlocal</span> <span class=n>_cached_fn</span>
<a id=__codelineno-0-39 name=__codelineno-0-39></a> <span class=n>_cached_fn</span> <span class=o>=</span> <span class=kc>None</span>
<a id=__codelineno-0-40 name=__codelineno-0-40></a>
<a id=__codelineno-0-41 name=__codelineno-0-41></a> <span class=n>wrapper</span><span class=o>.</span><span class=n>cache_remove</span> <span class=o>=</span> <span class=n>cache_remove</span> <span class=c1># type: ignore</span>
<a id=__codelineno-0-42 name=__codelineno-0-42></a>
<a id=__codelineno-0-43 name=__codelineno-0-43></a> <span class=k>return</span> <span class=n>cast</span><span class=p>(</span><span class=n>TFunc</span><span class=p>,</span> <span class=n>wrapper</span><span class=p>)</span>
<a id=__codelineno-0-44 name=__codelineno-0-44></a>
<a id=__codelineno-0-45 name=__codelineno-0-45></a> <span class=k>return</span> <span class=n>decorator</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.util.html class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">html</span> <a href=#django_components.util.html class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p><span class=doc-section-title>Functions:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.html.parse_document_or_nodes href=../#django_components.util.html.parse_document_or_nodes>parse_document_or_nodes</a></code></b> <div class=doc-md-description> <p>Use this if you do NOT know whether the given HTML is a full document</p> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.html.parse_multiroot_html href=../#django_components.util.html.parse_multiroot_html>parse_multiroot_html</a></code></b> <div class=doc-md-description> <p>Use this when you know the given HTML is a multiple nodes like</p> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.html.parse_node href=../#django_components.util.html.parse_node>parse_node</a></code></b> <div class=doc-md-description> <p>Use this when you know the given HTML is a single node like</p> </div> </li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h3 id=django_components.util.html.parse_document_or_nodes class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">parse_document_or_nodes</span> <a href=#django_components.util.html.parse_document_or_nodes class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nf>parse_document_or_nodes</span><span class=p>(</span><span class=n>html</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Union href=https://docs.python.org/3.12/library/typing.html#typing.Union>Union</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><span title=selectolax.lexbor.LexborNode>LexborNode</span></span><span class=p>],</span> <span class=n><span title=selectolax.lexbor.LexborHTMLParser>LexborHTMLParser</span></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Use this if you do NOT know whether the given HTML is a full document with <code>&lt;html&gt;</code>, <code>&lt;head&gt;</code>, and <code>&lt;body&gt;</code> tags, or an HTML fragment.</p> <details class=quote> <summary>Source code in <code>src/django_components/util/html.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-18>18</a></span>
<span class=normal><a href=#__codelineno-0-19>19</a></span>
<span class=normal><a href=#__codelineno-0-20>20</a></span>
<span class=normal><a href=#__codelineno-0-21>21</a></span>
<span class=normal><a href=#__codelineno-0-22>22</a></span>
<span class=normal><a href=#__codelineno-0-23>23</a></span>
<span class=normal><a href=#__codelineno-0-24>24</a></span>
<span class=normal><a href=#__codelineno-0-25>25</a></span>
<span class=normal><a href=#__codelineno-0-26>26</a></span>
<span class=normal><a href=#__codelineno-0-27>27</a></span>
<span class=normal><a href=#__codelineno-0-28>28</a></span>
<span class=normal><a href=#__codelineno-0-29>29</a></span>
<span class=normal><a href=#__codelineno-0-30>30</a></span>
<span class=normal><a href=#__codelineno-0-31>31</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-18 name=__codelineno-0-18></a><span class=k>def</span> <span class=nf>parse_document_or_nodes</span><span class=p>(</span><span class=n>html</span><span class=p>:</span> <span class=nb>str</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Union</span><span class=p>[</span><span class=n>List</span><span class=p>[</span><span class=n>LexborNode</span><span class=p>],</span> <span class=n>LexborHTMLParser</span><span class=p>]:</span>
<a id=__codelineno-0-19 name=__codelineno-0-19></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-20 name=__codelineno-0-20></a><span class=sd> Use this if you do NOT know whether the given HTML is a full document</span>
<a id=__codelineno-0-21 name=__codelineno-0-21></a><span class=sd> with `&lt;html&gt;`, `&lt;head&gt;`, and `&lt;body&gt;` tags, or an HTML fragment.</span>
<a id=__codelineno-0-22 name=__codelineno-0-22></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-23 name=__codelineno-0-23></a> <span class=n>html</span> <span class=o>=</span> <span class=n>html</span><span class=o>.</span><span class=n>strip</span><span class=p>()</span>
<a id=__codelineno-0-24 name=__codelineno-0-24></a> <span class=n>tree</span> <span class=o>=</span> <span class=n>LexborHTMLParser</span><span class=p>(</span><span class=n>html</span><span class=p>)</span>
<a id=__codelineno-0-25 name=__codelineno-0-25></a> <span class=n>is_fragment</span> <span class=o>=</span> <span class=n>is_html_parser_fragment</span><span class=p>(</span><span class=n>html</span><span class=p>,</span> <span class=n>tree</span><span class=p>)</span>
<a id=__codelineno-0-26 name=__codelineno-0-26></a>
<a id=__codelineno-0-27 name=__codelineno-0-27></a> <span class=k>if</span> <span class=n>is_fragment</span><span class=p>:</span>
<a id=__codelineno-0-28 name=__codelineno-0-28></a> <span class=n>nodes</span> <span class=o>=</span> <span class=n>parse_multiroot_html</span><span class=p>(</span><span class=n>html</span><span class=p>)</span>
<a id=__codelineno-0-29 name=__codelineno-0-29></a> <span class=k>return</span> <span class=n>nodes</span>
<a id=__codelineno-0-30 name=__codelineno-0-30></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-31 name=__codelineno-0-31></a> <span class=k>return</span> <span class=n>tree</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.util.html.parse_multiroot_html class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">parse_multiroot_html</span> <a href=#django_components.util.html.parse_multiroot_html class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nf>parse_multiroot_html</span><span class=p>(</span><span class=n>html</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><span title=selectolax.lexbor.LexborNode>LexborNode</span></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Use this when you know the given HTML is a multiple nodes like</p> <p><code>&lt;div&gt; Hi &lt;/div&gt; &lt;span&gt; Hello &lt;/span&gt;</code></p> <details class=quote> <summary>Source code in <code>src/django_components/util/html.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-34>34</a></span>
<span class=normal><a href=#__codelineno-0-35>35</a></span>
<span class=normal><a href=#__codelineno-0-36>36</a></span>
<span class=normal><a href=#__codelineno-0-37>37</a></span>
<span class=normal><a href=#__codelineno-0-38>38</a></span>
<span class=normal><a href=#__codelineno-0-39>39</a></span>
<span class=normal><a href=#__codelineno-0-40>40</a></span>
<span class=normal><a href=#__codelineno-0-41>41</a></span>
<span class=normal><a href=#__codelineno-0-42>42</a></span>
<span class=normal><a href=#__codelineno-0-43>43</a></span>
<span class=normal><a href=#__codelineno-0-44>44</a></span>
<span class=normal><a href=#__codelineno-0-45>45</a></span>
<span class=normal><a href=#__codelineno-0-46>46</a></span>
<span class=normal><a href=#__codelineno-0-47>47</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-34 name=__codelineno-0-34></a><span class=k>def</span> <span class=nf>parse_multiroot_html</span><span class=p>(</span><span class=n>html</span><span class=p>:</span> <span class=nb>str</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>List</span><span class=p>[</span><span class=n>LexborNode</span><span class=p>]:</span>
<a id=__codelineno-0-35 name=__codelineno-0-35></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-36 name=__codelineno-0-36></a><span class=sd> Use this when you know the given HTML is a multiple nodes like</span>
<a id=__codelineno-0-37 name=__codelineno-0-37></a>
<a id=__codelineno-0-38 name=__codelineno-0-38></a><span class=sd> `&lt;div&gt; Hi &lt;/div&gt; &lt;span&gt; Hello &lt;/span&gt;`</span>
<a id=__codelineno-0-39 name=__codelineno-0-39></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-40 name=__codelineno-0-40></a> <span class=c1># NOTE: HTML / XML MUST have a single root. So, to support multiple</span>
<a id=__codelineno-0-41 name=__codelineno-0-41></a> <span class=c1># top-level elements, we wrap them in a dummy singular root.</span>
<a id=__codelineno-0-42 name=__codelineno-0-42></a> <span class=n>parser</span> <span class=o>=</span> <span class=n>LexborHTMLParser</span><span class=p>(</span><span class=sa>f</span><span class=s2>&quot;&lt;root&gt;</span><span class=si>{</span><span class=n>html</span><span class=si>}</span><span class=s2>&lt;/root&gt;&quot;</span><span class=p>)</span>
<a id=__codelineno-0-43 name=__codelineno-0-43></a>
<a id=__codelineno-0-44 name=__codelineno-0-44></a> <span class=c1># Get all contents of the root</span>
<a id=__codelineno-0-45 name=__codelineno-0-45></a> <span class=n>root_elem</span> <span class=o>=</span> <span class=n>parser</span><span class=o>.</span><span class=n>css_first</span><span class=p>(</span><span class=s2>&quot;root&quot;</span><span class=p>)</span>
<a id=__codelineno-0-46 name=__codelineno-0-46></a> <span class=n>elems</span> <span class=o>=</span> <span class=p>[</span><span class=o>*</span><span class=n>root_elem</span><span class=o>.</span><span class=n>iter</span><span class=p>()]</span> <span class=k>if</span> <span class=n>root_elem</span> <span class=k>else</span> <span class=p>[]</span>
<a id=__codelineno-0-47 name=__codelineno-0-47></a> <span class=k>return</span> <span class=n>elems</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.util.html.parse_node class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">parse_node</span> <a href=#django_components.util.html.parse_node class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nf>parse_node</span><span class=p>(</span><span class=n>html</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><span title=selectolax.lexbor.LexborNode>LexborNode</span></span>
</code></pre></div> <div class="doc doc-contents "> <p>Use this when you know the given HTML is a single node like</p> <p><code>&lt;div&gt; Hi &lt;/div&gt;</code></p> <details class=quote> <summary>Source code in <code>src/django_components/util/html.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-6> 6</a></span>
<span class=normal><a href=#__codelineno-0-7> 7</a></span>
<span class=normal><a href=#__codelineno-0-8> 8</a></span>
<span class=normal><a href=#__codelineno-0-9> 9</a></span>
<span class=normal><a href=#__codelineno-0-10>10</a></span>
<span class=normal><a href=#__codelineno-0-11>11</a></span>
<span class=normal><a href=#__codelineno-0-12>12</a></span>
<span class=normal><a href=#__codelineno-0-13>13</a></span>
<span class=normal><a href=#__codelineno-0-14>14</a></span>
<span class=normal><a href=#__codelineno-0-15>15</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-6 name=__codelineno-0-6></a><span class=k>def</span> <span class=nf>parse_node</span><span class=p>(</span><span class=n>html</span><span class=p>:</span> <span class=nb>str</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>LexborNode</span><span class=p>:</span>
<a id=__codelineno-0-7 name=__codelineno-0-7></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-8 name=__codelineno-0-8></a><span class=sd> Use this when you know the given HTML is a single node like</span>
<a id=__codelineno-0-9 name=__codelineno-0-9></a>
<a id=__codelineno-0-10 name=__codelineno-0-10></a><span class=sd> `&lt;div&gt; Hi &lt;/div&gt;`</span>
<a id=__codelineno-0-11 name=__codelineno-0-11></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-12 name=__codelineno-0-12></a> <span class=n>tree</span> <span class=o>=</span> <span class=n>LexborHTMLParser</span><span class=p>(</span><span class=n>html</span><span class=p>)</span>
<a id=__codelineno-0-13 name=__codelineno-0-13></a> <span class=c1># NOTE: The parser automatically places &lt;style&gt; tags inside &lt;head&gt;</span>
<a id=__codelineno-0-14 name=__codelineno-0-14></a> <span class=c1># while &lt;script&gt; tags are inside &lt;body&gt;.</span>
<a id=__codelineno-0-15 name=__codelineno-0-15></a> <span class=k>return</span> <span class=n>tree</span><span class=o>.</span><span class=n>body</span><span class=o>.</span><span class=n>child</span> <span class=ow>or</span> <span class=n>tree</span><span class=o>.</span><span class=n>head</span><span class=o>.</span><span class=n>child</span> <span class=c1># type: ignore[union-attr, return-value]</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.util.loader class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">loader</span> <a href=#django_components.util.loader class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p><span class=doc-section-title>Classes:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.loader.ComponentFileEntry href=../#django_components.util.loader.ComponentFileEntry>ComponentFileEntry</a></code></b> <div class=doc-md-description> <p>Result returned by <a href=../api#django_components.get_component_files><code>get_component_files()</code></a>.</p> </div> </li> </ul> <p><span class=doc-section-title>Functions:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.loader.get_component_dirs href=../#django_components.util.loader.get_component_dirs>get_component_dirs</a></code></b> <div class=doc-md-description> <p>Get directories that may contain component files.</p> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.loader.get_component_files href=../#django_components.util.loader.get_component_files>get_component_files</a></code></b> <div class=doc-md-description> <p>Search for files within the component directories (as defined in</p> </div> </li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h3 id=django_components.util.loader.ComponentFileEntry class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ComponentFileEntry</span> <a href=#django_components.util.loader.ComponentFileEntry class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title=typing.NamedTuple href=https://docs.python.org/3.12/library/typing.html#typing.NamedTuple>NamedTuple</a></code></p> <p>Result returned by <a href=../api#django_components.get_component_files><code>get_component_files()</code></a>.</p> <p><span class=doc-section-title>Attributes:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.loader.ComponentFileEntry.dot_path href=../#django_components.util.loader.ComponentFileEntry.dot_path>dot_path</a></code></b> (<code><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></code>) <div class=doc-md-description> <p>The python import path for the module. E.g. <code>app.components.mycomp</code></p> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.loader.ComponentFileEntry.filepath href=../#django_components.util.loader.ComponentFileEntry.filepath>filepath</a></code></b> (<code><a class="autorefs autorefs-external" title=pathlib.Path href=https://docs.python.org/3.12/library/pathlib.html#pathlib.Path>Path</a></code>) <div class=doc-md-description> <p>The filesystem path to the module. E.g. <code>/path/to/project/app/components/mycomp.py</code></p> </div> </li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h4 id=django_components.util.loader.ComponentFileEntry.dot_path class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">dot_path</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.util.loader.ComponentFileEntry.dot_path class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>dot_path</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>The python import path for the module. E.g. <code>app.components.mycomp</code></p> </div> </div> <div class="doc doc-object doc-attribute"> <h4 id=django_components.util.loader.ComponentFileEntry.filepath class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">filepath</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.util.loader.ComponentFileEntry.filepath class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>filepath</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=pathlib.Path href=https://docs.python.org/3.12/library/pathlib.html#pathlib.Path>Path</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>The filesystem path to the module. E.g. <code>/path/to/project/app/components/mycomp.py</code></p> </div> </div> </div> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.util.loader.get_component_dirs class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">get_component_dirs</span> <a href=#django_components.util.loader.get_component_dirs class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nf>get_component_dirs</span><span class=p>(</span><span class=n>include_apps</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></span> <span class=o>=</span> <span class=kc>True</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=pathlib.Path href=https://docs.python.org/3.12/library/pathlib.html#pathlib.Path>Path</a></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Get directories that may contain component files.</p> <p>This is the heart of all features that deal with filesystem and file lookup. Autodiscovery, Django template resolution, static file resolution - They all use this.</p> <p><span class=doc-section-title>Parameters:</span></p> <ul> <li class="doc-section-item field-body"> <b><code>include_apps</code></b> (<code><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></code>, default: <code>True</code> ) <div class=doc-md-description> <p>Include directories from installed Django apps. Defaults to <code>True</code>.</p> </div> </li> </ul> <p><span class=doc-section-title>Returns:</span></p> <ul> <li class="doc-section-item field-body"> <code><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a>[<a class="autorefs autorefs-external" title=pathlib.Path href=https://docs.python.org/3.12/library/pathlib.html#pathlib.Path>Path</a>]</code> <div class=doc-md-description> <p>List[Path]: A list of directories that may contain component files.</p> </div> </li> </ul> <p><code>get_component_dirs()</code> searches for dirs set in <a href=../settings#django_components.app_settings.ComponentsSettings.dirs><code>COMPONENTS.dirs</code></a> settings. If none set, defaults to searching for a <code>"components"</code> app.</p> <p>In addition to that, also all installed Django apps are checked whether they contain directories as set in <a href=../settings#django_components.app_settings.ComponentsSettings.app_dirs><code>COMPONENTS.app_dirs</code></a> (e.g. <code>[app]/components</code>).</p> <p><strong>Notes:</strong></p> <ul> <li> <p>Paths that do not point to directories are ignored.</p> </li> <li> <p><code>BASE_DIR</code> setting is required.</p> </li> <li> <p>The paths in <a href=../settings#django_components.app_settings.ComponentsSettings.dirs><code>COMPONENTS.dirs</code></a> must be absolute paths.</p> </li> </ul> <details class=quote> <summary>Source code in <code>src/django_components/util/loader.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-13> 13</a></span>
<span class=normal><a href=#__codelineno-0-14> 14</a></span>
<span class=normal><a href=#__codelineno-0-15> 15</a></span>
<span class=normal><a href=#__codelineno-0-16> 16</a></span>
<span class=normal><a href=#__codelineno-0-17> 17</a></span>
<span class=normal><a href=#__codelineno-0-18> 18</a></span>
<span class=normal><a href=#__codelineno-0-19> 19</a></span>
<span class=normal><a href=#__codelineno-0-20> 20</a></span>
<span class=normal><a href=#__codelineno-0-21> 21</a></span>
<span class=normal><a href=#__codelineno-0-22> 22</a></span>
<span class=normal><a href=#__codelineno-0-23> 23</a></span>
<span class=normal><a href=#__codelineno-0-24> 24</a></span>
<span class=normal><a href=#__codelineno-0-25> 25</a></span>
<span class=normal><a href=#__codelineno-0-26> 26</a></span>
<span class=normal><a href=#__codelineno-0-27> 27</a></span>
<span class=normal><a href=#__codelineno-0-28> 28</a></span>
<span class=normal><a href=#__codelineno-0-29> 29</a></span>
<span class=normal><a href=#__codelineno-0-30> 30</a></span>
<span class=normal><a href=#__codelineno-0-31> 31</a></span>
<span class=normal><a href=#__codelineno-0-32> 32</a></span>
<span class=normal><a href=#__codelineno-0-33> 33</a></span>
<span class=normal><a href=#__codelineno-0-34> 34</a></span>
<span class=normal><a href=#__codelineno-0-35> 35</a></span>
<span class=normal><a href=#__codelineno-0-36> 36</a></span>
<span class=normal><a href=#__codelineno-0-37> 37</a></span>
<span class=normal><a href=#__codelineno-0-38> 38</a></span>
<span class=normal><a href=#__codelineno-0-39> 39</a></span>
<span class=normal><a href=#__codelineno-0-40> 40</a></span>
<span class=normal><a href=#__codelineno-0-41> 41</a></span>
<span class=normal><a href=#__codelineno-0-42> 42</a></span>
<span class=normal><a href=#__codelineno-0-43> 43</a></span>
<span class=normal><a href=#__codelineno-0-44> 44</a></span>
<span class=normal><a href=#__codelineno-0-45> 45</a></span>
<span class=normal><a href=#__codelineno-0-46> 46</a></span>
<span class=normal><a href=#__codelineno-0-47> 47</a></span>
<span class=normal><a href=#__codelineno-0-48> 48</a></span>
<span class=normal><a href=#__codelineno-0-49> 49</a></span>
<span class=normal><a href=#__codelineno-0-50> 50</a></span>
<span class=normal><a href=#__codelineno-0-51> 51</a></span>
<span class=normal><a href=#__codelineno-0-52> 52</a></span>
<span class=normal><a href=#__codelineno-0-53> 53</a></span>
<span class=normal><a href=#__codelineno-0-54> 54</a></span>
<span class=normal><a href=#__codelineno-0-55> 55</a></span>
<span class=normal><a href=#__codelineno-0-56> 56</a></span>
<span class=normal><a href=#__codelineno-0-57> 57</a></span>
<span class=normal><a href=#__codelineno-0-58> 58</a></span>
<span class=normal><a href=#__codelineno-0-59> 59</a></span>
<span class=normal><a href=#__codelineno-0-60> 60</a></span>
<span class=normal><a href=#__codelineno-0-61> 61</a></span>
<span class=normal><a href=#__codelineno-0-62> 62</a></span>
<span class=normal><a href=#__codelineno-0-63> 63</a></span>
<span class=normal><a href=#__codelineno-0-64> 64</a></span>
<span class=normal><a href=#__codelineno-0-65> 65</a></span>
<span class=normal><a href=#__codelineno-0-66> 66</a></span>
<span class=normal><a href=#__codelineno-0-67> 67</a></span>
<span class=normal><a href=#__codelineno-0-68> 68</a></span>
<span class=normal><a href=#__codelineno-0-69> 69</a></span>
<span class=normal><a href=#__codelineno-0-70> 70</a></span>
<span class=normal><a href=#__codelineno-0-71> 71</a></span>
<span class=normal><a href=#__codelineno-0-72> 72</a></span>
<span class=normal><a href=#__codelineno-0-73> 73</a></span>
<span class=normal><a href=#__codelineno-0-74> 74</a></span>
<span class=normal><a href=#__codelineno-0-75> 75</a></span>
<span class=normal><a href=#__codelineno-0-76> 76</a></span>
<span class=normal><a href=#__codelineno-0-77> 77</a></span>
<span class=normal><a href=#__codelineno-0-78> 78</a></span>
<span class=normal><a href=#__codelineno-0-79> 79</a></span>
<span class=normal><a href=#__codelineno-0-80> 80</a></span>
<span class=normal><a href=#__codelineno-0-81> 81</a></span>
<span class=normal><a href=#__codelineno-0-82> 82</a></span>
<span class=normal><a href=#__codelineno-0-83> 83</a></span>
<span class=normal><a href=#__codelineno-0-84> 84</a></span>
<span class=normal><a href=#__codelineno-0-85> 85</a></span>
<span class=normal><a href=#__codelineno-0-86> 86</a></span>
<span class=normal><a href=#__codelineno-0-87> 87</a></span>
<span class=normal><a href=#__codelineno-0-88> 88</a></span>
<span class=normal><a href=#__codelineno-0-89> 89</a></span>
<span class=normal><a href=#__codelineno-0-90> 90</a></span>
<span class=normal><a href=#__codelineno-0-91> 91</a></span>
<span class=normal><a href=#__codelineno-0-92> 92</a></span>
<span class=normal><a href=#__codelineno-0-93> 93</a></span>
<span class=normal><a href=#__codelineno-0-94> 94</a></span>
<span class=normal><a href=#__codelineno-0-95> 95</a></span>
<span class=normal><a href=#__codelineno-0-96> 96</a></span>
<span class=normal><a href=#__codelineno-0-97> 97</a></span>
<span class=normal><a href=#__codelineno-0-98> 98</a></span>
<span class=normal><a href=#__codelineno-0-99> 99</a></span>
<span class=normal><a href=#__codelineno-0-100>100</a></span>
<span class=normal><a href=#__codelineno-0-101>101</a></span>
<span class=normal><a href=#__codelineno-0-102>102</a></span>
<span class=normal><a href=#__codelineno-0-103>103</a></span>
<span class=normal><a href=#__codelineno-0-104>104</a></span>
<span class=normal><a href=#__codelineno-0-105>105</a></span>
<span class=normal><a href=#__codelineno-0-106>106</a></span>
<span class=normal><a href=#__codelineno-0-107>107</a></span>
<span class=normal><a href=#__codelineno-0-108>108</a></span>
<span class=normal><a href=#__codelineno-0-109>109</a></span>
<span class=normal><a href=#__codelineno-0-110>110</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-13 name=__codelineno-0-13></a><span class=k>def</span> <span class=nf>get_component_dirs</span><span class=p>(</span><span class=n>include_apps</span><span class=p>:</span> <span class=nb>bool</span> <span class=o>=</span> <span class=kc>True</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>List</span><span class=p>[</span><span class=n>Path</span><span class=p>]:</span>
<a id=__codelineno-0-14 name=__codelineno-0-14></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-15 name=__codelineno-0-15></a><span class=sd> Get directories that may contain component files.</span>
<a id=__codelineno-0-16 name=__codelineno-0-16></a>
<a id=__codelineno-0-17 name=__codelineno-0-17></a><span class=sd> This is the heart of all features that deal with filesystem and file lookup.</span>
<a id=__codelineno-0-18 name=__codelineno-0-18></a><span class=sd> Autodiscovery, Django template resolution, static file resolution - They all use this.</span>
<a id=__codelineno-0-19 name=__codelineno-0-19></a>
<a id=__codelineno-0-20 name=__codelineno-0-20></a><span class=sd> Args:</span>
<a id=__codelineno-0-21 name=__codelineno-0-21></a><span class=sd> include_apps (bool, optional): Include directories from installed Django apps.\</span>
<a id=__codelineno-0-22 name=__codelineno-0-22></a><span class=sd> Defaults to `True`.</span>
<a id=__codelineno-0-23 name=__codelineno-0-23></a>
<a id=__codelineno-0-24 name=__codelineno-0-24></a><span class=sd> Returns:</span>
<a id=__codelineno-0-25 name=__codelineno-0-25></a><span class=sd> List[Path]: A list of directories that may contain component files.</span>
<a id=__codelineno-0-26 name=__codelineno-0-26></a>
<a id=__codelineno-0-27 name=__codelineno-0-27></a><span class=sd> `get_component_dirs()` searches for dirs set in</span>
<a id=__codelineno-0-28 name=__codelineno-0-28></a><span class=sd> [`COMPONENTS.dirs`](../settings#django_components.app_settings.ComponentsSettings.dirs)</span>
<a id=__codelineno-0-29 name=__codelineno-0-29></a><span class=sd> settings. If none set, defaults to searching for a `&quot;components&quot;` app.</span>
<a id=__codelineno-0-30 name=__codelineno-0-30></a>
<a id=__codelineno-0-31 name=__codelineno-0-31></a><span class=sd> In addition to that, also all installed Django apps are checked whether they contain</span>
<a id=__codelineno-0-32 name=__codelineno-0-32></a><span class=sd> directories as set in</span>
<a id=__codelineno-0-33 name=__codelineno-0-33></a><span class=sd> [`COMPONENTS.app_dirs`](../settings#django_components.app_settings.ComponentsSettings.app_dirs)</span>
<a id=__codelineno-0-34 name=__codelineno-0-34></a><span class=sd> (e.g. `[app]/components`).</span>
<a id=__codelineno-0-35 name=__codelineno-0-35></a>
<a id=__codelineno-0-36 name=__codelineno-0-36></a><span class=sd> **Notes:**</span>
<a id=__codelineno-0-37 name=__codelineno-0-37></a>
<a id=__codelineno-0-38 name=__codelineno-0-38></a><span class=sd> - Paths that do not point to directories are ignored.</span>
<a id=__codelineno-0-39 name=__codelineno-0-39></a>
<a id=__codelineno-0-40 name=__codelineno-0-40></a><span class=sd> - `BASE_DIR` setting is required.</span>
<a id=__codelineno-0-41 name=__codelineno-0-41></a>
<a id=__codelineno-0-42 name=__codelineno-0-42></a><span class=sd> - The paths in [`COMPONENTS.dirs`](../settings#django_components.app_settings.ComponentsSettings.dirs)</span>
<a id=__codelineno-0-43 name=__codelineno-0-43></a><span class=sd> must be absolute paths.</span>
<a id=__codelineno-0-44 name=__codelineno-0-44></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-45 name=__codelineno-0-45></a> <span class=c1># Allow to configure from settings which dirs should be checked for components</span>
<a id=__codelineno-0-46 name=__codelineno-0-46></a> <span class=n>component_dirs</span> <span class=o>=</span> <span class=n>app_settings</span><span class=o>.</span><span class=n>DIRS</span>
<a id=__codelineno-0-47 name=__codelineno-0-47></a>
<a id=__codelineno-0-48 name=__codelineno-0-48></a> <span class=c1># TODO_REMOVE_IN_V1</span>
<a id=__codelineno-0-49 name=__codelineno-0-49></a> <span class=n>raw_component_settings</span> <span class=o>=</span> <span class=nb>getattr</span><span class=p>(</span><span class=n>settings</span><span class=p>,</span> <span class=s2>&quot;COMPONENTS&quot;</span><span class=p>,</span> <span class=p>{})</span>
<a id=__codelineno-0-50 name=__codelineno-0-50></a> <span class=k>if</span> <span class=nb>isinstance</span><span class=p>(</span><span class=n>raw_component_settings</span><span class=p>,</span> <span class=nb>dict</span><span class=p>):</span>
<a id=__codelineno-0-51 name=__codelineno-0-51></a> <span class=n>raw_dirs_value</span> <span class=o>=</span> <span class=n>raw_component_settings</span><span class=o>.</span><span class=n>get</span><span class=p>(</span><span class=s2>&quot;dirs&quot;</span><span class=p>,</span> <span class=kc>None</span><span class=p>)</span>
<a id=__codelineno-0-52 name=__codelineno-0-52></a> <span class=k>elif</span> <span class=nb>isinstance</span><span class=p>(</span><span class=n>raw_component_settings</span><span class=p>,</span> <span class=n>ComponentsSettings</span><span class=p>):</span>
<a id=__codelineno-0-53 name=__codelineno-0-53></a> <span class=n>raw_dirs_value</span> <span class=o>=</span> <span class=n>raw_component_settings</span><span class=o>.</span><span class=n>dirs</span>
<a id=__codelineno-0-54 name=__codelineno-0-54></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-55 name=__codelineno-0-55></a> <span class=n>raw_dirs_value</span> <span class=o>=</span> <span class=kc>None</span>
<a id=__codelineno-0-56 name=__codelineno-0-56></a> <span class=n>is_component_dirs_set</span> <span class=o>=</span> <span class=n>raw_dirs_value</span> <span class=ow>is</span> <span class=ow>not</span> <span class=kc>None</span>
<a id=__codelineno-0-57 name=__codelineno-0-57></a> <span class=n>is_legacy_paths</span> <span class=o>=</span> <span class=p>(</span>
<a id=__codelineno-0-58 name=__codelineno-0-58></a> <span class=c1># Use value of `STATICFILES_DIRS` ONLY if `COMPONENT.dirs` not set</span>
<a id=__codelineno-0-59 name=__codelineno-0-59></a> <span class=ow>not</span> <span class=n>is_component_dirs_set</span>
<a id=__codelineno-0-60 name=__codelineno-0-60></a> <span class=ow>and</span> <span class=nb>hasattr</span><span class=p>(</span><span class=n>settings</span><span class=p>,</span> <span class=s2>&quot;STATICFILES_DIRS&quot;</span><span class=p>)</span>
<a id=__codelineno-0-61 name=__codelineno-0-61></a> <span class=ow>and</span> <span class=n>settings</span><span class=o>.</span><span class=n>STATICFILES_DIRS</span>
<a id=__codelineno-0-62 name=__codelineno-0-62></a> <span class=p>)</span>
<a id=__codelineno-0-63 name=__codelineno-0-63></a> <span class=k>if</span> <span class=n>is_legacy_paths</span><span class=p>:</span>
<a id=__codelineno-0-64 name=__codelineno-0-64></a> <span class=c1># NOTE: For STATICFILES_DIRS, we use the defaults even for empty list.</span>
<a id=__codelineno-0-65 name=__codelineno-0-65></a> <span class=c1># We don&#39;t do this for COMPONENTS.dirs, so user can explicitly specify &quot;NO dirs&quot;.</span>
<a id=__codelineno-0-66 name=__codelineno-0-66></a> <span class=n>component_dirs</span> <span class=o>=</span> <span class=n>settings</span><span class=o>.</span><span class=n>STATICFILES_DIRS</span> <span class=ow>or</span> <span class=p>[</span><span class=n>settings</span><span class=o>.</span><span class=n>BASE_DIR</span> <span class=o>/</span> <span class=s2>&quot;components&quot;</span><span class=p>]</span>
<a id=__codelineno-0-67 name=__codelineno-0-67></a> <span class=c1># END TODO_REMOVE_IN_V1</span>
<a id=__codelineno-0-68 name=__codelineno-0-68></a>
<a id=__codelineno-0-69 name=__codelineno-0-69></a> <span class=n>source</span> <span class=o>=</span> <span class=s2>&quot;STATICFILES_DIRS&quot;</span> <span class=k>if</span> <span class=n>is_legacy_paths</span> <span class=k>else</span> <span class=s2>&quot;COMPONENTS.dirs&quot;</span>
<a id=__codelineno-0-70 name=__codelineno-0-70></a>
<a id=__codelineno-0-71 name=__codelineno-0-71></a> <span class=n>logger</span><span class=o>.</span><span class=n>debug</span><span class=p>(</span>
<a id=__codelineno-0-72 name=__codelineno-0-72></a> <span class=s2>&quot;get_component_dirs will search for valid dirs from following options:</span><span class=se>\n</span><span class=s2>&quot;</span>
<a id=__codelineno-0-73 name=__codelineno-0-73></a> <span class=o>+</span> <span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>([</span><span class=sa>f</span><span class=s2>&quot; - </span><span class=si>{</span><span class=nb>str</span><span class=p>(</span><span class=n>d</span><span class=p>)</span><span class=si>}</span><span class=s2>&quot;</span> <span class=k>for</span> <span class=n>d</span> <span class=ow>in</span> <span class=n>component_dirs</span><span class=p>])</span>
<a id=__codelineno-0-74 name=__codelineno-0-74></a> <span class=p>)</span>
<a id=__codelineno-0-75 name=__codelineno-0-75></a>
<a id=__codelineno-0-76 name=__codelineno-0-76></a> <span class=c1># Add `[app]/[APP_DIR]` to the directories. This is, by default `[app]/components`</span>
<a id=__codelineno-0-77 name=__codelineno-0-77></a> <span class=n>app_paths</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=n>Path</span><span class=p>]</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-78 name=__codelineno-0-78></a> <span class=k>if</span> <span class=n>include_apps</span><span class=p>:</span>
<a id=__codelineno-0-79 name=__codelineno-0-79></a> <span class=k>for</span> <span class=n>conf</span> <span class=ow>in</span> <span class=n>apps</span><span class=o>.</span><span class=n>get_app_configs</span><span class=p>():</span>
<a id=__codelineno-0-80 name=__codelineno-0-80></a> <span class=k>for</span> <span class=n>app_dir</span> <span class=ow>in</span> <span class=n>app_settings</span><span class=o>.</span><span class=n>APP_DIRS</span><span class=p>:</span>
<a id=__codelineno-0-81 name=__codelineno-0-81></a> <span class=n>comps_path</span> <span class=o>=</span> <span class=n>Path</span><span class=p>(</span><span class=n>conf</span><span class=o>.</span><span class=n>path</span><span class=p>)</span><span class=o>.</span><span class=n>joinpath</span><span class=p>(</span><span class=n>app_dir</span><span class=p>)</span>
<a id=__codelineno-0-82 name=__codelineno-0-82></a> <span class=k>if</span> <span class=n>comps_path</span><span class=o>.</span><span class=n>exists</span><span class=p>():</span>
<a id=__codelineno-0-83 name=__codelineno-0-83></a> <span class=n>app_paths</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>comps_path</span><span class=p>)</span>
<a id=__codelineno-0-84 name=__codelineno-0-84></a>
<a id=__codelineno-0-85 name=__codelineno-0-85></a> <span class=n>directories</span><span class=p>:</span> <span class=n>Set</span><span class=p>[</span><span class=n>Path</span><span class=p>]</span> <span class=o>=</span> <span class=nb>set</span><span class=p>(</span><span class=n>app_paths</span><span class=p>)</span>
<a id=__codelineno-0-86 name=__codelineno-0-86></a>
<a id=__codelineno-0-87 name=__codelineno-0-87></a> <span class=c1># Validate and add other values from the config</span>
<a id=__codelineno-0-88 name=__codelineno-0-88></a> <span class=k>for</span> <span class=n>component_dir</span> <span class=ow>in</span> <span class=n>component_dirs</span><span class=p>:</span>
<a id=__codelineno-0-89 name=__codelineno-0-89></a> <span class=c1># Consider tuples for STATICFILES_DIRS (See #489)</span>
<a id=__codelineno-0-90 name=__codelineno-0-90></a> <span class=c1># See https://docs.djangoproject.com/en/5.0/ref/settings/#prefixes-optional</span>
<a id=__codelineno-0-91 name=__codelineno-0-91></a> <span class=k>if</span> <span class=nb>isinstance</span><span class=p>(</span><span class=n>component_dir</span><span class=p>,</span> <span class=p>(</span><span class=nb>tuple</span><span class=p>,</span> <span class=nb>list</span><span class=p>)):</span>
<a id=__codelineno-0-92 name=__codelineno-0-92></a> <span class=n>component_dir</span> <span class=o>=</span> <span class=n>component_dir</span><span class=p>[</span><span class=mi>1</span><span class=p>]</span>
<a id=__codelineno-0-93 name=__codelineno-0-93></a> <span class=k>try</span><span class=p>:</span>
<a id=__codelineno-0-94 name=__codelineno-0-94></a> <span class=n>Path</span><span class=p>(</span><span class=n>component_dir</span><span class=p>)</span>
<a id=__codelineno-0-95 name=__codelineno-0-95></a> <span class=k>except</span> <span class=ne>TypeError</span><span class=p>:</span>
<a id=__codelineno-0-96 name=__codelineno-0-96></a> <span class=n>logger</span><span class=o>.</span><span class=n>warning</span><span class=p>(</span>
<a id=__codelineno-0-97 name=__codelineno-0-97></a> <span class=sa>f</span><span class=s2>&quot;</span><span class=si>{</span><span class=n>source</span><span class=si>}</span><span class=s2> expected str, bytes or os.PathLike object, or tuple/list of length 2. &quot;</span>
<a id=__codelineno-0-98 name=__codelineno-0-98></a> <span class=sa>f</span><span class=s2>&quot;See Django documentation for STATICFILES_DIRS. Got </span><span class=si>{</span><span class=nb>type</span><span class=p>(</span><span class=n>component_dir</span><span class=p>)</span><span class=si>}</span><span class=s2> : </span><span class=si>{</span><span class=n>component_dir</span><span class=si>}</span><span class=s2>&quot;</span>
<a id=__codelineno-0-99 name=__codelineno-0-99></a> <span class=p>)</span>
<a id=__codelineno-0-100 name=__codelineno-0-100></a> <span class=k>continue</span>
<a id=__codelineno-0-101 name=__codelineno-0-101></a>
<a id=__codelineno-0-102 name=__codelineno-0-102></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>Path</span><span class=p>(</span><span class=n>component_dir</span><span class=p>)</span><span class=o>.</span><span class=n>is_absolute</span><span class=p>():</span>
<a id=__codelineno-0-103 name=__codelineno-0-103></a> <span class=k>raise</span> <span class=ne>ValueError</span><span class=p>(</span><span class=sa>f</span><span class=s2>&quot;</span><span class=si>{</span><span class=n>source</span><span class=si>}</span><span class=s2> must contain absolute paths, got &#39;</span><span class=si>{</span><span class=n>component_dir</span><span class=si>}</span><span class=s2>&#39;&quot;</span><span class=p>)</span>
<a id=__codelineno-0-104 name=__codelineno-0-104></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-105 name=__codelineno-0-105></a> <span class=n>directories</span><span class=o>.</span><span class=n>add</span><span class=p>(</span><span class=n>Path</span><span class=p>(</span><span class=n>component_dir</span><span class=p>)</span><span class=o>.</span><span class=n>resolve</span><span class=p>())</span>
<a id=__codelineno-0-106 name=__codelineno-0-106></a>
<a id=__codelineno-0-107 name=__codelineno-0-107></a> <span class=n>logger</span><span class=o>.</span><span class=n>debug</span><span class=p>(</span>
<a id=__codelineno-0-108 name=__codelineno-0-108></a> <span class=s2>&quot;get_component_dirs matched following template dirs:</span><span class=se>\n</span><span class=s2>&quot;</span> <span class=o>+</span> <span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>([</span><span class=sa>f</span><span class=s2>&quot; - </span><span class=si>{</span><span class=nb>str</span><span class=p>(</span><span class=n>d</span><span class=p>)</span><span class=si>}</span><span class=s2>&quot;</span> <span class=k>for</span> <span class=n>d</span> <span class=ow>in</span> <span class=n>directories</span><span class=p>])</span>
<a id=__codelineno-0-109 name=__codelineno-0-109></a> <span class=p>)</span>
<a id=__codelineno-0-110 name=__codelineno-0-110></a> <span class=k>return</span> <span class=nb>list</span><span class=p>(</span><span class=n>directories</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.util.loader.get_component_files class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">get_component_files</span> <a href=#django_components.util.loader.get_component_files class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nf>get_component_files</span><span class=p>(</span><span class=n>suffix</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-internal" title=django_components.util.loader.ComponentFileEntry href=../#django_components.util.loader.ComponentFileEntry>ComponentFileEntry</a></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Search for files within the component directories (as defined in <a href=../api#django_components.get_component_dirs><code>get_component_dirs()</code></a>).</p> <p>Requires <code>BASE_DIR</code> setting to be set.</p> <p><span class=doc-section-title>Parameters:</span></p> <ul> <li class="doc-section-item field-body"> <b><code>suffix</code></b> (<code><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a>[<a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a>]</code>, default: <code>None</code> ) <div class=doc-md-description> <p>The suffix to search for. E.g. <code>.py</code>, <code>.js</code>, <code>.css</code>. Defaults to <code>None</code>, which will search for all files.</p> </div> </li> </ul> <p><span class=doc-section-title>Returns:</span></p> <ul> <li class="doc-section-item field-body"> <code><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a>[<a class="autorefs autorefs-internal" title=django_components.util.loader.ComponentFileEntry href=../#django_components.util.loader.ComponentFileEntry>ComponentFileEntry</a>]</code> <div class=doc-md-description> <p>List[ComponentFileEntry] A list of entries that contain both the filesystem path and the python import path (dot path).</p> </div> </li> </ul> <p><strong>Example:</strong></p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=kn>from</span> <span class=nn>django_components</span> <span class=kn>import</span> <span class=n>get_component_files</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=n>modules</span> <span class=o>=</span> <span class=n>get_component_files</span><span class=p>(</span><span class=s2>&quot;.py&quot;</span><span class=p>)</span>
</code></pre></div> <details class=quote> <summary>Source code in <code>src/django_components/util/loader.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-122>122</a></span>
<span class=normal><a href=#__codelineno-0-123>123</a></span>
<span class=normal><a href=#__codelineno-0-124>124</a></span>
<span class=normal><a href=#__codelineno-0-125>125</a></span>
<span class=normal><a href=#__codelineno-0-126>126</a></span>
<span class=normal><a href=#__codelineno-0-127>127</a></span>
<span class=normal><a href=#__codelineno-0-128>128</a></span>
<span class=normal><a href=#__codelineno-0-129>129</a></span>
<span class=normal><a href=#__codelineno-0-130>130</a></span>
<span class=normal><a href=#__codelineno-0-131>131</a></span>
<span class=normal><a href=#__codelineno-0-132>132</a></span>
<span class=normal><a href=#__codelineno-0-133>133</a></span>
<span class=normal><a href=#__codelineno-0-134>134</a></span>
<span class=normal><a href=#__codelineno-0-135>135</a></span>
<span class=normal><a href=#__codelineno-0-136>136</a></span>
<span class=normal><a href=#__codelineno-0-137>137</a></span>
<span class=normal><a href=#__codelineno-0-138>138</a></span>
<span class=normal><a href=#__codelineno-0-139>139</a></span>
<span class=normal><a href=#__codelineno-0-140>140</a></span>
<span class=normal><a href=#__codelineno-0-141>141</a></span>
<span class=normal><a href=#__codelineno-0-142>142</a></span>
<span class=normal><a href=#__codelineno-0-143>143</a></span>
<span class=normal><a href=#__codelineno-0-144>144</a></span>
<span class=normal><a href=#__codelineno-0-145>145</a></span>
<span class=normal><a href=#__codelineno-0-146>146</a></span>
<span class=normal><a href=#__codelineno-0-147>147</a></span>
<span class=normal><a href=#__codelineno-0-148>148</a></span>
<span class=normal><a href=#__codelineno-0-149>149</a></span>
<span class=normal><a href=#__codelineno-0-150>150</a></span>
<span class=normal><a href=#__codelineno-0-151>151</a></span>
<span class=normal><a href=#__codelineno-0-152>152</a></span>
<span class=normal><a href=#__codelineno-0-153>153</a></span>
<span class=normal><a href=#__codelineno-0-154>154</a></span>
<span class=normal><a href=#__codelineno-0-155>155</a></span>
<span class=normal><a href=#__codelineno-0-156>156</a></span>
<span class=normal><a href=#__codelineno-0-157>157</a></span>
<span class=normal><a href=#__codelineno-0-158>158</a></span>
<span class=normal><a href=#__codelineno-0-159>159</a></span>
<span class=normal><a href=#__codelineno-0-160>160</a></span>
<span class=normal><a href=#__codelineno-0-161>161</a></span>
<span class=normal><a href=#__codelineno-0-162>162</a></span>
<span class=normal><a href=#__codelineno-0-163>163</a></span>
<span class=normal><a href=#__codelineno-0-164>164</a></span>
<span class=normal><a href=#__codelineno-0-165>165</a></span>
<span class=normal><a href=#__codelineno-0-166>166</a></span>
<span class=normal><a href=#__codelineno-0-167>167</a></span>
<span class=normal><a href=#__codelineno-0-168>168</a></span>
<span class=normal><a href=#__codelineno-0-169>169</a></span>
<span class=normal><a href=#__codelineno-0-170>170</a></span>
<span class=normal><a href=#__codelineno-0-171>171</a></span>
<span class=normal><a href=#__codelineno-0-172>172</a></span>
<span class=normal><a href=#__codelineno-0-173>173</a></span>
<span class=normal><a href=#__codelineno-0-174>174</a></span>
<span class=normal><a href=#__codelineno-0-175>175</a></span>
<span class=normal><a href=#__codelineno-0-176>176</a></span>
<span class=normal><a href=#__codelineno-0-177>177</a></span>
<span class=normal><a href=#__codelineno-0-178>178</a></span>
<span class=normal><a href=#__codelineno-0-179>179</a></span>
<span class=normal><a href=#__codelineno-0-180>180</a></span>
<span class=normal><a href=#__codelineno-0-181>181</a></span>
<span class=normal><a href=#__codelineno-0-182>182</a></span>
<span class=normal><a href=#__codelineno-0-183>183</a></span>
<span class=normal><a href=#__codelineno-0-184>184</a></span>
<span class=normal><a href=#__codelineno-0-185>185</a></span>
<span class=normal><a href=#__codelineno-0-186>186</a></span>
<span class=normal><a href=#__codelineno-0-187>187</a></span>
<span class=normal><a href=#__codelineno-0-188>188</a></span>
<span class=normal><a href=#__codelineno-0-189>189</a></span>
<span class=normal><a href=#__codelineno-0-190>190</a></span>
<span class=normal><a href=#__codelineno-0-191>191</a></span>
<span class=normal><a href=#__codelineno-0-192>192</a></span>
<span class=normal><a href=#__codelineno-0-193>193</a></span>
<span class=normal><a href=#__codelineno-0-194>194</a></span>
<span class=normal><a href=#__codelineno-0-195>195</a></span>
<span class=normal><a href=#__codelineno-0-196>196</a></span>
<span class=normal><a href=#__codelineno-0-197>197</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-122 name=__codelineno-0-122></a><span class=k>def</span> <span class=nf>get_component_files</span><span class=p>(</span><span class=n>suffix</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>List</span><span class=p>[</span><span class=n>ComponentFileEntry</span><span class=p>]:</span>
<a id=__codelineno-0-123 name=__codelineno-0-123></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-124 name=__codelineno-0-124></a><span class=sd> Search for files within the component directories (as defined in</span>
<a id=__codelineno-0-125 name=__codelineno-0-125></a><span class=sd> [`get_component_dirs()`](../api#django_components.get_component_dirs)).</span>
<a id=__codelineno-0-126 name=__codelineno-0-126></a>
<a id=__codelineno-0-127 name=__codelineno-0-127></a><span class=sd> Requires `BASE_DIR` setting to be set.</span>
<a id=__codelineno-0-128 name=__codelineno-0-128></a>
<a id=__codelineno-0-129 name=__codelineno-0-129></a><span class=sd> Args:</span>
<a id=__codelineno-0-130 name=__codelineno-0-130></a><span class=sd> suffix (Optional[str], optional): The suffix to search for. E.g. `.py`, `.js`, `.css`.\</span>
<a id=__codelineno-0-131 name=__codelineno-0-131></a><span class=sd> Defaults to `None`, which will search for all files.</span>
<a id=__codelineno-0-132 name=__codelineno-0-132></a>
<a id=__codelineno-0-133 name=__codelineno-0-133></a><span class=sd> Returns:</span>
<a id=__codelineno-0-134 name=__codelineno-0-134></a><span class=sd> List[ComponentFileEntry] A list of entries that contain both the filesystem path and \</span>
<a id=__codelineno-0-135 name=__codelineno-0-135></a><span class=sd> the python import path (dot path).</span>
<a id=__codelineno-0-136 name=__codelineno-0-136></a>
<a id=__codelineno-0-137 name=__codelineno-0-137></a><span class=sd> **Example:**</span>
<a id=__codelineno-0-138 name=__codelineno-0-138></a>
<a id=__codelineno-0-139 name=__codelineno-0-139></a><span class=sd> ```python</span>
<a id=__codelineno-0-140 name=__codelineno-0-140></a><span class=sd> from django_components import get_component_files</span>
<a id=__codelineno-0-141 name=__codelineno-0-141></a>
<a id=__codelineno-0-142 name=__codelineno-0-142></a><span class=sd> modules = get_component_files(&quot;.py&quot;)</span>
<a id=__codelineno-0-143 name=__codelineno-0-143></a><span class=sd> ```</span>
<a id=__codelineno-0-144 name=__codelineno-0-144></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-145 name=__codelineno-0-145></a> <span class=n>search_glob</span> <span class=o>=</span> <span class=sa>f</span><span class=s2>&quot;**/*</span><span class=si>{</span><span class=n>suffix</span><span class=si>}</span><span class=s2>&quot;</span> <span class=k>if</span> <span class=n>suffix</span> <span class=k>else</span> <span class=s2>&quot;**/*&quot;</span>
<a id=__codelineno-0-146 name=__codelineno-0-146></a>
<a id=__codelineno-0-147 name=__codelineno-0-147></a> <span class=n>dirs</span> <span class=o>=</span> <span class=n>get_component_dirs</span><span class=p>(</span><span class=n>include_apps</span><span class=o>=</span><span class=kc>False</span><span class=p>)</span>
<a id=__codelineno-0-148 name=__codelineno-0-148></a> <span class=n>component_filepaths</span> <span class=o>=</span> <span class=n>_search_dirs</span><span class=p>(</span><span class=n>dirs</span><span class=p>,</span> <span class=n>search_glob</span><span class=p>)</span>
<a id=__codelineno-0-149 name=__codelineno-0-149></a>
<a id=__codelineno-0-150 name=__codelineno-0-150></a> <span class=k>if</span> <span class=nb>hasattr</span><span class=p>(</span><span class=n>settings</span><span class=p>,</span> <span class=s2>&quot;BASE_DIR&quot;</span><span class=p>)</span> <span class=ow>and</span> <span class=n>settings</span><span class=o>.</span><span class=n>BASE_DIR</span><span class=p>:</span>
<a id=__codelineno-0-151 name=__codelineno-0-151></a> <span class=n>project_root</span> <span class=o>=</span> <span class=nb>str</span><span class=p>(</span><span class=n>settings</span><span class=o>.</span><span class=n>BASE_DIR</span><span class=p>)</span>
<a id=__codelineno-0-152 name=__codelineno-0-152></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-153 name=__codelineno-0-153></a> <span class=c1># Fallback for getting the root dir, see https://stackoverflow.com/a/16413955/9788634</span>
<a id=__codelineno-0-154 name=__codelineno-0-154></a> <span class=n>project_root</span> <span class=o>=</span> <span class=n>os</span><span class=o>.</span><span class=n>path</span><span class=o>.</span><span class=n>abspath</span><span class=p>(</span><span class=n>os</span><span class=o>.</span><span class=n>path</span><span class=o>.</span><span class=n>dirname</span><span class=p>(</span><span class=vm>__name__</span><span class=p>))</span>
<a id=__codelineno-0-155 name=__codelineno-0-155></a>
<a id=__codelineno-0-156 name=__codelineno-0-156></a> <span class=c1># NOTE: We handle dirs from `COMPONENTS.dirs` and from individual apps separately.</span>
<a id=__codelineno-0-157 name=__codelineno-0-157></a> <span class=n>modules</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=n>ComponentFileEntry</span><span class=p>]</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-158 name=__codelineno-0-158></a>
<a id=__codelineno-0-159 name=__codelineno-0-159></a> <span class=c1># First let&#39;s handle the dirs from `COMPONENTS.dirs`</span>
<a id=__codelineno-0-160 name=__codelineno-0-160></a> <span class=c1>#</span>
<a id=__codelineno-0-161 name=__codelineno-0-161></a> <span class=c1># Because for dirs in `COMPONENTS.dirs`, we assume they will be nested under `BASE_DIR`,</span>
<a id=__codelineno-0-162 name=__codelineno-0-162></a> <span class=c1># and that `BASE_DIR` is the current working dir (CWD). So the path relatively to `BASE_DIR`</span>
<a id=__codelineno-0-163 name=__codelineno-0-163></a> <span class=c1># is ALSO the python import path.</span>
<a id=__codelineno-0-164 name=__codelineno-0-164></a> <span class=k>for</span> <span class=n>filepath</span> <span class=ow>in</span> <span class=n>component_filepaths</span><span class=p>:</span>
<a id=__codelineno-0-165 name=__codelineno-0-165></a> <span class=n>module_path</span> <span class=o>=</span> <span class=n>_filepath_to_python_module</span><span class=p>(</span><span class=n>filepath</span><span class=p>,</span> <span class=n>project_root</span><span class=p>,</span> <span class=kc>None</span><span class=p>)</span>
<a id=__codelineno-0-166 name=__codelineno-0-166></a> <span class=c1># Ignore files starting with dot `.` or files in dirs that start with dot.</span>
<a id=__codelineno-0-167 name=__codelineno-0-167></a> <span class=c1>#</span>
<a id=__codelineno-0-168 name=__codelineno-0-168></a> <span class=c1># If any of the parts of the path start with a dot, e.g. the filesystem path</span>
<a id=__codelineno-0-169 name=__codelineno-0-169></a> <span class=c1># is `./abc/.def`, then this gets converted to python module as `abc..def`</span>
<a id=__codelineno-0-170 name=__codelineno-0-170></a> <span class=c1>#</span>
<a id=__codelineno-0-171 name=__codelineno-0-171></a> <span class=c1># NOTE: This approach also ignores files:</span>
<a id=__codelineno-0-172 name=__codelineno-0-172></a> <span class=c1># - with two dots in the middle (ab..cd.py)</span>
<a id=__codelineno-0-173 name=__codelineno-0-173></a> <span class=c1># - an extra dot at the end (abcd..py)</span>
<a id=__codelineno-0-174 name=__codelineno-0-174></a> <span class=c1># - files outside of the parent component (../abcd.py).</span>
<a id=__codelineno-0-175 name=__codelineno-0-175></a> <span class=c1># But all these are NOT valid python modules so that&#39;s fine.</span>
<a id=__codelineno-0-176 name=__codelineno-0-176></a> <span class=k>if</span> <span class=s2>&quot;..&quot;</span> <span class=ow>in</span> <span class=n>module_path</span><span class=p>:</span>
<a id=__codelineno-0-177 name=__codelineno-0-177></a> <span class=k>continue</span>
<a id=__codelineno-0-178 name=__codelineno-0-178></a>
<a id=__codelineno-0-179 name=__codelineno-0-179></a> <span class=n>entry</span> <span class=o>=</span> <span class=n>ComponentFileEntry</span><span class=p>(</span><span class=n>dot_path</span><span class=o>=</span><span class=n>module_path</span><span class=p>,</span> <span class=n>filepath</span><span class=o>=</span><span class=n>filepath</span><span class=p>)</span>
<a id=__codelineno-0-180 name=__codelineno-0-180></a> <span class=n>modules</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>entry</span><span class=p>)</span>
<a id=__codelineno-0-181 name=__codelineno-0-181></a>
<a id=__codelineno-0-182 name=__codelineno-0-182></a> <span class=c1># For for apps, the directories may be outside of the project, e.g. in case of third party</span>
<a id=__codelineno-0-183 name=__codelineno-0-183></a> <span class=c1># apps. So we have to resolve the python import path relative to the package name / the root</span>
<a id=__codelineno-0-184 name=__codelineno-0-184></a> <span class=c1># import path for the app.</span>
<a id=__codelineno-0-185 name=__codelineno-0-185></a> <span class=c1># See https://github.com/EmilStenstrom/django-components/issues/669</span>
<a id=__codelineno-0-186 name=__codelineno-0-186></a> <span class=k>for</span> <span class=n>conf</span> <span class=ow>in</span> <span class=n>apps</span><span class=o>.</span><span class=n>get_app_configs</span><span class=p>():</span>
<a id=__codelineno-0-187 name=__codelineno-0-187></a> <span class=k>for</span> <span class=n>app_dir</span> <span class=ow>in</span> <span class=n>app_settings</span><span class=o>.</span><span class=n>APP_DIRS</span><span class=p>:</span>
<a id=__codelineno-0-188 name=__codelineno-0-188></a> <span class=n>comps_path</span> <span class=o>=</span> <span class=n>Path</span><span class=p>(</span><span class=n>conf</span><span class=o>.</span><span class=n>path</span><span class=p>)</span><span class=o>.</span><span class=n>joinpath</span><span class=p>(</span><span class=n>app_dir</span><span class=p>)</span>
<a id=__codelineno-0-189 name=__codelineno-0-189></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>comps_path</span><span class=o>.</span><span class=n>exists</span><span class=p>():</span>
<a id=__codelineno-0-190 name=__codelineno-0-190></a> <span class=k>continue</span>
<a id=__codelineno-0-191 name=__codelineno-0-191></a> <span class=n>app_component_filepaths</span> <span class=o>=</span> <span class=n>_search_dirs</span><span class=p>([</span><span class=n>comps_path</span><span class=p>],</span> <span class=n>search_glob</span><span class=p>)</span>
<a id=__codelineno-0-192 name=__codelineno-0-192></a> <span class=k>for</span> <span class=n>filepath</span> <span class=ow>in</span> <span class=n>app_component_filepaths</span><span class=p>:</span>
<a id=__codelineno-0-193 name=__codelineno-0-193></a> <span class=n>app_component_module</span> <span class=o>=</span> <span class=n>_filepath_to_python_module</span><span class=p>(</span><span class=n>filepath</span><span class=p>,</span> <span class=n>conf</span><span class=o>.</span><span class=n>path</span><span class=p>,</span> <span class=n>conf</span><span class=o>.</span><span class=n>name</span><span class=p>)</span>
<a id=__codelineno-0-194 name=__codelineno-0-194></a> <span class=n>entry</span> <span class=o>=</span> <span class=n>ComponentFileEntry</span><span class=p>(</span><span class=n>dot_path</span><span class=o>=</span><span class=n>app_component_module</span><span class=p>,</span> <span class=n>filepath</span><span class=o>=</span><span class=n>filepath</span><span class=p>)</span>
<a id=__codelineno-0-195 name=__codelineno-0-195></a> <span class=n>modules</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>entry</span><span class=p>)</span>
<a id=__codelineno-0-196 name=__codelineno-0-196></a>
<a id=__codelineno-0-197 name=__codelineno-0-197></a> <span class=k>return</span> <span class=n>modules</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.util.logger class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">logger</span> <a href=#django_components.util.logger class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p><span class=doc-section-title>Functions:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.logger.trace href=../#django_components.util.logger.trace>trace</a></code></b> <div class=doc-md-description> <p>TRACE level logger.</p> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.logger.trace_msg href=../#django_components.util.logger.trace_msg>trace_msg</a></code></b> <div class=doc-md-description> <p>TRACE level logger with opinionated format for tracing interaction of components,</p> </div> </li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h3 id=django_components.util.logger.trace class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">trace</span> <a href=#django_components.util.logger.trace class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nf>trace</span><span class=p>(</span><span class=n>logger</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=logging.Logger href=https://docs.python.org/3.12/library/logging.html#logging.Logger>Logger</a></span><span class=p>,</span> <span class=n>message</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=o>*</span><span class=n>args</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>,</span> <span class=o>**</span><span class=n>kwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>TRACE level logger.</p> <p>To display TRACE logs, set the logging level to 5.</p> <p>Example: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>LOGGING</span> <span class=o>=</span> <span class=p>{</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=s2>&quot;version&quot;</span><span class=p>:</span> <span class=mi>1</span><span class=p>,</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=s2>&quot;disable_existing_loggers&quot;</span><span class=p>:</span> <span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=s2>&quot;handlers&quot;</span><span class=p>:</span> <span class=p>{</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=s2>&quot;console&quot;</span><span class=p>:</span> <span class=p>{</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=s2>&quot;class&quot;</span><span class=p>:</span> <span class=s2>&quot;logging.StreamHandler&quot;</span><span class=p>,</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> <span class=s2>&quot;stream&quot;</span><span class=p>:</span> <span class=n>sys</span><span class=o>.</span><span class=n>stdout</span><span class=p>,</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a> <span class=p>},</span>
<a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a> <span class=p>},</span>
<a id=__codelineno-0-10 name=__codelineno-0-10 href=#__codelineno-0-10></a> <span class=s2>&quot;loggers&quot;</span><span class=p>:</span> <span class=p>{</span>
<a id=__codelineno-0-11 name=__codelineno-0-11 href=#__codelineno-0-11></a> <span class=s2>&quot;django_components&quot;</span><span class=p>:</span> <span class=p>{</span>
<a id=__codelineno-0-12 name=__codelineno-0-12 href=#__codelineno-0-12></a> <span class=s2>&quot;level&quot;</span><span class=p>:</span> <span class=mi>5</span><span class=p>,</span>
<a id=__codelineno-0-13 name=__codelineno-0-13 href=#__codelineno-0-13></a> <span class=s2>&quot;handlers&quot;</span><span class=p>:</span> <span class=p>[</span><span class=s2>&quot;console&quot;</span><span class=p>],</span>
<a id=__codelineno-0-14 name=__codelineno-0-14 href=#__codelineno-0-14></a> <span class=p>},</span>
<a id=__codelineno-0-15 name=__codelineno-0-15 href=#__codelineno-0-15></a> <span class=p>},</span>
<a id=__codelineno-0-16 name=__codelineno-0-16 href=#__codelineno-0-16></a><span class=p>}</span>
</code></pre></div></p> <details class=quote> <summary>Source code in <code>src/django_components/util/logger.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-32>32</a></span>
<span class=normal><a href=#__codelineno-0-33>33</a></span>
<span class=normal><a href=#__codelineno-0-34>34</a></span>
<span class=normal><a href=#__codelineno-0-35>35</a></span>
<span class=normal><a href=#__codelineno-0-36>36</a></span>
<span class=normal><a href=#__codelineno-0-37>37</a></span>
<span class=normal><a href=#__codelineno-0-38>38</a></span>
<span class=normal><a href=#__codelineno-0-39>39</a></span>
<span class=normal><a href=#__codelineno-0-40>40</a></span>
<span class=normal><a href=#__codelineno-0-41>41</a></span>
<span class=normal><a href=#__codelineno-0-42>42</a></span>
<span class=normal><a href=#__codelineno-0-43>43</a></span>
<span class=normal><a href=#__codelineno-0-44>44</a></span>
<span class=normal><a href=#__codelineno-0-45>45</a></span>
<span class=normal><a href=#__codelineno-0-46>46</a></span>
<span class=normal><a href=#__codelineno-0-47>47</a></span>
<span class=normal><a href=#__codelineno-0-48>48</a></span>
<span class=normal><a href=#__codelineno-0-49>49</a></span>
<span class=normal><a href=#__codelineno-0-50>50</a></span>
<span class=normal><a href=#__codelineno-0-51>51</a></span>
<span class=normal><a href=#__codelineno-0-52>52</a></span>
<span class=normal><a href=#__codelineno-0-53>53</a></span>
<span class=normal><a href=#__codelineno-0-54>54</a></span>
<span class=normal><a href=#__codelineno-0-55>55</a></span>
<span class=normal><a href=#__codelineno-0-56>56</a></span>
<span class=normal><a href=#__codelineno-0-57>57</a></span>
<span class=normal><a href=#__codelineno-0-58>58</a></span>
<span class=normal><a href=#__codelineno-0-59>59</a></span>
<span class=normal><a href=#__codelineno-0-60>60</a></span>
<span class=normal><a href=#__codelineno-0-61>61</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-32 name=__codelineno-0-32></a><span class=k>def</span> <span class=nf>trace</span><span class=p>(</span><span class=n>logger</span><span class=p>:</span> <span class=n>logging</span><span class=o>.</span><span class=n>Logger</span><span class=p>,</span> <span class=n>message</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span> <span class=o>*</span><span class=n>args</span><span class=p>:</span> <span class=n>Any</span><span class=p>,</span> <span class=o>**</span><span class=n>kwargs</span><span class=p>:</span> <span class=n>Any</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-33 name=__codelineno-0-33></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-34 name=__codelineno-0-34></a><span class=sd> TRACE level logger.</span>
<a id=__codelineno-0-35 name=__codelineno-0-35></a>
<a id=__codelineno-0-36 name=__codelineno-0-36></a><span class=sd> To display TRACE logs, set the logging level to 5.</span>
<a id=__codelineno-0-37 name=__codelineno-0-37></a>
<a id=__codelineno-0-38 name=__codelineno-0-38></a><span class=sd> Example:</span>
<a id=__codelineno-0-39 name=__codelineno-0-39></a><span class=sd> ```py</span>
<a id=__codelineno-0-40 name=__codelineno-0-40></a><span class=sd> LOGGING = {</span>
<a id=__codelineno-0-41 name=__codelineno-0-41></a><span class=sd> &quot;version&quot;: 1,</span>
<a id=__codelineno-0-42 name=__codelineno-0-42></a><span class=sd> &quot;disable_existing_loggers&quot;: False,</span>
<a id=__codelineno-0-43 name=__codelineno-0-43></a><span class=sd> &quot;handlers&quot;: {</span>
<a id=__codelineno-0-44 name=__codelineno-0-44></a><span class=sd> &quot;console&quot;: {</span>
<a id=__codelineno-0-45 name=__codelineno-0-45></a><span class=sd> &quot;class&quot;: &quot;logging.StreamHandler&quot;,</span>
<a id=__codelineno-0-46 name=__codelineno-0-46></a><span class=sd> &quot;stream&quot;: sys.stdout,</span>
<a id=__codelineno-0-47 name=__codelineno-0-47></a><span class=sd> },</span>
<a id=__codelineno-0-48 name=__codelineno-0-48></a><span class=sd> },</span>
<a id=__codelineno-0-49 name=__codelineno-0-49></a><span class=sd> &quot;loggers&quot;: {</span>
<a id=__codelineno-0-50 name=__codelineno-0-50></a><span class=sd> &quot;django_components&quot;: {</span>
<a id=__codelineno-0-51 name=__codelineno-0-51></a><span class=sd> &quot;level&quot;: 5,</span>
<a id=__codelineno-0-52 name=__codelineno-0-52></a><span class=sd> &quot;handlers&quot;: [&quot;console&quot;],</span>
<a id=__codelineno-0-53 name=__codelineno-0-53></a><span class=sd> },</span>
<a id=__codelineno-0-54 name=__codelineno-0-54></a><span class=sd> },</span>
<a id=__codelineno-0-55 name=__codelineno-0-55></a><span class=sd> }</span>
<a id=__codelineno-0-56 name=__codelineno-0-56></a><span class=sd> ```</span>
<a id=__codelineno-0-57 name=__codelineno-0-57></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-58 name=__codelineno-0-58></a> <span class=k>if</span> <span class=n>actual_trace_level_num</span> <span class=o>==</span> <span class=o>-</span><span class=mi>1</span><span class=p>:</span>
<a id=__codelineno-0-59 name=__codelineno-0-59></a> <span class=n>setup_logging</span><span class=p>()</span>
<a id=__codelineno-0-60 name=__codelineno-0-60></a> <span class=k>if</span> <span class=n>logger</span><span class=o>.</span><span class=n>isEnabledFor</span><span class=p>(</span><span class=n>actual_trace_level_num</span><span class=p>):</span>
<a id=__codelineno-0-61 name=__codelineno-0-61></a> <span class=n>logger</span><span class=o>.</span><span class=n>log</span><span class=p>(</span><span class=n>actual_trace_level_num</span><span class=p>,</span> <span class=n>message</span><span class=p>,</span> <span class=o>*</span><span class=n>args</span><span class=p>,</span> <span class=o>**</span><span class=n>kwargs</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.util.logger.trace_msg class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">trace_msg</span> <a href=#django_components.util.logger.trace_msg class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nf>trace_msg</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>action</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Literal href=https://docs.python.org/3.12/library/typing.html#typing.Literal>Literal</a></span><span class=p>[</span><span class=s2>&quot;PARSE&quot;</span><span class=p>,</span> <span class=s2>&quot;RENDR&quot;</span><span class=p>,</span> <span class=s2>&quot;GET&quot;</span><span class=p>,</span> <span class=s2>&quot;SET&quot;</span><span class=p>],</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>node_type</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Literal href=https://docs.python.org/3.12/library/typing.html#typing.Literal>Literal</a></span><span class=p>[</span><span class=s2>&quot;COMP&quot;</span><span class=p>,</span> <span class=s2>&quot;FILL&quot;</span><span class=p>,</span> <span class=s2>&quot;SLOT&quot;</span><span class=p>,</span> <span class=s2>&quot;PROVIDE&quot;</span><span class=p>,</span> <span class=s2>&quot;N/A&quot;</span><span class=p>],</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=n>node_name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=n>node_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=n>msg</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span> <span class=o>=</span> <span class=s2>&quot;&quot;</span><span class=p>,</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> <span class=n>component_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>TRACE level logger with opinionated format for tracing interaction of components, nodes, and slots. Formats messages like so:</p> <p><code>"ASSOC SLOT test_slot ID 0088 TO COMP 0087"</code></p> <details class=quote> <summary>Source code in <code>src/django_components/util/logger.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-64>64</a></span>
<span class=normal><a href=#__codelineno-0-65>65</a></span>
<span class=normal><a href=#__codelineno-0-66>66</a></span>
<span class=normal><a href=#__codelineno-0-67>67</a></span>
<span class=normal><a href=#__codelineno-0-68>68</a></span>
<span class=normal><a href=#__codelineno-0-69>69</a></span>
<span class=normal><a href=#__codelineno-0-70>70</a></span>
<span class=normal><a href=#__codelineno-0-71>71</a></span>
<span class=normal><a href=#__codelineno-0-72>72</a></span>
<span class=normal><a href=#__codelineno-0-73>73</a></span>
<span class=normal><a href=#__codelineno-0-74>74</a></span>
<span class=normal><a href=#__codelineno-0-75>75</a></span>
<span class=normal><a href=#__codelineno-0-76>76</a></span>
<span class=normal><a href=#__codelineno-0-77>77</a></span>
<span class=normal><a href=#__codelineno-0-78>78</a></span>
<span class=normal><a href=#__codelineno-0-79>79</a></span>
<span class=normal><a href=#__codelineno-0-80>80</a></span>
<span class=normal><a href=#__codelineno-0-81>81</a></span>
<span class=normal><a href=#__codelineno-0-82>82</a></span>
<span class=normal><a href=#__codelineno-0-83>83</a></span>
<span class=normal><a href=#__codelineno-0-84>84</a></span>
<span class=normal><a href=#__codelineno-0-85>85</a></span>
<span class=normal><a href=#__codelineno-0-86>86</a></span>
<span class=normal><a href=#__codelineno-0-87>87</a></span>
<span class=normal><a href=#__codelineno-0-88>88</a></span>
<span class=normal><a href=#__codelineno-0-89>89</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-64 name=__codelineno-0-64></a><span class=k>def</span> <span class=nf>trace_msg</span><span class=p>(</span>
<a id=__codelineno-0-65 name=__codelineno-0-65></a> <span class=n>action</span><span class=p>:</span> <span class=n>Literal</span><span class=p>[</span><span class=s2>&quot;PARSE&quot;</span><span class=p>,</span> <span class=s2>&quot;RENDR&quot;</span><span class=p>,</span> <span class=s2>&quot;GET&quot;</span><span class=p>,</span> <span class=s2>&quot;SET&quot;</span><span class=p>],</span>
<a id=__codelineno-0-66 name=__codelineno-0-66></a> <span class=n>node_type</span><span class=p>:</span> <span class=n>Literal</span><span class=p>[</span><span class=s2>&quot;COMP&quot;</span><span class=p>,</span> <span class=s2>&quot;FILL&quot;</span><span class=p>,</span> <span class=s2>&quot;SLOT&quot;</span><span class=p>,</span> <span class=s2>&quot;PROVIDE&quot;</span><span class=p>,</span> <span class=s2>&quot;N/A&quot;</span><span class=p>],</span>
<a id=__codelineno-0-67 name=__codelineno-0-67></a> <span class=n>node_name</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-68 name=__codelineno-0-68></a> <span class=n>node_id</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-69 name=__codelineno-0-69></a> <span class=n>msg</span><span class=p>:</span> <span class=nb>str</span> <span class=o>=</span> <span class=s2>&quot;&quot;</span><span class=p>,</span>
<a id=__codelineno-0-70 name=__codelineno-0-70></a> <span class=n>component_id</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-71 name=__codelineno-0-71></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-72 name=__codelineno-0-72></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-73 name=__codelineno-0-73></a><span class=sd> TRACE level logger with opinionated format for tracing interaction of components,</span>
<a id=__codelineno-0-74 name=__codelineno-0-74></a><span class=sd> nodes, and slots. Formats messages like so:</span>
<a id=__codelineno-0-75 name=__codelineno-0-75></a>
<a id=__codelineno-0-76 name=__codelineno-0-76></a><span class=sd> `&quot;ASSOC SLOT test_slot ID 0088 TO COMP 0087&quot;`</span>
<a id=__codelineno-0-77 name=__codelineno-0-77></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-78 name=__codelineno-0-78></a> <span class=n>msg_prefix</span> <span class=o>=</span> <span class=s2>&quot;&quot;</span>
<a id=__codelineno-0-79 name=__codelineno-0-79></a> <span class=k>if</span> <span class=n>action</span> <span class=o>==</span> <span class=s2>&quot;RENDR&quot;</span> <span class=ow>and</span> <span class=n>node_type</span> <span class=o>==</span> <span class=s2>&quot;FILL&quot;</span><span class=p>:</span>
<a id=__codelineno-0-80 name=__codelineno-0-80></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>component_id</span><span class=p>:</span>
<a id=__codelineno-0-81 name=__codelineno-0-81></a> <span class=k>raise</span> <span class=ne>ValueError</span><span class=p>(</span><span class=s2>&quot;component_id must be set for the RENDER action&quot;</span><span class=p>)</span>
<a id=__codelineno-0-82 name=__codelineno-0-82></a> <span class=n>msg_prefix</span> <span class=o>=</span> <span class=sa>f</span><span class=s2>&quot;FOR COMP </span><span class=si>{</span><span class=n>component_id</span><span class=si>}</span><span class=s2>&quot;</span>
<a id=__codelineno-0-83 name=__codelineno-0-83></a>
<a id=__codelineno-0-84 name=__codelineno-0-84></a> <span class=n>msg_parts</span> <span class=o>=</span> <span class=p>[</span><span class=sa>f</span><span class=s2>&quot;</span><span class=si>{</span><span class=n>action</span><span class=si>}</span><span class=s2> </span><span class=si>{</span><span class=n>node_type</span><span class=si>}</span><span class=s2> </span><span class=si>{</span><span class=n>node_name</span><span class=si>}</span><span class=s2> ID </span><span class=si>{</span><span class=n>node_id</span><span class=si>}</span><span class=s2>&quot;</span><span class=p>,</span> <span class=o>*</span><span class=p>([</span><span class=n>msg_prefix</span><span class=p>]</span> <span class=k>if</span> <span class=n>msg_prefix</span> <span class=k>else</span> <span class=p>[]),</span> <span class=n>msg</span><span class=p>]</span>
<a id=__codelineno-0-85 name=__codelineno-0-85></a> <span class=n>full_msg</span> <span class=o>=</span> <span class=s2>&quot; &quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=n>msg_parts</span><span class=p>)</span>
<a id=__codelineno-0-86 name=__codelineno-0-86></a>
<a id=__codelineno-0-87 name=__codelineno-0-87></a> <span class=c1># NOTE: When debugging tests during development, it may be easier to change</span>
<a id=__codelineno-0-88 name=__codelineno-0-88></a> <span class=c1># this to `print()`</span>
<a id=__codelineno-0-89 name=__codelineno-0-89></a> <span class=n>trace</span><span class=p>(</span><span class=n>logger</span><span class=p>,</span> <span class=n>full_msg</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.util.misc class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">misc</span> <a href=#django_components.util.misc class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p><span class=doc-section-title>Functions:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.misc.gen_id href=../#django_components.util.misc.gen_id>gen_id</a></code></b> <div class=doc-md-description> <p>Generate a unique ID that can be associated with a Node</p> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.misc.get_import_path href=../#django_components.util.misc.get_import_path>get_import_path</a></code></b> <div class=doc-md-description> <p>Get the full import path for a class or a function, e.g. <code>"path.to.MyClass"</code></p> </div> </li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h3 id=django_components.util.misc.gen_id class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">gen_id</span> <a href=#django_components.util.misc.gen_id class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nf>gen_id</span><span class=p>()</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Generate a unique ID that can be associated with a Node</p> <details class=quote> <summary>Source code in <code>src/django_components/util/misc.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-13>13</a></span>
<span class=normal><a href=#__codelineno-0-14>14</a></span>
<span class=normal><a href=#__codelineno-0-15>15</a></span>
<span class=normal><a href=#__codelineno-0-16>16</a></span>
<span class=normal><a href=#__codelineno-0-17>17</a></span>
<span class=normal><a href=#__codelineno-0-18>18</a></span>
<span class=normal><a href=#__codelineno-0-19>19</a></span>
<span class=normal><a href=#__codelineno-0-20>20</a></span>
<span class=normal><a href=#__codelineno-0-21>21</a></span>
<span class=normal><a href=#__codelineno-0-22>22</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-13 name=__codelineno-0-13></a><span class=k>def</span> <span class=nf>gen_id</span><span class=p>()</span> <span class=o>-&gt;</span> <span class=nb>str</span><span class=p>:</span>
<a id=__codelineno-0-14 name=__codelineno-0-14></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Generate a unique ID that can be associated with a Node&quot;&quot;&quot;</span>
<a id=__codelineno-0-15 name=__codelineno-0-15></a> <span class=c1># Alphabet is only alphanumeric. Compared to the default alphabet used by nanoid,</span>
<a id=__codelineno-0-16 name=__codelineno-0-16></a> <span class=c1># we&#39;ve omitted `-` and `_`.</span>
<a id=__codelineno-0-17 name=__codelineno-0-17></a> <span class=c1># With this alphabet, at 6 chars, the chance of collision is 1 in 3.3M.</span>
<a id=__codelineno-0-18 name=__codelineno-0-18></a> <span class=c1># See https://zelark.github.io/nano-id-cc/</span>
<a id=__codelineno-0-19 name=__codelineno-0-19></a> <span class=k>return</span> <span class=n>generate</span><span class=p>(</span>
<a id=__codelineno-0-20 name=__codelineno-0-20></a> <span class=s2>&quot;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;</span><span class=p>,</span>
<a id=__codelineno-0-21 name=__codelineno-0-21></a> <span class=n>size</span><span class=o>=</span><span class=mi>6</span><span class=p>,</span>
<a id=__codelineno-0-22 name=__codelineno-0-22></a> <span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.util.misc.get_import_path class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">get_import_path</span> <a href=#django_components.util.misc.get_import_path class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nf>get_import_path</span><span class=p>(</span><span class=n>cls_or_fn</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Type href=https://docs.python.org/3.12/library/typing.html#typing.Type>Type</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>])</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Get the full import path for a class or a function, e.g. <code>"path.to.MyClass"</code></p> <details class=quote> <summary>Source code in <code>src/django_components/util/misc.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-45>45</a></span>
<span class=normal><a href=#__codelineno-0-46>46</a></span>
<span class=normal><a href=#__codelineno-0-47>47</a></span>
<span class=normal><a href=#__codelineno-0-48>48</a></span>
<span class=normal><a href=#__codelineno-0-49>49</a></span>
<span class=normal><a href=#__codelineno-0-50>50</a></span>
<span class=normal><a href=#__codelineno-0-51>51</a></span>
<span class=normal><a href=#__codelineno-0-52>52</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-45 name=__codelineno-0-45></a><span class=k>def</span> <span class=nf>get_import_path</span><span class=p>(</span><span class=n>cls_or_fn</span><span class=p>:</span> <span class=n>Type</span><span class=p>[</span><span class=n>Any</span><span class=p>])</span> <span class=o>-&gt;</span> <span class=nb>str</span><span class=p>:</span>
<a id=__codelineno-0-46 name=__codelineno-0-46></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-47 name=__codelineno-0-47></a><span class=sd> Get the full import path for a class or a function, e.g. `&quot;path.to.MyClass&quot;`</span>
<a id=__codelineno-0-48 name=__codelineno-0-48></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-49 name=__codelineno-0-49></a> <span class=n>module</span> <span class=o>=</span> <span class=n>cls_or_fn</span><span class=o>.</span><span class=vm>__module__</span>
<a id=__codelineno-0-50 name=__codelineno-0-50></a> <span class=k>if</span> <span class=n>module</span> <span class=o>==</span> <span class=s2>&quot;builtins&quot;</span><span class=p>:</span>
<a id=__codelineno-0-51 name=__codelineno-0-51></a> <span class=k>return</span> <span class=n>cls_or_fn</span><span class=o>.</span><span class=vm>__qualname__</span> <span class=c1># avoid outputs like &#39;builtins.str&#39;</span>
<a id=__codelineno-0-52 name=__codelineno-0-52></a> <span class=k>return</span> <span class=n>module</span> <span class=o>+</span> <span class=s2>&quot;.&quot;</span> <span class=o>+</span> <span class=n>cls_or_fn</span><span class=o>.</span><span class=vm>__qualname__</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.util.tag_parser class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">tag_parser</span> <a href=#django_components.util.tag_parser class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p><span class=doc-section-title>Classes:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.tag_parser.TagAttr href=../#django_components.util.tag_parser.TagAttr>TagAttr</a></code></b> <div class=doc-md-description> </div> </li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h3 id=django_components.util.tag_parser.TagAttr class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">TagAttr</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-dataclass"><code>dataclass</code></small> </span> <a href=#django_components.util.tag_parser.TagAttr class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nf>TagAttr</span><span class=p>(</span><span class=n>key</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>],</span> <span class=n>value</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n>start_index</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#int>int</a></span><span class=p>,</span> <span class=n>quoted</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></span><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p><span class=doc-section-title>Attributes:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.tag_parser.TagAttr.quoted href=../#django_components.util.tag_parser.TagAttr.quoted>quoted</a></code></b> (<code><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></code>) <div class=doc-md-description> <p>Whether the value is quoted (either with single or double quotes)</p> </div> </li> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.tag_parser.TagAttr.start_index href=../#django_components.util.tag_parser.TagAttr.start_index>start_index</a></code></b> (<code><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#int>int</a></code>) <div class=doc-md-description> <p>Start index of the attribute (include both key and value),</p> </div> </li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h4 id=django_components.util.tag_parser.TagAttr.quoted class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">quoted</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.util.tag_parser.TagAttr.quoted class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>quoted</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Whether the value is quoted (either with single or double quotes)</p> </div> </div> <div class="doc doc-object doc-attribute"> <h4 id=django_components.util.tag_parser.TagAttr.start_index class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">start_index</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.util.tag_parser.TagAttr.start_index class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>start_index</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#int>int</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Start index of the attribute (include both key and value), relative to the start of the owner Tag.</p> </div> </div> </div> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.util.types class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">types</span> <a href=#django_components.util.types class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p><span class=doc-section-title>Classes:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.types.EmptyDict href=../#django_components.util.types.EmptyDict>EmptyDict</a></code></b> <div class=doc-md-description> <p>TypedDict with no members.</p> </div> </li> </ul> <p><span class=doc-section-title>Attributes:</span></p> <ul> <li class="doc-section-item field-body"> <b><code><a class="autorefs autorefs-internal" title=django_components.util.types.EmptyTuple href=../#django_components.util.types.EmptyTuple>EmptyTuple</a></code></b> <div class=doc-md-description> <p>Tuple with no members.</p> </div> </li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h3 id=django_components.util.types.EmptyTuple class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">EmptyTuple</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small> </span> <a href=#django_components.util.types.EmptyTuple class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>EmptyTuple</span> <span class=o>=</span> <span class=n><a class="autorefs autorefs-external" title=typing.Tuple href=https://docs.python.org/3.12/library/typing.html#typing.Tuple>Tuple</a></span><span class=p>[]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Tuple with no members.</p> <p>You can use this to define a <a href=../api#django_components.Component>Component</a> that accepts NO positional arguments:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=kn>from</span> <span class=nn>django_components</span> <span class=kn>import</span> <span class=n>Component</span><span class=p>,</span> <span class=n>EmptyTuple</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=k>class</span> <span class=nc>Table</span><span class=p>(</span><span class=n>Component</span><span class=p>(</span><span class=n>EmptyTuple</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>))</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=o>...</span>
</code></pre></div> <p>After that, when you call <a href=../api#django_components.Component.render><code>Component.render()</code></a> or <a href=../api#django_components.Component.render_to_response><code>Component.render_to_response()</code></a>, the <code>args</code> parameter will raise type error if <code>args</code> is anything else than an empty tuple.</p> <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=n>Table</span><span class=o>.</span><span class=n>render</span><span class=p>(</span>
<a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a> <span class=n>args</span><span class=p>:</span> <span class=p>(),</span>
<a id=__codelineno-1-3 name=__codelineno-1-3 href=#__codelineno-1-3></a><span class=p>)</span>
</code></pre></div> <p>Omitting <code>args</code> is also fine:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a><span class=n>Table</span><span class=o>.</span><span class=n>render</span><span class=p>()</span>
</code></pre></div> <p>Other values are not allowed. This will raise an error with MyPy:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-3-1 name=__codelineno-3-1 href=#__codelineno-3-1></a><span class=n>Table</span><span class=o>.</span><span class=n>render</span><span class=p>(</span>
<a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a> <span class=n>args</span><span class=p>:</span> <span class=p>(</span><span class=s2>&quot;one&quot;</span><span class=p>,</span> <span class=mi>2</span><span class=p>,</span> <span class=s2>&quot;three&quot;</span><span class=p>),</span>
<a id=__codelineno-3-3 name=__codelineno-3-3 href=#__codelineno-3-3></a><span class=p>)</span>
</code></pre></div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.util.types.EmptyDict class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">EmptyDict</span> <a href=#django_components.util.types.EmptyDict class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><span title=typing_extensions.TypedDict>TypedDict</span></code></p> <p>TypedDict with no members.</p> <p>You can use this to define a <a href=../api#django_components.Component>Component</a> that accepts NO kwargs, or NO slots, or returns NO data from <a href=../api#django_components.Component.get_context_data><code>Component.get_context_data()</code></a> / <a href=../api#django_components.Component.get_js_data><code>Component.get_js_data()</code></a> / <a href=../api#django_components.Component.get_css_data><code>Component.get_css_data()</code></a>:</p> <p>Accepts NO kwargs:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=kn>from</span> <span class=nn>django_components</span> <span class=kn>import</span> <span class=n>Component</span><span class=p>,</span> <span class=n>EmptyDict</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=k>class</span> <span class=nc>Table</span><span class=p>(</span><span class=n>Component</span><span class=p>(</span><span class=n>Any</span><span class=p>,</span> <span class=n>EmptyDict</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>))</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=o>...</span>
</code></pre></div> <p>Accepts NO slots:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=kn>from</span> <span class=nn>django_components</span> <span class=kn>import</span> <span class=n>Component</span><span class=p>,</span> <span class=n>EmptyDict</span>
<a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a>
<a id=__codelineno-1-3 name=__codelineno-1-3 href=#__codelineno-1-3></a><span class=k>class</span> <span class=nc>Table</span><span class=p>(</span><span class=n>Component</span><span class=p>(</span><span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>EmptyDict</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>))</span>
<a id=__codelineno-1-4 name=__codelineno-1-4 href=#__codelineno-1-4></a> <span class=o>...</span>
</code></pre></div> <p>Returns NO data from <code>get_context_data()</code>:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a><span class=kn>from</span> <span class=nn>django_components</span> <span class=kn>import</span> <span class=n>Component</span><span class=p>,</span> <span class=n>EmptyDict</span>
<a id=__codelineno-2-2 name=__codelineno-2-2 href=#__codelineno-2-2></a>
<a id=__codelineno-2-3 name=__codelineno-2-3 href=#__codelineno-2-3></a><span class=k>class</span> <span class=nc>Table</span><span class=p>(</span><span class=n>Component</span><span class=p>(</span><span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>EmptyDict</span><span class=p>,</span> <span class=n>Any</span><span class=p>,</span> <span class=n>Any</span><span class=p>))</span>
<a id=__codelineno-2-4 name=__codelineno-2-4 href=#__codelineno-2-4></a> <span class=o>...</span>
</code></pre></div> <p>Going back to the example with NO kwargs, when you then call <a href=../api#django_components.Component.render><code>Component.render()</code></a> or <a href=../api#django_components.Component.render_to_response><code>Component.render_to_response()</code></a>, the <code>kwargs</code> parameter will raise type error if <code>kwargs</code> is anything else than an empty dict.</p> <div class=highlight><pre><span></span><code><a id=__codelineno-3-1 name=__codelineno-3-1 href=#__codelineno-3-1></a><span class=n>Table</span><span class=o>.</span><span class=n>render</span><span class=p>(</span>
<a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a> <span class=n>kwargs</span><span class=p>:</span> <span class=p>{},</span>
<a id=__codelineno-3-3 name=__codelineno-3-3 href=#__codelineno-3-3></a><span class=p>)</span>
</code></pre></div> <p>Omitting <code>kwargs</code> is also fine:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-4-1 name=__codelineno-4-1 href=#__codelineno-4-1></a><span class=n>Table</span><span class=o>.</span><span class=n>render</span><span class=p>()</span>
</code></pre></div> <p>Other values are not allowed. This will raise an error with MyPy:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-5-1 name=__codelineno-5-1 href=#__codelineno-5-1></a><span class=n>Table</span><span class=o>.</span><span class=n>render</span><span class=p>(</span>
<a id=__codelineno-5-2 name=__codelineno-5-2 href=#__codelineno-5-2></a> <span class=n>kwargs</span><span class=p>:</span> <span class=p>{</span>
<a id=__codelineno-5-3 name=__codelineno-5-3 href=#__codelineno-5-3></a> <span class=s2>&quot;one&quot;</span><span class=p>:</span> <span class=mi>2</span><span class=p>,</span>
<a id=__codelineno-5-4 name=__codelineno-5-4 href=#__codelineno-5-4></a> <span class=s2>&quot;three&quot;</span><span class=p>:</span> <span class=mi>4</span><span class=p>,</span>
<a id=__codelineno-5-5 name=__codelineno-5-5 href=#__codelineno-5-5></a> <span class=p>},</span>
<a id=__codelineno-5-6 name=__codelineno-5-6 href=#__codelineno-5-6></a><span class=p>)</span>
</code></pre></div> </div> </div> </div> </div> </div> </div> </div> </div> </article> </div> <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type=button class="md-top md-icon" data-md-component=top hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class=md-footer> <nav class="md-footer__inner md-grid" aria-label=Footer> <a href=../urls/ class="md-footer__link md-footer__link--prev" aria-label='Previous: <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> urls'> <div class="md-footer__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </div> <div class=md-footer__title> <span class=md-footer__direction> Previous </span> <div class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> urls </div> </div> </a> <a href=cache/ class="md-footer__link md-footer__link--next" aria-label='Next: <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> cache'> <div class=md-footer__title> <span class=md-footer__direction> Next </span> <div class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> cache </div> </div> <div class="md-footer__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> <div class=md-social> <a href=https://github.com/EmilStenstrom/django-components target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 496 512"><!-- Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </a> <a href=https://pypi.org/project/django-components/ target=_blank rel=noopener title=pypi.org class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6M286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3M167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4m-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3"/></svg> </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <div class=md-progress data-md-component=progress role=progressbar></div> <script id=__config type=application/json>{"base": "../../..", "features": ["content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tabs.link", "navigation.expand", "navigation.footer", "navigation.instant", "navigation.instant.progress", "navigation.indexes", "navigation.sections", "navigation.tracking", "navigation.top", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"alias": true, "default": ["dev"], "provider": "mike"}}</script> <script src=../../../assets/javascripts/bundle.83f73b43.min.js></script> <script src=../../../assets/_markdown_exec_pyodide.js></script> <script src=../../../js/timeago.min.js></script> <script src=../../../js/timeago_mkdocs_material.js></script> </body> </html>