1
0
Fork 0
sqlglot/docs/sqlglot/helper.html
Daniel Baumann d9e621c994
Adding upstream version 26.25.3.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-06-07 04:46:28 +02:00

2280 lines
No EOL
302 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<title>sqlglot.helper API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
<style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pdoc-code .cp{color:#9C6500}.pdoc-code .cpf{color:#3D7B7B; font-style:italic}.pdoc-code .c1{color:#3D7B7B; font-style:italic}.pdoc-code .cs{color:#3D7B7B; font-style:italic}.pdoc-code .gd{color:#A00000}.pdoc-code .ge{font-style:italic}.pdoc-code .gr{color:#E40000}.pdoc-code .gh{color:#000080; font-weight:bold}.pdoc-code .gi{color:#008400}.pdoc-code .go{color:#717171}.pdoc-code .gp{color:#000080; font-weight:bold}.pdoc-code .gs{font-weight:bold}.pdoc-code .gu{color:#800080; font-weight:bold}.pdoc-code .gt{color:#0044DD}.pdoc-code .kc{color:#008000; font-weight:bold}.pdoc-code .kd{color:#008000; font-weight:bold}.pdoc-code .kn{color:#008000; font-weight:bold}.pdoc-code .kp{color:#008000}.pdoc-code .kr{color:#008000; font-weight:bold}.pdoc-code .kt{color:#B00040}.pdoc-code .m{color:#666666}.pdoc-code .s{color:#BA2121}.pdoc-code .na{color:#687822}.pdoc-code .nb{color:#008000}.pdoc-code .nc{color:#0000FF; font-weight:bold}.pdoc-code .no{color:#880000}.pdoc-code .nd{color:#AA22FF}.pdoc-code .ni{color:#717171; font-weight:bold}.pdoc-code .ne{color:#CB3F38; font-weight:bold}.pdoc-code .nf{color:#0000FF}.pdoc-code .nl{color:#767600}.pdoc-code .nn{color:#0000FF; font-weight:bold}.pdoc-code .nt{color:#008000; font-weight:bold}.pdoc-code .nv{color:#19177C}.pdoc-code .ow{color:#AA22FF; font-weight:bold}.pdoc-code .w{color:#bbbbbb}.pdoc-code .mb{color:#666666}.pdoc-code .mf{color:#666666}.pdoc-code .mh{color:#666666}.pdoc-code .mi{color:#666666}.pdoc-code .mo{color:#666666}.pdoc-code .sa{color:#BA2121}.pdoc-code .sb{color:#BA2121}.pdoc-code .sc{color:#BA2121}.pdoc-code .dl{color:#BA2121}.pdoc-code .sd{color:#BA2121; font-style:italic}.pdoc-code .s2{color:#BA2121}.pdoc-code .se{color:#AA5D1F; font-weight:bold}.pdoc-code .sh{color:#BA2121}.pdoc-code .si{color:#A45A77; font-weight:bold}.pdoc-code .sx{color:#008000}.pdoc-code .sr{color:#A45A77}.pdoc-code .s1{color:#BA2121}.pdoc-code .ss{color:#19177C}.pdoc-code .bp{color:#008000}.pdoc-code .fm{color:#0000FF}.pdoc-code .vc{color:#19177C}.pdoc-code .vg{color:#19177C}.pdoc-code .vi{color:#19177C}.pdoc-code .vm{color:#19177C}.pdoc-code .il{color:#666666}</style>
<style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
<style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;z-index:999;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem;}.git-button{display:none !important;}nav input[type="search"]{max-width:77%;}nav input[type="search"]:first-child{margin-top:-6px;}nav input[type="search"]:valid ~ *{display:none !important;}}@media (min-width:770px){:root{--sidebar-width:clamp(12.5rem, 28vw, 22rem);}nav{position:fixed;overflow:auto;height:100vh;width:var(--sidebar-width);}main, header{padding:3rem 2rem 3rem calc(var(--sidebar-width) + 3rem);width:calc(54rem + var(--sidebar-width));max-width:100%;}header + main{margin-top:-4rem;}#navtoggle{display:none;}}#togglestate{position:absolute;height:0;opacity:0;}nav.pdoc{--pad:clamp(0.5rem, 2vw, 1.75rem);--indent:1.5rem;background-color:var(--accent);border-right:1px solid var(--accent2);box-shadow:0 0 20px rgba(50, 50, 50, .2) inset;padding:0 0 0 var(--pad);overflow-wrap:anywhere;scrollbar-width:thin; scrollbar-color:var(--accent2) transparent; z-index:1}nav.pdoc::-webkit-scrollbar{width:.4rem; }nav.pdoc::-webkit-scrollbar-thumb{background-color:var(--accent2); }nav.pdoc > div{padding:var(--pad) 0;}nav.pdoc .module-list-button{display:inline-flex;align-items:center;color:var(--text);border-color:var(--muted);margin-bottom:1rem;}nav.pdoc .module-list-button:hover{border-color:var(--text);}nav.pdoc input[type=search]{display:block;outline-offset:0;width:calc(100% - var(--pad));}nav.pdoc .logo{max-width:calc(100% - var(--pad));max-height:35vh;display:block;margin:0 auto 1rem;transform:translate(calc(-.5 * var(--pad)), 0);}nav.pdoc ul{list-style:none;padding-left:0;}nav.pdoc > div > ul{margin-left:calc(0px - var(--pad));}nav.pdoc li a{padding:.2rem 0 .2rem calc(var(--pad) + var(--indent));}nav.pdoc > div > ul > li > a{padding-left:var(--pad);}nav.pdoc li{transition:all 100ms;}nav.pdoc li:hover{background-color:var(--nav-hover);}nav.pdoc a, nav.pdoc a:hover{color:var(--text);}nav.pdoc a{display:block;}nav.pdoc > h2:first-of-type{margin-top:1.5rem;}nav.pdoc .class:before{content:"class ";color:var(--muted);}nav.pdoc .function:after{content:"()";color:var(--muted);}nav.pdoc footer:before{content:"";display:block;width:calc(100% - var(--pad));border-top:solid var(--accent2) 1px;margin-top:1.5rem;padding-top:.5rem;}nav.pdoc footer{font-size:small;}</style>
<style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{cursor:pointer;display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:.75rem center;margin-bottom:1rem;}.pdoc .alert > em{display:none;}.pdoc .alert > *:last-child{margin-bottom:0;}.pdoc .alert.note{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23084298%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M8%2016A8%208%200%201%200%208%200a8%208%200%200%200%200%2016zm.93-9.412-1%204.705c-.07.34.029.533.304.533.194%200%20.487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703%200-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381%202.29-.287zM8%205.5a1%201%200%201%201%200-2%201%201%200%200%201%200%202z%22/%3E%3C/svg%3E");}.pdoc .alert.tip{color:#0a3622;background-color:#d1e7dd;border-color:#a3cfbb;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%230a3622%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M2%206a6%206%200%201%201%2010.174%204.31c-.203.196-.359.4-.453.619l-.762%201.769A.5.5%200%200%201%2010.5%2013a.5.5%200%200%201%200%201%20.5.5%200%200%201%200%201l-.224.447a1%201%200%200%201-.894.553H6.618a1%201%200%200%201-.894-.553L5.5%2015a.5.5%200%200%201%200-1%20.5.5%200%200%201%200-1%20.5.5%200%200%201-.46-.302l-.761-1.77a2%202%200%200%200-.453-.618A5.98%205.98%200%200%201%202%206m6-5a5%205%200%200%200-3.479%208.592c.263.254.514.564.676.941L5.83%2012h4.342l.632-1.467c.162-.377.413-.687.676-.941A5%205%200%200%200%208%201%22/%3E%3C/svg%3E");}.pdoc .alert.important{color:#055160;background-color:#cff4fc;border-color:#9eeaf9;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23055160%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M2%200a2%202%200%200%200-2%202v12a2%202%200%200%200%202%202h12a2%202%200%200%200%202-2V2a2%202%200%200%200-2-2zm6%204c.535%200%20.954.462.9.995l-.35%203.507a.552.552%200%200%201-1.1%200L7.1%204.995A.905.905%200%200%201%208%204m.002%206a1%201%200%201%201%200%202%201%201%200%200%201%200-2%22/%3E%3C/svg%3E");}.pdoc .alert.warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23664d03%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M8.982%201.566a1.13%201.13%200%200%200-1.96%200L.165%2013.233c-.457.778.091%201.767.98%201.767h13.713c.889%200%201.438-.99.98-1.767L8.982%201.566zM8%205c.535%200%20.954.462.9.995l-.35%203.507a.552.552%200%200%201-1.1%200L7.1%205.995A.905.905%200%200%201%208%205zm.002%206a1%201%200%201%201%200%202%201%201%200%200%201%200-2z%22/%3E%3C/svg%3E");}.pdoc .alert.caution{color:#842029;background-color:#f8d7da;border-color:#f5c2c7;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23842029%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M11.46.146A.5.5%200%200%200%2011.107%200H4.893a.5.5%200%200%200-.353.146L.146%204.54A.5.5%200%200%200%200%204.893v6.214a.5.5%200%200%200%20.146.353l4.394%204.394a.5.5%200%200%200%20.353.146h6.214a.5.5%200%200%200%20.353-.146l4.394-4.394a.5.5%200%200%200%20.146-.353V4.893a.5.5%200%200%200-.146-.353zM8%204c.535%200%20.954.462.9.995l-.35%203.507a.552.552%200%200%201-1.1%200L7.1%204.995A.905.905%200%200%201%208%204m.002%206a1%201%200%201%201%200%202%201%201%200%200%201%200-2%22/%3E%3C/svg%3E");}.pdoc .alert.danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23842029%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M5.52.359A.5.5%200%200%201%206%200h4a.5.5%200%200%201%20.474.658L8.694%206H12.5a.5.5%200%200%201%20.395.807l-7%209a.5.5%200%200%201-.873-.454L6.823%209.5H3.5a.5.5%200%200%201-.48-.641l2.5-8.5z%22/%3E%3C/svg%3E");}.pdoc .visually-hidden{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important;}.pdoc h1, .pdoc h2, .pdoc h3{font-weight:300;margin:.3em 0;padding:.2em 0;}.pdoc > section:not(.module-info) h1{font-size:1.5rem;font-weight:500;}.pdoc > section:not(.module-info) h2{font-size:1.4rem;font-weight:500;}.pdoc > section:not(.module-info) h3{font-size:1.3rem;font-weight:500;}.pdoc > section:not(.module-info) h4{font-size:1.2rem;}.pdoc > section:not(.module-info) h5{font-size:1.1rem;}.pdoc a{text-decoration:none;color:var(--link);}.pdoc a:hover{color:var(--link-hover);}.pdoc blockquote{margin-left:2rem;}.pdoc pre{border-top:1px solid var(--accent2);border-bottom:1px solid var(--accent2);margin-top:0;margin-bottom:1em;padding:.5rem 0 .5rem .5rem;overflow-x:auto;background-color:var(--code);}.pdoc code{color:var(--text);padding:.2em .4em;margin:0;font-size:85%;background-color:var(--accent);border-radius:6px;}.pdoc a > code{color:inherit;}.pdoc pre > code{display:inline-block;font-size:inherit;background:none;border:none;padding:0;}.pdoc > section:not(.module-info){margin-bottom:1.5rem;}.pdoc .modulename{margin-top:0;font-weight:bold;}.pdoc .modulename a{color:var(--link);transition:100ms all;}.pdoc .git-button{float:right;border:solid var(--link) 1px;}.pdoc .git-button:hover{background-color:var(--link);color:var(--pdoc-background);}.view-source-toggle-state,.view-source-toggle-state ~ .pdoc-code{display:none;}.view-source-toggle-state:checked ~ .pdoc-code{display:block;}.view-source-button{display:inline-block;float:right;font-size:.75rem;line-height:1.5rem;color:var(--muted);padding:0 .4rem 0 1.3rem;cursor:pointer;text-indent:-2px;}.view-source-button > span{visibility:hidden;}.module-info .view-source-button{float:none;display:flex;justify-content:flex-end;margin:-1.2rem .4rem -.2rem 0;}.view-source-button::before{position:absolute;content:"View Source";display:list-item;list-style-type:disclosure-closed;}.view-source-toggle-state:checked ~ .attr .view-source-button::before,.view-source-toggle-state:checked ~ .view-source-button::before{list-style-type:disclosure-open;}.pdoc .docstring{margin-bottom:1.5rem;}.pdoc section:not(.module-info) .docstring{margin-left:clamp(0rem, 5vw - 2rem, 1rem);}.pdoc .docstring .pdoc-code{margin-left:1em;margin-right:1em;}.pdoc h1:target,.pdoc h2:target,.pdoc h3:target,.pdoc h4:target,.pdoc h5:target,.pdoc h6:target,.pdoc .pdoc-code > pre > span:target{background-color:var(--active);box-shadow:-1rem 0 0 0 var(--active);}.pdoc .pdoc-code > pre > span:target{display:block;}.pdoc div:target > .attr,.pdoc section:target > .attr,.pdoc dd:target > a{background-color:var(--active);}.pdoc *{scroll-margin:2rem;}.pdoc .pdoc-code .linenos{user-select:none;}.pdoc .attr:hover{filter:contrast(0.95);}.pdoc section, .pdoc .classattr{position:relative;}.pdoc .headerlink{--width:clamp(1rem, 3vw, 2rem);position:absolute;top:0;left:calc(0rem - var(--width));transition:all 100ms ease-in-out;opacity:0;}.pdoc .headerlink::before{content:"#";display:block;text-align:center;width:var(--width);height:2.3rem;line-height:2.3rem;font-size:1.5rem;}.pdoc .attr:hover ~ .headerlink,.pdoc *:target > .headerlink,.pdoc .headerlink:hover{opacity:1;}.pdoc .attr{display:block;margin:.5rem 0 .5rem;padding:.4rem .4rem .4rem 1rem;background-color:var(--accent);overflow-x:auto;}.pdoc .classattr{margin-left:2rem;}.pdoc .decorator-deprecated{color:#842029;}.pdoc .decorator-deprecated ~ span{filter:grayscale(1) opacity(0.8);}.pdoc .name{color:var(--name);font-weight:bold;}.pdoc .def{color:var(--def);font-weight:bold;}.pdoc .signature{background-color:transparent;}.pdoc .param, .pdoc .return-annotation{white-space:pre;}.pdoc .signature.multiline .param{display:block;}.pdoc .signature.condensed .param{display:inline-block;}.pdoc .annotation{color:var(--annotation);}.pdoc .view-value-toggle-state,.pdoc .view-value-toggle-state ~ .default_value{display:none;}.pdoc .view-value-toggle-state:checked ~ .default_value{display:inherit;}.pdoc .view-value-button{font-size:.5rem;vertical-align:middle;border-style:dashed;margin-top:-0.1rem;}.pdoc .view-value-button:hover{background:white;}.pdoc .view-value-button::before{content:"show";text-align:center;width:2.2em;display:inline-block;}.pdoc .view-value-toggle-state:checked ~ .view-value-button::before{content:"hide";}.pdoc .inherited{margin-left:2rem;}.pdoc .inherited dt{font-weight:700;}.pdoc .inherited dt, .pdoc .inherited dd{display:inline;margin-left:0;margin-bottom:.5rem;}.pdoc .inherited dd:not(:last-child):after{content:", ";}.pdoc .inherited .class:before{content:"class ";}.pdoc .inherited .function a:after{content:"()";}.pdoc .search-result .docstring{overflow:auto;max-height:25vh;}.pdoc .search-result.focused > .attr{background-color:var(--active);}.pdoc .attribution{margin-top:2rem;display:block;opacity:0.5;transition:all 200ms;filter:grayscale(100%);}.pdoc .attribution:hover{opacity:1;filter:grayscale(0%);}.pdoc .attribution img{margin-left:5px;height:35px;vertical-align:middle;width:70px;transition:all 200ms;}.pdoc table{display:block;width:max-content;max-width:100%;overflow:auto;margin-bottom:1rem;}.pdoc table th{font-weight:600;}.pdoc table th, .pdoc table td{padding:6px 13px;border:1px solid var(--accent2);}</style>
<style>/*! custom.css */</style></head>
<body>
<nav class="pdoc">
<label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
<input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
<div> <a class="pdoc-button module-list-button" href="../sqlglot.html">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
<path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
</svg> &nbsp;sqlglot</a>
<input type="search" placeholder="Search..." role="searchbox" aria-label="search"
pattern=".+" required>
<h2>API Documentation</h2>
<ul class="memberlist">
<li>
<a class="variable" href="#CAMEL_CASE_PATTERN">CAMEL_CASE_PATTERN</a>
</li>
<li>
<a class="variable" href="#PYTHON_VERSION">PYTHON_VERSION</a>
</li>
<li>
<a class="variable" href="#logger">logger</a>
</li>
<li>
<a class="class" href="#AutoName">AutoName</a>
<ul class="memberlist">
</ul>
</li>
<li>
<a class="class" href="#classproperty">classproperty</a>
<ul class="memberlist">
</ul>
</li>
<li>
<a class="function" href="#suggest_closest_match_and_fail">suggest_closest_match_and_fail</a>
</li>
<li>
<a class="function" href="#seq_get">seq_get</a>
</li>
<li>
<a class="function" href="#ensure_list">ensure_list</a>
</li>
<li>
<a class="function" href="#ensure_collection">ensure_collection</a>
</li>
<li>
<a class="function" href="#csv">csv</a>
</li>
<li>
<a class="function" href="#subclasses">subclasses</a>
</li>
<li>
<a class="function" href="#apply_index_offset">apply_index_offset</a>
</li>
<li>
<a class="function" href="#camel_to_snake_case">camel_to_snake_case</a>
</li>
<li>
<a class="function" href="#while_changing">while_changing</a>
</li>
<li>
<a class="function" href="#tsort">tsort</a>
</li>
<li>
<a class="function" href="#open_file">open_file</a>
</li>
<li>
<a class="function" href="#csv_reader">csv_reader</a>
</li>
<li>
<a class="function" href="#find_new_name">find_new_name</a>
</li>
<li>
<a class="function" href="#is_int">is_int</a>
</li>
<li>
<a class="function" href="#is_float">is_float</a>
</li>
<li>
<a class="function" href="#is_type">is_type</a>
</li>
<li>
<a class="function" href="#name_sequence">name_sequence</a>
</li>
<li>
<a class="function" href="#object_to_dict">object_to_dict</a>
</li>
<li>
<a class="function" href="#split_num_words">split_num_words</a>
</li>
<li>
<a class="function" href="#is_iterable">is_iterable</a>
</li>
<li>
<a class="function" href="#flatten">flatten</a>
</li>
<li>
<a class="function" href="#dict_depth">dict_depth</a>
</li>
<li>
<a class="function" href="#first">first</a>
</li>
<li>
<a class="function" href="#to_bool">to_bool</a>
</li>
<li>
<a class="function" href="#merge_ranges">merge_ranges</a>
</li>
<li>
<a class="function" href="#is_iso_date">is_iso_date</a>
</li>
<li>
<a class="function" href="#is_iso_datetime">is_iso_datetime</a>
</li>
<li>
<a class="variable" href="#DATE_UNITS">DATE_UNITS</a>
</li>
<li>
<a class="function" href="#is_date_unit">is_date_unit</a>
</li>
<li>
<a class="class" href="#SingleValuedMapping">SingleValuedMapping</a>
<ul class="memberlist">
<li>
<a class="function" href="#SingleValuedMapping.__init__">SingleValuedMapping</a>
</li>
</ul>
</li>
</ul>
<footer>Copyright (c) 2023 Toby Mao</footer>
<a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev" target="_blank">
built with <span class="visually-hidden">pdoc</span><img
alt="pdoc logo"
src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612-2.021%201.25-.079.295.021.601.274.837.219.203.415.364.598.501-.667.304-1.243.698-1.311%201.179-.02.144-.022.507.393.787.213.144.395.26.564.365-1.285.521-1.361.96-1.381%201.126-.018.142-.011.496.427.746l.854.489c-.473.389-.971.914-.999%201.429-.018.278.095.532.316.713.675.556%201.231.721%201.653.721.059%200%20.104-.014.158-.02.207.707.641%201.64%201.513%201.64h.013c.8-.008%201.236-.345%201.462-.626.173-.216.268-.457.325-.692.424.195.93.374%201.372.374.151%200%20.294-.021.423-.068.732-.27.944-.704.993-1.021.009-.061.003-.119.002-.179.266.086.538.147.789.147.15%200%20.294-.021.423-.069.542-.2.797-.489.914-.754.237.147.478.258.704.288.106.014.205.021.296.021.356%200%20.595-.101.767-.229.438.435%201.094.992%201.656%201.067.106.014.205.021.296.021a1.56%201.56%200%200%200%20.323-.035c.17.575.453%201.289.866%201.605.358.273.665.362.914.362a.99.99%200%200%200%20.421-.093%201.03%201.03%200%200%200%20.245-.164c.168.428.39.846.68%201.068.358.273.665.362.913.362a.99.99%200%200%200%20.421-.093c.317-.148.512-.448.639-.762.251.157.495.257.726.257.127%200%20.25-.024.37-.071.427-.17.706-.617.841-1.314.022-.015.047-.022.068-.038.067-.051.133-.104.196-.159-.443%201.486-1.107%202.761-2.086%203.257zM8.66%209.925a.5.5%200%201%200-1%200c0%20.653-.818%201.205-1.787%201.205s-1.787-.552-1.787-1.205a.5.5%200%201%200-1%200c0%201.216%201.25%202.205%202.787%202.205s2.787-.989%202.787-2.205zm4.4%2015.965l-.208.097c-2.661%201.258-4.708%201.436-6.086.527-1.542-1.017-1.88-3.19-1.844-4.198a.4.4%200%200%200-.385-.414c-.242-.029-.406.164-.414.385-.046%201.249.367%203.686%202.202%204.896.708.467%201.547.7%202.51.7%201.248%200%202.706-.392%204.362-1.174l.185-.086a.4.4%200%200%200%20.205-.527c-.089-.204-.326-.291-.527-.206zM9.547%202.292c.093.077.205.114.317.114a.5.5%200%200%200%20.318-.886L8.817.397a.5.5%200%200%200-.703.068.5.5%200%200%200%20.069.703l1.364%201.124zm-7.661-.065c.086%200%20.173-.022.253-.068l1.523-.893a.5.5%200%200%200-.506-.863l-1.523.892a.5.5%200%200%200-.179.685c.094.158.261.247.432.247z%22%20transform%3D%22matrix%28-1%200%200%201%2058%200%29%22%20fill%3D%22%233bb300%22/%3E%3Cpath%20d%3D%22M.3%2021.86V10.18q0-.46.02-.68.04-.22.18-.5.28-.54%201.34-.54%201.06%200%201.42.28.38.26.44.78.76-1.04%202.38-1.04%201.64%200%203.1%201.54%201.46%201.54%201.46%203.58%200%202.04-1.46%203.58-1.44%201.54-3.08%201.54-1.64%200-2.38-.92v4.04q0%20.46-.04.68-.02.22-.18.5-.14.3-.5.42-.36.12-.98.12-.62%200-1-.12-.36-.12-.52-.4-.14-.28-.18-.5-.02-.22-.02-.68zm3.96-9.42q-.46.54-.46%201.18%200%20.64.46%201.18.48.52%201.2.52.74%200%201.24-.52.52-.52.52-1.18%200-.66-.48-1.18-.48-.54-1.26-.54-.76%200-1.22.54zm14.741-8.36q.16-.3.54-.42.38-.12%201-.12.64%200%201.02.12.38.12.52.42.16.3.18.54.04.22.04.68v11.94q0%20.46-.04.7-.02.22-.18.5-.3.54-1.7.54-1.38%200-1.54-.98-.84.96-2.34.96-1.8%200-3.28-1.56-1.48-1.58-1.48-3.66%200-2.1%201.48-3.68%201.5-1.58%203.28-1.58%201.48%200%202.3%201v-4.2q0-.46.02-.68.04-.24.18-.52zm-3.24%2010.86q.52.54%201.26.54.74%200%201.22-.54.5-.54.5-1.18%200-.66-.48-1.22-.46-.56-1.26-.56-.8%200-1.28.56-.48.54-.48%201.2%200%20.66.52%201.2zm7.833-1.2q0-2.4%201.68-3.96%201.68-1.56%203.84-1.56%202.16%200%203.82%201.56%201.66%201.54%201.66%203.94%200%201.66-.86%202.96-.86%201.28-2.1%201.9-1.22.6-2.54.6-1.32%200-2.56-.64-1.24-.66-2.1-1.92-.84-1.28-.84-2.88zm4.18%201.44q.64.48%201.3.48.66%200%201.32-.5.66-.5.66-1.48%200-.98-.62-1.46-.62-.48-1.34-.48-.72%200-1.34.5-.62.5-.62%201.48%200%20.96.64%201.46zm11.412-1.44q0%20.84.56%201.32.56.46%201.18.46.64%200%201.18-.36.56-.38.9-.38.6%200%201.46%201.06.46.58.46%201.04%200%20.76-1.1%201.42-1.14.8-2.8.8-1.86%200-3.58-1.34-.82-.64-1.34-1.7-.52-1.08-.52-2.36%200-1.3.52-2.34.52-1.06%201.34-1.7%201.66-1.32%203.54-1.32.76%200%201.48.22.72.2%201.06.4l.32.2q.36.24.56.38.52.4.52.92%200%20.5-.42%201.14-.72%201.1-1.38%201.1-.38%200-1.08-.44-.36-.34-1.04-.34-.66%200-1.24.48-.58.48-.58%201.34z%22%20fill%3D%22green%22/%3E%3C/svg%3E"/>
</a>
</div>
</nav>
<main class="pdoc">
<section class="module-info">
<a class="pdoc-button git-button" href="https://github.com/tobymao/sqlglot/tree/main/sqlglot/helper.py">Edit on GitHub</a>
<h1 class="modulename">
<a href="./../sqlglot.html">sqlglot</a><wbr>.helper </h1>
<input id="mod-helper-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-source-button" for="mod-helper-view-source"><span>View Source</span></label>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">__future__</span><span class="w"> </span><span class="kn">import</span> <span class="n">annotations</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">datetime</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">inspect</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">sys</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">t</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">collections.abc</span><span class="w"> </span><span class="kn">import</span> <span class="n">Collection</span><span class="p">,</span> <span class="n">Set</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">contextlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">contextmanager</span>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">copy</span><span class="w"> </span><span class="kn">import</span> <span class="n">copy</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">difflib</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_close_matches</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">enum</span><span class="w"> </span><span class="kn">import</span> <span class="n">Enum</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">itertools</span><span class="w"> </span><span class="kn">import</span> <span class="n">count</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a><span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">TYPE_CHECKING</span><span class="p">:</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot</span><span class="w"> </span><span class="kn">import</span> <span class="n">exp</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot._typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">A</span><span class="p">,</span> <span class="n">E</span><span class="p">,</span> <span class="n">T</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.dialects.dialect</span><span class="w"> </span><span class="kn">import</span> <span class="n">DialectType</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.expressions</span><span class="w"> </span><span class="kn">import</span> <span class="n">Expression</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="n">CAMEL_CASE_PATTERN</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s2">&quot;(?&lt;!^)(?=[A-Z])&quot;</span><span class="p">)</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a><span class="n">PYTHON_VERSION</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s2">&quot;sqlglot&quot;</span><span class="p">)</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a><span class="k">class</span><span class="w"> </span><span class="nc">AutoName</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a><span class="sd"> This is used for creating Enum classes where `auto()` is the string form</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a><span class="sd"> of the corresponding enum&#39;s identifier (e.g. FOO.value results in &quot;FOO&quot;).</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a><span class="sd"> Reference: https://docs.python.org/3/howto/enum.html#using-automatic-values</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_generate_next_value_</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">_start</span><span class="p">,</span> <span class="n">_count</span><span class="p">,</span> <span class="n">_last_values</span><span class="p">):</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="k">return</span> <span class="n">name</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a><span class="k">class</span><span class="w"> </span><span class="nc">classproperty</span><span class="p">(</span><span class="nb">property</span><span class="p">):</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a><span class="sd"> Similar to a normal property but works for class methods</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="k">def</span><span class="w"> </span><span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">,</span> <span class="n">owner</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">:</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="k">return</span> <span class="nb">classmethod</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fget</span><span class="p">)</span><span class="o">.</span><span class="fm">__get__</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">owner</span><span class="p">)()</span> <span class="c1"># type: ignore</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a><span class="k">def</span><span class="w"> </span><span class="nf">suggest_closest_match_and_fail</span><span class="p">(</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="n">kind</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="n">word</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="n">possibilities</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Iterable</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="n">close_matches</span> <span class="o">=</span> <span class="n">get_close_matches</span><span class="p">(</span><span class="n">word</span><span class="p">,</span> <span class="n">possibilities</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="n">similar</span> <span class="o">=</span> <span class="n">seq_get</span><span class="p">(</span><span class="n">close_matches</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="k">if</span> <span class="n">similar</span><span class="p">:</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="n">similar</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; Did you mean </span><span class="si">{</span><span class="n">similar</span><span class="si">}</span><span class="s2">?&quot;</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unknown </span><span class="si">{</span><span class="n">kind</span><span class="si">}</span><span class="s2"> &#39;</span><span class="si">{</span><span class="n">word</span><span class="si">}</span><span class="s2">&#39;.</span><span class="si">{</span><span class="n">similar</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a><span class="k">def</span><span class="w"> </span><span class="nf">seq_get</span><span class="p">(</span><span class="n">seq</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="n">T</span><span class="p">],</span> <span class="n">index</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the value in `seq` at position `index`, or `None` if `index` is out of bounds.&quot;&quot;&quot;</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="k">return</span> <span class="n">seq</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a><span class="nd">@t</span><span class="o">.</span><span class="n">overload</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_list</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">T</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span> <span class="o">...</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a><span class="nd">@t</span><span class="o">.</span><span class="n">overload</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_list</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">:</span> <span class="o">...</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a><span class="nd">@t</span><span class="o">.</span><span class="n">overload</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_list</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">T</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span> <span class="o">...</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_list</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a><span class="sd"> Ensures that a value is a list, otherwise casts or wraps it into one.</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a><span class="sd"> Args:</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a><span class="sd"> value: The value of interest.</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a><span class="sd"> Returns:</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a><span class="sd"> The value cast as a list if it&#39;s a list or a tuple, or else the value wrapped in a list.</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">return</span> <span class="p">[]</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="p">]</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a><span class="nd">@t</span><span class="o">.</span><span class="n">overload</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_collection</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">T</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span> <span class="o">...</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a><span class="nd">@t</span><span class="o">.</span><span class="n">overload</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_collection</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">T</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span> <span class="o">...</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_collection</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a><span class="sd"> Ensures that a value is a collection (excluding `str` and `bytes`), otherwise wraps it into a list.</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a><span class="sd"> Args:</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a><span class="sd"> value: The value of interest.</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="sd"> Returns:</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="sd"> The value if it&#39;s a collection, or else the value wrapped in a list.</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="k">return</span> <span class="p">[]</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">return</span> <span class="p">(</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Collection</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">))</span> <span class="k">else</span> <span class="p">[</span><span class="n">value</span><span class="p">]</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="p">)</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a><span class="k">def</span><span class="w"> </span><span class="nf">csv</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">sep</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a><span class="sd"> Formats any number of string arguments as CSV.</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a><span class="sd"> Args:</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a><span class="sd"> args: The string arguments to format.</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a><span class="sd"> sep: The argument separator.</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a><span class="sd"> Returns:</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a><span class="sd"> The arguments formatted as a CSV string.</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="k">return</span> <span class="n">sep</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">arg</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span> <span class="k">if</span> <span class="n">arg</span><span class="p">)</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a><span class="k">def</span><span class="w"> </span><span class="nf">subclasses</span><span class="p">(</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="n">module_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="n">classes</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span> <span class="o">|</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">,</span> <span class="o">...</span><span class="p">],</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="n">exclude</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span> <span class="o">|</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">,</span> <span class="o">...</span><span class="p">]</span> <span class="o">=</span> <span class="p">(),</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">]:</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a><span class="sd"> Returns all subclasses for a collection of classes, possibly excluding some of them.</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a><span class="sd"> Args:</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a><span class="sd"> module_name: The name of the module to search for subclasses in.</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a><span class="sd"> classes: Class(es) we want to find the subclasses of.</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a><span class="sd"> exclude: Class(es) we want to exclude from the returned list.</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a><span class="sd"> Returns:</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a><span class="sd"> The target subclasses.</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="k">return</span> <span class="p">[</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="n">obj</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getmembers</span><span class="p">(</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="n">module_name</span><span class="p">],</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="k">lambda</span> <span class="n">obj</span><span class="p">:</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">classes</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">,</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="p">)</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="p">]</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a><span class="k">def</span><span class="w"> </span><span class="nf">apply_index_offset</span><span class="p">(</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="n">this</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="n">expressions</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">E</span><span class="p">],</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="n">offset</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">E</span><span class="p">]:</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a><span class="sd"> Applies an offset to a given integer literal expression.</span>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a><span class="sd"> Args:</span>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a><span class="sd"> this: The target of the index.</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a><span class="sd"> expressions: The expression the offset will be applied to, wrapped in a list.</span>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a><span class="sd"> offset: The offset that will be applied.</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a><span class="sd"> dialect: the dialect of interest.</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a><span class="sd"> Returns:</span>
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a><span class="sd"> The original expression with the offset applied to it, wrapped in a list. If the provided</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a><span class="sd"> `expressions` argument contains more than one expression, it&#39;s returned unaffected.</span>
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">offset</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="k">return</span> <span class="n">expressions</span>
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a>
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a>
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot</span><span class="w"> </span><span class="kn">import</span> <span class="n">exp</span>
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.annotate_types</span><span class="w"> </span><span class="kn">import</span> <span class="n">annotate_types</span>
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.simplify</span><span class="w"> </span><span class="kn">import</span> <span class="n">simplify</span>
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a>
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">this</span><span class="o">.</span><span class="n">type</span><span class="p">:</span>
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a> <span class="n">annotate_types</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a>
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a> <span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">,</span> <span class="n">this</span><span class="o">.</span><span class="n">type</span><span class="p">)</span><span class="o">.</span><span class="n">this</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span>
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">UNKNOWN</span><span class="p">,</span>
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">ARRAY</span><span class="p">,</span>
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a> <span class="p">):</span>
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a> <span class="k">return</span> <span class="n">expressions</span>
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a>
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">expression</span><span class="o">.</span><span class="n">type</span><span class="p">:</span>
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a> <span class="n">annotate_types</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a>
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a> <span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">type</span><span class="p">)</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">INTEGER_TYPES</span><span class="p">:</span>
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Applying array index offset (</span><span class="si">%s</span><span class="s2">)&quot;</span><span class="p">,</span> <span class="n">offset</span><span class="p">)</span>
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">expression</span> <span class="o">+</span> <span class="n">offset</span><span class="p">)</span>
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a> <span class="k">return</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span>
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a>
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a> <span class="k">return</span> <span class="n">expressions</span>
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a>
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a>
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a><span class="k">def</span><span class="w"> </span><span class="nf">camel_to_snake_case</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-214"><a href="#L-214"><span class="linenos">214</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts `name` from camelCase to snake_case and returns the result.&quot;&quot;&quot;</span>
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a> <span class="k">return</span> <span class="n">CAMEL_CASE_PATTERN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a>
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a>
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a><span class="k">def</span><span class="w"> </span><span class="nf">while_changing</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">Expression</span><span class="p">,</span> <span class="n">func</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Expression</span><span class="p">],</span> <span class="n">E</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">E</span><span class="p">:</span>
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a><span class="sd"> Applies a transformation to a given expression until a fix point is reached.</span>
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a>
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a><span class="sd"> Args:</span>
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a><span class="sd"> expression: The expression to be transformed.</span>
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a><span class="sd"> func: The transformation to be applied.</span>
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a>
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a><span class="sd"> Returns:</span>
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a><span class="sd"> The transformed expression.</span>
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a> <span class="n">end_hash</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a>
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="c1"># No need to walk the AST we&#39;ve already cached the hashes in the previous iteration</span>
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="k">if</span> <span class="n">end_hash</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">())):</span>
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a> <span class="n">n</span><span class="o">.</span><span class="n">_hash</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a>
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a> <span class="n">start_hash</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a>
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a> <span class="n">expression_nodes</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">())</span>
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a>
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="c1"># Uncache previous caches so we can recompute them</span>
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">expression_nodes</span><span class="p">):</span>
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="n">n</span><span class="o">.</span><span class="n">_hash</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a> <span class="n">n</span><span class="o">.</span><span class="n">_hash</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a>
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a> <span class="n">end_hash</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a>
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a> <span class="k">if</span> <span class="n">start_hash</span> <span class="o">==</span> <span class="n">end_hash</span><span class="p">:</span>
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a> <span class="c1"># ... and reset the hash so we don&#39;t risk it becoming out of date if a mutation happens</span>
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">expression_nodes</span><span class="p">:</span>
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a> <span class="n">n</span><span class="o">.</span><span class="n">_hash</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a>
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a> <span class="k">break</span>
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a>
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a>
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a>
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a><span class="k">def</span><span class="w"> </span><span class="nf">tsort</span><span class="p">(</span><span class="n">dag</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="n">T</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Set</span><span class="p">[</span><span class="n">T</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span>
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a><span class="sd"> Sorts a given directed acyclic graph in topological order.</span>
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a>
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a><span class="sd"> Args:</span>
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a><span class="sd"> dag: The graph to be sorted.</span>
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a>
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a><span class="sd"> Returns:</span>
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a><span class="sd"> A list that contains all of the graph&#39;s nodes in topological order.</span>
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a>
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a> <span class="k">for</span> <span class="n">node</span><span class="p">,</span> <span class="n">deps</span> <span class="ow">in</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">dag</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a> <span class="k">for</span> <span class="n">dep</span> <span class="ow">in</span> <span class="n">deps</span><span class="p">:</span>
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a> <span class="k">if</span> <span class="n">dep</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">dag</span><span class="p">:</span>
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a> <span class="n">dag</span><span class="p">[</span><span class="n">dep</span><span class="p">]</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a>
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a> <span class="k">while</span> <span class="n">dag</span><span class="p">:</span>
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a> <span class="n">current</span> <span class="o">=</span> <span class="p">{</span><span class="n">node</span> <span class="k">for</span> <span class="n">node</span><span class="p">,</span> <span class="n">deps</span> <span class="ow">in</span> <span class="n">dag</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">deps</span><span class="p">}</span>
</span><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a>
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">current</span><span class="p">:</span>
</span><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Cycle error&quot;</span><span class="p">)</span>
</span><span id="L-281"><a href="#L-281"><span class="linenos">281</span></a>
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">current</span><span class="p">:</span>
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a> <span class="n">dag</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a>
</span><span id="L-285"><a href="#L-285"><span class="linenos">285</span></a> <span class="k">for</span> <span class="n">deps</span> <span class="ow">in</span> <span class="n">dag</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
</span><span id="L-286"><a href="#L-286"><span class="linenos">286</span></a> <span class="n">deps</span> <span class="o">-=</span> <span class="n">current</span>
</span><span id="L-287"><a href="#L-287"><span class="linenos">287</span></a>
</span><span id="L-288"><a href="#L-288"><span class="linenos">288</span></a> <span class="n">result</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">current</span><span class="p">))</span> <span class="c1"># type: ignore</span>
</span><span id="L-289"><a href="#L-289"><span class="linenos">289</span></a>
</span><span id="L-290"><a href="#L-290"><span class="linenos">290</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="L-291"><a href="#L-291"><span class="linenos">291</span></a>
</span><span id="L-292"><a href="#L-292"><span class="linenos">292</span></a>
</span><span id="L-293"><a href="#L-293"><span class="linenos">293</span></a><span class="k">def</span><span class="w"> </span><span class="nf">open_file</span><span class="p">(</span><span class="n">file_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">TextIO</span><span class="p">:</span>
</span><span id="L-294"><a href="#L-294"><span class="linenos">294</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Open a file that may be compressed as gzip and return it in universal newline mode.&quot;&quot;&quot;</span>
</span><span id="L-295"><a href="#L-295"><span class="linenos">295</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="L-296"><a href="#L-296"><span class="linenos">296</span></a> <span class="n">gzipped</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">==</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x1f\x8b</span><span class="s2">&quot;</span>
</span><span id="L-297"><a href="#L-297"><span class="linenos">297</span></a>
</span><span id="L-298"><a href="#L-298"><span class="linenos">298</span></a> <span class="k">if</span> <span class="n">gzipped</span><span class="p">:</span>
</span><span id="L-299"><a href="#L-299"><span class="linenos">299</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">gzip</span>
</span><span id="L-300"><a href="#L-300"><span class="linenos">300</span></a>
</span><span id="L-301"><a href="#L-301"><span class="linenos">301</span></a> <span class="k">return</span> <span class="n">gzip</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="s2">&quot;rt&quot;</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="L-302"><a href="#L-302"><span class="linenos">302</span></a>
</span><span id="L-303"><a href="#L-303"><span class="linenos">303</span></a> <span class="k">return</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;utf-8&quot;</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="L-304"><a href="#L-304"><span class="linenos">304</span></a>
</span><span id="L-305"><a href="#L-305"><span class="linenos">305</span></a>
</span><span id="L-306"><a href="#L-306"><span class="linenos">306</span></a><span class="nd">@contextmanager</span>
</span><span id="L-307"><a href="#L-307"><span class="linenos">307</span></a><span class="k">def</span><span class="w"> </span><span class="nf">csv_reader</span><span class="p">(</span><span class="n">read_csv</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">ReadCSV</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">:</span>
</span><span id="L-308"><a href="#L-308"><span class="linenos">308</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-309"><a href="#L-309"><span class="linenos">309</span></a><span class="sd"> Returns a csv reader given the expression `READ_CSV(name, [&#39;delimiter&#39;, &#39;|&#39;, ...])`.</span>
</span><span id="L-310"><a href="#L-310"><span class="linenos">310</span></a>
</span><span id="L-311"><a href="#L-311"><span class="linenos">311</span></a><span class="sd"> Args:</span>
</span><span id="L-312"><a href="#L-312"><span class="linenos">312</span></a><span class="sd"> read_csv: A `ReadCSV` function call.</span>
</span><span id="L-313"><a href="#L-313"><span class="linenos">313</span></a>
</span><span id="L-314"><a href="#L-314"><span class="linenos">314</span></a><span class="sd"> Yields:</span>
</span><span id="L-315"><a href="#L-315"><span class="linenos">315</span></a><span class="sd"> A python csv reader.</span>
</span><span id="L-316"><a href="#L-316"><span class="linenos">316</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-317"><a href="#L-317"><span class="linenos">317</span></a> <span class="n">args</span> <span class="o">=</span> <span class="n">read_csv</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-318"><a href="#L-318"><span class="linenos">318</span></a> <span class="n">file</span> <span class="o">=</span> <span class="n">open_file</span><span class="p">(</span><span class="n">read_csv</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="L-319"><a href="#L-319"><span class="linenos">319</span></a>
</span><span id="L-320"><a href="#L-320"><span class="linenos">320</span></a> <span class="n">delimiter</span> <span class="o">=</span> <span class="s2">&quot;,&quot;</span>
</span><span id="L-321"><a href="#L-321"><span class="linenos">321</span></a> <span class="n">args</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">)</span> <span class="c1"># type: ignore</span>
</span><span id="L-322"><a href="#L-322"><span class="linenos">322</span></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
</span><span id="L-323"><a href="#L-323"><span class="linenos">323</span></a> <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="s2">&quot;delimiter&quot;</span><span class="p">:</span>
</span><span id="L-324"><a href="#L-324"><span class="linenos">324</span></a> <span class="n">delimiter</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="L-325"><a href="#L-325"><span class="linenos">325</span></a>
</span><span id="L-326"><a href="#L-326"><span class="linenos">326</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-327"><a href="#L-327"><span class="linenos">327</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">csv</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">csv_</span>
</span><span id="L-328"><a href="#L-328"><span class="linenos">328</span></a>
</span><span id="L-329"><a href="#L-329"><span class="linenos">329</span></a> <span class="k">yield</span> <span class="n">csv_</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="n">delimiter</span><span class="p">)</span>
</span><span id="L-330"><a href="#L-330"><span class="linenos">330</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="L-331"><a href="#L-331"><span class="linenos">331</span></a> <span class="n">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span><span id="L-332"><a href="#L-332"><span class="linenos">332</span></a>
</span><span id="L-333"><a href="#L-333"><span class="linenos">333</span></a>
</span><span id="L-334"><a href="#L-334"><span class="linenos">334</span></a><span class="k">def</span><span class="w"> </span><span class="nf">find_new_name</span><span class="p">(</span><span class="n">taken</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">base</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-335"><a href="#L-335"><span class="linenos">335</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-336"><a href="#L-336"><span class="linenos">336</span></a><span class="sd"> Searches for a new name.</span>
</span><span id="L-337"><a href="#L-337"><span class="linenos">337</span></a>
</span><span id="L-338"><a href="#L-338"><span class="linenos">338</span></a><span class="sd"> Args:</span>
</span><span id="L-339"><a href="#L-339"><span class="linenos">339</span></a><span class="sd"> taken: A collection of taken names.</span>
</span><span id="L-340"><a href="#L-340"><span class="linenos">340</span></a><span class="sd"> base: Base name to alter.</span>
</span><span id="L-341"><a href="#L-341"><span class="linenos">341</span></a>
</span><span id="L-342"><a href="#L-342"><span class="linenos">342</span></a><span class="sd"> Returns:</span>
</span><span id="L-343"><a href="#L-343"><span class="linenos">343</span></a><span class="sd"> The new, available name.</span>
</span><span id="L-344"><a href="#L-344"><span class="linenos">344</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-345"><a href="#L-345"><span class="linenos">345</span></a> <span class="k">if</span> <span class="n">base</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">taken</span><span class="p">:</span>
</span><span id="L-346"><a href="#L-346"><span class="linenos">346</span></a> <span class="k">return</span> <span class="n">base</span>
</span><span id="L-347"><a href="#L-347"><span class="linenos">347</span></a>
</span><span id="L-348"><a href="#L-348"><span class="linenos">348</span></a> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span>
</span><span id="L-349"><a href="#L-349"><span class="linenos">349</span></a> <span class="n">new</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-350"><a href="#L-350"><span class="linenos">350</span></a> <span class="k">while</span> <span class="n">new</span> <span class="ow">in</span> <span class="n">taken</span><span class="p">:</span>
</span><span id="L-351"><a href="#L-351"><span class="linenos">351</span></a> <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="L-352"><a href="#L-352"><span class="linenos">352</span></a> <span class="n">new</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-353"><a href="#L-353"><span class="linenos">353</span></a>
</span><span id="L-354"><a href="#L-354"><span class="linenos">354</span></a> <span class="k">return</span> <span class="n">new</span>
</span><span id="L-355"><a href="#L-355"><span class="linenos">355</span></a>
</span><span id="L-356"><a href="#L-356"><span class="linenos">356</span></a>
</span><span id="L-357"><a href="#L-357"><span class="linenos">357</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_int</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-358"><a href="#L-358"><span class="linenos">358</span></a> <span class="k">return</span> <span class="n">is_type</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
</span><span id="L-359"><a href="#L-359"><span class="linenos">359</span></a>
</span><span id="L-360"><a href="#L-360"><span class="linenos">360</span></a>
</span><span id="L-361"><a href="#L-361"><span class="linenos">361</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_float</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-362"><a href="#L-362"><span class="linenos">362</span></a> <span class="k">return</span> <span class="n">is_type</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="nb">float</span><span class="p">)</span>
</span><span id="L-363"><a href="#L-363"><span class="linenos">363</span></a>
</span><span id="L-364"><a href="#L-364"><span class="linenos">364</span></a>
</span><span id="L-365"><a href="#L-365"><span class="linenos">365</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_type</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">target_type</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-366"><a href="#L-366"><span class="linenos">366</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-367"><a href="#L-367"><span class="linenos">367</span></a> <span class="n">target_type</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span><span id="L-368"><a href="#L-368"><span class="linenos">368</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-369"><a href="#L-369"><span class="linenos">369</span></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
</span><span id="L-370"><a href="#L-370"><span class="linenos">370</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-371"><a href="#L-371"><span class="linenos">371</span></a>
</span><span id="L-372"><a href="#L-372"><span class="linenos">372</span></a>
</span><span id="L-373"><a href="#L-373"><span class="linenos">373</span></a><span class="k">def</span><span class="w"> </span><span class="nf">name_sequence</span><span class="p">(</span><span class="n">prefix</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[],</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="L-374"><a href="#L-374"><span class="linenos">374</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a name generator given a prefix (e.g. a0, a1, a2, ... if the prefix is &quot;a&quot;).&quot;&quot;&quot;</span>
</span><span id="L-375"><a href="#L-375"><span class="linenos">375</span></a> <span class="n">sequence</span> <span class="o">=</span> <span class="n">count</span><span class="p">()</span>
</span><span id="L-376"><a href="#L-376"><span class="linenos">376</span></a> <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">prefix</span><span class="si">}{</span><span class="nb">next</span><span class="p">(</span><span class="n">sequence</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-377"><a href="#L-377"><span class="linenos">377</span></a>
</span><span id="L-378"><a href="#L-378"><span class="linenos">378</span></a>
</span><span id="L-379"><a href="#L-379"><span class="linenos">379</span></a><span class="k">def</span><span class="w"> </span><span class="nf">object_to_dict</span><span class="p">(</span><span class="n">obj</span><span class="p">:</span> <span class="n">t</span><span class="o">.</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="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">:</span>
</span><span id="L-380"><a href="#L-380"><span class="linenos">380</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a dictionary created from an object&#39;s attributes.&quot;&quot;&quot;</span>
</span><span id="L-381"><a href="#L-381"><span class="linenos">381</span></a> <span class="k">return</span> <span class="p">{</span>
</span><span id="L-382"><a href="#L-382"><span class="linenos">382</span></a> <span class="o">**</span><span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">v</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="s2">&quot;copy&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="n">copy</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">()},</span>
</span><span id="L-383"><a href="#L-383"><span class="linenos">383</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="L-384"><a href="#L-384"><span class="linenos">384</span></a> <span class="p">}</span>
</span><span id="L-385"><a href="#L-385"><span class="linenos">385</span></a>
</span><span id="L-386"><a href="#L-386"><span class="linenos">386</span></a>
</span><span id="L-387"><a href="#L-387"><span class="linenos">387</span></a><span class="k">def</span><span class="w"> </span><span class="nf">split_num_words</span><span class="p">(</span>
</span><span id="L-388"><a href="#L-388"><span class="linenos">388</span></a> <span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">sep</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">min_num_words</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">fill_from_start</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-389"><a href="#L-389"><span class="linenos">389</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
</span><span id="L-390"><a href="#L-390"><span class="linenos">390</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-391"><a href="#L-391"><span class="linenos">391</span></a><span class="sd"> Perform a split on a value and return N words as a result with `None` used for words that don&#39;t exist.</span>
</span><span id="L-392"><a href="#L-392"><span class="linenos">392</span></a>
</span><span id="L-393"><a href="#L-393"><span class="linenos">393</span></a><span class="sd"> Args:</span>
</span><span id="L-394"><a href="#L-394"><span class="linenos">394</span></a><span class="sd"> value: The value to be split.</span>
</span><span id="L-395"><a href="#L-395"><span class="linenos">395</span></a><span class="sd"> sep: The value to use to split on.</span>
</span><span id="L-396"><a href="#L-396"><span class="linenos">396</span></a><span class="sd"> min_num_words: The minimum number of words that are going to be in the result.</span>
</span><span id="L-397"><a href="#L-397"><span class="linenos">397</span></a><span class="sd"> fill_from_start: Indicates that if `None` values should be inserted at the start or end of the list.</span>
</span><span id="L-398"><a href="#L-398"><span class="linenos">398</span></a>
</span><span id="L-399"><a href="#L-399"><span class="linenos">399</span></a><span class="sd"> Examples:</span>
</span><span id="L-400"><a href="#L-400"><span class="linenos">400</span></a><span class="sd"> &gt;&gt;&gt; split_num_words(&quot;db.table&quot;, &quot;.&quot;, 3)</span>
</span><span id="L-401"><a href="#L-401"><span class="linenos">401</span></a><span class="sd"> [None, &#39;db&#39;, &#39;table&#39;]</span>
</span><span id="L-402"><a href="#L-402"><span class="linenos">402</span></a><span class="sd"> &gt;&gt;&gt; split_num_words(&quot;db.table&quot;, &quot;.&quot;, 3, fill_from_start=False)</span>
</span><span id="L-403"><a href="#L-403"><span class="linenos">403</span></a><span class="sd"> [&#39;db&#39;, &#39;table&#39;, None]</span>
</span><span id="L-404"><a href="#L-404"><span class="linenos">404</span></a><span class="sd"> &gt;&gt;&gt; split_num_words(&quot;db.table&quot;, &quot;.&quot;, 1)</span>
</span><span id="L-405"><a href="#L-405"><span class="linenos">405</span></a><span class="sd"> [&#39;db&#39;, &#39;table&#39;]</span>
</span><span id="L-406"><a href="#L-406"><span class="linenos">406</span></a>
</span><span id="L-407"><a href="#L-407"><span class="linenos">407</span></a><span class="sd"> Returns:</span>
</span><span id="L-408"><a href="#L-408"><span class="linenos">408</span></a><span class="sd"> The list of words returned by `split`, possibly augmented by a number of `None` values.</span>
</span><span id="L-409"><a href="#L-409"><span class="linenos">409</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-410"><a href="#L-410"><span class="linenos">410</span></a> <span class="n">words</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">sep</span><span class="p">)</span>
</span><span id="L-411"><a href="#L-411"><span class="linenos">411</span></a> <span class="k">if</span> <span class="n">fill_from_start</span><span class="p">:</span>
</span><span id="L-412"><a href="#L-412"><span class="linenos">412</span></a> <span class="k">return</span> <span class="p">[</span><span class="kc">None</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">min_num_words</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">words</span><span class="p">))</span> <span class="o">+</span> <span class="n">words</span>
</span><span id="L-413"><a href="#L-413"><span class="linenos">413</span></a> <span class="k">return</span> <span class="n">words</span> <span class="o">+</span> <span class="p">[</span><span class="kc">None</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">min_num_words</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">words</span><span class="p">))</span>
</span><span id="L-414"><a href="#L-414"><span class="linenos">414</span></a>
</span><span id="L-415"><a href="#L-415"><span class="linenos">415</span></a>
</span><span id="L-416"><a href="#L-416"><span class="linenos">416</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_iterable</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-417"><a href="#L-417"><span class="linenos">417</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-418"><a href="#L-418"><span class="linenos">418</span></a><span class="sd"> Checks if the value is an iterable, excluding the types `str` and `bytes`.</span>
</span><span id="L-419"><a href="#L-419"><span class="linenos">419</span></a>
</span><span id="L-420"><a href="#L-420"><span class="linenos">420</span></a><span class="sd"> Examples:</span>
</span><span id="L-421"><a href="#L-421"><span class="linenos">421</span></a><span class="sd"> &gt;&gt;&gt; is_iterable([1,2])</span>
</span><span id="L-422"><a href="#L-422"><span class="linenos">422</span></a><span class="sd"> True</span>
</span><span id="L-423"><a href="#L-423"><span class="linenos">423</span></a><span class="sd"> &gt;&gt;&gt; is_iterable(&quot;test&quot;)</span>
</span><span id="L-424"><a href="#L-424"><span class="linenos">424</span></a><span class="sd"> False</span>
</span><span id="L-425"><a href="#L-425"><span class="linenos">425</span></a>
</span><span id="L-426"><a href="#L-426"><span class="linenos">426</span></a><span class="sd"> Args:</span>
</span><span id="L-427"><a href="#L-427"><span class="linenos">427</span></a><span class="sd"> value: The value to check if it is an iterable.</span>
</span><span id="L-428"><a href="#L-428"><span class="linenos">428</span></a>
</span><span id="L-429"><a href="#L-429"><span class="linenos">429</span></a><span class="sd"> Returns:</span>
</span><span id="L-430"><a href="#L-430"><span class="linenos">430</span></a><span class="sd"> A `bool` value indicating if it is an iterable.</span>
</span><span id="L-431"><a href="#L-431"><span class="linenos">431</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-432"><a href="#L-432"><span class="linenos">432</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot</span><span class="w"> </span><span class="kn">import</span> <span class="n">Expression</span>
</span><span id="L-433"><a href="#L-433"><span class="linenos">433</span></a>
</span><span id="L-434"><a href="#L-434"><span class="linenos">434</span></a> <span class="k">return</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="s2">&quot;__iter__&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">,</span> <span class="n">Expression</span><span class="p">))</span>
</span><span id="L-435"><a href="#L-435"><span class="linenos">435</span></a>
</span><span id="L-436"><a href="#L-436"><span class="linenos">436</span></a>
</span><span id="L-437"><a href="#L-437"><span class="linenos">437</span></a><span class="k">def</span><span class="w"> </span><span class="nf">flatten</span><span class="p">(</span><span class="n">values</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Iterable</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Iterable</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Iterator</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">]:</span>
</span><span id="L-438"><a href="#L-438"><span class="linenos">438</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-439"><a href="#L-439"><span class="linenos">439</span></a><span class="sd"> Flattens an iterable that can contain both iterable and non-iterable elements. Objects of</span>
</span><span id="L-440"><a href="#L-440"><span class="linenos">440</span></a><span class="sd"> type `str` and `bytes` are not regarded as iterables.</span>
</span><span id="L-441"><a href="#L-441"><span class="linenos">441</span></a>
</span><span id="L-442"><a href="#L-442"><span class="linenos">442</span></a><span class="sd"> Examples:</span>
</span><span id="L-443"><a href="#L-443"><span class="linenos">443</span></a><span class="sd"> &gt;&gt;&gt; list(flatten([[1, 2], 3, {4}, (5, &quot;bla&quot;)]))</span>
</span><span id="L-444"><a href="#L-444"><span class="linenos">444</span></a><span class="sd"> [1, 2, 3, 4, 5, &#39;bla&#39;]</span>
</span><span id="L-445"><a href="#L-445"><span class="linenos">445</span></a><span class="sd"> &gt;&gt;&gt; list(flatten([1, 2, 3]))</span>
</span><span id="L-446"><a href="#L-446"><span class="linenos">446</span></a><span class="sd"> [1, 2, 3]</span>
</span><span id="L-447"><a href="#L-447"><span class="linenos">447</span></a>
</span><span id="L-448"><a href="#L-448"><span class="linenos">448</span></a><span class="sd"> Args:</span>
</span><span id="L-449"><a href="#L-449"><span class="linenos">449</span></a><span class="sd"> values: The value to be flattened.</span>
</span><span id="L-450"><a href="#L-450"><span class="linenos">450</span></a>
</span><span id="L-451"><a href="#L-451"><span class="linenos">451</span></a><span class="sd"> Yields:</span>
</span><span id="L-452"><a href="#L-452"><span class="linenos">452</span></a><span class="sd"> Non-iterable elements in `values`.</span>
</span><span id="L-453"><a href="#L-453"><span class="linenos">453</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-454"><a href="#L-454"><span class="linenos">454</span></a> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
</span><span id="L-455"><a href="#L-455"><span class="linenos">455</span></a> <span class="k">if</span> <span class="n">is_iterable</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
</span><span id="L-456"><a href="#L-456"><span class="linenos">456</span></a> <span class="k">yield from</span> <span class="n">flatten</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span id="L-457"><a href="#L-457"><span class="linenos">457</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-458"><a href="#L-458"><span class="linenos">458</span></a> <span class="k">yield</span> <span class="n">value</span>
</span><span id="L-459"><a href="#L-459"><span class="linenos">459</span></a>
</span><span id="L-460"><a href="#L-460"><span class="linenos">460</span></a>
</span><span id="L-461"><a href="#L-461"><span class="linenos">461</span></a><span class="k">def</span><span class="w"> </span><span class="nf">dict_depth</span><span class="p">(</span><span class="n">d</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="L-462"><a href="#L-462"><span class="linenos">462</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-463"><a href="#L-463"><span class="linenos">463</span></a><span class="sd"> Get the nesting depth of a dictionary.</span>
</span><span id="L-464"><a href="#L-464"><span class="linenos">464</span></a>
</span><span id="L-465"><a href="#L-465"><span class="linenos">465</span></a><span class="sd"> Example:</span>
</span><span id="L-466"><a href="#L-466"><span class="linenos">466</span></a><span class="sd"> &gt;&gt;&gt; dict_depth(None)</span>
</span><span id="L-467"><a href="#L-467"><span class="linenos">467</span></a><span class="sd"> 0</span>
</span><span id="L-468"><a href="#L-468"><span class="linenos">468</span></a><span class="sd"> &gt;&gt;&gt; dict_depth({})</span>
</span><span id="L-469"><a href="#L-469"><span class="linenos">469</span></a><span class="sd"> 1</span>
</span><span id="L-470"><a href="#L-470"><span class="linenos">470</span></a><span class="sd"> &gt;&gt;&gt; dict_depth({&quot;a&quot;: &quot;b&quot;})</span>
</span><span id="L-471"><a href="#L-471"><span class="linenos">471</span></a><span class="sd"> 1</span>
</span><span id="L-472"><a href="#L-472"><span class="linenos">472</span></a><span class="sd"> &gt;&gt;&gt; dict_depth({&quot;a&quot;: {}})</span>
</span><span id="L-473"><a href="#L-473"><span class="linenos">473</span></a><span class="sd"> 2</span>
</span><span id="L-474"><a href="#L-474"><span class="linenos">474</span></a><span class="sd"> &gt;&gt;&gt; dict_depth({&quot;a&quot;: {&quot;b&quot;: {}}})</span>
</span><span id="L-475"><a href="#L-475"><span class="linenos">475</span></a><span class="sd"> 3</span>
</span><span id="L-476"><a href="#L-476"><span class="linenos">476</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-477"><a href="#L-477"><span class="linenos">477</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-478"><a href="#L-478"><span class="linenos">478</span></a> <span class="k">return</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">dict_depth</span><span class="p">(</span><span class="nb">next</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">values</span><span class="p">())))</span>
</span><span id="L-479"><a href="#L-479"><span class="linenos">479</span></a> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
</span><span id="L-480"><a href="#L-480"><span class="linenos">480</span></a> <span class="c1"># d doesn&#39;t have attribute &quot;values&quot;</span>
</span><span id="L-481"><a href="#L-481"><span class="linenos">481</span></a> <span class="k">return</span> <span class="mi">0</span>
</span><span id="L-482"><a href="#L-482"><span class="linenos">482</span></a> <span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span>
</span><span id="L-483"><a href="#L-483"><span class="linenos">483</span></a> <span class="c1"># d.values() returns an empty sequence</span>
</span><span id="L-484"><a href="#L-484"><span class="linenos">484</span></a> <span class="k">return</span> <span class="mi">1</span>
</span><span id="L-485"><a href="#L-485"><span class="linenos">485</span></a>
</span><span id="L-486"><a href="#L-486"><span class="linenos">486</span></a>
</span><span id="L-487"><a href="#L-487"><span class="linenos">487</span></a><span class="k">def</span><span class="w"> </span><span class="nf">first</span><span class="p">(</span><span class="n">it</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Iterable</span><span class="p">[</span><span class="n">T</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">T</span><span class="p">:</span>
</span><span id="L-488"><a href="#L-488"><span class="linenos">488</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the first element from an iterable (useful for sets).&quot;&quot;&quot;</span>
</span><span id="L-489"><a href="#L-489"><span class="linenos">489</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">it</span><span class="p">)</span>
</span><span id="L-490"><a href="#L-490"><span class="linenos">490</span></a>
</span><span id="L-491"><a href="#L-491"><span class="linenos">491</span></a>
</span><span id="L-492"><a href="#L-492"><span class="linenos">492</span></a><span class="k">def</span><span class="w"> </span><span class="nf">to_bool</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="nb">bool</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="nb">bool</span><span class="p">]:</span>
</span><span id="L-493"><a href="#L-493"><span class="linenos">493</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span> <span class="ow">or</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-494"><a href="#L-494"><span class="linenos">494</span></a> <span class="k">return</span> <span class="n">value</span>
</span><span id="L-495"><a href="#L-495"><span class="linenos">495</span></a>
</span><span id="L-496"><a href="#L-496"><span class="linenos">496</span></a> <span class="c1"># Coerce the value to boolean if it matches to the truthy/falsy values below</span>
</span><span id="L-497"><a href="#L-497"><span class="linenos">497</span></a> <span class="n">value_lower</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
</span><span id="L-498"><a href="#L-498"><span class="linenos">498</span></a> <span class="k">if</span> <span class="n">value_lower</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;true&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">):</span>
</span><span id="L-499"><a href="#L-499"><span class="linenos">499</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-500"><a href="#L-500"><span class="linenos">500</span></a> <span class="k">if</span> <span class="n">value_lower</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;false&quot;</span><span class="p">,</span> <span class="s2">&quot;0&quot;</span><span class="p">):</span>
</span><span id="L-501"><a href="#L-501"><span class="linenos">501</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-502"><a href="#L-502"><span class="linenos">502</span></a>
</span><span id="L-503"><a href="#L-503"><span class="linenos">503</span></a> <span class="k">return</span> <span class="n">value</span>
</span><span id="L-504"><a href="#L-504"><span class="linenos">504</span></a>
</span><span id="L-505"><a href="#L-505"><span class="linenos">505</span></a>
</span><span id="L-506"><a href="#L-506"><span class="linenos">506</span></a><span class="k">def</span><span class="w"> </span><span class="nf">merge_ranges</span><span class="p">(</span><span class="n">ranges</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="n">A</span><span class="p">,</span> <span class="n">A</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="n">A</span><span class="p">,</span> <span class="n">A</span><span class="p">]]:</span>
</span><span id="L-507"><a href="#L-507"><span class="linenos">507</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-508"><a href="#L-508"><span class="linenos">508</span></a><span class="sd"> Merges a sequence of ranges, represented as tuples (low, high) whose values</span>
</span><span id="L-509"><a href="#L-509"><span class="linenos">509</span></a><span class="sd"> belong to some totally-ordered set.</span>
</span><span id="L-510"><a href="#L-510"><span class="linenos">510</span></a>
</span><span id="L-511"><a href="#L-511"><span class="linenos">511</span></a><span class="sd"> Example:</span>
</span><span id="L-512"><a href="#L-512"><span class="linenos">512</span></a><span class="sd"> &gt;&gt;&gt; merge_ranges([(1, 3), (2, 6)])</span>
</span><span id="L-513"><a href="#L-513"><span class="linenos">513</span></a><span class="sd"> [(1, 6)]</span>
</span><span id="L-514"><a href="#L-514"><span class="linenos">514</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-515"><a href="#L-515"><span class="linenos">515</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">ranges</span><span class="p">:</span>
</span><span id="L-516"><a href="#L-516"><span class="linenos">516</span></a> <span class="k">return</span> <span class="p">[]</span>
</span><span id="L-517"><a href="#L-517"><span class="linenos">517</span></a>
</span><span id="L-518"><a href="#L-518"><span class="linenos">518</span></a> <span class="n">ranges</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">ranges</span><span class="p">)</span>
</span><span id="L-519"><a href="#L-519"><span class="linenos">519</span></a>
</span><span id="L-520"><a href="#L-520"><span class="linenos">520</span></a> <span class="n">merged</span> <span class="o">=</span> <span class="p">[</span><span class="n">ranges</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
</span><span id="L-521"><a href="#L-521"><span class="linenos">521</span></a>
</span><span id="L-522"><a href="#L-522"><span class="linenos">522</span></a> <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span> <span class="ow">in</span> <span class="n">ranges</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
</span><span id="L-523"><a href="#L-523"><span class="linenos">523</span></a> <span class="n">last_start</span><span class="p">,</span> <span class="n">last_end</span> <span class="o">=</span> <span class="n">merged</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span><span id="L-524"><a href="#L-524"><span class="linenos">524</span></a>
</span><span id="L-525"><a href="#L-525"><span class="linenos">525</span></a> <span class="k">if</span> <span class="n">start</span> <span class="o">&lt;=</span> <span class="n">last_end</span><span class="p">:</span>
</span><span id="L-526"><a href="#L-526"><span class="linenos">526</span></a> <span class="n">merged</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">last_start</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="n">last_end</span><span class="p">,</span> <span class="n">end</span><span class="p">))</span>
</span><span id="L-527"><a href="#L-527"><span class="linenos">527</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-528"><a href="#L-528"><span class="linenos">528</span></a> <span class="n">merged</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">))</span>
</span><span id="L-529"><a href="#L-529"><span class="linenos">529</span></a>
</span><span id="L-530"><a href="#L-530"><span class="linenos">530</span></a> <span class="k">return</span> <span class="n">merged</span>
</span><span id="L-531"><a href="#L-531"><span class="linenos">531</span></a>
</span><span id="L-532"><a href="#L-532"><span class="linenos">532</span></a>
</span><span id="L-533"><a href="#L-533"><span class="linenos">533</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_iso_date</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-534"><a href="#L-534"><span class="linenos">534</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-535"><a href="#L-535"><span class="linenos">535</span></a> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span><span id="L-536"><a href="#L-536"><span class="linenos">536</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-537"><a href="#L-537"><span class="linenos">537</span></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
</span><span id="L-538"><a href="#L-538"><span class="linenos">538</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-539"><a href="#L-539"><span class="linenos">539</span></a>
</span><span id="L-540"><a href="#L-540"><span class="linenos">540</span></a>
</span><span id="L-541"><a href="#L-541"><span class="linenos">541</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_iso_datetime</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-542"><a href="#L-542"><span class="linenos">542</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-543"><a href="#L-543"><span class="linenos">543</span></a> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span><span id="L-544"><a href="#L-544"><span class="linenos">544</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-545"><a href="#L-545"><span class="linenos">545</span></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
</span><span id="L-546"><a href="#L-546"><span class="linenos">546</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-547"><a href="#L-547"><span class="linenos">547</span></a>
</span><span id="L-548"><a href="#L-548"><span class="linenos">548</span></a>
</span><span id="L-549"><a href="#L-549"><span class="linenos">549</span></a><span class="c1"># Interval units that operate on date components</span>
</span><span id="L-550"><a href="#L-550"><span class="linenos">550</span></a><span class="n">DATE_UNITS</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;day&quot;</span><span class="p">,</span> <span class="s2">&quot;week&quot;</span><span class="p">,</span> <span class="s2">&quot;month&quot;</span><span class="p">,</span> <span class="s2">&quot;quarter&quot;</span><span class="p">,</span> <span class="s2">&quot;year&quot;</span><span class="p">,</span> <span class="s2">&quot;year_month&quot;</span><span class="p">}</span>
</span><span id="L-551"><a href="#L-551"><span class="linenos">551</span></a>
</span><span id="L-552"><a href="#L-552"><span class="linenos">552</span></a>
</span><span id="L-553"><a href="#L-553"><span class="linenos">553</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_date_unit</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-554"><a href="#L-554"><span class="linenos">554</span></a> <span class="k">return</span> <span class="n">expression</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="n">DATE_UNITS</span>
</span><span id="L-555"><a href="#L-555"><span class="linenos">555</span></a>
</span><span id="L-556"><a href="#L-556"><span class="linenos">556</span></a>
</span><span id="L-557"><a href="#L-557"><span class="linenos">557</span></a><span class="n">K</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">TypeVar</span><span class="p">(</span><span class="s2">&quot;K&quot;</span><span class="p">)</span>
</span><span id="L-558"><a href="#L-558"><span class="linenos">558</span></a><span class="n">V</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">TypeVar</span><span class="p">(</span><span class="s2">&quot;V&quot;</span><span class="p">)</span>
</span><span id="L-559"><a href="#L-559"><span class="linenos">559</span></a>
</span><span id="L-560"><a href="#L-560"><span class="linenos">560</span></a>
</span><span id="L-561"><a href="#L-561"><span class="linenos">561</span></a><span class="k">class</span><span class="w"> </span><span class="nc">SingleValuedMapping</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">Mapping</span><span class="p">[</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="p">]):</span>
</span><span id="L-562"><a href="#L-562"><span class="linenos">562</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-563"><a href="#L-563"><span class="linenos">563</span></a><span class="sd"> Mapping where all keys return the same value.</span>
</span><span id="L-564"><a href="#L-564"><span class="linenos">564</span></a>
</span><span id="L-565"><a href="#L-565"><span class="linenos">565</span></a><span class="sd"> This rigamarole is meant to avoid copying keys, which was originally intended</span>
</span><span id="L-566"><a href="#L-566"><span class="linenos">566</span></a><span class="sd"> as an optimization while qualifying columns for tables with lots of columns.</span>
</span><span id="L-567"><a href="#L-567"><span class="linenos">567</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-568"><a href="#L-568"><span class="linenos">568</span></a>
</span><span id="L-569"><a href="#L-569"><span class="linenos">569</span></a> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keys</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">K</span><span class="p">],</span> <span class="n">value</span><span class="p">:</span> <span class="n">V</span><span class="p">):</span>
</span><span id="L-570"><a href="#L-570"><span class="linenos">570</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_keys</span> <span class="o">=</span> <span class="n">keys</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">keys</span><span class="p">,</span> <span class="n">Set</span><span class="p">)</span> <span class="k">else</span> <span class="nb">set</span><span class="p">(</span><span class="n">keys</span><span class="p">)</span>
</span><span id="L-571"><a href="#L-571"><span class="linenos">571</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span> <span class="o">=</span> <span class="n">value</span>
</span><span id="L-572"><a href="#L-572"><span class="linenos">572</span></a>
</span><span id="L-573"><a href="#L-573"><span class="linenos">573</span></a> <span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="n">K</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">V</span><span class="p">:</span>
</span><span id="L-574"><a href="#L-574"><span class="linenos">574</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_keys</span><span class="p">:</span>
</span><span id="L-575"><a href="#L-575"><span class="linenos">575</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span>
</span><span id="L-576"><a href="#L-576"><span class="linenos">576</span></a> <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
</span><span id="L-577"><a href="#L-577"><span class="linenos">577</span></a>
</span><span id="L-578"><a href="#L-578"><span class="linenos">578</span></a> <span class="k">def</span><span class="w"> </span><span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="L-579"><a href="#L-579"><span class="linenos">579</span></a> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_keys</span><span class="p">)</span>
</span><span id="L-580"><a href="#L-580"><span class="linenos">580</span></a>
</span><span id="L-581"><a href="#L-581"><span class="linenos">581</span></a> <span class="k">def</span><span class="w"> </span><span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Iterator</span><span class="p">[</span><span class="n">K</span><span class="p">]:</span>
</span><span id="L-582"><a href="#L-582"><span class="linenos">582</span></a> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_keys</span><span class="p">)</span>
</span></pre></div>
</section>
<section id="CAMEL_CASE_PATTERN">
<div class="attr variable">
<span class="name">CAMEL_CASE_PATTERN</span> =
<span class="default_value">re.compile(&#39;(?&lt;!^)(?=[A-Z])&#39;)</span>
</div>
<a class="headerlink" href="#CAMEL_CASE_PATTERN"></a>
</section>
<section id="PYTHON_VERSION">
<div class="attr variable">
<span class="name">PYTHON_VERSION</span> =
<span class="default_value">(3, 10)</span>
</div>
<a class="headerlink" href="#PYTHON_VERSION"></a>
</section>
<section id="logger">
<div class="attr variable">
<span class="name">logger</span> =
<span class="default_value">&lt;Logger sqlglot (WARNING)&gt;</span>
</div>
<a class="headerlink" href="#logger"></a>
</section>
<section id="AutoName">
<input id="AutoName-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr class">
<span class="def">class</span>
<span class="name">AutoName</span><wbr>(<span class="base">enum.Enum</span>):
<label class="view-source-button" for="AutoName-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#AutoName"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="AutoName-29"><a href="#AutoName-29"><span class="linenos">29</span></a><span class="k">class</span><span class="w"> </span><span class="nc">AutoName</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
</span><span id="AutoName-30"><a href="#AutoName-30"><span class="linenos">30</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="AutoName-31"><a href="#AutoName-31"><span class="linenos">31</span></a><span class="sd"> This is used for creating Enum classes where `auto()` is the string form</span>
</span><span id="AutoName-32"><a href="#AutoName-32"><span class="linenos">32</span></a><span class="sd"> of the corresponding enum&#39;s identifier (e.g. FOO.value results in &quot;FOO&quot;).</span>
</span><span id="AutoName-33"><a href="#AutoName-33"><span class="linenos">33</span></a>
</span><span id="AutoName-34"><a href="#AutoName-34"><span class="linenos">34</span></a><span class="sd"> Reference: https://docs.python.org/3/howto/enum.html#using-automatic-values</span>
</span><span id="AutoName-35"><a href="#AutoName-35"><span class="linenos">35</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="AutoName-36"><a href="#AutoName-36"><span class="linenos">36</span></a>
</span><span id="AutoName-37"><a href="#AutoName-37"><span class="linenos">37</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_generate_next_value_</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">_start</span><span class="p">,</span> <span class="n">_count</span><span class="p">,</span> <span class="n">_last_values</span><span class="p">):</span>
</span><span id="AutoName-38"><a href="#AutoName-38"><span class="linenos">38</span></a> <span class="k">return</span> <span class="n">name</span>
</span></pre></div>
<div class="docstring"><p>This is used for creating Enum classes where <code>auto()</code> is the string form
of the corresponding enum's identifier (e.g. FOO.value results in "FOO").</p>
<p>Reference: <a href="https://docs.python.org/3/howto/enum.html#using-automatic-values">https://docs.python.org/3/howto/enum.html#using-automatic-values</a></p>
</div>
</section>
<section id="classproperty">
<input id="classproperty-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr class">
<span class="def">class</span>
<span class="name">classproperty</span><wbr>(<span class="base">builtins.property</span>):
<label class="view-source-button" for="classproperty-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#classproperty"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="classproperty-41"><a href="#classproperty-41"><span class="linenos">41</span></a><span class="k">class</span><span class="w"> </span><span class="nc">classproperty</span><span class="p">(</span><span class="nb">property</span><span class="p">):</span>
</span><span id="classproperty-42"><a href="#classproperty-42"><span class="linenos">42</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="classproperty-43"><a href="#classproperty-43"><span class="linenos">43</span></a><span class="sd"> Similar to a normal property but works for class methods</span>
</span><span id="classproperty-44"><a href="#classproperty-44"><span class="linenos">44</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="classproperty-45"><a href="#classproperty-45"><span class="linenos">45</span></a>
</span><span id="classproperty-46"><a href="#classproperty-46"><span class="linenos">46</span></a> <span class="k">def</span><span class="w"> </span><span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">,</span> <span class="n">owner</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">:</span>
</span><span id="classproperty-47"><a href="#classproperty-47"><span class="linenos">47</span></a> <span class="k">return</span> <span class="nb">classmethod</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fget</span><span class="p">)</span><span class="o">.</span><span class="fm">__get__</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">owner</span><span class="p">)()</span> <span class="c1"># type: ignore</span>
</span></pre></div>
<div class="docstring"><p>Similar to a normal property but works for class methods</p>
</div>
</section>
<section id="suggest_closest_match_and_fail">
<input id="suggest_closest_match_and_fail-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">suggest_closest_match_and_fail</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">kind</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">word</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">possibilities</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="suggest_closest_match_and_fail-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#suggest_closest_match_and_fail"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="suggest_closest_match_and_fail-50"><a href="#suggest_closest_match_and_fail-50"><span class="linenos">50</span></a><span class="k">def</span><span class="w"> </span><span class="nf">suggest_closest_match_and_fail</span><span class="p">(</span>
</span><span id="suggest_closest_match_and_fail-51"><a href="#suggest_closest_match_and_fail-51"><span class="linenos">51</span></a> <span class="n">kind</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="suggest_closest_match_and_fail-52"><a href="#suggest_closest_match_and_fail-52"><span class="linenos">52</span></a> <span class="n">word</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="suggest_closest_match_and_fail-53"><a href="#suggest_closest_match_and_fail-53"><span class="linenos">53</span></a> <span class="n">possibilities</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Iterable</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
</span><span id="suggest_closest_match_and_fail-54"><a href="#suggest_closest_match_and_fail-54"><span class="linenos">54</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="suggest_closest_match_and_fail-55"><a href="#suggest_closest_match_and_fail-55"><span class="linenos">55</span></a> <span class="n">close_matches</span> <span class="o">=</span> <span class="n">get_close_matches</span><span class="p">(</span><span class="n">word</span><span class="p">,</span> <span class="n">possibilities</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="suggest_closest_match_and_fail-56"><a href="#suggest_closest_match_and_fail-56"><span class="linenos">56</span></a>
</span><span id="suggest_closest_match_and_fail-57"><a href="#suggest_closest_match_and_fail-57"><span class="linenos">57</span></a> <span class="n">similar</span> <span class="o">=</span> <span class="n">seq_get</span><span class="p">(</span><span class="n">close_matches</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span>
</span><span id="suggest_closest_match_and_fail-58"><a href="#suggest_closest_match_and_fail-58"><span class="linenos">58</span></a> <span class="k">if</span> <span class="n">similar</span><span class="p">:</span>
</span><span id="suggest_closest_match_and_fail-59"><a href="#suggest_closest_match_and_fail-59"><span class="linenos">59</span></a> <span class="n">similar</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; Did you mean </span><span class="si">{</span><span class="n">similar</span><span class="si">}</span><span class="s2">?&quot;</span>
</span><span id="suggest_closest_match_and_fail-60"><a href="#suggest_closest_match_and_fail-60"><span class="linenos">60</span></a>
</span><span id="suggest_closest_match_and_fail-61"><a href="#suggest_closest_match_and_fail-61"><span class="linenos">61</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unknown </span><span class="si">{</span><span class="n">kind</span><span class="si">}</span><span class="s2"> &#39;</span><span class="si">{</span><span class="n">word</span><span class="si">}</span><span class="s2">&#39;.</span><span class="si">{</span><span class="n">similar</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span></pre></div>
</section>
<section id="seq_get">
<input id="seq_get-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">seq_get</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">seq</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="o">~</span><span class="n">T</span><span class="p">]</span>, </span><span class="param"><span class="n">index</span><span class="p">:</span> <span class="nb">int</span></span><span class="return-annotation">) -> <span class="n">Optional</span><span class="p">[</span><span class="o">~</span><span class="n">T</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="seq_get-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#seq_get"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="seq_get-64"><a href="#seq_get-64"><span class="linenos">64</span></a><span class="k">def</span><span class="w"> </span><span class="nf">seq_get</span><span class="p">(</span><span class="n">seq</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="n">T</span><span class="p">],</span> <span class="n">index</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span>
</span><span id="seq_get-65"><a href="#seq_get-65"><span class="linenos">65</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the value in `seq` at position `index`, or `None` if `index` is out of bounds.&quot;&quot;&quot;</span>
</span><span id="seq_get-66"><a href="#seq_get-66"><span class="linenos">66</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="seq_get-67"><a href="#seq_get-67"><span class="linenos">67</span></a> <span class="k">return</span> <span class="n">seq</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
</span><span id="seq_get-68"><a href="#seq_get-68"><span class="linenos">68</span></a> <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
</span><span id="seq_get-69"><a href="#seq_get-69"><span class="linenos">69</span></a> <span class="k">return</span> <span class="kc">None</span>
</span></pre></div>
<div class="docstring"><p>Returns the value in <code>seq</code> at position <code>index</code>, or <code>None</code> if <code>index</code> is out of bounds.</p>
</div>
</section>
<section id="ensure_list">
<input id="ensure_list-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">ensure_list</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">value</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="ensure_list-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#ensure_list"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ensure_list-84"><a href="#ensure_list-84"><span class="linenos">84</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_list</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
</span><span id="ensure_list-85"><a href="#ensure_list-85"><span class="linenos">85</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ensure_list-86"><a href="#ensure_list-86"><span class="linenos">86</span></a><span class="sd"> Ensures that a value is a list, otherwise casts or wraps it into one.</span>
</span><span id="ensure_list-87"><a href="#ensure_list-87"><span class="linenos">87</span></a>
</span><span id="ensure_list-88"><a href="#ensure_list-88"><span class="linenos">88</span></a><span class="sd"> Args:</span>
</span><span id="ensure_list-89"><a href="#ensure_list-89"><span class="linenos">89</span></a><span class="sd"> value: The value of interest.</span>
</span><span id="ensure_list-90"><a href="#ensure_list-90"><span class="linenos">90</span></a>
</span><span id="ensure_list-91"><a href="#ensure_list-91"><span class="linenos">91</span></a><span class="sd"> Returns:</span>
</span><span id="ensure_list-92"><a href="#ensure_list-92"><span class="linenos">92</span></a><span class="sd"> The value cast as a list if it&#39;s a list or a tuple, or else the value wrapped in a list.</span>
</span><span id="ensure_list-93"><a href="#ensure_list-93"><span class="linenos">93</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ensure_list-94"><a href="#ensure_list-94"><span class="linenos">94</span></a> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="ensure_list-95"><a href="#ensure_list-95"><span class="linenos">95</span></a> <span class="k">return</span> <span class="p">[]</span>
</span><span id="ensure_list-96"><a href="#ensure_list-96"><span class="linenos">96</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
</span><span id="ensure_list-97"><a href="#ensure_list-97"><span class="linenos">97</span></a> <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span id="ensure_list-98"><a href="#ensure_list-98"><span class="linenos">98</span></a>
</span><span id="ensure_list-99"><a href="#ensure_list-99"><span class="linenos">99</span></a> <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="p">]</span>
</span></pre></div>
<div class="docstring"><p>Ensures that a value is a list, otherwise casts or wraps it into one.</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>value:</strong> The value of interest.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>The value cast as a list if it's a list or a tuple, or else the value wrapped in a list.</p>
</blockquote>
</div>
</section>
<section id="ensure_collection">
<input id="ensure_collection-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">ensure_collection</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">value</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="ensure_collection-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#ensure_collection"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ensure_collection-110"><a href="#ensure_collection-110"><span class="linenos">110</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_collection</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
</span><span id="ensure_collection-111"><a href="#ensure_collection-111"><span class="linenos">111</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ensure_collection-112"><a href="#ensure_collection-112"><span class="linenos">112</span></a><span class="sd"> Ensures that a value is a collection (excluding `str` and `bytes`), otherwise wraps it into a list.</span>
</span><span id="ensure_collection-113"><a href="#ensure_collection-113"><span class="linenos">113</span></a>
</span><span id="ensure_collection-114"><a href="#ensure_collection-114"><span class="linenos">114</span></a><span class="sd"> Args:</span>
</span><span id="ensure_collection-115"><a href="#ensure_collection-115"><span class="linenos">115</span></a><span class="sd"> value: The value of interest.</span>
</span><span id="ensure_collection-116"><a href="#ensure_collection-116"><span class="linenos">116</span></a>
</span><span id="ensure_collection-117"><a href="#ensure_collection-117"><span class="linenos">117</span></a><span class="sd"> Returns:</span>
</span><span id="ensure_collection-118"><a href="#ensure_collection-118"><span class="linenos">118</span></a><span class="sd"> The value if it&#39;s a collection, or else the value wrapped in a list.</span>
</span><span id="ensure_collection-119"><a href="#ensure_collection-119"><span class="linenos">119</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ensure_collection-120"><a href="#ensure_collection-120"><span class="linenos">120</span></a> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="ensure_collection-121"><a href="#ensure_collection-121"><span class="linenos">121</span></a> <span class="k">return</span> <span class="p">[]</span>
</span><span id="ensure_collection-122"><a href="#ensure_collection-122"><span class="linenos">122</span></a> <span class="k">return</span> <span class="p">(</span>
</span><span id="ensure_collection-123"><a href="#ensure_collection-123"><span class="linenos">123</span></a> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Collection</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">))</span> <span class="k">else</span> <span class="p">[</span><span class="n">value</span><span class="p">]</span>
</span><span id="ensure_collection-124"><a href="#ensure_collection-124"><span class="linenos">124</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Ensures that a value is a collection (excluding <code>str</code> and <code>bytes</code>), otherwise wraps it into a list.</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>value:</strong> The value of interest.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>The value if it's a collection, or else the value wrapped in a list.</p>
</blockquote>
</div>
</section>
<section id="csv">
<input id="csv-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">csv</span><span class="signature pdoc-code condensed">(<span class="param"><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">sep</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="csv-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#csv"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="csv-127"><a href="#csv-127"><span class="linenos">127</span></a><span class="k">def</span><span class="w"> </span><span class="nf">csv</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">sep</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="csv-128"><a href="#csv-128"><span class="linenos">128</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="csv-129"><a href="#csv-129"><span class="linenos">129</span></a><span class="sd"> Formats any number of string arguments as CSV.</span>
</span><span id="csv-130"><a href="#csv-130"><span class="linenos">130</span></a>
</span><span id="csv-131"><a href="#csv-131"><span class="linenos">131</span></a><span class="sd"> Args:</span>
</span><span id="csv-132"><a href="#csv-132"><span class="linenos">132</span></a><span class="sd"> args: The string arguments to format.</span>
</span><span id="csv-133"><a href="#csv-133"><span class="linenos">133</span></a><span class="sd"> sep: The argument separator.</span>
</span><span id="csv-134"><a href="#csv-134"><span class="linenos">134</span></a>
</span><span id="csv-135"><a href="#csv-135"><span class="linenos">135</span></a><span class="sd"> Returns:</span>
</span><span id="csv-136"><a href="#csv-136"><span class="linenos">136</span></a><span class="sd"> The arguments formatted as a CSV string.</span>
</span><span id="csv-137"><a href="#csv-137"><span class="linenos">137</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="csv-138"><a href="#csv-138"><span class="linenos">138</span></a> <span class="k">return</span> <span class="n">sep</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">arg</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span> <span class="k">if</span> <span class="n">arg</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Formats any number of string arguments as CSV.</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>args:</strong> The string arguments to format.</li>
<li><strong>sep:</strong> The argument separator.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>The arguments formatted as a CSV string.</p>
</blockquote>
</div>
</section>
<section id="subclasses">
<input id="subclasses-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">subclasses</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">module_name</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">classes</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">Type</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="n">Type</span><span class="p">,</span> <span class="o">...</span><span class="p">]]</span>,</span><span class="param"> <span class="n">exclude</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">Type</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="n">Type</span><span class="p">,</span> <span class="o">...</span><span class="p">]]</span> <span class="o">=</span> <span class="p">()</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="n">Type</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="subclasses-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#subclasses"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="subclasses-141"><a href="#subclasses-141"><span class="linenos">141</span></a><span class="k">def</span><span class="w"> </span><span class="nf">subclasses</span><span class="p">(</span>
</span><span id="subclasses-142"><a href="#subclasses-142"><span class="linenos">142</span></a> <span class="n">module_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="subclasses-143"><a href="#subclasses-143"><span class="linenos">143</span></a> <span class="n">classes</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span> <span class="o">|</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">,</span> <span class="o">...</span><span class="p">],</span>
</span><span id="subclasses-144"><a href="#subclasses-144"><span class="linenos">144</span></a> <span class="n">exclude</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span> <span class="o">|</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">,</span> <span class="o">...</span><span class="p">]</span> <span class="o">=</span> <span class="p">(),</span>
</span><span id="subclasses-145"><a href="#subclasses-145"><span class="linenos">145</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">]:</span>
</span><span id="subclasses-146"><a href="#subclasses-146"><span class="linenos">146</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="subclasses-147"><a href="#subclasses-147"><span class="linenos">147</span></a><span class="sd"> Returns all subclasses for a collection of classes, possibly excluding some of them.</span>
</span><span id="subclasses-148"><a href="#subclasses-148"><span class="linenos">148</span></a>
</span><span id="subclasses-149"><a href="#subclasses-149"><span class="linenos">149</span></a><span class="sd"> Args:</span>
</span><span id="subclasses-150"><a href="#subclasses-150"><span class="linenos">150</span></a><span class="sd"> module_name: The name of the module to search for subclasses in.</span>
</span><span id="subclasses-151"><a href="#subclasses-151"><span class="linenos">151</span></a><span class="sd"> classes: Class(es) we want to find the subclasses of.</span>
</span><span id="subclasses-152"><a href="#subclasses-152"><span class="linenos">152</span></a><span class="sd"> exclude: Class(es) we want to exclude from the returned list.</span>
</span><span id="subclasses-153"><a href="#subclasses-153"><span class="linenos">153</span></a>
</span><span id="subclasses-154"><a href="#subclasses-154"><span class="linenos">154</span></a><span class="sd"> Returns:</span>
</span><span id="subclasses-155"><a href="#subclasses-155"><span class="linenos">155</span></a><span class="sd"> The target subclasses.</span>
</span><span id="subclasses-156"><a href="#subclasses-156"><span class="linenos">156</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="subclasses-157"><a href="#subclasses-157"><span class="linenos">157</span></a> <span class="k">return</span> <span class="p">[</span>
</span><span id="subclasses-158"><a href="#subclasses-158"><span class="linenos">158</span></a> <span class="n">obj</span>
</span><span id="subclasses-159"><a href="#subclasses-159"><span class="linenos">159</span></a> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getmembers</span><span class="p">(</span>
</span><span id="subclasses-160"><a href="#subclasses-160"><span class="linenos">160</span></a> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="n">module_name</span><span class="p">],</span>
</span><span id="subclasses-161"><a href="#subclasses-161"><span class="linenos">161</span></a> <span class="k">lambda</span> <span class="n">obj</span><span class="p">:</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">classes</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">,</span>
</span><span id="subclasses-162"><a href="#subclasses-162"><span class="linenos">162</span></a> <span class="p">)</span>
</span><span id="subclasses-163"><a href="#subclasses-163"><span class="linenos">163</span></a> <span class="p">]</span>
</span></pre></div>
<div class="docstring"><p>Returns all subclasses for a collection of classes, possibly excluding some of them.</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>module_name:</strong> The name of the module to search for subclasses in.</li>
<li><strong>classes:</strong> Class(es) we want to find the subclasses of.</li>
<li><strong>exclude:</strong> Class(es) we want to exclude from the returned list.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>The target subclasses.</p>
</blockquote>
</div>
</section>
<section id="apply_index_offset">
<input id="apply_index_offset-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">apply_index_offset</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">this</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>,</span><span class="param"> <span class="n">expressions</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="o">~</span><span class="n">E</span><span class="p">]</span>,</span><span class="param"> <span class="n">offset</span><span class="p">:</span> <span class="nb">int</span>,</span><span class="param"> <span class="n">dialect</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n"><a href="dialects.html#Dialect">sqlglot.dialects.Dialect</a></span><span class="p">,</span> <span class="n">Type</span><span class="p">[</span><span class="n"><a href="dialects.html#Dialect">sqlglot.dialects.Dialect</a></span><span class="p">],</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="o">~</span><span class="n">E</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="apply_index_offset-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#apply_index_offset"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="apply_index_offset-166"><a href="#apply_index_offset-166"><span class="linenos">166</span></a><span class="k">def</span><span class="w"> </span><span class="nf">apply_index_offset</span><span class="p">(</span>
</span><span id="apply_index_offset-167"><a href="#apply_index_offset-167"><span class="linenos">167</span></a> <span class="n">this</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
</span><span id="apply_index_offset-168"><a href="#apply_index_offset-168"><span class="linenos">168</span></a> <span class="n">expressions</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">E</span><span class="p">],</span>
</span><span id="apply_index_offset-169"><a href="#apply_index_offset-169"><span class="linenos">169</span></a> <span class="n">offset</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
</span><span id="apply_index_offset-170"><a href="#apply_index_offset-170"><span class="linenos">170</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="apply_index_offset-171"><a href="#apply_index_offset-171"><span class="linenos">171</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">E</span><span class="p">]:</span>
</span><span id="apply_index_offset-172"><a href="#apply_index_offset-172"><span class="linenos">172</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="apply_index_offset-173"><a href="#apply_index_offset-173"><span class="linenos">173</span></a><span class="sd"> Applies an offset to a given integer literal expression.</span>
</span><span id="apply_index_offset-174"><a href="#apply_index_offset-174"><span class="linenos">174</span></a>
</span><span id="apply_index_offset-175"><a href="#apply_index_offset-175"><span class="linenos">175</span></a><span class="sd"> Args:</span>
</span><span id="apply_index_offset-176"><a href="#apply_index_offset-176"><span class="linenos">176</span></a><span class="sd"> this: The target of the index.</span>
</span><span id="apply_index_offset-177"><a href="#apply_index_offset-177"><span class="linenos">177</span></a><span class="sd"> expressions: The expression the offset will be applied to, wrapped in a list.</span>
</span><span id="apply_index_offset-178"><a href="#apply_index_offset-178"><span class="linenos">178</span></a><span class="sd"> offset: The offset that will be applied.</span>
</span><span id="apply_index_offset-179"><a href="#apply_index_offset-179"><span class="linenos">179</span></a><span class="sd"> dialect: the dialect of interest.</span>
</span><span id="apply_index_offset-180"><a href="#apply_index_offset-180"><span class="linenos">180</span></a>
</span><span id="apply_index_offset-181"><a href="#apply_index_offset-181"><span class="linenos">181</span></a><span class="sd"> Returns:</span>
</span><span id="apply_index_offset-182"><a href="#apply_index_offset-182"><span class="linenos">182</span></a><span class="sd"> The original expression with the offset applied to it, wrapped in a list. If the provided</span>
</span><span id="apply_index_offset-183"><a href="#apply_index_offset-183"><span class="linenos">183</span></a><span class="sd"> `expressions` argument contains more than one expression, it&#39;s returned unaffected.</span>
</span><span id="apply_index_offset-184"><a href="#apply_index_offset-184"><span class="linenos">184</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="apply_index_offset-185"><a href="#apply_index_offset-185"><span class="linenos">185</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">offset</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="apply_index_offset-186"><a href="#apply_index_offset-186"><span class="linenos">186</span></a> <span class="k">return</span> <span class="n">expressions</span>
</span><span id="apply_index_offset-187"><a href="#apply_index_offset-187"><span class="linenos">187</span></a>
</span><span id="apply_index_offset-188"><a href="#apply_index_offset-188"><span class="linenos">188</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="apply_index_offset-189"><a href="#apply_index_offset-189"><span class="linenos">189</span></a>
</span><span id="apply_index_offset-190"><a href="#apply_index_offset-190"><span class="linenos">190</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot</span><span class="w"> </span><span class="kn">import</span> <span class="n">exp</span>
</span><span id="apply_index_offset-191"><a href="#apply_index_offset-191"><span class="linenos">191</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.annotate_types</span><span class="w"> </span><span class="kn">import</span> <span class="n">annotate_types</span>
</span><span id="apply_index_offset-192"><a href="#apply_index_offset-192"><span class="linenos">192</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.simplify</span><span class="w"> </span><span class="kn">import</span> <span class="n">simplify</span>
</span><span id="apply_index_offset-193"><a href="#apply_index_offset-193"><span class="linenos">193</span></a>
</span><span id="apply_index_offset-194"><a href="#apply_index_offset-194"><span class="linenos">194</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">this</span><span class="o">.</span><span class="n">type</span><span class="p">:</span>
</span><span id="apply_index_offset-195"><a href="#apply_index_offset-195"><span class="linenos">195</span></a> <span class="n">annotate_types</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="apply_index_offset-196"><a href="#apply_index_offset-196"><span class="linenos">196</span></a>
</span><span id="apply_index_offset-197"><a href="#apply_index_offset-197"><span class="linenos">197</span></a> <span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">,</span> <span class="n">this</span><span class="o">.</span><span class="n">type</span><span class="p">)</span><span class="o">.</span><span class="n">this</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span>
</span><span id="apply_index_offset-198"><a href="#apply_index_offset-198"><span class="linenos">198</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">UNKNOWN</span><span class="p">,</span>
</span><span id="apply_index_offset-199"><a href="#apply_index_offset-199"><span class="linenos">199</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">ARRAY</span><span class="p">,</span>
</span><span id="apply_index_offset-200"><a href="#apply_index_offset-200"><span class="linenos">200</span></a> <span class="p">):</span>
</span><span id="apply_index_offset-201"><a href="#apply_index_offset-201"><span class="linenos">201</span></a> <span class="k">return</span> <span class="n">expressions</span>
</span><span id="apply_index_offset-202"><a href="#apply_index_offset-202"><span class="linenos">202</span></a>
</span><span id="apply_index_offset-203"><a href="#apply_index_offset-203"><span class="linenos">203</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">expression</span><span class="o">.</span><span class="n">type</span><span class="p">:</span>
</span><span id="apply_index_offset-204"><a href="#apply_index_offset-204"><span class="linenos">204</span></a> <span class="n">annotate_types</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="apply_index_offset-205"><a href="#apply_index_offset-205"><span class="linenos">205</span></a>
</span><span id="apply_index_offset-206"><a href="#apply_index_offset-206"><span class="linenos">206</span></a> <span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">type</span><span class="p">)</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">INTEGER_TYPES</span><span class="p">:</span>
</span><span id="apply_index_offset-207"><a href="#apply_index_offset-207"><span class="linenos">207</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Applying array index offset (</span><span class="si">%s</span><span class="s2">)&quot;</span><span class="p">,</span> <span class="n">offset</span><span class="p">)</span>
</span><span id="apply_index_offset-208"><a href="#apply_index_offset-208"><span class="linenos">208</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">expression</span> <span class="o">+</span> <span class="n">offset</span><span class="p">)</span>
</span><span id="apply_index_offset-209"><a href="#apply_index_offset-209"><span class="linenos">209</span></a> <span class="k">return</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span>
</span><span id="apply_index_offset-210"><a href="#apply_index_offset-210"><span class="linenos">210</span></a>
</span><span id="apply_index_offset-211"><a href="#apply_index_offset-211"><span class="linenos">211</span></a> <span class="k">return</span> <span class="n">expressions</span>
</span></pre></div>
<div class="docstring"><p>Applies an offset to a given integer literal expression.</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>this:</strong> The target of the index.</li>
<li><strong>expressions:</strong> The expression the offset will be applied to, wrapped in a list.</li>
<li><strong>offset:</strong> The offset that will be applied.</li>
<li><strong>dialect:</strong> the dialect of interest.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>The original expression with the offset applied to it, wrapped in a list. If the provided
<code>expressions</code> argument contains more than one expression, it's returned unaffected.</p>
</blockquote>
</div>
</section>
<section id="camel_to_snake_case">
<input id="camel_to_snake_case-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">camel_to_snake_case</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">name</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="camel_to_snake_case-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#camel_to_snake_case"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="camel_to_snake_case-214"><a href="#camel_to_snake_case-214"><span class="linenos">214</span></a><span class="k">def</span><span class="w"> </span><span class="nf">camel_to_snake_case</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="camel_to_snake_case-215"><a href="#camel_to_snake_case-215"><span class="linenos">215</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts `name` from camelCase to snake_case and returns the result.&quot;&quot;&quot;</span>
</span><span id="camel_to_snake_case-216"><a href="#camel_to_snake_case-216"><span class="linenos">216</span></a> <span class="k">return</span> <span class="n">CAMEL_CASE_PATTERN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
</span></pre></div>
<div class="docstring"><p>Converts <code>name</code> from camelCase to snake_case and returns the result.</p>
</div>
</section>
<section id="while_changing">
<input id="while_changing-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">while_changing</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>,</span><span class="param"> <span class="n">func</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">],</span> <span class="o">~</span><span class="n">E</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="o">~</span><span class="n">E</span>:</span></span>
<label class="view-source-button" for="while_changing-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#while_changing"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="while_changing-219"><a href="#while_changing-219"><span class="linenos">219</span></a><span class="k">def</span><span class="w"> </span><span class="nf">while_changing</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">Expression</span><span class="p">,</span> <span class="n">func</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Expression</span><span class="p">],</span> <span class="n">E</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">E</span><span class="p">:</span>
</span><span id="while_changing-220"><a href="#while_changing-220"><span class="linenos">220</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="while_changing-221"><a href="#while_changing-221"><span class="linenos">221</span></a><span class="sd"> Applies a transformation to a given expression until a fix point is reached.</span>
</span><span id="while_changing-222"><a href="#while_changing-222"><span class="linenos">222</span></a>
</span><span id="while_changing-223"><a href="#while_changing-223"><span class="linenos">223</span></a><span class="sd"> Args:</span>
</span><span id="while_changing-224"><a href="#while_changing-224"><span class="linenos">224</span></a><span class="sd"> expression: The expression to be transformed.</span>
</span><span id="while_changing-225"><a href="#while_changing-225"><span class="linenos">225</span></a><span class="sd"> func: The transformation to be applied.</span>
</span><span id="while_changing-226"><a href="#while_changing-226"><span class="linenos">226</span></a>
</span><span id="while_changing-227"><a href="#while_changing-227"><span class="linenos">227</span></a><span class="sd"> Returns:</span>
</span><span id="while_changing-228"><a href="#while_changing-228"><span class="linenos">228</span></a><span class="sd"> The transformed expression.</span>
</span><span id="while_changing-229"><a href="#while_changing-229"><span class="linenos">229</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="while_changing-230"><a href="#while_changing-230"><span class="linenos">230</span></a> <span class="n">end_hash</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="while_changing-231"><a href="#while_changing-231"><span class="linenos">231</span></a>
</span><span id="while_changing-232"><a href="#while_changing-232"><span class="linenos">232</span></a> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="while_changing-233"><a href="#while_changing-233"><span class="linenos">233</span></a> <span class="c1"># No need to walk the AST we&#39;ve already cached the hashes in the previous iteration</span>
</span><span id="while_changing-234"><a href="#while_changing-234"><span class="linenos">234</span></a> <span class="k">if</span> <span class="n">end_hash</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="while_changing-235"><a href="#while_changing-235"><span class="linenos">235</span></a> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">())):</span>
</span><span id="while_changing-236"><a href="#while_changing-236"><span class="linenos">236</span></a> <span class="n">n</span><span class="o">.</span><span class="n">_hash</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
</span><span id="while_changing-237"><a href="#while_changing-237"><span class="linenos">237</span></a>
</span><span id="while_changing-238"><a href="#while_changing-238"><span class="linenos">238</span></a> <span class="n">start_hash</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="while_changing-239"><a href="#while_changing-239"><span class="linenos">239</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="while_changing-240"><a href="#while_changing-240"><span class="linenos">240</span></a>
</span><span id="while_changing-241"><a href="#while_changing-241"><span class="linenos">241</span></a> <span class="n">expression_nodes</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">())</span>
</span><span id="while_changing-242"><a href="#while_changing-242"><span class="linenos">242</span></a>
</span><span id="while_changing-243"><a href="#while_changing-243"><span class="linenos">243</span></a> <span class="c1"># Uncache previous caches so we can recompute them</span>
</span><span id="while_changing-244"><a href="#while_changing-244"><span class="linenos">244</span></a> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">expression_nodes</span><span class="p">):</span>
</span><span id="while_changing-245"><a href="#while_changing-245"><span class="linenos">245</span></a> <span class="n">n</span><span class="o">.</span><span class="n">_hash</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="while_changing-246"><a href="#while_changing-246"><span class="linenos">246</span></a> <span class="n">n</span><span class="o">.</span><span class="n">_hash</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
</span><span id="while_changing-247"><a href="#while_changing-247"><span class="linenos">247</span></a>
</span><span id="while_changing-248"><a href="#while_changing-248"><span class="linenos">248</span></a> <span class="n">end_hash</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="while_changing-249"><a href="#while_changing-249"><span class="linenos">249</span></a>
</span><span id="while_changing-250"><a href="#while_changing-250"><span class="linenos">250</span></a> <span class="k">if</span> <span class="n">start_hash</span> <span class="o">==</span> <span class="n">end_hash</span><span class="p">:</span>
</span><span id="while_changing-251"><a href="#while_changing-251"><span class="linenos">251</span></a> <span class="c1"># ... and reset the hash so we don&#39;t risk it becoming out of date if a mutation happens</span>
</span><span id="while_changing-252"><a href="#while_changing-252"><span class="linenos">252</span></a> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">expression_nodes</span><span class="p">:</span>
</span><span id="while_changing-253"><a href="#while_changing-253"><span class="linenos">253</span></a> <span class="n">n</span><span class="o">.</span><span class="n">_hash</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="while_changing-254"><a href="#while_changing-254"><span class="linenos">254</span></a>
</span><span id="while_changing-255"><a href="#while_changing-255"><span class="linenos">255</span></a> <span class="k">break</span>
</span><span id="while_changing-256"><a href="#while_changing-256"><span class="linenos">256</span></a>
</span><span id="while_changing-257"><a href="#while_changing-257"><span class="linenos">257</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Applies a transformation to a given expression until a fix point is reached.</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>expression:</strong> The expression to be transformed.</li>
<li><strong>func:</strong> The transformation to be applied.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>The transformed expression.</p>
</blockquote>
</div>
</section>
<section id="tsort">
<input id="tsort-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">tsort</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">dag</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="o">~</span><span class="n">T</span><span class="p">,</span> <span class="n">Set</span><span class="p">[</span><span class="o">~</span><span class="n">T</span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="o">~</span><span class="n">T</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="tsort-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#tsort"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="tsort-260"><a href="#tsort-260"><span class="linenos">260</span></a><span class="k">def</span><span class="w"> </span><span class="nf">tsort</span><span class="p">(</span><span class="n">dag</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="n">T</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Set</span><span class="p">[</span><span class="n">T</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span>
</span><span id="tsort-261"><a href="#tsort-261"><span class="linenos">261</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="tsort-262"><a href="#tsort-262"><span class="linenos">262</span></a><span class="sd"> Sorts a given directed acyclic graph in topological order.</span>
</span><span id="tsort-263"><a href="#tsort-263"><span class="linenos">263</span></a>
</span><span id="tsort-264"><a href="#tsort-264"><span class="linenos">264</span></a><span class="sd"> Args:</span>
</span><span id="tsort-265"><a href="#tsort-265"><span class="linenos">265</span></a><span class="sd"> dag: The graph to be sorted.</span>
</span><span id="tsort-266"><a href="#tsort-266"><span class="linenos">266</span></a>
</span><span id="tsort-267"><a href="#tsort-267"><span class="linenos">267</span></a><span class="sd"> Returns:</span>
</span><span id="tsort-268"><a href="#tsort-268"><span class="linenos">268</span></a><span class="sd"> A list that contains all of the graph&#39;s nodes in topological order.</span>
</span><span id="tsort-269"><a href="#tsort-269"><span class="linenos">269</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="tsort-270"><a href="#tsort-270"><span class="linenos">270</span></a> <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="tsort-271"><a href="#tsort-271"><span class="linenos">271</span></a>
</span><span id="tsort-272"><a href="#tsort-272"><span class="linenos">272</span></a> <span class="k">for</span> <span class="n">node</span><span class="p">,</span> <span class="n">deps</span> <span class="ow">in</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">dag</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
</span><span id="tsort-273"><a href="#tsort-273"><span class="linenos">273</span></a> <span class="k">for</span> <span class="n">dep</span> <span class="ow">in</span> <span class="n">deps</span><span class="p">:</span>
</span><span id="tsort-274"><a href="#tsort-274"><span class="linenos">274</span></a> <span class="k">if</span> <span class="n">dep</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">dag</span><span class="p">:</span>
</span><span id="tsort-275"><a href="#tsort-275"><span class="linenos">275</span></a> <span class="n">dag</span><span class="p">[</span><span class="n">dep</span><span class="p">]</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
</span><span id="tsort-276"><a href="#tsort-276"><span class="linenos">276</span></a>
</span><span id="tsort-277"><a href="#tsort-277"><span class="linenos">277</span></a> <span class="k">while</span> <span class="n">dag</span><span class="p">:</span>
</span><span id="tsort-278"><a href="#tsort-278"><span class="linenos">278</span></a> <span class="n">current</span> <span class="o">=</span> <span class="p">{</span><span class="n">node</span> <span class="k">for</span> <span class="n">node</span><span class="p">,</span> <span class="n">deps</span> <span class="ow">in</span> <span class="n">dag</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">deps</span><span class="p">}</span>
</span><span id="tsort-279"><a href="#tsort-279"><span class="linenos">279</span></a>
</span><span id="tsort-280"><a href="#tsort-280"><span class="linenos">280</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">current</span><span class="p">:</span>
</span><span id="tsort-281"><a href="#tsort-281"><span class="linenos">281</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Cycle error&quot;</span><span class="p">)</span>
</span><span id="tsort-282"><a href="#tsort-282"><span class="linenos">282</span></a>
</span><span id="tsort-283"><a href="#tsort-283"><span class="linenos">283</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">current</span><span class="p">:</span>
</span><span id="tsort-284"><a href="#tsort-284"><span class="linenos">284</span></a> <span class="n">dag</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
</span><span id="tsort-285"><a href="#tsort-285"><span class="linenos">285</span></a>
</span><span id="tsort-286"><a href="#tsort-286"><span class="linenos">286</span></a> <span class="k">for</span> <span class="n">deps</span> <span class="ow">in</span> <span class="n">dag</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
</span><span id="tsort-287"><a href="#tsort-287"><span class="linenos">287</span></a> <span class="n">deps</span> <span class="o">-=</span> <span class="n">current</span>
</span><span id="tsort-288"><a href="#tsort-288"><span class="linenos">288</span></a>
</span><span id="tsort-289"><a href="#tsort-289"><span class="linenos">289</span></a> <span class="n">result</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">current</span><span class="p">))</span> <span class="c1"># type: ignore</span>
</span><span id="tsort-290"><a href="#tsort-290"><span class="linenos">290</span></a>
</span><span id="tsort-291"><a href="#tsort-291"><span class="linenos">291</span></a> <span class="k">return</span> <span class="n">result</span>
</span></pre></div>
<div class="docstring"><p>Sorts a given directed acyclic graph in topological order.</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>dag:</strong> The graph to be sorted.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>A list that contains all of the graph's nodes in topological order.</p>
</blockquote>
</div>
</section>
<section id="open_file">
<input id="open_file-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">open_file</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">file_name</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> &lt;class &#x27;TextIO&#x27;&gt;:</span></span>
<label class="view-source-button" for="open_file-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#open_file"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="open_file-294"><a href="#open_file-294"><span class="linenos">294</span></a><span class="k">def</span><span class="w"> </span><span class="nf">open_file</span><span class="p">(</span><span class="n">file_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">TextIO</span><span class="p">:</span>
</span><span id="open_file-295"><a href="#open_file-295"><span class="linenos">295</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Open a file that may be compressed as gzip and return it in universal newline mode.&quot;&quot;&quot;</span>
</span><span id="open_file-296"><a href="#open_file-296"><span class="linenos">296</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="open_file-297"><a href="#open_file-297"><span class="linenos">297</span></a> <span class="n">gzipped</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">==</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x1f\x8b</span><span class="s2">&quot;</span>
</span><span id="open_file-298"><a href="#open_file-298"><span class="linenos">298</span></a>
</span><span id="open_file-299"><a href="#open_file-299"><span class="linenos">299</span></a> <span class="k">if</span> <span class="n">gzipped</span><span class="p">:</span>
</span><span id="open_file-300"><a href="#open_file-300"><span class="linenos">300</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">gzip</span>
</span><span id="open_file-301"><a href="#open_file-301"><span class="linenos">301</span></a>
</span><span id="open_file-302"><a href="#open_file-302"><span class="linenos">302</span></a> <span class="k">return</span> <span class="n">gzip</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="s2">&quot;rt&quot;</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="open_file-303"><a href="#open_file-303"><span class="linenos">303</span></a>
</span><span id="open_file-304"><a href="#open_file-304"><span class="linenos">304</span></a> <span class="k">return</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;utf-8&quot;</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Open a file that may be compressed as gzip and return it in universal newline mode.</p>
</div>
</section>
<section id="csv_reader">
<input id="csv_reader-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-contextmanager">@contextmanager</div>
<span class="def">def</span>
<span class="name">csv_reader</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">read_csv</span><span class="p">:</span> <span class="n"><a href="expressions.html#ReadCSV">sqlglot.expressions.ReadCSV</a></span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="csv_reader-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#csv_reader"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="csv_reader-307"><a href="#csv_reader-307"><span class="linenos">307</span></a><span class="nd">@contextmanager</span>
</span><span id="csv_reader-308"><a href="#csv_reader-308"><span class="linenos">308</span></a><span class="k">def</span><span class="w"> </span><span class="nf">csv_reader</span><span class="p">(</span><span class="n">read_csv</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">ReadCSV</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">:</span>
</span><span id="csv_reader-309"><a href="#csv_reader-309"><span class="linenos">309</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="csv_reader-310"><a href="#csv_reader-310"><span class="linenos">310</span></a><span class="sd"> Returns a csv reader given the expression `READ_CSV(name, [&#39;delimiter&#39;, &#39;|&#39;, ...])`.</span>
</span><span id="csv_reader-311"><a href="#csv_reader-311"><span class="linenos">311</span></a>
</span><span id="csv_reader-312"><a href="#csv_reader-312"><span class="linenos">312</span></a><span class="sd"> Args:</span>
</span><span id="csv_reader-313"><a href="#csv_reader-313"><span class="linenos">313</span></a><span class="sd"> read_csv: A `ReadCSV` function call.</span>
</span><span id="csv_reader-314"><a href="#csv_reader-314"><span class="linenos">314</span></a>
</span><span id="csv_reader-315"><a href="#csv_reader-315"><span class="linenos">315</span></a><span class="sd"> Yields:</span>
</span><span id="csv_reader-316"><a href="#csv_reader-316"><span class="linenos">316</span></a><span class="sd"> A python csv reader.</span>
</span><span id="csv_reader-317"><a href="#csv_reader-317"><span class="linenos">317</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="csv_reader-318"><a href="#csv_reader-318"><span class="linenos">318</span></a> <span class="n">args</span> <span class="o">=</span> <span class="n">read_csv</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="csv_reader-319"><a href="#csv_reader-319"><span class="linenos">319</span></a> <span class="n">file</span> <span class="o">=</span> <span class="n">open_file</span><span class="p">(</span><span class="n">read_csv</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="csv_reader-320"><a href="#csv_reader-320"><span class="linenos">320</span></a>
</span><span id="csv_reader-321"><a href="#csv_reader-321"><span class="linenos">321</span></a> <span class="n">delimiter</span> <span class="o">=</span> <span class="s2">&quot;,&quot;</span>
</span><span id="csv_reader-322"><a href="#csv_reader-322"><span class="linenos">322</span></a> <span class="n">args</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">)</span> <span class="c1"># type: ignore</span>
</span><span id="csv_reader-323"><a href="#csv_reader-323"><span class="linenos">323</span></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
</span><span id="csv_reader-324"><a href="#csv_reader-324"><span class="linenos">324</span></a> <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="s2">&quot;delimiter&quot;</span><span class="p">:</span>
</span><span id="csv_reader-325"><a href="#csv_reader-325"><span class="linenos">325</span></a> <span class="n">delimiter</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="csv_reader-326"><a href="#csv_reader-326"><span class="linenos">326</span></a>
</span><span id="csv_reader-327"><a href="#csv_reader-327"><span class="linenos">327</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="csv_reader-328"><a href="#csv_reader-328"><span class="linenos">328</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">csv</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">csv_</span>
</span><span id="csv_reader-329"><a href="#csv_reader-329"><span class="linenos">329</span></a>
</span><span id="csv_reader-330"><a href="#csv_reader-330"><span class="linenos">330</span></a> <span class="k">yield</span> <span class="n">csv_</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="n">delimiter</span><span class="p">)</span>
</span><span id="csv_reader-331"><a href="#csv_reader-331"><span class="linenos">331</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="csv_reader-332"><a href="#csv_reader-332"><span class="linenos">332</span></a> <span class="n">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></pre></div>
<div class="docstring"><p>Returns a csv reader given the expression <code>READ_CSV(name, ['delimiter', '|', ...])</code>.</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>read_csv:</strong> A <code>ReadCSV</code> function call.</li>
</ul>
<h6 id="yields">Yields:</h6>
<blockquote>
<p>A python csv reader.</p>
</blockquote>
</div>
</section>
<section id="find_new_name">
<input id="find_new_name-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">find_new_name</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">taken</span><span class="p">:</span> <span class="n">Collection</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>, </span><span class="param"><span class="n">base</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="find_new_name-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#find_new_name"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="find_new_name-335"><a href="#find_new_name-335"><span class="linenos">335</span></a><span class="k">def</span><span class="w"> </span><span class="nf">find_new_name</span><span class="p">(</span><span class="n">taken</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">base</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="find_new_name-336"><a href="#find_new_name-336"><span class="linenos">336</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="find_new_name-337"><a href="#find_new_name-337"><span class="linenos">337</span></a><span class="sd"> Searches for a new name.</span>
</span><span id="find_new_name-338"><a href="#find_new_name-338"><span class="linenos">338</span></a>
</span><span id="find_new_name-339"><a href="#find_new_name-339"><span class="linenos">339</span></a><span class="sd"> Args:</span>
</span><span id="find_new_name-340"><a href="#find_new_name-340"><span class="linenos">340</span></a><span class="sd"> taken: A collection of taken names.</span>
</span><span id="find_new_name-341"><a href="#find_new_name-341"><span class="linenos">341</span></a><span class="sd"> base: Base name to alter.</span>
</span><span id="find_new_name-342"><a href="#find_new_name-342"><span class="linenos">342</span></a>
</span><span id="find_new_name-343"><a href="#find_new_name-343"><span class="linenos">343</span></a><span class="sd"> Returns:</span>
</span><span id="find_new_name-344"><a href="#find_new_name-344"><span class="linenos">344</span></a><span class="sd"> The new, available name.</span>
</span><span id="find_new_name-345"><a href="#find_new_name-345"><span class="linenos">345</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="find_new_name-346"><a href="#find_new_name-346"><span class="linenos">346</span></a> <span class="k">if</span> <span class="n">base</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">taken</span><span class="p">:</span>
</span><span id="find_new_name-347"><a href="#find_new_name-347"><span class="linenos">347</span></a> <span class="k">return</span> <span class="n">base</span>
</span><span id="find_new_name-348"><a href="#find_new_name-348"><span class="linenos">348</span></a>
</span><span id="find_new_name-349"><a href="#find_new_name-349"><span class="linenos">349</span></a> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span>
</span><span id="find_new_name-350"><a href="#find_new_name-350"><span class="linenos">350</span></a> <span class="n">new</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="find_new_name-351"><a href="#find_new_name-351"><span class="linenos">351</span></a> <span class="k">while</span> <span class="n">new</span> <span class="ow">in</span> <span class="n">taken</span><span class="p">:</span>
</span><span id="find_new_name-352"><a href="#find_new_name-352"><span class="linenos">352</span></a> <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="find_new_name-353"><a href="#find_new_name-353"><span class="linenos">353</span></a> <span class="n">new</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="find_new_name-354"><a href="#find_new_name-354"><span class="linenos">354</span></a>
</span><span id="find_new_name-355"><a href="#find_new_name-355"><span class="linenos">355</span></a> <span class="k">return</span> <span class="n">new</span>
</span></pre></div>
<div class="docstring"><p>Searches for a new name.</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>taken:</strong> A collection of taken names.</li>
<li><strong>base:</strong> Base name to alter.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>The new, available name.</p>
</blockquote>
</div>
</section>
<section id="is_int">
<input id="is_int-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">is_int</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">text</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="nb">bool</span>:</span></span>
<label class="view-source-button" for="is_int-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#is_int"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_int-358"><a href="#is_int-358"><span class="linenos">358</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_int</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="is_int-359"><a href="#is_int-359"><span class="linenos">359</span></a> <span class="k">return</span> <span class="n">is_type</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
</span></pre></div>
</section>
<section id="is_float">
<input id="is_float-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">is_float</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">text</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="nb">bool</span>:</span></span>
<label class="view-source-button" for="is_float-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#is_float"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_float-362"><a href="#is_float-362"><span class="linenos">362</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_float</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="is_float-363"><a href="#is_float-363"><span class="linenos">363</span></a> <span class="k">return</span> <span class="n">is_type</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="nb">float</span><span class="p">)</span>
</span></pre></div>
</section>
<section id="is_type">
<input id="is_type-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">is_type</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">text</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">target_type</span><span class="p">:</span> <span class="n">Type</span></span><span class="return-annotation">) -> <span class="nb">bool</span>:</span></span>
<label class="view-source-button" for="is_type-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#is_type"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_type-366"><a href="#is_type-366"><span class="linenos">366</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_type</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">target_type</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="is_type-367"><a href="#is_type-367"><span class="linenos">367</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="is_type-368"><a href="#is_type-368"><span class="linenos">368</span></a> <span class="n">target_type</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span><span id="is_type-369"><a href="#is_type-369"><span class="linenos">369</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="is_type-370"><a href="#is_type-370"><span class="linenos">370</span></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
</span><span id="is_type-371"><a href="#is_type-371"><span class="linenos">371</span></a> <span class="k">return</span> <span class="kc">False</span>
</span></pre></div>
</section>
<section id="name_sequence">
<input id="name_sequence-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">name_sequence</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">prefix</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="n">Callable</span><span class="p">[[],</span> <span class="nb">str</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="name_sequence-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#name_sequence"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="name_sequence-374"><a href="#name_sequence-374"><span class="linenos">374</span></a><span class="k">def</span><span class="w"> </span><span class="nf">name_sequence</span><span class="p">(</span><span class="n">prefix</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[],</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="name_sequence-375"><a href="#name_sequence-375"><span class="linenos">375</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a name generator given a prefix (e.g. a0, a1, a2, ... if the prefix is &quot;a&quot;).&quot;&quot;&quot;</span>
</span><span id="name_sequence-376"><a href="#name_sequence-376"><span class="linenos">376</span></a> <span class="n">sequence</span> <span class="o">=</span> <span class="n">count</span><span class="p">()</span>
</span><span id="name_sequence-377"><a href="#name_sequence-377"><span class="linenos">377</span></a> <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">prefix</span><span class="si">}{</span><span class="nb">next</span><span class="p">(</span><span class="n">sequence</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span></pre></div>
<div class="docstring"><p>Returns a name generator given a prefix (e.g. a0, a1, a2, ... if the prefix is "a").</p>
</div>
</section>
<section id="object_to_dict">
<input id="object_to_dict-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">object_to_dict</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">obj</span><span class="p">:</span> <span class="n">Any</span>, </span><span class="param"><span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n">Dict</span>:</span></span>
<label class="view-source-button" for="object_to_dict-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#object_to_dict"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="object_to_dict-380"><a href="#object_to_dict-380"><span class="linenos">380</span></a><span class="k">def</span><span class="w"> </span><span class="nf">object_to_dict</span><span class="p">(</span><span class="n">obj</span><span class="p">:</span> <span class="n">t</span><span class="o">.</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="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">:</span>
</span><span id="object_to_dict-381"><a href="#object_to_dict-381"><span class="linenos">381</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a dictionary created from an object&#39;s attributes.&quot;&quot;&quot;</span>
</span><span id="object_to_dict-382"><a href="#object_to_dict-382"><span class="linenos">382</span></a> <span class="k">return</span> <span class="p">{</span>
</span><span id="object_to_dict-383"><a href="#object_to_dict-383"><span class="linenos">383</span></a> <span class="o">**</span><span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">v</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="s2">&quot;copy&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="n">copy</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">()},</span>
</span><span id="object_to_dict-384"><a href="#object_to_dict-384"><span class="linenos">384</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="object_to_dict-385"><a href="#object_to_dict-385"><span class="linenos">385</span></a> <span class="p">}</span>
</span></pre></div>
<div class="docstring"><p>Returns a dictionary created from an object's attributes.</p>
</div>
</section>
<section id="split_num_words">
<input id="split_num_words-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">split_num_words</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">value</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">sep</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">min_num_words</span><span class="p">:</span> <span class="nb">int</span>,</span><span class="param"> <span class="n">fill_from_start</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>:</span></span>
<label class="view-source-button" for="split_num_words-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#split_num_words"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="split_num_words-388"><a href="#split_num_words-388"><span class="linenos">388</span></a><span class="k">def</span><span class="w"> </span><span class="nf">split_num_words</span><span class="p">(</span>
</span><span id="split_num_words-389"><a href="#split_num_words-389"><span class="linenos">389</span></a> <span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">sep</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">min_num_words</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">fill_from_start</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="split_num_words-390"><a href="#split_num_words-390"><span class="linenos">390</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
</span><span id="split_num_words-391"><a href="#split_num_words-391"><span class="linenos">391</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="split_num_words-392"><a href="#split_num_words-392"><span class="linenos">392</span></a><span class="sd"> Perform a split on a value and return N words as a result with `None` used for words that don&#39;t exist.</span>
</span><span id="split_num_words-393"><a href="#split_num_words-393"><span class="linenos">393</span></a>
</span><span id="split_num_words-394"><a href="#split_num_words-394"><span class="linenos">394</span></a><span class="sd"> Args:</span>
</span><span id="split_num_words-395"><a href="#split_num_words-395"><span class="linenos">395</span></a><span class="sd"> value: The value to be split.</span>
</span><span id="split_num_words-396"><a href="#split_num_words-396"><span class="linenos">396</span></a><span class="sd"> sep: The value to use to split on.</span>
</span><span id="split_num_words-397"><a href="#split_num_words-397"><span class="linenos">397</span></a><span class="sd"> min_num_words: The minimum number of words that are going to be in the result.</span>
</span><span id="split_num_words-398"><a href="#split_num_words-398"><span class="linenos">398</span></a><span class="sd"> fill_from_start: Indicates that if `None` values should be inserted at the start or end of the list.</span>
</span><span id="split_num_words-399"><a href="#split_num_words-399"><span class="linenos">399</span></a>
</span><span id="split_num_words-400"><a href="#split_num_words-400"><span class="linenos">400</span></a><span class="sd"> Examples:</span>
</span><span id="split_num_words-401"><a href="#split_num_words-401"><span class="linenos">401</span></a><span class="sd"> &gt;&gt;&gt; split_num_words(&quot;db.table&quot;, &quot;.&quot;, 3)</span>
</span><span id="split_num_words-402"><a href="#split_num_words-402"><span class="linenos">402</span></a><span class="sd"> [None, &#39;db&#39;, &#39;table&#39;]</span>
</span><span id="split_num_words-403"><a href="#split_num_words-403"><span class="linenos">403</span></a><span class="sd"> &gt;&gt;&gt; split_num_words(&quot;db.table&quot;, &quot;.&quot;, 3, fill_from_start=False)</span>
</span><span id="split_num_words-404"><a href="#split_num_words-404"><span class="linenos">404</span></a><span class="sd"> [&#39;db&#39;, &#39;table&#39;, None]</span>
</span><span id="split_num_words-405"><a href="#split_num_words-405"><span class="linenos">405</span></a><span class="sd"> &gt;&gt;&gt; split_num_words(&quot;db.table&quot;, &quot;.&quot;, 1)</span>
</span><span id="split_num_words-406"><a href="#split_num_words-406"><span class="linenos">406</span></a><span class="sd"> [&#39;db&#39;, &#39;table&#39;]</span>
</span><span id="split_num_words-407"><a href="#split_num_words-407"><span class="linenos">407</span></a>
</span><span id="split_num_words-408"><a href="#split_num_words-408"><span class="linenos">408</span></a><span class="sd"> Returns:</span>
</span><span id="split_num_words-409"><a href="#split_num_words-409"><span class="linenos">409</span></a><span class="sd"> The list of words returned by `split`, possibly augmented by a number of `None` values.</span>
</span><span id="split_num_words-410"><a href="#split_num_words-410"><span class="linenos">410</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="split_num_words-411"><a href="#split_num_words-411"><span class="linenos">411</span></a> <span class="n">words</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">sep</span><span class="p">)</span>
</span><span id="split_num_words-412"><a href="#split_num_words-412"><span class="linenos">412</span></a> <span class="k">if</span> <span class="n">fill_from_start</span><span class="p">:</span>
</span><span id="split_num_words-413"><a href="#split_num_words-413"><span class="linenos">413</span></a> <span class="k">return</span> <span class="p">[</span><span class="kc">None</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">min_num_words</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">words</span><span class="p">))</span> <span class="o">+</span> <span class="n">words</span>
</span><span id="split_num_words-414"><a href="#split_num_words-414"><span class="linenos">414</span></a> <span class="k">return</span> <span class="n">words</span> <span class="o">+</span> <span class="p">[</span><span class="kc">None</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">min_num_words</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">words</span><span class="p">))</span>
</span></pre></div>
<div class="docstring"><p>Perform a split on a value and return N words as a result with <code>None</code> used for words that don't exist.</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>value:</strong> The value to be split.</li>
<li><strong>sep:</strong> The value to use to split on.</li>
<li><strong>min_num_words:</strong> The minimum number of words that are going to be in the result.</li>
<li><strong>fill_from_start:</strong> Indicates that if <code>None</code> values should be inserted at the start or end of the list.</li>
</ul>
<h6 id="examples">Examples:</h6>
<blockquote>
<div class="pdoc-code codehilite">
<pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="n">split_num_words</span><span class="p">(</span><span class="s2">&quot;db.table&quot;</span><span class="p">,</span> <span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="go">[None, &#39;db&#39;, &#39;table&#39;]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">split_num_words</span><span class="p">(</span><span class="s2">&quot;db.table&quot;</span><span class="p">,</span> <span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">fill_from_start</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="go">[&#39;db&#39;, &#39;table&#39;, None]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">split_num_words</span><span class="p">(</span><span class="s2">&quot;db.table&quot;</span><span class="p">,</span> <span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="go">[&#39;db&#39;, &#39;table&#39;]</span>
</code></pre>
</div>
</blockquote>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>The list of words returned by <code>split</code>, possibly augmented by a number of <code>None</code> values.</p>
</blockquote>
</div>
</section>
<section id="is_iterable">
<input id="is_iterable-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">is_iterable</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">value</span><span class="p">:</span> <span class="n">Any</span></span><span class="return-annotation">) -> <span class="nb">bool</span>:</span></span>
<label class="view-source-button" for="is_iterable-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#is_iterable"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_iterable-417"><a href="#is_iterable-417"><span class="linenos">417</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_iterable</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="is_iterable-418"><a href="#is_iterable-418"><span class="linenos">418</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="is_iterable-419"><a href="#is_iterable-419"><span class="linenos">419</span></a><span class="sd"> Checks if the value is an iterable, excluding the types `str` and `bytes`.</span>
</span><span id="is_iterable-420"><a href="#is_iterable-420"><span class="linenos">420</span></a>
</span><span id="is_iterable-421"><a href="#is_iterable-421"><span class="linenos">421</span></a><span class="sd"> Examples:</span>
</span><span id="is_iterable-422"><a href="#is_iterable-422"><span class="linenos">422</span></a><span class="sd"> &gt;&gt;&gt; is_iterable([1,2])</span>
</span><span id="is_iterable-423"><a href="#is_iterable-423"><span class="linenos">423</span></a><span class="sd"> True</span>
</span><span id="is_iterable-424"><a href="#is_iterable-424"><span class="linenos">424</span></a><span class="sd"> &gt;&gt;&gt; is_iterable(&quot;test&quot;)</span>
</span><span id="is_iterable-425"><a href="#is_iterable-425"><span class="linenos">425</span></a><span class="sd"> False</span>
</span><span id="is_iterable-426"><a href="#is_iterable-426"><span class="linenos">426</span></a>
</span><span id="is_iterable-427"><a href="#is_iterable-427"><span class="linenos">427</span></a><span class="sd"> Args:</span>
</span><span id="is_iterable-428"><a href="#is_iterable-428"><span class="linenos">428</span></a><span class="sd"> value: The value to check if it is an iterable.</span>
</span><span id="is_iterable-429"><a href="#is_iterable-429"><span class="linenos">429</span></a>
</span><span id="is_iterable-430"><a href="#is_iterable-430"><span class="linenos">430</span></a><span class="sd"> Returns:</span>
</span><span id="is_iterable-431"><a href="#is_iterable-431"><span class="linenos">431</span></a><span class="sd"> A `bool` value indicating if it is an iterable.</span>
</span><span id="is_iterable-432"><a href="#is_iterable-432"><span class="linenos">432</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="is_iterable-433"><a href="#is_iterable-433"><span class="linenos">433</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot</span><span class="w"> </span><span class="kn">import</span> <span class="n">Expression</span>
</span><span id="is_iterable-434"><a href="#is_iterable-434"><span class="linenos">434</span></a>
</span><span id="is_iterable-435"><a href="#is_iterable-435"><span class="linenos">435</span></a> <span class="k">return</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="s2">&quot;__iter__&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">,</span> <span class="n">Expression</span><span class="p">))</span>
</span></pre></div>
<div class="docstring"><p>Checks if the value is an iterable, excluding the types <code>str</code> and <code>bytes</code>.</p>
<h6 id="examples">Examples:</h6>
<blockquote>
<div class="pdoc-code codehilite">
<pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="n">is_iterable</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">])</span>
<span class="go">True</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">is_iterable</span><span class="p">(</span><span class="s2">&quot;test&quot;</span><span class="p">)</span>
<span class="go">False</span>
</code></pre>
</div>
</blockquote>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>value:</strong> The value to check if it is an iterable.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>A <code>bool</code> value indicating if it is an iterable.</p>
</blockquote>
</div>
</section>
<section id="flatten">
<input id="flatten-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">flatten</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">values</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">Iterable</span><span class="p">[</span><span class="n">Any</span><span class="p">],</span> <span class="n">Any</span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n">Iterator</span><span class="p">[</span><span class="n">Any</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="flatten-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#flatten"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="flatten-438"><a href="#flatten-438"><span class="linenos">438</span></a><span class="k">def</span><span class="w"> </span><span class="nf">flatten</span><span class="p">(</span><span class="n">values</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Iterable</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Iterable</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Iterator</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Any</span><span class="p">]:</span>
</span><span id="flatten-439"><a href="#flatten-439"><span class="linenos">439</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="flatten-440"><a href="#flatten-440"><span class="linenos">440</span></a><span class="sd"> Flattens an iterable that can contain both iterable and non-iterable elements. Objects of</span>
</span><span id="flatten-441"><a href="#flatten-441"><span class="linenos">441</span></a><span class="sd"> type `str` and `bytes` are not regarded as iterables.</span>
</span><span id="flatten-442"><a href="#flatten-442"><span class="linenos">442</span></a>
</span><span id="flatten-443"><a href="#flatten-443"><span class="linenos">443</span></a><span class="sd"> Examples:</span>
</span><span id="flatten-444"><a href="#flatten-444"><span class="linenos">444</span></a><span class="sd"> &gt;&gt;&gt; list(flatten([[1, 2], 3, {4}, (5, &quot;bla&quot;)]))</span>
</span><span id="flatten-445"><a href="#flatten-445"><span class="linenos">445</span></a><span class="sd"> [1, 2, 3, 4, 5, &#39;bla&#39;]</span>
</span><span id="flatten-446"><a href="#flatten-446"><span class="linenos">446</span></a><span class="sd"> &gt;&gt;&gt; list(flatten([1, 2, 3]))</span>
</span><span id="flatten-447"><a href="#flatten-447"><span class="linenos">447</span></a><span class="sd"> [1, 2, 3]</span>
</span><span id="flatten-448"><a href="#flatten-448"><span class="linenos">448</span></a>
</span><span id="flatten-449"><a href="#flatten-449"><span class="linenos">449</span></a><span class="sd"> Args:</span>
</span><span id="flatten-450"><a href="#flatten-450"><span class="linenos">450</span></a><span class="sd"> values: The value to be flattened.</span>
</span><span id="flatten-451"><a href="#flatten-451"><span class="linenos">451</span></a>
</span><span id="flatten-452"><a href="#flatten-452"><span class="linenos">452</span></a><span class="sd"> Yields:</span>
</span><span id="flatten-453"><a href="#flatten-453"><span class="linenos">453</span></a><span class="sd"> Non-iterable elements in `values`.</span>
</span><span id="flatten-454"><a href="#flatten-454"><span class="linenos">454</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="flatten-455"><a href="#flatten-455"><span class="linenos">455</span></a> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
</span><span id="flatten-456"><a href="#flatten-456"><span class="linenos">456</span></a> <span class="k">if</span> <span class="n">is_iterable</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
</span><span id="flatten-457"><a href="#flatten-457"><span class="linenos">457</span></a> <span class="k">yield from</span> <span class="n">flatten</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span id="flatten-458"><a href="#flatten-458"><span class="linenos">458</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="flatten-459"><a href="#flatten-459"><span class="linenos">459</span></a> <span class="k">yield</span> <span class="n">value</span>
</span></pre></div>
<div class="docstring"><p>Flattens an iterable that can contain both iterable and non-iterable elements. Objects of
type <code>str</code> and <code>bytes</code> are not regarded as iterables.</p>
<h6 id="examples">Examples:</h6>
<blockquote>
<div class="pdoc-code codehilite">
<pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">flatten</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="mi">3</span><span class="p">,</span> <span class="p">{</span><span class="mi">4</span><span class="p">},</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="s2">&quot;bla&quot;</span><span class="p">)]))</span>
<span class="go">[1, 2, 3, 4, 5, &#39;bla&#39;]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">flatten</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]))</span>
<span class="go">[1, 2, 3]</span>
</code></pre>
</div>
</blockquote>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>values:</strong> The value to be flattened.</li>
</ul>
<h6 id="yields">Yields:</h6>
<blockquote>
<p>Non-iterable elements in <code>values</code>.</p>
</blockquote>
</div>
</section>
<section id="dict_depth">
<input id="dict_depth-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">dict_depth</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">d</span><span class="p">:</span> <span class="n">Dict</span></span><span class="return-annotation">) -> <span class="nb">int</span>:</span></span>
<label class="view-source-button" for="dict_depth-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#dict_depth"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="dict_depth-462"><a href="#dict_depth-462"><span class="linenos">462</span></a><span class="k">def</span><span class="w"> </span><span class="nf">dict_depth</span><span class="p">(</span><span class="n">d</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="dict_depth-463"><a href="#dict_depth-463"><span class="linenos">463</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="dict_depth-464"><a href="#dict_depth-464"><span class="linenos">464</span></a><span class="sd"> Get the nesting depth of a dictionary.</span>
</span><span id="dict_depth-465"><a href="#dict_depth-465"><span class="linenos">465</span></a>
</span><span id="dict_depth-466"><a href="#dict_depth-466"><span class="linenos">466</span></a><span class="sd"> Example:</span>
</span><span id="dict_depth-467"><a href="#dict_depth-467"><span class="linenos">467</span></a><span class="sd"> &gt;&gt;&gt; dict_depth(None)</span>
</span><span id="dict_depth-468"><a href="#dict_depth-468"><span class="linenos">468</span></a><span class="sd"> 0</span>
</span><span id="dict_depth-469"><a href="#dict_depth-469"><span class="linenos">469</span></a><span class="sd"> &gt;&gt;&gt; dict_depth({})</span>
</span><span id="dict_depth-470"><a href="#dict_depth-470"><span class="linenos">470</span></a><span class="sd"> 1</span>
</span><span id="dict_depth-471"><a href="#dict_depth-471"><span class="linenos">471</span></a><span class="sd"> &gt;&gt;&gt; dict_depth({&quot;a&quot;: &quot;b&quot;})</span>
</span><span id="dict_depth-472"><a href="#dict_depth-472"><span class="linenos">472</span></a><span class="sd"> 1</span>
</span><span id="dict_depth-473"><a href="#dict_depth-473"><span class="linenos">473</span></a><span class="sd"> &gt;&gt;&gt; dict_depth({&quot;a&quot;: {}})</span>
</span><span id="dict_depth-474"><a href="#dict_depth-474"><span class="linenos">474</span></a><span class="sd"> 2</span>
</span><span id="dict_depth-475"><a href="#dict_depth-475"><span class="linenos">475</span></a><span class="sd"> &gt;&gt;&gt; dict_depth({&quot;a&quot;: {&quot;b&quot;: {}}})</span>
</span><span id="dict_depth-476"><a href="#dict_depth-476"><span class="linenos">476</span></a><span class="sd"> 3</span>
</span><span id="dict_depth-477"><a href="#dict_depth-477"><span class="linenos">477</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="dict_depth-478"><a href="#dict_depth-478"><span class="linenos">478</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="dict_depth-479"><a href="#dict_depth-479"><span class="linenos">479</span></a> <span class="k">return</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">dict_depth</span><span class="p">(</span><span class="nb">next</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">values</span><span class="p">())))</span>
</span><span id="dict_depth-480"><a href="#dict_depth-480"><span class="linenos">480</span></a> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
</span><span id="dict_depth-481"><a href="#dict_depth-481"><span class="linenos">481</span></a> <span class="c1"># d doesn&#39;t have attribute &quot;values&quot;</span>
</span><span id="dict_depth-482"><a href="#dict_depth-482"><span class="linenos">482</span></a> <span class="k">return</span> <span class="mi">0</span>
</span><span id="dict_depth-483"><a href="#dict_depth-483"><span class="linenos">483</span></a> <span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span>
</span><span id="dict_depth-484"><a href="#dict_depth-484"><span class="linenos">484</span></a> <span class="c1"># d.values() returns an empty sequence</span>
</span><span id="dict_depth-485"><a href="#dict_depth-485"><span class="linenos">485</span></a> <span class="k">return</span> <span class="mi">1</span>
</span></pre></div>
<div class="docstring"><p>Get the nesting depth of a dictionary.</p>
<h6 id="example">Example:</h6>
<blockquote>
<div class="pdoc-code codehilite">
<pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="n">dict_depth</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="go">0</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">dict_depth</span><span class="p">({})</span>
<span class="go">1</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">dict_depth</span><span class="p">({</span><span class="s2">&quot;a&quot;</span><span class="p">:</span> <span class="s2">&quot;b&quot;</span><span class="p">})</span>
<span class="go">1</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">dict_depth</span><span class="p">({</span><span class="s2">&quot;a&quot;</span><span class="p">:</span> <span class="p">{}})</span>
<span class="go">2</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">dict_depth</span><span class="p">({</span><span class="s2">&quot;a&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;b&quot;</span><span class="p">:</span> <span class="p">{}}})</span>
<span class="go">3</span>
</code></pre>
</div>
</blockquote>
</div>
</section>
<section id="first">
<input id="first-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">first</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">it</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="o">~</span><span class="n">T</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="o">~</span><span class="n">T</span>:</span></span>
<label class="view-source-button" for="first-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#first"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="first-488"><a href="#first-488"><span class="linenos">488</span></a><span class="k">def</span><span class="w"> </span><span class="nf">first</span><span class="p">(</span><span class="n">it</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Iterable</span><span class="p">[</span><span class="n">T</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">T</span><span class="p">:</span>
</span><span id="first-489"><a href="#first-489"><span class="linenos">489</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the first element from an iterable (useful for sets).&quot;&quot;&quot;</span>
</span><span id="first-490"><a href="#first-490"><span class="linenos">490</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">it</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Returns the first element from an iterable (useful for sets).</p>
</div>
</section>
<section id="to_bool">
<input id="to_bool-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">to_bool</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">value</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bool</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bool</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="to_bool-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#to_bool"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="to_bool-493"><a href="#to_bool-493"><span class="linenos">493</span></a><span class="k">def</span><span class="w"> </span><span class="nf">to_bool</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="nb">bool</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="nb">bool</span><span class="p">]:</span>
</span><span id="to_bool-494"><a href="#to_bool-494"><span class="linenos">494</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span> <span class="ow">or</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="to_bool-495"><a href="#to_bool-495"><span class="linenos">495</span></a> <span class="k">return</span> <span class="n">value</span>
</span><span id="to_bool-496"><a href="#to_bool-496"><span class="linenos">496</span></a>
</span><span id="to_bool-497"><a href="#to_bool-497"><span class="linenos">497</span></a> <span class="c1"># Coerce the value to boolean if it matches to the truthy/falsy values below</span>
</span><span id="to_bool-498"><a href="#to_bool-498"><span class="linenos">498</span></a> <span class="n">value_lower</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
</span><span id="to_bool-499"><a href="#to_bool-499"><span class="linenos">499</span></a> <span class="k">if</span> <span class="n">value_lower</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;true&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">):</span>
</span><span id="to_bool-500"><a href="#to_bool-500"><span class="linenos">500</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="to_bool-501"><a href="#to_bool-501"><span class="linenos">501</span></a> <span class="k">if</span> <span class="n">value_lower</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;false&quot;</span><span class="p">,</span> <span class="s2">&quot;0&quot;</span><span class="p">):</span>
</span><span id="to_bool-502"><a href="#to_bool-502"><span class="linenos">502</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="to_bool-503"><a href="#to_bool-503"><span class="linenos">503</span></a>
</span><span id="to_bool-504"><a href="#to_bool-504"><span class="linenos">504</span></a> <span class="k">return</span> <span class="n">value</span>
</span></pre></div>
</section>
<section id="merge_ranges">
<input id="merge_ranges-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">merge_ranges</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">ranges</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="o">~</span><span class="n">A</span><span class="p">,</span> <span class="o">~</span><span class="n">A</span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="o">~</span><span class="n">A</span><span class="p">,</span> <span class="o">~</span><span class="n">A</span><span class="p">]]</span>:</span></span>
<label class="view-source-button" for="merge_ranges-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#merge_ranges"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="merge_ranges-507"><a href="#merge_ranges-507"><span class="linenos">507</span></a><span class="k">def</span><span class="w"> </span><span class="nf">merge_ranges</span><span class="p">(</span><span class="n">ranges</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="n">A</span><span class="p">,</span> <span class="n">A</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="n">A</span><span class="p">,</span> <span class="n">A</span><span class="p">]]:</span>
</span><span id="merge_ranges-508"><a href="#merge_ranges-508"><span class="linenos">508</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="merge_ranges-509"><a href="#merge_ranges-509"><span class="linenos">509</span></a><span class="sd"> Merges a sequence of ranges, represented as tuples (low, high) whose values</span>
</span><span id="merge_ranges-510"><a href="#merge_ranges-510"><span class="linenos">510</span></a><span class="sd"> belong to some totally-ordered set.</span>
</span><span id="merge_ranges-511"><a href="#merge_ranges-511"><span class="linenos">511</span></a>
</span><span id="merge_ranges-512"><a href="#merge_ranges-512"><span class="linenos">512</span></a><span class="sd"> Example:</span>
</span><span id="merge_ranges-513"><a href="#merge_ranges-513"><span class="linenos">513</span></a><span class="sd"> &gt;&gt;&gt; merge_ranges([(1, 3), (2, 6)])</span>
</span><span id="merge_ranges-514"><a href="#merge_ranges-514"><span class="linenos">514</span></a><span class="sd"> [(1, 6)]</span>
</span><span id="merge_ranges-515"><a href="#merge_ranges-515"><span class="linenos">515</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="merge_ranges-516"><a href="#merge_ranges-516"><span class="linenos">516</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">ranges</span><span class="p">:</span>
</span><span id="merge_ranges-517"><a href="#merge_ranges-517"><span class="linenos">517</span></a> <span class="k">return</span> <span class="p">[]</span>
</span><span id="merge_ranges-518"><a href="#merge_ranges-518"><span class="linenos">518</span></a>
</span><span id="merge_ranges-519"><a href="#merge_ranges-519"><span class="linenos">519</span></a> <span class="n">ranges</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">ranges</span><span class="p">)</span>
</span><span id="merge_ranges-520"><a href="#merge_ranges-520"><span class="linenos">520</span></a>
</span><span id="merge_ranges-521"><a href="#merge_ranges-521"><span class="linenos">521</span></a> <span class="n">merged</span> <span class="o">=</span> <span class="p">[</span><span class="n">ranges</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
</span><span id="merge_ranges-522"><a href="#merge_ranges-522"><span class="linenos">522</span></a>
</span><span id="merge_ranges-523"><a href="#merge_ranges-523"><span class="linenos">523</span></a> <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span> <span class="ow">in</span> <span class="n">ranges</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
</span><span id="merge_ranges-524"><a href="#merge_ranges-524"><span class="linenos">524</span></a> <span class="n">last_start</span><span class="p">,</span> <span class="n">last_end</span> <span class="o">=</span> <span class="n">merged</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span><span id="merge_ranges-525"><a href="#merge_ranges-525"><span class="linenos">525</span></a>
</span><span id="merge_ranges-526"><a href="#merge_ranges-526"><span class="linenos">526</span></a> <span class="k">if</span> <span class="n">start</span> <span class="o">&lt;=</span> <span class="n">last_end</span><span class="p">:</span>
</span><span id="merge_ranges-527"><a href="#merge_ranges-527"><span class="linenos">527</span></a> <span class="n">merged</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">last_start</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="n">last_end</span><span class="p">,</span> <span class="n">end</span><span class="p">))</span>
</span><span id="merge_ranges-528"><a href="#merge_ranges-528"><span class="linenos">528</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="merge_ranges-529"><a href="#merge_ranges-529"><span class="linenos">529</span></a> <span class="n">merged</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">))</span>
</span><span id="merge_ranges-530"><a href="#merge_ranges-530"><span class="linenos">530</span></a>
</span><span id="merge_ranges-531"><a href="#merge_ranges-531"><span class="linenos">531</span></a> <span class="k">return</span> <span class="n">merged</span>
</span></pre></div>
<div class="docstring"><p>Merges a sequence of ranges, represented as tuples (low, high) whose values
belong to some totally-ordered set.</p>
<h6 id="example">Example:</h6>
<blockquote>
<div class="pdoc-code codehilite">
<pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="n">merge_ranges</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">6</span><span class="p">)])</span>
<span class="go">[(1, 6)]</span>
</code></pre>
</div>
</blockquote>
</div>
</section>
<section id="is_iso_date">
<input id="is_iso_date-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">is_iso_date</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">text</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="nb">bool</span>:</span></span>
<label class="view-source-button" for="is_iso_date-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#is_iso_date"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_iso_date-534"><a href="#is_iso_date-534"><span class="linenos">534</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_iso_date</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="is_iso_date-535"><a href="#is_iso_date-535"><span class="linenos">535</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="is_iso_date-536"><a href="#is_iso_date-536"><span class="linenos">536</span></a> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span><span id="is_iso_date-537"><a href="#is_iso_date-537"><span class="linenos">537</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="is_iso_date-538"><a href="#is_iso_date-538"><span class="linenos">538</span></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
</span><span id="is_iso_date-539"><a href="#is_iso_date-539"><span class="linenos">539</span></a> <span class="k">return</span> <span class="kc">False</span>
</span></pre></div>
</section>
<section id="is_iso_datetime">
<input id="is_iso_datetime-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">is_iso_datetime</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">text</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="nb">bool</span>:</span></span>
<label class="view-source-button" for="is_iso_datetime-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#is_iso_datetime"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_iso_datetime-542"><a href="#is_iso_datetime-542"><span class="linenos">542</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_iso_datetime</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="is_iso_datetime-543"><a href="#is_iso_datetime-543"><span class="linenos">543</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="is_iso_datetime-544"><a href="#is_iso_datetime-544"><span class="linenos">544</span></a> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span><span id="is_iso_datetime-545"><a href="#is_iso_datetime-545"><span class="linenos">545</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="is_iso_datetime-546"><a href="#is_iso_datetime-546"><span class="linenos">546</span></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
</span><span id="is_iso_datetime-547"><a href="#is_iso_datetime-547"><span class="linenos">547</span></a> <span class="k">return</span> <span class="kc">False</span>
</span></pre></div>
</section>
<section id="DATE_UNITS">
<div class="attr variable">
<span class="name">DATE_UNITS</span> =
<span class="default_value">{&#39;year_month&#39;, &#39;year&#39;, &#39;day&#39;, &#39;month&#39;, &#39;quarter&#39;, &#39;week&#39;}</span>
</div>
<a class="headerlink" href="#DATE_UNITS"></a>
</section>
<section id="is_date_unit">
<input id="is_date_unit-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">is_date_unit</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">expression</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">]</span></span><span class="return-annotation">) -> <span class="nb">bool</span>:</span></span>
<label class="view-source-button" for="is_date_unit-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#is_date_unit"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_date_unit-554"><a href="#is_date_unit-554"><span class="linenos">554</span></a><span class="k">def</span><span class="w"> </span><span class="nf">is_date_unit</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="is_date_unit-555"><a href="#is_date_unit-555"><span class="linenos">555</span></a> <span class="k">return</span> <span class="n">expression</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="n">DATE_UNITS</span>
</span></pre></div>
</section>
<section id="SingleValuedMapping">
<input id="SingleValuedMapping-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr class">
<span class="def">class</span>
<span class="name">SingleValuedMapping</span><wbr>(<span class="base">typing.Mapping[~K, ~V]</span>):
<label class="view-source-button" for="SingleValuedMapping-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#SingleValuedMapping"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="SingleValuedMapping-562"><a href="#SingleValuedMapping-562"><span class="linenos">562</span></a><span class="k">class</span><span class="w"> </span><span class="nc">SingleValuedMapping</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">Mapping</span><span class="p">[</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="p">]):</span>
</span><span id="SingleValuedMapping-563"><a href="#SingleValuedMapping-563"><span class="linenos">563</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="SingleValuedMapping-564"><a href="#SingleValuedMapping-564"><span class="linenos">564</span></a><span class="sd"> Mapping where all keys return the same value.</span>
</span><span id="SingleValuedMapping-565"><a href="#SingleValuedMapping-565"><span class="linenos">565</span></a>
</span><span id="SingleValuedMapping-566"><a href="#SingleValuedMapping-566"><span class="linenos">566</span></a><span class="sd"> This rigamarole is meant to avoid copying keys, which was originally intended</span>
</span><span id="SingleValuedMapping-567"><a href="#SingleValuedMapping-567"><span class="linenos">567</span></a><span class="sd"> as an optimization while qualifying columns for tables with lots of columns.</span>
</span><span id="SingleValuedMapping-568"><a href="#SingleValuedMapping-568"><span class="linenos">568</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="SingleValuedMapping-569"><a href="#SingleValuedMapping-569"><span class="linenos">569</span></a>
</span><span id="SingleValuedMapping-570"><a href="#SingleValuedMapping-570"><span class="linenos">570</span></a> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keys</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">K</span><span class="p">],</span> <span class="n">value</span><span class="p">:</span> <span class="n">V</span><span class="p">):</span>
</span><span id="SingleValuedMapping-571"><a href="#SingleValuedMapping-571"><span class="linenos">571</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_keys</span> <span class="o">=</span> <span class="n">keys</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">keys</span><span class="p">,</span> <span class="n">Set</span><span class="p">)</span> <span class="k">else</span> <span class="nb">set</span><span class="p">(</span><span class="n">keys</span><span class="p">)</span>
</span><span id="SingleValuedMapping-572"><a href="#SingleValuedMapping-572"><span class="linenos">572</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span> <span class="o">=</span> <span class="n">value</span>
</span><span id="SingleValuedMapping-573"><a href="#SingleValuedMapping-573"><span class="linenos">573</span></a>
</span><span id="SingleValuedMapping-574"><a href="#SingleValuedMapping-574"><span class="linenos">574</span></a> <span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="n">K</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">V</span><span class="p">:</span>
</span><span id="SingleValuedMapping-575"><a href="#SingleValuedMapping-575"><span class="linenos">575</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_keys</span><span class="p">:</span>
</span><span id="SingleValuedMapping-576"><a href="#SingleValuedMapping-576"><span class="linenos">576</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span>
</span><span id="SingleValuedMapping-577"><a href="#SingleValuedMapping-577"><span class="linenos">577</span></a> <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
</span><span id="SingleValuedMapping-578"><a href="#SingleValuedMapping-578"><span class="linenos">578</span></a>
</span><span id="SingleValuedMapping-579"><a href="#SingleValuedMapping-579"><span class="linenos">579</span></a> <span class="k">def</span><span class="w"> </span><span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="SingleValuedMapping-580"><a href="#SingleValuedMapping-580"><span class="linenos">580</span></a> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_keys</span><span class="p">)</span>
</span><span id="SingleValuedMapping-581"><a href="#SingleValuedMapping-581"><span class="linenos">581</span></a>
</span><span id="SingleValuedMapping-582"><a href="#SingleValuedMapping-582"><span class="linenos">582</span></a> <span class="k">def</span><span class="w"> </span><span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Iterator</span><span class="p">[</span><span class="n">K</span><span class="p">]:</span>
</span><span id="SingleValuedMapping-583"><a href="#SingleValuedMapping-583"><span class="linenos">583</span></a> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_keys</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Mapping where all keys return the same value.</p>
<p>This rigamarole is meant to avoid copying keys, which was originally intended
as an optimization while qualifying columns for tables with lots of columns.</p>
</div>
<div id="SingleValuedMapping.__init__" class="classattr">
<input id="SingleValuedMapping.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="name">SingleValuedMapping</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">keys</span><span class="p">:</span> <span class="n">Collection</span><span class="p">[</span><span class="o">~</span><span class="n">K</span><span class="p">]</span>, </span><span class="param"><span class="n">value</span><span class="p">:</span> <span class="o">~</span><span class="n">V</span></span>)</span>
<label class="view-source-button" for="SingleValuedMapping.__init__-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#SingleValuedMapping.__init__"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="SingleValuedMapping.__init__-570"><a href="#SingleValuedMapping.__init__-570"><span class="linenos">570</span></a> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keys</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">K</span><span class="p">],</span> <span class="n">value</span><span class="p">:</span> <span class="n">V</span><span class="p">):</span>
</span><span id="SingleValuedMapping.__init__-571"><a href="#SingleValuedMapping.__init__-571"><span class="linenos">571</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_keys</span> <span class="o">=</span> <span class="n">keys</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">keys</span><span class="p">,</span> <span class="n">Set</span><span class="p">)</span> <span class="k">else</span> <span class="nb">set</span><span class="p">(</span><span class="n">keys</span><span class="p">)</span>
</span><span id="SingleValuedMapping.__init__-572"><a href="#SingleValuedMapping.__init__-572"><span class="linenos">572</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span> <span class="o">=</span> <span class="n">value</span>
</span></pre></div>
</div>
</section>
</main>
<script>
function escapeHTML(html) {
return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
}
const originalContent = document.querySelector("main.pdoc");
let currentContent = originalContent;
function setContent(innerHTML) {
let elem;
if (innerHTML) {
elem = document.createElement("main");
elem.classList.add("pdoc");
elem.innerHTML = innerHTML;
} else {
elem = originalContent;
}
if (currentContent !== elem) {
currentContent.replaceWith(elem);
currentContent = elem;
}
}
function getSearchTerm() {
return (new URL(window.location)).searchParams.get("search");
}
const searchBox = document.querySelector(".pdoc input[type=search]");
searchBox.addEventListener("input", function () {
let url = new URL(window.location);
if (searchBox.value.trim()) {
url.hash = "";
url.searchParams.set("search", searchBox.value);
} else {
url.searchParams.delete("search");
}
history.replaceState("", "", url.toString());
onInput();
});
window.addEventListener("popstate", onInput);
let search, searchErr;
async function initialize() {
try {
search = await new Promise((resolve, reject) => {
const script = document.createElement("script");
script.type = "text/javascript";
script.async = true;
script.onload = () => resolve(window.pdocSearch);
script.onerror = (e) => reject(e);
script.src = "../search.js";
document.getElementsByTagName("head")[0].appendChild(script);
});
} catch (e) {
console.error("Cannot fetch pdoc search index");
searchErr = "Cannot fetch search index.";
}
onInput();
document.querySelector("nav.pdoc").addEventListener("click", e => {
if (e.target.hash) {
searchBox.value = "";
searchBox.dispatchEvent(new Event("input"));
}
});
}
function onInput() {
setContent((() => {
const term = getSearchTerm();
if (!term) {
return null
}
if (searchErr) {
return `<h3>Error: ${searchErr}</h3>`
}
if (!search) {
return "<h3>Searching...</h3>"
}
window.scrollTo({top: 0, left: 0, behavior: 'auto'});
const results = search(term);
let html;
if (results.length === 0) {
html = `No search results for '${escapeHTML(term)}'.`
} else {
html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
}
for (let result of results.slice(0, 10)) {
let doc = result.doc;
let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
if (doc.qualname) {
url += `#${doc.qualname}`;
}
let heading;
switch (result.doc.kind) {
case "function":
if (doc.fullname.endsWith(".__init__")) {
heading = `<span class="name">${doc.fullname.replace(/\.__init__$/, "")}</span>${doc.signature}`;
} else {
heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span>${doc.signature}`;
}
break;
case "class":
heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
if (doc.bases)
heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
heading += `:`;
break;
case "variable":
heading = `<span class="name">${doc.fullname}</span>`;
if (doc.annotation)
heading += `<span class="annotation">${doc.annotation}</span>`;
if (doc.default_value)
heading += `<span class="default_value"> = ${doc.default_value}</span>`;
break;
default:
heading = `<span class="name">${doc.fullname}</span>`;
break;
}
html += `
<section class="search-result">
<a href="${url}" class="attr ${doc.kind}">${heading}</a>
<div class="docstring">${doc.doc}</div>
</section>
`;
}
return html;
})());
}
if (getSearchTerm()) {
initialize();
searchBox.value = getSearchTerm();
onInput();
} else {
searchBox.addEventListener("focus", initialize, {once: true});
}
searchBox.addEventListener("keydown", e => {
if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
let focused = currentContent.querySelector(".search-result.focused");
if (!focused) {
currentContent.querySelector(".search-result").classList.add("focused");
} else if (
e.key === "ArrowDown"
&& focused.nextElementSibling
&& focused.nextElementSibling.classList.contains("search-result")
) {
focused.classList.remove("focused");
focused.nextElementSibling.classList.add("focused");
focused.nextElementSibling.scrollIntoView({
behavior: "smooth",
block: "nearest",
inline: "nearest"
});
} else if (
e.key === "ArrowUp"
&& focused.previousElementSibling
&& focused.previousElementSibling.classList.contains("search-result")
) {
focused.classList.remove("focused");
focused.previousElementSibling.classList.add("focused");
focused.previousElementSibling.scrollIntoView({
behavior: "smooth",
block: "nearest",
inline: "nearest"
});
} else if (
e.key === "Enter"
) {
focused.querySelector("a").click();
}
}
});
</script></body>
</html>