Files
windmill/python-client/docs/wmill/client.html
Diego Imbert 2ee00b3c7b fix: S3 SDK nits + Presigned S3 Public URL function (#7342)
* export S3Object + URI / Record in TS SDK

* stash getS3SignedPublicUrls

* getPresignedS3PublicUrls in TS client

* update python client for get_presigned_s3_public_urls
2025-12-11 13:26:30 +00:00

8057 lines
1.3 MiB

<!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 16.0.0"/>
<title>wmill.client 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:27px;vertical-align:bottom;width:50px;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="../wmill.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;wmill</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="#logger">logger</a>
</li>
<li>
<a class="variable" href="#JobStatus">JobStatus</a>
</li>
<li>
<a class="class" href="#Windmill">Windmill</a>
<ul class="memberlist">
<li>
<a class="function" href="#Windmill.__init__">Windmill</a>
</li>
<li>
<a class="variable" href="#Windmill.base_url">base_url</a>
</li>
<li>
<a class="variable" href="#Windmill.token">token</a>
</li>
<li>
<a class="variable" href="#Windmill.headers">headers</a>
</li>
<li>
<a class="variable" href="#Windmill.verify">verify</a>
</li>
<li>
<a class="variable" href="#Windmill.client">client</a>
</li>
<li>
<a class="variable" href="#Windmill.workspace">workspace</a>
</li>
<li>
<a class="variable" href="#Windmill.path">path</a>
</li>
<li>
<a class="variable" href="#Windmill.mocked_api">mocked_api</a>
</li>
<li>
<a class="function" href="#Windmill.get_mocked_api">get_mocked_api</a>
</li>
<li>
<a class="function" href="#Windmill.get_client">get_client</a>
</li>
<li>
<a class="function" href="#Windmill.get">get</a>
</li>
<li>
<a class="function" href="#Windmill.post">post</a>
</li>
<li>
<a class="function" href="#Windmill.create_token">create_token</a>
</li>
<li>
<a class="function" href="#Windmill.run_script_async">run_script_async</a>
</li>
<li>
<a class="function" href="#Windmill.run_script_by_path_async">run_script_by_path_async</a>
</li>
<li>
<a class="function" href="#Windmill.run_script_by_hash_async">run_script_by_hash_async</a>
</li>
<li>
<a class="function" href="#Windmill.run_flow_async">run_flow_async</a>
</li>
<li>
<a class="function" href="#Windmill.run_script">run_script</a>
</li>
<li>
<a class="function" href="#Windmill.run_script_by_path">run_script_by_path</a>
</li>
<li>
<a class="function" href="#Windmill.run_script_by_hash">run_script_by_hash</a>
</li>
<li>
<a class="function" href="#Windmill.run_inline_script_preview">run_inline_script_preview</a>
</li>
<li>
<a class="function" href="#Windmill.wait_job">wait_job</a>
</li>
<li>
<a class="function" href="#Windmill.cancel_job">cancel_job</a>
</li>
<li>
<a class="function" href="#Windmill.cancel_running">cancel_running</a>
</li>
<li>
<a class="function" href="#Windmill.get_job">get_job</a>
</li>
<li>
<a class="function" href="#Windmill.get_root_job_id">get_root_job_id</a>
</li>
<li>
<a class="function" href="#Windmill.get_id_token">get_id_token</a>
</li>
<li>
<a class="function" href="#Windmill.get_job_status">get_job_status</a>
</li>
<li>
<a class="function" href="#Windmill.get_result">get_result</a>
</li>
<li>
<a class="function" href="#Windmill.get_variable">get_variable</a>
</li>
<li>
<a class="function" href="#Windmill.set_variable">set_variable</a>
</li>
<li>
<a class="function" href="#Windmill.get_resource">get_resource</a>
</li>
<li>
<a class="function" href="#Windmill.set_resource">set_resource</a>
</li>
<li>
<a class="function" href="#Windmill.list_resources">list_resources</a>
</li>
<li>
<a class="function" href="#Windmill.set_state">set_state</a>
</li>
<li>
<a class="function" href="#Windmill.set_progress">set_progress</a>
</li>
<li>
<a class="function" href="#Windmill.get_progress">get_progress</a>
</li>
<li>
<a class="function" href="#Windmill.set_flow_user_state">set_flow_user_state</a>
</li>
<li>
<a class="function" href="#Windmill.get_flow_user_state">get_flow_user_state</a>
</li>
<li>
<a class="variable" href="#Windmill.version">version</a>
</li>
<li>
<a class="function" href="#Windmill.get_duckdb_connection_settings">get_duckdb_connection_settings</a>
</li>
<li>
<a class="function" href="#Windmill.get_polars_connection_settings">get_polars_connection_settings</a>
</li>
<li>
<a class="function" href="#Windmill.get_boto3_connection_settings">get_boto3_connection_settings</a>
</li>
<li>
<a class="function" href="#Windmill.load_s3_file">load_s3_file</a>
</li>
<li>
<a class="function" href="#Windmill.load_s3_file_reader">load_s3_file_reader</a>
</li>
<li>
<a class="function" href="#Windmill.write_s3_file">write_s3_file</a>
</li>
<li>
<a class="function" href="#Windmill.sign_s3_objects">sign_s3_objects</a>
</li>
<li>
<a class="function" href="#Windmill.sign_s3_object">sign_s3_object</a>
</li>
<li>
<a class="function" href="#Windmill.get_presigned_s3_public_urls">get_presigned_s3_public_urls</a>
</li>
<li>
<a class="function" href="#Windmill.get_presigned_s3_public_url">get_presigned_s3_public_url</a>
</li>
<li>
<a class="function" href="#Windmill.whoami">whoami</a>
</li>
<li>
<a class="variable" href="#Windmill.user">user</a>
</li>
<li>
<a class="variable" href="#Windmill.state_path">state_path</a>
</li>
<li>
<a class="variable" href="#Windmill.state">state</a>
</li>
<li>
<a class="function" href="#Windmill.set_shared_state_pickle">set_shared_state_pickle</a>
</li>
<li>
<a class="function" href="#Windmill.get_shared_state_pickle">get_shared_state_pickle</a>
</li>
<li>
<a class="function" href="#Windmill.set_shared_state">set_shared_state</a>
</li>
<li>
<a class="function" href="#Windmill.get_shared_state">get_shared_state</a>
</li>
<li>
<a class="function" href="#Windmill.get_resume_urls">get_resume_urls</a>
</li>
<li>
<a class="function" href="#Windmill.request_interactive_slack_approval">request_interactive_slack_approval</a>
</li>
<li>
<a class="function" href="#Windmill.username_to_email">username_to_email</a>
</li>
<li>
<a class="function" href="#Windmill.send_teams_message">send_teams_message</a>
</li>
<li>
<a class="function" href="#Windmill.datatable">datatable</a>
</li>
<li>
<a class="function" href="#Windmill.ducklake">ducklake</a>
</li>
</ul>
</li>
<li>
<a class="function" href="#init_global_client">init_global_client</a>
</li>
<li>
<a class="function" href="#deprecate">deprecate</a>
</li>
<li>
<a class="function" href="#get_workspace">get_workspace</a>
</li>
<li>
<a class="function" href="#get_root_job_id">get_root_job_id</a>
</li>
<li>
<a class="function" href="#get_version">get_version</a>
</li>
<li>
<a class="function" href="#run_script_async">run_script_async</a>
</li>
<li>
<a class="function" href="#run_flow_async">run_flow_async</a>
</li>
<li>
<a class="function" href="#run_script_sync">run_script_sync</a>
</li>
<li>
<a class="function" href="#run_script_by_path_async">run_script_by_path_async</a>
</li>
<li>
<a class="function" href="#run_script_by_hash_async">run_script_by_hash_async</a>
</li>
<li>
<a class="function" href="#run_script_by_path_sync">run_script_by_path_sync</a>
</li>
<li>
<a class="function" href="#get_id_token">get_id_token</a>
</li>
<li>
<a class="function" href="#get_job_status">get_job_status</a>
</li>
<li>
<a class="function" href="#get_result">get_result</a>
</li>
<li>
<a class="function" href="#duckdb_connection_settings">duckdb_connection_settings</a>
</li>
<li>
<a class="function" href="#polars_connection_settings">polars_connection_settings</a>
</li>
<li>
<a class="function" href="#boto3_connection_settings">boto3_connection_settings</a>
</li>
<li>
<a class="function" href="#load_s3_file">load_s3_file</a>
</li>
<li>
<a class="function" href="#load_s3_file_reader">load_s3_file_reader</a>
</li>
<li>
<a class="function" href="#write_s3_file">write_s3_file</a>
</li>
<li>
<a class="function" href="#sign_s3_objects">sign_s3_objects</a>
</li>
<li>
<a class="function" href="#sign_s3_object">sign_s3_object</a>
</li>
<li>
<a class="function" href="#get_presigned_s3_public_urls">get_presigned_s3_public_urls</a>
</li>
<li>
<a class="function" href="#get_presigned_s3_public_url">get_presigned_s3_public_url</a>
</li>
<li>
<a class="function" href="#whoami">whoami</a>
</li>
<li>
<a class="function" href="#get_state">get_state</a>
</li>
<li>
<a class="function" href="#get_resource">get_resource</a>
</li>
<li>
<a class="function" href="#set_resource">set_resource</a>
</li>
<li>
<a class="function" href="#list_resources">list_resources</a>
</li>
<li>
<a class="function" href="#set_state">set_state</a>
</li>
<li>
<a class="function" href="#set_progress">set_progress</a>
</li>
<li>
<a class="function" href="#get_progress">get_progress</a>
</li>
<li>
<a class="function" href="#set_shared_state_pickle">set_shared_state_pickle</a>
</li>
<li>
<a class="function" href="#get_shared_state_pickle">get_shared_state_pickle</a>
</li>
<li>
<a class="function" href="#set_shared_state">set_shared_state</a>
</li>
<li>
<a class="function" href="#get_shared_state">get_shared_state</a>
</li>
<li>
<a class="function" href="#get_variable">get_variable</a>
</li>
<li>
<a class="function" href="#set_variable">set_variable</a>
</li>
<li>
<a class="function" href="#get_flow_user_state">get_flow_user_state</a>
</li>
<li>
<a class="function" href="#set_flow_user_state">set_flow_user_state</a>
</li>
<li>
<a class="function" href="#get_state_path">get_state_path</a>
</li>
<li>
<a class="function" href="#get_resume_urls">get_resume_urls</a>
</li>
<li>
<a class="function" href="#request_interactive_slack_approval">request_interactive_slack_approval</a>
</li>
<li>
<a class="function" href="#send_teams_message">send_teams_message</a>
</li>
<li>
<a class="function" href="#cancel_job">cancel_job</a>
</li>
<li>
<a class="function" href="#cancel_running">cancel_running</a>
</li>
<li>
<a class="function" href="#run_script">run_script</a>
</li>
<li>
<a class="function" href="#run_script_by_path">run_script_by_path</a>
</li>
<li>
<a class="function" href="#run_script_by_hash">run_script_by_hash</a>
</li>
<li>
<a class="function" href="#run_inline_script_preview">run_inline_script_preview</a>
</li>
<li>
<a class="function" href="#username_to_email">username_to_email</a>
</li>
<li>
<a class="function" href="#datatable">datatable</a>
</li>
<li>
<a class="function" href="#ducklake">ducklake</a>
</li>
<li>
<a class="function" href="#task">task</a>
</li>
<li>
<a class="function" href="#parse_resource_syntax">parse_resource_syntax</a>
</li>
<li>
<a class="function" href="#parse_s3_object">parse_s3_object</a>
</li>
<li>
<a class="function" href="#parse_variable_syntax">parse_variable_syntax</a>
</li>
<li>
<a class="function" href="#append_to_result_stream">append_to_result_stream</a>
</li>
<li>
<a class="function" href="#stream_result">stream_result</a>
</li>
<li>
<a class="class" href="#DataTableClient">DataTableClient</a>
<ul class="memberlist">
<li>
<a class="function" href="#DataTableClient.__init__">DataTableClient</a>
</li>
<li>
<a class="variable" href="#DataTableClient.client">client</a>
</li>
<li>
<a class="variable" href="#DataTableClient.name">name</a>
</li>
<li>
<a class="function" href="#DataTableClient.query">query</a>
</li>
</ul>
</li>
<li>
<a class="class" href="#DucklakeClient">DucklakeClient</a>
<ul class="memberlist">
<li>
<a class="function" href="#DucklakeClient.__init__">DucklakeClient</a>
</li>
<li>
<a class="variable" href="#DucklakeClient.client">client</a>
</li>
<li>
<a class="variable" href="#DucklakeClient.name">name</a>
</li>
<li>
<a class="function" href="#DucklakeClient.query">query</a>
</li>
</ul>
</li>
<li>
<a class="class" href="#SqlQuery">SqlQuery</a>
<ul class="memberlist">
<li>
<a class="function" href="#SqlQuery.__init__">SqlQuery</a>
</li>
<li>
<a class="variable" href="#SqlQuery.sql">sql</a>
</li>
<li>
<a class="variable" href="#SqlQuery.fetch_fn">fetch_fn</a>
</li>
<li>
<a class="function" href="#SqlQuery.fetch">fetch</a>
</li>
<li>
<a class="function" href="#SqlQuery.fetch_one">fetch_one</a>
</li>
</ul>
</li>
<li>
<a class="function" href="#infer_sql_type">infer_sql_type</a>
</li>
</ul>
<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%22160%22%20viewBox%3D%220%200%20150%2080%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M132.316%2048.886c.276-4.679%202.342-6.698%204.409-7.982s4.27-1.165%206.751-1.055c1.586.07%203.044.156%204.222-.482%201.142-.619%202.026-1.932%202.162-3.739.268-3.576-1.929-5.368-5.006-5.551s-7.599.524-10.517%201.606c-4.455%201.652-8.588%206.606-9.552%208.992s-2.342%206.193-1.745%2010.873%202.664%209.221%205.878%2011.79%205.878%203.808%2010.103%204.312%203.444.229%206.062.229%205.006-2.202%204.914-4.909-2.296-5.001-4.501-4.863-3.077.505-5.281.229-7.715-2.064-7.899-9.451z%22%20fill%3D%22%23198754%22/%3E%3Ccircle%20cx%3D%22101.504%22%20cy%3D%2248.943%22%20r%3D%2214.208%22%20fill%3D%22none%22%20stroke%3D%22%23198754%22%20stroke-width%3D%229.354%22/%3E%3Cpath%20d%3D%22M87.81.002c-3.637.065-5.001.454-7.014%201.232s-3.443%201.363-6.3%204.282c-1.723%201.76-3.148%205.019-3.776%207.329-.413%201.521-.316%202.63-.316%202.63l-.195%2034.612c.065%205.774-6.755%208.305-9.612%208.37s-9.678-1.038-9.743-9.408%207.128-9.521%208.362-9.521c1.413-.13%202.526-.021%203.718-.016%202.071.009%204.157-.778%204.092-4.671s-4.157-4.736-4.157-4.736c-6.3-.843-11.43%202.206-11.43%202.206S40.917%2038.15%2041.372%2049.634%2051.568%2068.19%2061.311%2068.125s18.316-7.007%2018.445-17.193l.13-22.772c.046-2.291%202.683-3.644%204.476-4.203.745-.232%201.694-.274%201.694-.274l10.457-.13s4.871-.324%207.729-3.114%204.352-6.294%204.352-6.294.974-3.049.13-4.606-.195-1.233-2.792-3.309-8.573-4.477-8.573-4.477S91.447-.063%2087.81.002zM0%2047.169l.065%2028.417S0%2080.127%204.481%2079.997s5.072-3.866%205.049-4.152l-.113-28.482s1.624-7.656%209.937-7.721%2010.002%206.942%2010.002%208.499-.909%2010.51-9.093%2010.51c-.948%200-2.99-.567-4.145-.272-3.919%201-3.194%204.554-3.194%204.554s.065%205.061%207.404%204.996%2018.575-6.034%2018.575-19.074S26.953%2030.04%2019.549%2029.91%201.234%2035.296%200%2047.169z%22%20fill%3D%22%23198754%22/%3E%3Cg%20transform%3D%22matrix%28.325601%200%200%20.325256%20-10.32669%20-45.802786%29%22%3E%3Ccircle%20cx%3D%22297.554%22%20cy%3D%22172.286%22%20r%3D%2216.5%22%20fill%3D%22%23fff%22/%3E%3Cellipse%20cx%3D%22297.709%22%20cy%3D%22172.642%22%20rx%3D%2211.071%22%20ry%3D%2210.871%22%20fill%3D%22%23105a48%22/%3E%3Ccircle%20cx%3D%22304.104%22%20cy%3D%22167.667%22%20r%3D%224.5%22%20fill%3D%22%23fff%22/%3E%3C/g%3E%3Cpath%20d%3D%22M94.661%2017.032l.893-1.476s.99.714%201.916.925%201.575.114%202.955.114l14.565-.162c1.283-.032%203.085-.762%203.02-3.293s-.373-3.503-.373-3.503l1.283-.487s.52.503.877%201.573.309%201.995.292%202.66-.227%201.541-.227%201.541%201.564-.308%202.359-1.038.823-.779%201.489-1.508.812-.86.812-.86.552-.13.877.26.341.957.065%201.46-1.672%202.206-3.247%203.066-2.76%201.427-3.929%201.768-3.848.73-7.063.714l-10.944-.114s-2.143-.081-3.02-.373-2.241-.973-2.598-1.265z%22%20fill%3D%22%23d36d49%22/%3E%3Cg%20fill%3D%22%23105a48%22%3E%3Cellipse%20cx%3D%2293.052%22%20cy%3D%2243.567%22%20rx%3D%22.869%22%20ry%3D%221.014%22%20transform%3D%22rotate%28341.022%29%22/%3E%3Cellipse%20cx%3D%22104.3%22%20cy%3D%22-16.184%22%20rx%3D%22.865%22%20ry%3D%221.009%22%20transform%3D%22rotate%2814.786%29%22/%3E%3C/g%3E%3C/svg%3E"/>
</a>
</div>
</nav>
<main class="pdoc">
<section class="module-info">
<h1 class="modulename">
<a href="./../wmill.html">wmill</a><wbr>.client </h1>
<input id="mod-client-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-source-button" for="mod-client-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">atexit</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">datetime</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">dt</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">functools</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">io</span><span class="w"> </span><span class="kn">import</span> <span class="n">BufferedReader</span><span class="p">,</span> <span class="n">BytesIO</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">logging</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">os</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">random</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">time</span>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">json</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">json</span><span class="w"> </span><span class="kn">import</span> <span class="n">JSONDecodeError</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">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Union</span><span class="p">,</span> <span class="n">Literal</span><span class="p">,</span> <span class="n">Optional</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">httpx</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a>
</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">.s3_reader</span><span class="w"> </span><span class="kn">import</span> <span class="n">S3BufferedReader</span><span class="p">,</span> <span class="n">bytes_generator</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">.s3_types</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a> <span class="n">Boto3ConnectionSettings</span><span class="p">,</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a> <span class="n">DuckDbConnectionSettings</span><span class="p">,</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a> <span class="n">PolarsConnectionSettings</span><span class="p">,</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a> <span class="n">S3Object</span><span class="p">,</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><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 class="n">_client</span><span class="p">:</span> <span class="s2">&quot;Windmill | None&quot;</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</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;windmill_client&quot;</span><span class="p">)</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a><span class="n">JobStatus</span> <span class="o">=</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;RUNNING&quot;</span><span class="p">,</span> <span class="s2">&quot;WAITING&quot;</span><span class="p">,</span> <span class="s2">&quot;COMPLETED&quot;</span><span class="p">]</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><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a><span class="k">class</span><span class="w"> </span><span class="nc">Windmill</span><span class="p">:</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</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">base_url</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">token</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">workspace</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">verify</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="n">base</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="n">base_url</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;BASE_INTERNAL_URL&quot;</span><span class="p">)</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_BASE_URL&quot;</span><span class="p">)</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="p">)</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_url</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">/api&quot;</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="n">token</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_TOKEN&quot;</span><span class="p">)</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="s2">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="s2">&quot;Authorization&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Bearer </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="p">}</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">verify</span> <span class="o">=</span> <span class="n">verify</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_client</span><span class="p">()</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">workspace</span> <span class="o">=</span> <span class="n">workspace</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_WORKSPACE&quot;</span><span class="p">)</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_PATH&quot;</span><span class="p">)</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_mocked_api</span><span class="p">()</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="p">,</span> <span class="p">(</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="sa">f</span><span class="s2">&quot;workspace required as an argument or as WM_WORKSPACE environment variable&quot;</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="p">)</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_mocked_api</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span><span class="p">]:</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="n">mocked_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_MOCKED_API_FILE&quot;</span><span class="p">)</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">mocked_path</span><span class="p">:</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Using mocked API from </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">mocked_path</span><span class="p">)</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="n">mocked_api</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;variables&quot;</span><span class="p">:</span> <span class="p">{},</span> <span class="s2">&quot;resources&quot;</span><span class="p">:</span> <span class="p">{}}</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">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">mocked_path</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="n">incoming_mocked_api</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="n">mocked_api</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">mocked_api</span><span class="p">,</span> <span class="o">**</span><span class="n">incoming_mocked_api</span><span class="p">}</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="s2">&quot;Error parsing mocked API file at path </span><span class="si">%s</span><span class="s2"> Using empty mocked API.&quot;</span><span class="p">,</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="n">mocked_path</span><span class="p">,</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="p">)</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="k">return</span> <span class="n">mocked_api</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_client</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span><span class="p">:</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="k">return</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="n">base_url</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">base_url</span><span class="p">,</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="n">headers</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">,</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="n">verify</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">verify</span><span class="p">,</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="p">)</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">True</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">httpx</span><span class="o">.</span><span class="n">Response</span><span class="p">:</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="n">resp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/</span><span class="si">{</span><span class="n">endpoint</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="k">if</span> <span class="n">raise_for_status</span><span class="p">:</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="n">resp</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="k">except</span> <span class="n">httpx</span><span class="o">.</span><span class="n">HTTPStatusError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="n">error</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">error</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="n">resp</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">True</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">httpx</span><span class="o">.</span><span class="n">Response</span><span class="p">:</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="n">resp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/</span><span class="si">{</span><span class="n">endpoint</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="k">if</span> <span class="n">raise_for_status</span><span class="p">:</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos"> 100</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos"> 101</span></a> <span class="n">resp</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos"> 102</span></a> <span class="k">except</span> <span class="n">httpx</span><span class="o">.</span><span class="n">HTTPStatusError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos"> 103</span></a> <span class="n">error</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos"> 104</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos"> 105</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos"> 106</span></a> <span class="k">return</span> <span class="n">resp</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 class="k">def</span><span class="w"> </span><span class="nf">create_token</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">duration</span><span class="o">=</span><span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos"> 109</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="s2">&quot;/users/tokens/create&quot;</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos"> 110</span></a> <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos"> 111</span></a> <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;refresh </span><span class="si">{</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos"> 112</span></a> <span class="s2">&quot;expiration&quot;</span><span class="p">:</span> <span class="p">(</span><span class="n">dt</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="o">+</span> <span class="n">duration</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%Y-%m-</span><span class="si">%d</span><span class="s2">T%H:%M:%SZ&quot;</span><span class="p">),</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos"> 113</span></a> <span class="p">}</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos"> 114</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">)</span><span class="o">.</span><span class="n">text</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="k">def</span><span class="w"> </span><span class="nf">run_script_async</span><span class="p">(</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos"> 117</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos"> 118</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos"> 119</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</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="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos"> 121</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos"> 122</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos"> 123</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a script job and return its job id.</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos"> 124</span></a><span class="sd"> </span>
</span><span id="L-125"><a href="#L-125"><span class="linenos"> 125</span></a><span class="sd"> .. deprecated:: Use run_script_by_path_async or run_script_by_hash_async instead.</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos"> 126</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos"> 127</span></a> <span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos"> 128</span></a> <span class="s2">&quot;run_script_async is deprecated. Use run_script_by_path_async or run_script_by_hash_async instead.&quot;</span><span class="p">,</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos"> 129</span></a> <span class="p">)</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos"> 130</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="p">(</span><span class="n">path</span> <span class="ow">and</span> <span class="n">hash_</span><span class="p">),</span> <span class="s2">&quot;path and hash_ are mutually exclusive&quot;</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos"> 131</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_async_internal</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">)</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos"> 132</span></a>
</span><span id="L-133"><a href="#L-133"><span class="linenos"> 133</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_run_script_async_internal</span><span class="p">(</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos"> 134</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos"> 135</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos"> 136</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos"> 137</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos"> 138</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos"> 139</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos"> 140</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Internal helper for running scripts asynchronously.&quot;&quot;&quot;</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos"> 141</span></a> <span class="n">args</span> <span class="o">=</span> <span class="n">args</span> <span class="ow">or</span> <span class="p">{}</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos"> 142</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;scheduled_in_secs&quot;</span><span class="p">:</span> <span class="n">scheduled_in_secs</span><span class="p">}</span> <span class="k">if</span> <span class="n">scheduled_in_secs</span> <span class="k">else</span> <span class="p">{}</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos"> 143</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">):</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos"> 144</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;parent_job&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos"> 145</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_ROOT_FLOW_JOB_ID&quot;</span><span class="p">):</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos"> 146</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;root_job&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_ROOT_FLOW_JOB_ID&quot;</span><span class="p">)</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="k">if</span> <span class="n">path</span><span class="p">:</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos"> 149</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/run/p/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos"> 150</span></a> <span class="k">elif</span> <span class="n">hash_</span><span class="p">:</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos"> 151</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/run/h/</span><span class="si">{</span><span class="n">hash_</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos"> 152</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos"> 153</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;path or hash_ must be provided&quot;</span><span class="p">)</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos"> 154</span></a>
</span><span id="L-155"><a href="#L-155"><span class="linenos"> 155</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos"> 156</span></a>
</span><span id="L-157"><a href="#L-157"><span class="linenos"> 157</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_path_async</span><span class="p">(</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos"> 158</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos"> 159</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos"> 160</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos"> 161</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos"> 162</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos"> 163</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a script job by path and return its job id.&quot;&quot;&quot;</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos"> 164</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_async_internal</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">)</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos"> 165</span></a>
</span><span id="L-166"><a href="#L-166"><span class="linenos"> 166</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_hash_async</span><span class="p">(</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos"> 167</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos"> 168</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos"> 169</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</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="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos"> 171</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos"> 172</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a script job by hash and return its job id.&quot;&quot;&quot;</span>
</span><span id="L-173"><a href="#L-173"><span class="linenos"> 173</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_async_internal</span><span class="p">(</span><span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">)</span>
</span><span id="L-174"><a href="#L-174"><span class="linenos"> 174</span></a>
</span><span id="L-175"><a href="#L-175"><span class="linenos"> 175</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_flow_async</span><span class="p">(</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos"> 176</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-177"><a href="#L-177"><span class="linenos"> 177</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos"> 178</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos"> 179</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos"> 180</span></a> <span class="c1"># can only be set to false if this the job will be fully await and not concurrent with any other job</span>
</span><span id="L-181"><a href="#L-181"><span class="linenos"> 181</span></a> <span class="c1"># as otherwise the child flow and its own child will store their state in the parent job which will</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos"> 182</span></a> <span class="c1"># lead to incorrectness and failures</span>
</span><span id="L-183"><a href="#L-183"><span class="linenos"> 183</span></a> <span class="n">do_not_track_in_parent</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-184"><a href="#L-184"><span class="linenos"> 184</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-185"><a href="#L-185"><span class="linenos"> 185</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a flow job and return its job id.&quot;&quot;&quot;</span>
</span><span id="L-186"><a href="#L-186"><span class="linenos"> 186</span></a> <span class="n">args</span> <span class="o">=</span> <span class="n">args</span> <span class="ow">or</span> <span class="p">{}</span>
</span><span id="L-187"><a href="#L-187"><span class="linenos"> 187</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;scheduled_in_secs&quot;</span><span class="p">:</span> <span class="n">scheduled_in_secs</span><span class="p">}</span> <span class="k">if</span> <span class="n">scheduled_in_secs</span> <span class="k">else</span> <span class="p">{}</span>
</span><span id="L-188"><a href="#L-188"><span class="linenos"> 188</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">do_not_track_in_parent</span><span class="p">:</span>
</span><span id="L-189"><a href="#L-189"><span class="linenos"> 189</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">):</span>
</span><span id="L-190"><a href="#L-190"><span class="linenos"> 190</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;parent_job&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="L-191"><a href="#L-191"><span class="linenos"> 191</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_ROOT_FLOW_JOB_ID&quot;</span><span class="p">):</span>
</span><span id="L-192"><a href="#L-192"><span class="linenos"> 192</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;root_job&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_ROOT_FLOW_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="L-193"><a href="#L-193"><span class="linenos"> 193</span></a> <span class="k">if</span> <span class="n">path</span><span class="p">:</span>
</span><span id="L-194"><a href="#L-194"><span class="linenos"> 194</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/run/f/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-195"><a href="#L-195"><span class="linenos"> 195</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-196"><a href="#L-196"><span class="linenos"> 196</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;path must be provided&quot;</span><span class="p">)</span>
</span><span id="L-197"><a href="#L-197"><span class="linenos"> 197</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="L-198"><a href="#L-198"><span class="linenos"> 198</span></a>
</span><span id="L-199"><a href="#L-199"><span class="linenos"> 199</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script</span><span class="p">(</span>
</span><span id="L-200"><a href="#L-200"><span class="linenos"> 200</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-201"><a href="#L-201"><span class="linenos"> 201</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-202"><a href="#L-202"><span class="linenos"> 202</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-203"><a href="#L-203"><span class="linenos"> 203</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-204"><a href="#L-204"><span class="linenos"> 204</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-205"><a href="#L-205"><span class="linenos"> 205</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-206"><a href="#L-206"><span class="linenos"> 206</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-207"><a href="#L-207"><span class="linenos"> 207</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-208"><a href="#L-208"><span class="linenos"> 208</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-209"><a href="#L-209"><span class="linenos"> 209</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script synchronously and return its result.</span>
</span><span id="L-210"><a href="#L-210"><span class="linenos"> 210</span></a><span class="sd"> </span>
</span><span id="L-211"><a href="#L-211"><span class="linenos"> 211</span></a><span class="sd"> .. deprecated:: Use run_script_by_path or run_script_by_hash instead.</span>
</span><span id="L-212"><a href="#L-212"><span class="linenos"> 212</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-213"><a href="#L-213"><span class="linenos"> 213</span></a> <span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
</span><span id="L-214"><a href="#L-214"><span class="linenos"> 214</span></a> <span class="s2">&quot;run_script is deprecated. Use run_script_by_path or run_script_by_hash instead.&quot;</span><span class="p">,</span>
</span><span id="L-215"><a href="#L-215"><span class="linenos"> 215</span></a> <span class="p">)</span>
</span><span id="L-216"><a href="#L-216"><span class="linenos"> 216</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="p">(</span><span class="n">path</span> <span class="ow">and</span> <span class="n">hash_</span><span class="p">),</span> <span class="s2">&quot;path and hash_ are mutually exclusive&quot;</span>
</span><span id="L-217"><a href="#L-217"><span class="linenos"> 217</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_internal</span><span class="p">(</span>
</span><span id="L-218"><a href="#L-218"><span class="linenos"> 218</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="L-219"><a href="#L-219"><span class="linenos"> 219</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span>
</span><span id="L-220"><a href="#L-220"><span class="linenos"> 220</span></a> <span class="p">)</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="k">def</span><span class="w"> </span><span class="nf">_run_script_internal</span><span class="p">(</span>
</span><span id="L-223"><a href="#L-223"><span class="linenos"> 223</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-224"><a href="#L-224"><span class="linenos"> 224</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-225"><a href="#L-225"><span class="linenos"> 225</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-226"><a href="#L-226"><span class="linenos"> 226</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-227"><a href="#L-227"><span class="linenos"> 227</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-228"><a href="#L-228"><span class="linenos"> 228</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-229"><a href="#L-229"><span class="linenos"> 229</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-230"><a href="#L-230"><span class="linenos"> 230</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-231"><a href="#L-231"><span class="linenos"> 231</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-232"><a href="#L-232"><span class="linenos"> 232</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Internal helper for running scripts synchronously.&quot;&quot;&quot;</span>
</span><span id="L-233"><a href="#L-233"><span class="linenos"> 233</span></a> <span class="n">args</span> <span class="o">=</span> <span class="n">args</span> <span class="ow">or</span> <span class="p">{}</span>
</span><span id="L-234"><a href="#L-234"><span class="linenos"> 234</span></a>
</span><span id="L-235"><a href="#L-235"><span class="linenos"> 235</span></a> <span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
</span><span id="L-236"><a href="#L-236"><span class="linenos"> 236</span></a> <span class="k">if</span> <span class="n">path</span><span class="p">:</span>
</span><span id="L-237"><a href="#L-237"><span class="linenos"> 237</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;running `</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">` synchronously with </span><span class="si">{</span><span class="n">args</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-238"><a href="#L-238"><span class="linenos"> 238</span></a> <span class="k">elif</span> <span class="n">hash_</span><span class="p">:</span>
</span><span id="L-239"><a href="#L-239"><span class="linenos"> 239</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;running script with hash `</span><span class="si">{</span><span class="n">hash_</span><span class="si">}</span><span class="s2">` synchronously with </span><span class="si">{</span><span class="n">args</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-240"><a href="#L-240"><span class="linenos"> 240</span></a>
</span><span id="L-241"><a href="#L-241"><span class="linenos"> 241</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">timeout</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span><span class="p">):</span>
</span><span id="L-242"><a href="#L-242"><span class="linenos"> 242</span></a> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="o">.</span><span class="n">total_seconds</span><span class="p">()</span>
</span><span id="L-243"><a href="#L-243"><span class="linenos"> 243</span></a>
</span><span id="L-244"><a href="#L-244"><span class="linenos"> 244</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_async_internal</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">)</span>
</span><span id="L-245"><a href="#L-245"><span class="linenos"> 245</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wait_job</span><span class="p">(</span>
</span><span id="L-246"><a href="#L-246"><span class="linenos"> 246</span></a> <span class="n">job_id</span><span class="p">,</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">verbose</span><span class="p">,</span> <span class="n">cleanup</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span>
</span><span id="L-247"><a href="#L-247"><span class="linenos"> 247</span></a> <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">def</span><span class="w"> </span><span class="nf">run_script_by_path</span><span class="p">(</span>
</span><span id="L-250"><a href="#L-250"><span class="linenos"> 250</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-251"><a href="#L-251"><span class="linenos"> 251</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-252"><a href="#L-252"><span class="linenos"> 252</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-253"><a href="#L-253"><span class="linenos"> 253</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-254"><a href="#L-254"><span class="linenos"> 254</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-255"><a href="#L-255"><span class="linenos"> 255</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-256"><a href="#L-256"><span class="linenos"> 256</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-257"><a href="#L-257"><span class="linenos"> 257</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-258"><a href="#L-258"><span class="linenos"> 258</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script by path synchronously and return its result.&quot;&quot;&quot;</span>
</span><span id="L-259"><a href="#L-259"><span class="linenos"> 259</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_internal</span><span class="p">(</span>
</span><span id="L-260"><a href="#L-260"><span class="linenos"> 260</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="L-261"><a href="#L-261"><span class="linenos"> 261</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span>
</span><span id="L-262"><a href="#L-262"><span class="linenos"> 262</span></a> <span class="p">)</span>
</span><span id="L-263"><a href="#L-263"><span class="linenos"> 263</span></a>
</span><span id="L-264"><a href="#L-264"><span class="linenos"> 264</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_hash</span><span class="p">(</span>
</span><span id="L-265"><a href="#L-265"><span class="linenos"> 265</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-266"><a href="#L-266"><span class="linenos"> 266</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-267"><a href="#L-267"><span class="linenos"> 267</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-268"><a href="#L-268"><span class="linenos"> 268</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-269"><a href="#L-269"><span class="linenos"> 269</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-270"><a href="#L-270"><span class="linenos"> 270</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-271"><a href="#L-271"><span class="linenos"> 271</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-272"><a href="#L-272"><span class="linenos"> 272</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-273"><a href="#L-273"><span class="linenos"> 273</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script by hash synchronously and return its result.&quot;&quot;&quot;</span>
</span><span id="L-274"><a href="#L-274"><span class="linenos"> 274</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_internal</span><span class="p">(</span>
</span><span id="L-275"><a href="#L-275"><span class="linenos"> 275</span></a> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="L-276"><a href="#L-276"><span class="linenos"> 276</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span>
</span><span id="L-277"><a href="#L-277"><span class="linenos"> 277</span></a> <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">def</span><span class="w"> </span><span class="nf">run_inline_script_preview</span><span class="p">(</span>
</span><span id="L-280"><a href="#L-280"><span class="linenos"> 280</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-281"><a href="#L-281"><span class="linenos"> 281</span></a> <span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-282"><a href="#L-282"><span class="linenos"> 282</span></a> <span class="n">language</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-283"><a href="#L-283"><span class="linenos"> 283</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-284"><a href="#L-284"><span class="linenos"> 284</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-285"><a href="#L-285"><span class="linenos"> 285</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run a script on the current worker without creating a job&quot;&quot;&quot;</span>
</span><span id="L-286"><a href="#L-286"><span class="linenos"> 286</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/run_inline/preview&quot;</span>
</span><span id="L-287"><a href="#L-287"><span class="linenos"> 287</span></a> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-288"><a href="#L-288"><span class="linenos"> 288</span></a> <span class="s2">&quot;content&quot;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
</span><span id="L-289"><a href="#L-289"><span class="linenos"> 289</span></a> <span class="s2">&quot;language&quot;</span><span class="p">:</span> <span class="n">language</span><span class="p">,</span>
</span><span id="L-290"><a href="#L-290"><span class="linenos"> 290</span></a> <span class="s2">&quot;args&quot;</span><span class="p">:</span> <span class="n">args</span> <span class="ow">or</span> <span class="p">{},</span>
</span><span id="L-291"><a href="#L-291"><span class="linenos"> 291</span></a> <span class="p">}</span>
</span><span id="L-292"><a href="#L-292"><span class="linenos"> 292</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">body</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="L-293"><a href="#L-293"><span class="linenos"> 293</span></a>
</span><span id="L-294"><a href="#L-294"><span class="linenos"> 294</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">wait_job</span><span class="p">(</span>
</span><span id="L-295"><a href="#L-295"><span class="linenos"> 295</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-296"><a href="#L-296"><span class="linenos"> 296</span></a> <span class="n">job_id</span><span class="p">,</span>
</span><span id="L-297"><a href="#L-297"><span class="linenos"> 297</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-298"><a href="#L-298"><span class="linenos"> 298</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-299"><a href="#L-299"><span class="linenos"> 299</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-300"><a href="#L-300"><span class="linenos"> 300</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-301"><a href="#L-301"><span class="linenos"> 301</span></a> <span class="p">):</span>
</span><span id="L-302"><a href="#L-302"><span class="linenos"> 302</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">cancel_job</span><span class="p">():</span>
</span><span id="L-303"><a href="#L-303"><span class="linenos"> 303</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;cancelling job: </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-304"><a href="#L-304"><span class="linenos"> 304</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-305"><a href="#L-305"><span class="linenos"> 305</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-306"><a href="#L-306"><span class="linenos"> 306</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="s2">&quot;parent script cancelled&quot;</span><span class="p">},</span>
</span><span id="L-307"><a href="#L-307"><span class="linenos"> 307</span></a> <span class="p">)</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="L-308"><a href="#L-308"><span class="linenos"> 308</span></a>
</span><span id="L-309"><a href="#L-309"><span class="linenos"> 309</span></a> <span class="k">if</span> <span class="n">cleanup</span><span class="p">:</span>
</span><span id="L-310"><a href="#L-310"><span class="linenos"> 310</span></a> <span class="n">atexit</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">cancel_job</span><span class="p">)</span>
</span><span id="L-311"><a href="#L-311"><span class="linenos"> 311</span></a>
</span><span id="L-312"><a href="#L-312"><span class="linenos"> 312</span></a> <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</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="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">timeout</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span><span class="p">):</span>
</span><span id="L-315"><a href="#L-315"><span class="linenos"> 315</span></a> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="o">.</span><span class="n">total_seconds</span><span class="p">()</span>
</span><span id="L-316"><a href="#L-316"><span class="linenos"> 316</span></a>
</span><span id="L-317"><a href="#L-317"><span class="linenos"> 317</span></a> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-318"><a href="#L-318"><span class="linenos"> 318</span></a> <span class="n">result_res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-319"><a href="#L-319"><span class="linenos"> 319</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/completed/get_result_maybe/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="kc">True</span>
</span><span id="L-320"><a href="#L-320"><span class="linenos"> 320</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-321"><a href="#L-321"><span class="linenos"> 321</span></a>
</span><span id="L-322"><a href="#L-322"><span class="linenos"> 322</span></a> <span class="n">started</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;started&quot;</span><span class="p">]</span>
</span><span id="L-323"><a href="#L-323"><span class="linenos"> 323</span></a> <span class="n">completed</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;completed&quot;</span><span class="p">]</span>
</span><span id="L-324"><a href="#L-324"><span class="linenos"> 324</span></a> <span class="n">success</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;success&quot;</span><span class="p">]</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">if</span> <span class="ow">not</span> <span class="n">started</span> <span class="ow">and</span> <span class="n">verbose</span><span class="p">:</span>
</span><span id="L-327"><a href="#L-327"><span class="linenos"> 327</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2"> has not started yet&quot;</span><span class="p">)</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">if</span> <span class="n">cleanup</span> <span class="ow">and</span> <span class="n">completed</span><span class="p">:</span>
</span><span id="L-330"><a href="#L-330"><span class="linenos"> 330</span></a> <span class="n">atexit</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="n">cancel_job</span><span class="p">)</span>
</span><span id="L-331"><a href="#L-331"><span class="linenos"> 331</span></a>
</span><span id="L-332"><a href="#L-332"><span class="linenos"> 332</span></a> <span class="k">if</span> <span class="n">completed</span><span class="p">:</span>
</span><span id="L-333"><a href="#L-333"><span class="linenos"> 333</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;result&quot;</span><span class="p">]</span>
</span><span id="L-334"><a href="#L-334"><span class="linenos"> 334</span></a> <span class="k">if</span> <span class="n">success</span><span class="p">:</span>
</span><span id="L-335"><a href="#L-335"><span class="linenos"> 335</span></a> <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">assert_result_is_not_none</span><span class="p">:</span>
</span><span id="L-336"><a href="#L-336"><span class="linenos"> 336</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Result was none&quot;</span><span class="p">)</span>
</span><span id="L-337"><a href="#L-337"><span class="linenos"> 337</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="L-338"><a href="#L-338"><span class="linenos"> 338</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-339"><a href="#L-339"><span class="linenos"> 339</span></a> <span class="n">error</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s2">&quot;error&quot;</span><span class="p">]</span>
</span><span id="L-340"><a href="#L-340"><span class="linenos"> 340</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2"> was not successful: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">error</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</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="k">if</span> <span class="n">timeout</span> <span class="ow">and</span> <span class="p">((</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">timeout</span><span class="p">):</span>
</span><span id="L-343"><a href="#L-343"><span class="linenos"> 343</span></a> <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;reached timeout&quot;</span>
</span><span id="L-344"><a href="#L-344"><span class="linenos"> 344</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</span><span id="L-345"><a href="#L-345"><span class="linenos"> 345</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-346"><a href="#L-346"><span class="linenos"> 346</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-347"><a href="#L-347"><span class="linenos"> 347</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="n">msg</span><span class="p">},</span>
</span><span id="L-348"><a href="#L-348"><span class="linenos"> 348</span></a> <span class="p">)</span>
</span><span id="L-349"><a href="#L-349"><span class="linenos"> 349</span></a> <span class="k">raise</span> <span class="ne">TimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</span><span id="L-350"><a href="#L-350"><span class="linenos"> 350</span></a> <span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
</span><span id="L-351"><a href="#L-351"><span class="linenos"> 351</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;sleeping 0.5 seconds for </span><span class="si">{</span><span class="n">job_id</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-352"><a href="#L-352"><span class="linenos"> 352</span></a>
</span><span id="L-353"><a href="#L-353"><span class="linenos"> 353</span></a> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
</span><span id="L-354"><a href="#L-354"><span class="linenos"> 354</span></a>
</span><span id="L-355"><a href="#L-355"><span class="linenos"> 355</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">cancel_job</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-356"><a href="#L-356"><span class="linenos"> 356</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cancel a specific job by ID.</span>
</span><span id="L-357"><a href="#L-357"><span class="linenos"> 357</span></a>
</span><span id="L-358"><a href="#L-358"><span class="linenos"> 358</span></a><span class="sd"> Args:</span>
</span><span id="L-359"><a href="#L-359"><span class="linenos"> 359</span></a><span class="sd"> job_id: UUID of the job to cancel</span>
</span><span id="L-360"><a href="#L-360"><span class="linenos"> 360</span></a><span class="sd"> reason: Optional reason for cancellation</span>
</span><span id="L-361"><a href="#L-361"><span class="linenos"> 361</span></a>
</span><span id="L-362"><a href="#L-362"><span class="linenos"> 362</span></a><span class="sd"> Returns:</span>
</span><span id="L-363"><a href="#L-363"><span class="linenos"> 363</span></a><span class="sd"> Response message from the cancel endpoint</span>
</span><span id="L-364"><a href="#L-364"><span class="linenos"> 364</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-365"><a href="#L-365"><span class="linenos"> 365</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;cancelling job: </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-366"><a href="#L-366"><span class="linenos"> 366</span></a>
</span><span id="L-367"><a href="#L-367"><span class="linenos"> 367</span></a> <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="n">reason</span> <span class="ow">or</span> <span class="s2">&quot;cancelled via cancel_job method&quot;</span><span class="p">}</span>
</span><span id="L-368"><a href="#L-368"><span class="linenos"> 368</span></a>
</span><span id="L-369"><a href="#L-369"><span class="linenos"> 369</span></a> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-370"><a href="#L-370"><span class="linenos"> 370</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-371"><a href="#L-371"><span class="linenos"> 371</span></a> <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
</span><span id="L-372"><a href="#L-372"><span class="linenos"> 372</span></a> <span class="p">)</span>
</span><span id="L-373"><a href="#L-373"><span class="linenos"> 373</span></a>
</span><span id="L-374"><a href="#L-374"><span class="linenos"> 374</span></a> <span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span>
</span><span id="L-375"><a href="#L-375"><span class="linenos"> 375</span></a>
</span><span id="L-376"><a href="#L-376"><span class="linenos"> 376</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">cancel_running</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="L-377"><a href="#L-377"><span class="linenos"> 377</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cancel currently running executions of the same script.&quot;&quot;&quot;</span>
</span><span id="L-378"><a href="#L-378"><span class="linenos"> 378</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;canceling running executions of this script&quot;</span><span class="p">)</span>
</span><span id="L-379"><a href="#L-379"><span class="linenos"> 379</span></a>
</span><span id="L-380"><a href="#L-380"><span class="linenos"> 380</span></a> <span class="n">jobs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-381"><a href="#L-381"><span class="linenos"> 381</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/list&quot;</span><span class="p">,</span>
</span><span id="L-382"><a href="#L-382"><span class="linenos"> 382</span></a> <span class="n">params</span><span class="o">=</span><span class="p">{</span>
</span><span id="L-383"><a href="#L-383"><span class="linenos"> 383</span></a> <span class="s2">&quot;running&quot;</span><span class="p">:</span> <span class="s2">&quot;true&quot;</span><span class="p">,</span>
</span><span id="L-384"><a href="#L-384"><span class="linenos"> 384</span></a> <span class="s2">&quot;script_path_exact&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span>
</span><span id="L-385"><a href="#L-385"><span class="linenos"> 385</span></a> <span class="p">},</span>
</span><span id="L-386"><a href="#L-386"><span class="linenos"> 386</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-387"><a href="#L-387"><span class="linenos"> 387</span></a>
</span><span id="L-388"><a href="#L-388"><span class="linenos"> 388</span></a> <span class="n">current_job_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="L-389"><a href="#L-389"><span class="linenos"> 389</span></a>
</span><span id="L-390"><a href="#L-390"><span class="linenos"> 390</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">current_job_id</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-391"><a href="#L-391"><span class="linenos"> 391</span></a>
</span><span id="L-392"><a href="#L-392"><span class="linenos"> 392</span></a> <span class="n">job_ids</span> <span class="o">=</span> <span class="p">[</span><span class="n">j</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">jobs</span> <span class="k">if</span> <span class="n">j</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="n">current_job_id</span><span class="p">]</span>
</span><span id="L-393"><a href="#L-393"><span class="linenos"> 393</span></a>
</span><span id="L-394"><a href="#L-394"><span class="linenos"> 394</span></a> <span class="k">if</span> <span class="n">job_ids</span><span class="p">:</span>
</span><span id="L-395"><a href="#L-395"><span class="linenos"> 395</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;cancelling the following job ids: </span><span class="si">{</span><span class="n">job_ids</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-396"><a href="#L-396"><span class="linenos"> 396</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-397"><a href="#L-397"><span class="linenos"> 397</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;no previous executions to cancel&quot;</span><span class="p">)</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="n">result</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-400"><a href="#L-400"><span class="linenos"> 400</span></a>
</span><span id="L-401"><a href="#L-401"><span class="linenos"> 401</span></a> <span class="k">for</span> <span class="n">id_</span> <span class="ow">in</span> <span class="n">job_ids</span><span class="p">:</span>
</span><span id="L-402"><a href="#L-402"><span class="linenos"> 402</span></a> <span class="n">result</span><span class="p">[</span><span class="n">id_</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-403"><a href="#L-403"><span class="linenos"> 403</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">id_</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-404"><a href="#L-404"><span class="linenos"> 404</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="s2">&quot;killed by `cancel_running` method&quot;</span><span class="p">},</span>
</span><span id="L-405"><a href="#L-405"><span class="linenos"> 405</span></a> <span class="p">)</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="k">return</span> <span class="n">result</span>
</span><span id="L-408"><a href="#L-408"><span class="linenos"> 408</span></a>
</span><span id="L-409"><a href="#L-409"><span class="linenos"> 409</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_job</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="L-410"><a href="#L-410"><span class="linenos"> 410</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/get/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-411"><a href="#L-411"><span class="linenos"> 411</span></a>
</span><span id="L-412"><a href="#L-412"><span class="linenos"> 412</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_root_job_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="L-413"><a href="#L-413"><span class="linenos"> 413</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">job_id</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="L-414"><a href="#L-414"><span class="linenos"> 414</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/get_root_job_id/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</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">get_id_token</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">audience</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">expires_in</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-417"><a href="#L-417"><span class="linenos"> 417</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-418"><a href="#L-418"><span class="linenos"> 418</span></a> <span class="k">if</span> <span class="n">expires_in</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-419"><a href="#L-419"><span class="linenos"> 419</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;expires_in&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">expires_in</span>
</span><span id="L-420"><a href="#L-420"><span class="linenos"> 420</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/oidc/token/</span><span class="si">{</span><span class="n">audience</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="L-421"><a href="#L-421"><span class="linenos"> 421</span></a>
</span><span id="L-422"><a href="#L-422"><span class="linenos"> 422</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_job_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">JobStatus</span><span class="p">:</span>
</span><span id="L-423"><a href="#L-423"><span class="linenos"> 423</span></a> <span class="n">job</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span><span id="L-424"><a href="#L-424"><span class="linenos"> 424</span></a> <span class="n">job_type</span> <span class="o">=</span> <span class="n">job</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;type&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="L-425"><a href="#L-425"><span class="linenos"> 425</span></a> <span class="k">assert</span> <span class="n">job_type</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">job</span><span class="si">}</span><span class="s2"> is not a valid job&quot;</span>
</span><span id="L-426"><a href="#L-426"><span class="linenos"> 426</span></a> <span class="k">if</span> <span class="n">job_type</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">&quot;completedjob&quot;</span><span class="p">:</span>
</span><span id="L-427"><a href="#L-427"><span class="linenos"> 427</span></a> <span class="k">return</span> <span class="s2">&quot;COMPLETED&quot;</span>
</span><span id="L-428"><a href="#L-428"><span class="linenos"> 428</span></a> <span class="k">if</span> <span class="n">job</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;running&quot;</span><span class="p">):</span>
</span><span id="L-429"><a href="#L-429"><span class="linenos"> 429</span></a> <span class="k">return</span> <span class="s2">&quot;RUNNING&quot;</span>
</span><span id="L-430"><a href="#L-430"><span class="linenos"> 430</span></a> <span class="k">return</span> <span class="s2">&quot;WAITING&quot;</span>
</span><span id="L-431"><a href="#L-431"><span class="linenos"> 431</span></a>
</span><span id="L-432"><a href="#L-432"><span class="linenos"> 432</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_result</span><span class="p">(</span>
</span><span id="L-433"><a href="#L-433"><span class="linenos"> 433</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-434"><a href="#L-434"><span class="linenos"> 434</span></a> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-435"><a href="#L-435"><span class="linenos"> 435</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-436"><a href="#L-436"><span class="linenos"> 436</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-437"><a href="#L-437"><span class="linenos"> 437</span></a> <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/completed/get_result/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-438"><a href="#L-438"><span class="linenos"> 438</span></a> <span class="n">result_text</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span>
</span><span id="L-439"><a href="#L-439"><span class="linenos"> 439</span></a> <span class="k">if</span> <span class="n">assert_result_is_not_none</span> <span class="ow">and</span> <span class="n">result_text</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-440"><a href="#L-440"><span class="linenos"> 440</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;result is None for </span><span class="si">{</span><span class="n">job_id</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-441"><a href="#L-441"><span class="linenos"> 441</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-442"><a href="#L-442"><span class="linenos"> 442</span></a> <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-443"><a href="#L-443"><span class="linenos"> 443</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span><span class="p">:</span>
</span><span id="L-444"><a href="#L-444"><span class="linenos"> 444</span></a> <span class="k">return</span> <span class="n">result_text</span>
</span><span id="L-445"><a href="#L-445"><span class="linenos"> 445</span></a>
</span><span id="L-446"><a href="#L-446"><span class="linenos"> 446</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</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-447"><a href="#L-447"><span class="linenos"> 447</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_variable_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="L-448"><a href="#L-448"><span class="linenos"> 448</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-449"><a href="#L-449"><span class="linenos"> 449</span></a> <span class="n">variables</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;variables&quot;</span><span class="p">]</span>
</span><span id="L-450"><a href="#L-450"><span class="linenos"> 450</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-451"><a href="#L-451"><span class="linenos"> 451</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">variables</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
</span><span id="L-452"><a href="#L-452"><span class="linenos"> 452</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="L-453"><a href="#L-453"><span class="linenos"> 453</span></a> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
</span><span id="L-454"><a href="#L-454"><span class="linenos"> 454</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span><span id="L-455"><a href="#L-455"><span class="linenos"> 455</span></a> <span class="sa">f</span><span class="s2">&quot;MockedAPI present, but variable not found at </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">, falling back to real API&quot;</span>
</span><span id="L-456"><a href="#L-456"><span class="linenos"> 456</span></a> <span class="p">)</span>
</span><span id="L-457"><a href="#L-457"><span class="linenos"> 457</span></a>
</span><span id="L-458"><a href="#L-458"><span class="linenos"> 458</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get variable from Windmill&quot;&quot;&quot;</span>
</span><span id="L-459"><a href="#L-459"><span class="linenos"> 459</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/get_value/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</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">set_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">is_secret</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-462"><a href="#L-462"><span class="linenos"> 462</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_variable_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="L-463"><a href="#L-463"><span class="linenos"> 463</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-464"><a href="#L-464"><span class="linenos"> 464</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;variables&quot;</span><span class="p">][</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
</span><span id="L-465"><a href="#L-465"><span class="linenos"> 465</span></a> <span class="k">return</span>
</span><span id="L-466"><a href="#L-466"><span class="linenos"> 466</span></a>
</span><span id="L-467"><a href="#L-467"><span class="linenos"> 467</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Set variable from Windmill&quot;&quot;&quot;</span>
</span><span id="L-468"><a href="#L-468"><span class="linenos"> 468</span></a> <span class="c1"># check if variable exists</span>
</span><span id="L-469"><a href="#L-469"><span class="linenos"> 469</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-470"><a href="#L-470"><span class="linenos"> 470</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/get/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span>
</span><span id="L-471"><a href="#L-471"><span class="linenos"> 471</span></a> <span class="p">)</span>
</span><span id="L-472"><a href="#L-472"><span class="linenos"> 472</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="L-473"><a href="#L-473"><span class="linenos"> 473</span></a> <span class="c1"># create variable</span>
</span><span id="L-474"><a href="#L-474"><span class="linenos"> 474</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-475"><a href="#L-475"><span class="linenos"> 475</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/create&quot;</span><span class="p">,</span>
</span><span id="L-476"><a href="#L-476"><span class="linenos"> 476</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="L-477"><a href="#L-477"><span class="linenos"> 477</span></a> <span class="s2">&quot;path&quot;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
</span><span id="L-478"><a href="#L-478"><span class="linenos"> 478</span></a> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span>
</span><span id="L-479"><a href="#L-479"><span class="linenos"> 479</span></a> <span class="s2">&quot;is_secret&quot;</span><span class="p">:</span> <span class="n">is_secret</span><span class="p">,</span>
</span><span id="L-480"><a href="#L-480"><span class="linenos"> 480</span></a> <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="L-481"><a href="#L-481"><span class="linenos"> 481</span></a> <span class="p">},</span>
</span><span id="L-482"><a href="#L-482"><span class="linenos"> 482</span></a> <span class="p">)</span>
</span><span id="L-483"><a href="#L-483"><span class="linenos"> 483</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-484"><a href="#L-484"><span class="linenos"> 484</span></a> <span class="c1"># update variable</span>
</span><span id="L-485"><a href="#L-485"><span class="linenos"> 485</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-486"><a href="#L-486"><span class="linenos"> 486</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/update/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-487"><a href="#L-487"><span class="linenos"> 487</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
</span><span id="L-488"><a href="#L-488"><span class="linenos"> 488</span></a> <span class="p">)</span>
</span><span id="L-489"><a href="#L-489"><span class="linenos"> 489</span></a>
</span><span id="L-490"><a href="#L-490"><span class="linenos"> 490</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_resource</span><span class="p">(</span>
</span><span id="L-491"><a href="#L-491"><span class="linenos"> 491</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-492"><a href="#L-492"><span class="linenos"> 492</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-493"><a href="#L-493"><span class="linenos"> 493</span></a> <span class="n">none_if_undefined</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-494"><a href="#L-494"><span class="linenos"> 494</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-495"><a href="#L-495"><span class="linenos"> 495</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="L-496"><a href="#L-496"><span class="linenos"> 496</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-497"><a href="#L-497"><span class="linenos"> 497</span></a> <span class="n">resources</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;resources&quot;</span><span class="p">]</span>
</span><span id="L-498"><a href="#L-498"><span class="linenos"> 498</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-499"><a href="#L-499"><span class="linenos"> 499</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">resources</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
</span><span id="L-500"><a href="#L-500"><span class="linenos"> 500</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="L-501"><a href="#L-501"><span class="linenos"> 501</span></a> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
</span><span id="L-502"><a href="#L-502"><span class="linenos"> 502</span></a> <span class="c1"># NOTE: should mocked_api respect `none_if_undefined`?</span>
</span><span id="L-503"><a href="#L-503"><span class="linenos"> 503</span></a> <span class="k">if</span> <span class="n">none_if_undefined</span><span class="p">:</span>
</span><span id="L-504"><a href="#L-504"><span class="linenos"> 504</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span><span id="L-505"><a href="#L-505"><span class="linenos"> 505</span></a> <span class="sa">f</span><span class="s2">&quot;resource not found at $</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">, but none_if_undefined is True, so returning None&quot;</span>
</span><span id="L-506"><a href="#L-506"><span class="linenos"> 506</span></a> <span class="p">)</span>
</span><span id="L-507"><a href="#L-507"><span class="linenos"> 507</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-508"><a href="#L-508"><span class="linenos"> 508</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span><span id="L-509"><a href="#L-509"><span class="linenos"> 509</span></a> <span class="sa">f</span><span class="s2">&quot;MockedAPI present, but resource not found at $</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">, falling back to real API&quot;</span>
</span><span id="L-510"><a href="#L-510"><span class="linenos"> 510</span></a> <span class="p">)</span>
</span><span id="L-511"><a href="#L-511"><span class="linenos"> 511</span></a>
</span><span id="L-512"><a href="#L-512"><span class="linenos"> 512</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get resource from Windmill&quot;&quot;&quot;</span>
</span><span id="L-513"><a href="#L-513"><span class="linenos"> 513</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-514"><a href="#L-514"><span class="linenos"> 514</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-515"><a href="#L-515"><span class="linenos"> 515</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/get_value_interpolated/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-516"><a href="#L-516"><span class="linenos"> 516</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-517"><a href="#L-517"><span class="linenos"> 517</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-518"><a href="#L-518"><span class="linenos"> 518</span></a> <span class="k">if</span> <span class="n">none_if_undefined</span><span class="p">:</span>
</span><span id="L-519"><a href="#L-519"><span class="linenos"> 519</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-520"><a href="#L-520"><span class="linenos"> 520</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="L-521"><a href="#L-521"><span class="linenos"> 521</span></a> <span class="k">raise</span> <span class="n">e</span>
</span><span id="L-522"><a href="#L-522"><span class="linenos"> 522</span></a>
</span><span id="L-523"><a href="#L-523"><span class="linenos"> 523</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_resource</span><span class="p">(</span>
</span><span id="L-524"><a href="#L-524"><span class="linenos"> 524</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-525"><a href="#L-525"><span class="linenos"> 525</span></a> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span>
</span><span id="L-526"><a href="#L-526"><span class="linenos"> 526</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-527"><a href="#L-527"><span class="linenos"> 527</span></a> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-528"><a href="#L-528"><span class="linenos"> 528</span></a> <span class="p">):</span>
</span><span id="L-529"><a href="#L-529"><span class="linenos"> 529</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="L-530"><a href="#L-530"><span class="linenos"> 530</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-531"><a href="#L-531"><span class="linenos"> 531</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;resources&quot;</span><span class="p">][</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
</span><span id="L-532"><a href="#L-532"><span class="linenos"> 532</span></a> <span class="k">return</span>
</span><span id="L-533"><a href="#L-533"><span class="linenos"> 533</span></a>
</span><span id="L-534"><a href="#L-534"><span class="linenos"> 534</span></a> <span class="c1"># check if resource exists</span>
</span><span id="L-535"><a href="#L-535"><span class="linenos"> 535</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-536"><a href="#L-536"><span class="linenos"> 536</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/get/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span>
</span><span id="L-537"><a href="#L-537"><span class="linenos"> 537</span></a> <span class="p">)</span>
</span><span id="L-538"><a href="#L-538"><span class="linenos"> 538</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="L-539"><a href="#L-539"><span class="linenos"> 539</span></a> <span class="c1"># create resource</span>
</span><span id="L-540"><a href="#L-540"><span class="linenos"> 540</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-541"><a href="#L-541"><span class="linenos"> 541</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/create&quot;</span><span class="p">,</span>
</span><span id="L-542"><a href="#L-542"><span class="linenos"> 542</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="L-543"><a href="#L-543"><span class="linenos"> 543</span></a> <span class="s2">&quot;path&quot;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
</span><span id="L-544"><a href="#L-544"><span class="linenos"> 544</span></a> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span>
</span><span id="L-545"><a href="#L-545"><span class="linenos"> 545</span></a> <span class="s2">&quot;resource_type&quot;</span><span class="p">:</span> <span class="n">resource_type</span><span class="p">,</span>
</span><span id="L-546"><a href="#L-546"><span class="linenos"> 546</span></a> <span class="p">},</span>
</span><span id="L-547"><a href="#L-547"><span class="linenos"> 547</span></a> <span class="p">)</span>
</span><span id="L-548"><a href="#L-548"><span class="linenos"> 548</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-549"><a href="#L-549"><span class="linenos"> 549</span></a> <span class="c1"># update resource</span>
</span><span id="L-550"><a href="#L-550"><span class="linenos"> 550</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-551"><a href="#L-551"><span class="linenos"> 551</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/update_value/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-552"><a href="#L-552"><span class="linenos"> 552</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
</span><span id="L-553"><a href="#L-553"><span class="linenos"> 553</span></a> <span class="p">)</span>
</span><span id="L-554"><a href="#L-554"><span class="linenos"> 554</span></a>
</span><span id="L-555"><a href="#L-555"><span class="linenos"> 555</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">list_resources</span><span class="p">(</span>
</span><span id="L-556"><a href="#L-556"><span class="linenos"> 556</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-557"><a href="#L-557"><span class="linenos"> 557</span></a> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-558"><a href="#L-558"><span class="linenos"> 558</span></a> <span class="n">page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-559"><a href="#L-559"><span class="linenos"> 559</span></a> <span class="n">per_page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-560"><a href="#L-560"><span class="linenos"> 560</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">dict</span><span class="p">]:</span>
</span><span id="L-561"><a href="#L-561"><span class="linenos"> 561</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;List resources from Windmill workspace.</span>
</span><span id="L-562"><a href="#L-562"><span class="linenos"> 562</span></a><span class="sd"> </span>
</span><span id="L-563"><a href="#L-563"><span class="linenos"> 563</span></a><span class="sd"> Args:</span>
</span><span id="L-564"><a href="#L-564"><span class="linenos"> 564</span></a><span class="sd"> resource_type: Optional resource type to filter by (e.g., &quot;postgresql&quot;, &quot;mysql&quot;, &quot;s3&quot;)</span>
</span><span id="L-565"><a href="#L-565"><span class="linenos"> 565</span></a><span class="sd"> page: Optional page number for pagination</span>
</span><span id="L-566"><a href="#L-566"><span class="linenos"> 566</span></a><span class="sd"> per_page: Optional number of results per page</span>
</span><span id="L-567"><a href="#L-567"><span class="linenos"> 567</span></a><span class="sd"> </span>
</span><span id="L-568"><a href="#L-568"><span class="linenos"> 568</span></a><span class="sd"> Returns:</span>
</span><span id="L-569"><a href="#L-569"><span class="linenos"> 569</span></a><span class="sd"> List of resource dictionaries</span>
</span><span id="L-570"><a href="#L-570"><span class="linenos"> 570</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-571"><a href="#L-571"><span class="linenos"> 571</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-572"><a href="#L-572"><span class="linenos"> 572</span></a> <span class="k">if</span> <span class="n">resource_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-573"><a href="#L-573"><span class="linenos"> 573</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;resource_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">resource_type</span>
</span><span id="L-574"><a href="#L-574"><span class="linenos"> 574</span></a> <span class="k">if</span> <span class="n">page</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-575"><a href="#L-575"><span class="linenos"> 575</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;page&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">page</span>
</span><span id="L-576"><a href="#L-576"><span class="linenos"> 576</span></a> <span class="k">if</span> <span class="n">per_page</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-577"><a href="#L-577"><span class="linenos"> 577</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;per_page&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">per_page</span>
</span><span id="L-578"><a href="#L-578"><span class="linenos"> 578</span></a>
</span><span id="L-579"><a href="#L-579"><span class="linenos"> 579</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-580"><a href="#L-580"><span class="linenos"> 580</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/list&quot;</span><span class="p">,</span>
</span><span id="L-581"><a href="#L-581"><span class="linenos"> 581</span></a> <span class="n">params</span><span class="o">=</span><span class="n">params</span> <span class="k">if</span> <span class="n">params</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-582"><a href="#L-582"><span class="linenos"> 582</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-583"><a href="#L-583"><span class="linenos"> 583</span></a>
</span><span id="L-584"><a href="#L-584"><span class="linenos"> 584</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">):</span>
</span><span id="L-585"><a href="#L-585"><span class="linenos"> 585</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">set_resource</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">state_path</span><span class="p">,</span> <span class="n">resource_type</span><span class="o">=</span><span class="s2">&quot;state&quot;</span><span class="p">)</span>
</span><span id="L-586"><a href="#L-586"><span class="linenos"> 586</span></a>
</span><span id="L-587"><a href="#L-587"><span class="linenos"> 587</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_progress</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
</span><span id="L-588"><a href="#L-588"><span class="linenos"> 588</span></a> <span class="n">workspace</span> <span class="o">=</span> <span class="n">get_workspace</span><span class="p">()</span>
</span><span id="L-589"><a href="#L-589"><span class="linenos"> 589</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="L-590"><a href="#L-590"><span class="linenos"> 590</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">job_id</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="L-591"><a href="#L-591"><span class="linenos"> 591</span></a>
</span><span id="L-592"><a href="#L-592"><span class="linenos"> 592</span></a> <span class="k">if</span> <span class="n">job_id</span> <span class="o">!=</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-593"><a href="#L-593"><span class="linenos"> 593</span></a> <span class="n">job</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span><span id="L-594"><a href="#L-594"><span class="linenos"> 594</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="n">job</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;parent_job&quot;</span><span class="p">)</span>
</span><span id="L-595"><a href="#L-595"><span class="linenos"> 595</span></a>
</span><span id="L-596"><a href="#L-596"><span class="linenos"> 596</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-597"><a href="#L-597"><span class="linenos"> 597</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_metrics/set_progress/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-598"><a href="#L-598"><span class="linenos"> 598</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="L-599"><a href="#L-599"><span class="linenos"> 599</span></a> <span class="s2">&quot;percent&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span>
</span><span id="L-600"><a href="#L-600"><span class="linenos"> 600</span></a> <span class="s2">&quot;flow_job_id&quot;</span><span class="p">:</span> <span class="n">flow_id</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-601"><a href="#L-601"><span class="linenos"> 601</span></a> <span class="p">},</span>
</span><span id="L-602"><a href="#L-602"><span class="linenos"> 602</span></a> <span class="p">)</span>
</span><span id="L-603"><a href="#L-603"><span class="linenos"> 603</span></a>
</span><span id="L-604"><a href="#L-604"><span class="linenos"> 604</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_progress</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-605"><a href="#L-605"><span class="linenos"> 605</span></a> <span class="n">workspace</span> <span class="o">=</span> <span class="n">get_workspace</span><span class="p">()</span>
</span><span id="L-606"><a href="#L-606"><span class="linenos"> 606</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">job_id</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="L-607"><a href="#L-607"><span class="linenos"> 607</span></a>
</span><span id="L-608"><a href="#L-608"><span class="linenos"> 608</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-609"><a href="#L-609"><span class="linenos"> 609</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_metrics/get_progress/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-610"><a href="#L-610"><span class="linenos"> 610</span></a> <span class="p">)</span>
</span><span id="L-611"><a href="#L-611"><span class="linenos"> 611</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="L-612"><a href="#L-612"><span class="linenos"> 612</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2"> does not exist&quot;</span><span class="p">)</span>
</span><span id="L-613"><a href="#L-613"><span class="linenos"> 613</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-614"><a href="#L-614"><span class="linenos"> 614</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-615"><a href="#L-615"><span class="linenos"> 615</span></a> <span class="k">return</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-616"><a href="#L-616"><span class="linenos"> 616</span></a>
</span><span id="L-617"><a href="#L-617"><span class="linenos"> 617</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_flow_user_state</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="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-618"><a href="#L-618"><span class="linenos"> 618</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Set the user state of a flow at a given key&quot;&quot;&quot;</span>
</span><span id="L-619"><a href="#L-619"><span class="linenos"> 619</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_root_job_id</span><span class="p">()</span>
</span><span id="L-620"><a href="#L-620"><span class="linenos"> 620</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-621"><a href="#L-621"><span class="linenos"> 621</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/flow/user_states/</span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-622"><a href="#L-622"><span class="linenos"> 622</span></a> <span class="n">json</span><span class="o">=</span><span class="n">value</span><span class="p">,</span>
</span><span id="L-623"><a href="#L-623"><span class="linenos"> 623</span></a> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="L-624"><a href="#L-624"><span class="linenos"> 624</span></a> <span class="p">)</span>
</span><span id="L-625"><a href="#L-625"><span class="linenos"> 625</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="L-626"><a href="#L-626"><span class="linenos"> 626</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2"> does not exist or is not a flow&quot;</span><span class="p">)</span>
</span><span id="L-627"><a href="#L-627"><span class="linenos"> 627</span></a>
</span><span id="L-628"><a href="#L-628"><span class="linenos"> 628</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_flow_user_state</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="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-629"><a href="#L-629"><span class="linenos"> 629</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the user state of a flow at a given key&quot;&quot;&quot;</span>
</span><span id="L-630"><a href="#L-630"><span class="linenos"> 630</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_root_job_id</span><span class="p">()</span>
</span><span id="L-631"><a href="#L-631"><span class="linenos"> 631</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-632"><a href="#L-632"><span class="linenos"> 632</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/flow/user_states/</span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-633"><a href="#L-633"><span class="linenos"> 633</span></a> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="L-634"><a href="#L-634"><span class="linenos"> 634</span></a> <span class="p">)</span>
</span><span id="L-635"><a href="#L-635"><span class="linenos"> 635</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="L-636"><a href="#L-636"><span class="linenos"> 636</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2"> does not exist or is not a flow&quot;</span><span class="p">)</span>
</span><span id="L-637"><a href="#L-637"><span class="linenos"> 637</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-638"><a href="#L-638"><span class="linenos"> 638</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-639"><a href="#L-639"><span class="linenos"> 639</span></a> <span class="k">return</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-640"><a href="#L-640"><span class="linenos"> 640</span></a>
</span><span id="L-641"><a href="#L-641"><span class="linenos"> 641</span></a> <span class="nd">@property</span>
</span><span id="L-642"><a href="#L-642"><span class="linenos"> 642</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-643"><a href="#L-643"><span class="linenos"> 643</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;version&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="L-644"><a href="#L-644"><span class="linenos"> 644</span></a>
</span><span id="L-645"><a href="#L-645"><span class="linenos"> 645</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_duckdb_connection_settings</span><span class="p">(</span>
</span><span id="L-646"><a href="#L-646"><span class="linenos"> 646</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-647"><a href="#L-647"><span class="linenos"> 647</span></a> <span class="n">s3_resource_path</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><span id="L-648"><a href="#L-648"><span class="linenos"> 648</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DuckDbConnectionSettings</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-649"><a href="#L-649"><span class="linenos"> 649</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-650"><a href="#L-650"><span class="linenos"> 650</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="L-651"><a href="#L-651"><span class="linenos"> 651</span></a><span class="sd"> initiate an S3 connection from DuckDB</span>
</span><span id="L-652"><a href="#L-652"><span class="linenos"> 652</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-653"><a href="#L-653"><span class="linenos"> 653</span></a> <span class="n">s3_resource_path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">s3_resource_path</span>
</span><span id="L-654"><a href="#L-654"><span class="linenos"> 654</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-655"><a href="#L-655"><span class="linenos"> 655</span></a> <span class="n">raw_obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-656"><a href="#L-656"><span class="linenos"> 656</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/v2/duckdb_connection_settings&quot;</span><span class="p">,</span>
</span><span id="L-657"><a href="#L-657"><span class="linenos"> 657</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{}</span>
</span><span id="L-658"><a href="#L-658"><span class="linenos"> 658</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-659"><a href="#L-659"><span class="linenos"> 659</span></a> <span class="k">else</span> <span class="p">{</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">:</span> <span class="n">s3_resource_path</span><span class="p">},</span>
</span><span id="L-660"><a href="#L-660"><span class="linenos"> 660</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-661"><a href="#L-661"><span class="linenos"> 661</span></a> <span class="k">return</span> <span class="n">DuckDbConnectionSettings</span><span class="p">(</span><span class="n">raw_obj</span><span class="p">)</span>
</span><span id="L-662"><a href="#L-662"><span class="linenos"> 662</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-663"><a href="#L-663"><span class="linenos"> 663</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="L-664"><a href="#L-664"><span class="linenos"> 664</span></a> <span class="s2">&quot;Could not generate DuckDB S3 connection settings from the provided resource&quot;</span>
</span><span id="L-665"><a href="#L-665"><span class="linenos"> 665</span></a> <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span><span id="L-666"><a href="#L-666"><span class="linenos"> 666</span></a>
</span><span id="L-667"><a href="#L-667"><span class="linenos"> 667</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_polars_connection_settings</span><span class="p">(</span>
</span><span id="L-668"><a href="#L-668"><span class="linenos"> 668</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-669"><a href="#L-669"><span class="linenos"> 669</span></a> <span class="n">s3_resource_path</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><span id="L-670"><a href="#L-670"><span class="linenos"> 670</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">PolarsConnectionSettings</span><span class="p">:</span>
</span><span id="L-671"><a href="#L-671"><span class="linenos"> 671</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-672"><a href="#L-672"><span class="linenos"> 672</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="L-673"><a href="#L-673"><span class="linenos"> 673</span></a><span class="sd"> initiate an S3 connection from Polars</span>
</span><span id="L-674"><a href="#L-674"><span class="linenos"> 674</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-675"><a href="#L-675"><span class="linenos"> 675</span></a> <span class="n">s3_resource_path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">s3_resource_path</span>
</span><span id="L-676"><a href="#L-676"><span class="linenos"> 676</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-677"><a href="#L-677"><span class="linenos"> 677</span></a> <span class="n">raw_obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-678"><a href="#L-678"><span class="linenos"> 678</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/v2/polars_connection_settings&quot;</span><span class="p">,</span>
</span><span id="L-679"><a href="#L-679"><span class="linenos"> 679</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{}</span>
</span><span id="L-680"><a href="#L-680"><span class="linenos"> 680</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-681"><a href="#L-681"><span class="linenos"> 681</span></a> <span class="k">else</span> <span class="p">{</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">:</span> <span class="n">s3_resource_path</span><span class="p">},</span>
</span><span id="L-682"><a href="#L-682"><span class="linenos"> 682</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-683"><a href="#L-683"><span class="linenos"> 683</span></a> <span class="k">return</span> <span class="n">PolarsConnectionSettings</span><span class="p">(</span><span class="n">raw_obj</span><span class="p">)</span>
</span><span id="L-684"><a href="#L-684"><span class="linenos"> 684</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-685"><a href="#L-685"><span class="linenos"> 685</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="L-686"><a href="#L-686"><span class="linenos"> 686</span></a> <span class="s2">&quot;Could not generate Polars S3 connection settings from the provided resource&quot;</span>
</span><span id="L-687"><a href="#L-687"><span class="linenos"> 687</span></a> <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span><span id="L-688"><a href="#L-688"><span class="linenos"> 688</span></a>
</span><span id="L-689"><a href="#L-689"><span class="linenos"> 689</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_boto3_connection_settings</span><span class="p">(</span>
</span><span id="L-690"><a href="#L-690"><span class="linenos"> 690</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-691"><a href="#L-691"><span class="linenos"> 691</span></a> <span class="n">s3_resource_path</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><span id="L-692"><a href="#L-692"><span class="linenos"> 692</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Boto3ConnectionSettings</span><span class="p">:</span>
</span><span id="L-693"><a href="#L-693"><span class="linenos"> 693</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-694"><a href="#L-694"><span class="linenos"> 694</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="L-695"><a href="#L-695"><span class="linenos"> 695</span></a><span class="sd"> initiate an S3 connection using boto3</span>
</span><span id="L-696"><a href="#L-696"><span class="linenos"> 696</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-697"><a href="#L-697"><span class="linenos"> 697</span></a> <span class="n">s3_resource_path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">s3_resource_path</span>
</span><span id="L-698"><a href="#L-698"><span class="linenos"> 698</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-699"><a href="#L-699"><span class="linenos"> 699</span></a> <span class="n">s3_resource</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-700"><a href="#L-700"><span class="linenos"> 700</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/v2/s3_resource_info&quot;</span><span class="p">,</span>
</span><span id="L-701"><a href="#L-701"><span class="linenos"> 701</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{}</span>
</span><span id="L-702"><a href="#L-702"><span class="linenos"> 702</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-703"><a href="#L-703"><span class="linenos"> 703</span></a> <span class="k">else</span> <span class="p">{</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">:</span> <span class="n">s3_resource_path</span><span class="p">},</span>
</span><span id="L-704"><a href="#L-704"><span class="linenos"> 704</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-705"><a href="#L-705"><span class="linenos"> 705</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__boto3_connection_settings</span><span class="p">(</span><span class="n">s3_resource</span><span class="p">)</span>
</span><span id="L-706"><a href="#L-706"><span class="linenos"> 706</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-707"><a href="#L-707"><span class="linenos"> 707</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="L-708"><a href="#L-708"><span class="linenos"> 708</span></a> <span class="s2">&quot;Could not generate Boto3 S3 connection settings from the provided resource&quot;</span>
</span><span id="L-709"><a href="#L-709"><span class="linenos"> 709</span></a> <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span><span id="L-710"><a href="#L-710"><span class="linenos"> 710</span></a>
</span><span id="L-711"><a href="#L-711"><span class="linenos"> 711</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">load_s3_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bytes</span><span class="p">:</span>
</span><span id="L-712"><a href="#L-712"><span class="linenos"> 712</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-713"><a href="#L-713"><span class="linenos"> 713</span></a><span class="sd"> Load a file from the workspace s3 bucket and returns its content as bytes.</span>
</span><span id="L-714"><a href="#L-714"><span class="linenos"> 714</span></a>
</span><span id="L-715"><a href="#L-715"><span class="linenos"> 715</span></a><span class="sd"> &#39;&#39;&#39;python</span>
</span><span id="L-716"><a href="#L-716"><span class="linenos"> 716</span></a><span class="sd"> from wmill import S3Object</span>
</span><span id="L-717"><a href="#L-717"><span class="linenos"> 717</span></a>
</span><span id="L-718"><a href="#L-718"><span class="linenos"> 718</span></a><span class="sd"> s3_obj = S3Object(s3=&quot;/path/to/my_file.txt&quot;)</span>
</span><span id="L-719"><a href="#L-719"><span class="linenos"> 719</span></a><span class="sd"> my_obj_content = client.load_s3_file(s3_obj)</span>
</span><span id="L-720"><a href="#L-720"><span class="linenos"> 720</span></a><span class="sd"> file_content = my_obj_content.decode(&quot;utf-8&quot;)</span>
</span><span id="L-721"><a href="#L-721"><span class="linenos"> 721</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="L-722"><a href="#L-722"><span class="linenos"> 722</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-723"><a href="#L-723"><span class="linenos"> 723</span></a> <span class="n">s3object</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3object</span><span class="p">)</span>
</span><span id="L-724"><a href="#L-724"><span class="linenos"> 724</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_s3_file_reader</span><span class="p">(</span><span class="n">s3object</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">)</span> <span class="k">as</span> <span class="n">file_reader</span><span class="p">:</span>
</span><span id="L-725"><a href="#L-725"><span class="linenos"> 725</span></a> <span class="k">return</span> <span class="n">file_reader</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span><span id="L-726"><a href="#L-726"><span class="linenos"> 726</span></a>
</span><span id="L-727"><a href="#L-727"><span class="linenos"> 727</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">load_s3_file_reader</span><span class="p">(</span>
</span><span id="L-728"><a href="#L-728"><span class="linenos"> 728</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span>
</span><span id="L-729"><a href="#L-729"><span class="linenos"> 729</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">BufferedReader</span><span class="p">:</span>
</span><span id="L-730"><a href="#L-730"><span class="linenos"> 730</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-731"><a href="#L-731"><span class="linenos"> 731</span></a><span class="sd"> Load a file from the workspace s3 bucket and returns the bytes stream.</span>
</span><span id="L-732"><a href="#L-732"><span class="linenos"> 732</span></a>
</span><span id="L-733"><a href="#L-733"><span class="linenos"> 733</span></a><span class="sd"> &#39;&#39;&#39;python</span>
</span><span id="L-734"><a href="#L-734"><span class="linenos"> 734</span></a><span class="sd"> from wmill import S3Object</span>
</span><span id="L-735"><a href="#L-735"><span class="linenos"> 735</span></a>
</span><span id="L-736"><a href="#L-736"><span class="linenos"> 736</span></a><span class="sd"> s3_obj = S3Object(s3=&quot;/path/to/my_file.txt&quot;)</span>
</span><span id="L-737"><a href="#L-737"><span class="linenos"> 737</span></a><span class="sd"> with wmill.load_s3_file_reader(s3object, s3_resource_path) as file_reader:</span>
</span><span id="L-738"><a href="#L-738"><span class="linenos"> 738</span></a><span class="sd"> print(file_reader.read())</span>
</span><span id="L-739"><a href="#L-739"><span class="linenos"> 739</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="L-740"><a href="#L-740"><span class="linenos"> 740</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-741"><a href="#L-741"><span class="linenos"> 741</span></a> <span class="n">s3object</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3object</span><span class="p">)</span>
</span><span id="L-742"><a href="#L-742"><span class="linenos"> 742</span></a> <span class="n">reader</span> <span class="o">=</span> <span class="n">S3BufferedReader</span><span class="p">(</span>
</span><span id="L-743"><a href="#L-743"><span class="linenos"> 743</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-744"><a href="#L-744"><span class="linenos"> 744</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="p">,</span>
</span><span id="L-745"><a href="#L-745"><span class="linenos"> 745</span></a> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;s3&quot;</span><span class="p">],</span>
</span><span id="L-746"><a href="#L-746"><span class="linenos"> 746</span></a> <span class="n">s3_resource_path</span><span class="p">,</span>
</span><span id="L-747"><a href="#L-747"><span class="linenos"> 747</span></a> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span> <span class="k">if</span> <span class="s2">&quot;storage&quot;</span> <span class="ow">in</span> <span class="n">s3object</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-748"><a href="#L-748"><span class="linenos"> 748</span></a> <span class="p">)</span>
</span><span id="L-749"><a href="#L-749"><span class="linenos"> 749</span></a> <span class="k">return</span> <span class="n">reader</span>
</span><span id="L-750"><a href="#L-750"><span class="linenos"> 750</span></a>
</span><span id="L-751"><a href="#L-751"><span class="linenos"> 751</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">write_s3_file</span><span class="p">(</span>
</span><span id="L-752"><a href="#L-752"><span class="linenos"> 752</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-753"><a href="#L-753"><span class="linenos"> 753</span></a> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-754"><a href="#L-754"><span class="linenos"> 754</span></a> <span class="n">file_content</span><span class="p">:</span> <span class="n">BufferedReader</span> <span class="o">|</span> <span class="nb">bytes</span><span class="p">,</span>
</span><span id="L-755"><a href="#L-755"><span class="linenos"> 755</span></a> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-756"><a href="#L-756"><span class="linenos"> 756</span></a> <span class="n">content_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-757"><a href="#L-757"><span class="linenos"> 757</span></a> <span class="n">content_disposition</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-758"><a href="#L-758"><span class="linenos"> 758</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="L-759"><a href="#L-759"><span class="linenos"> 759</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-760"><a href="#L-760"><span class="linenos"> 760</span></a><span class="sd"> Write a file to the workspace S3 bucket</span>
</span><span id="L-761"><a href="#L-761"><span class="linenos"> 761</span></a>
</span><span id="L-762"><a href="#L-762"><span class="linenos"> 762</span></a><span class="sd"> &#39;&#39;&#39;python</span>
</span><span id="L-763"><a href="#L-763"><span class="linenos"> 763</span></a><span class="sd"> from wmill import S3Object</span>
</span><span id="L-764"><a href="#L-764"><span class="linenos"> 764</span></a>
</span><span id="L-765"><a href="#L-765"><span class="linenos"> 765</span></a><span class="sd"> s3_obj = S3Object(s3=&quot;/path/to/my_file.txt&quot;)</span>
</span><span id="L-766"><a href="#L-766"><span class="linenos"> 766</span></a>
</span><span id="L-767"><a href="#L-767"><span class="linenos"> 767</span></a><span class="sd"> # for an in memory bytes array:</span>
</span><span id="L-768"><a href="#L-768"><span class="linenos"> 768</span></a><span class="sd"> file_content = b&#39;Hello Windmill!&#39;</span>
</span><span id="L-769"><a href="#L-769"><span class="linenos"> 769</span></a><span class="sd"> client.write_s3_file(s3_obj, file_content)</span>
</span><span id="L-770"><a href="#L-770"><span class="linenos"> 770</span></a>
</span><span id="L-771"><a href="#L-771"><span class="linenos"> 771</span></a><span class="sd"> # for a file:</span>
</span><span id="L-772"><a href="#L-772"><span class="linenos"> 772</span></a><span class="sd"> with open(&quot;my_file.txt&quot;, &quot;rb&quot;) as my_file:</span>
</span><span id="L-773"><a href="#L-773"><span class="linenos"> 773</span></a><span class="sd"> client.write_s3_file(s3_obj, my_file)</span>
</span><span id="L-774"><a href="#L-774"><span class="linenos"> 774</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="L-775"><a href="#L-775"><span class="linenos"> 775</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-776"><a href="#L-776"><span class="linenos"> 776</span></a> <span class="n">s3object</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3object</span><span class="p">)</span>
</span><span id="L-777"><a href="#L-777"><span class="linenos"> 777</span></a> <span class="c1"># httpx accepts either bytes or &quot;a bytes generator&quot; as content. If it&#39;s a BufferedReader, we need to convert it to a generator</span>
</span><span id="L-778"><a href="#L-778"><span class="linenos"> 778</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_content</span><span class="p">,</span> <span class="n">BufferedReader</span><span class="p">):</span>
</span><span id="L-779"><a href="#L-779"><span class="linenos"> 779</span></a> <span class="n">content_payload</span> <span class="o">=</span> <span class="n">bytes_generator</span><span class="p">(</span><span class="n">file_content</span><span class="p">)</span>
</span><span id="L-780"><a href="#L-780"><span class="linenos"> 780</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_content</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
</span><span id="L-781"><a href="#L-781"><span class="linenos"> 781</span></a> <span class="n">content_payload</span> <span class="o">=</span> <span class="n">file_content</span>
</span><span id="L-782"><a href="#L-782"><span class="linenos"> 782</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-783"><a href="#L-783"><span class="linenos"> 783</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Type of file_content not supported&quot;</span><span class="p">)</span>
</span><span id="L-784"><a href="#L-784"><span class="linenos"> 784</span></a>
</span><span id="L-785"><a href="#L-785"><span class="linenos"> 785</span></a> <span class="n">query_params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-786"><a href="#L-786"><span class="linenos"> 786</span></a> <span class="k">if</span> <span class="n">s3object</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;s3&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
</span><span id="L-787"><a href="#L-787"><span class="linenos"> 787</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;file_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;s3&quot;</span><span class="p">]</span>
</span><span id="L-788"><a href="#L-788"><span class="linenos"> 788</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">s3_resource_path</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
</span><span id="L-789"><a href="#L-789"><span class="linenos"> 789</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">s3_resource_path</span>
</span><span id="L-790"><a href="#L-790"><span class="linenos"> 790</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-791"><a href="#L-791"><span class="linenos"> 791</span></a> <span class="n">s3object</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
</span><span id="L-792"><a href="#L-792"><span class="linenos"> 792</span></a> <span class="ow">and</span> <span class="s2">&quot;storage&quot;</span> <span class="ow">in</span> <span class="n">s3object</span>
</span><span id="L-793"><a href="#L-793"><span class="linenos"> 793</span></a> <span class="ow">and</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
</span><span id="L-794"><a href="#L-794"><span class="linenos"> 794</span></a> <span class="p">):</span>
</span><span id="L-795"><a href="#L-795"><span class="linenos"> 795</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span>
</span><span id="L-796"><a href="#L-796"><span class="linenos"> 796</span></a> <span class="k">if</span> <span class="n">content_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-797"><a href="#L-797"><span class="linenos"> 797</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;content_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">content_type</span>
</span><span id="L-798"><a href="#L-798"><span class="linenos"> 798</span></a> <span class="k">if</span> <span class="n">content_disposition</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-799"><a href="#L-799"><span class="linenos"> 799</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;content_disposition&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">content_disposition</span>
</span><span id="L-800"><a href="#L-800"><span class="linenos"> 800</span></a>
</span><span id="L-801"><a href="#L-801"><span class="linenos"> 801</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-802"><a href="#L-802"><span class="linenos"> 802</span></a> <span class="c1"># need a vanilla client b/c content-type is not application/json here</span>
</span><span id="L-803"><a href="#L-803"><span class="linenos"> 803</span></a> <span class="n">response</span> <span class="o">=</span> <span class="n">httpx</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-804"><a href="#L-804"><span class="linenos"> 804</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_url</span><span class="si">}</span><span class="s2">/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/upload_s3_file&quot;</span><span class="p">,</span>
</span><span id="L-805"><a href="#L-805"><span class="linenos"> 805</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
</span><span id="L-806"><a href="#L-806"><span class="linenos"> 806</span></a> <span class="s2">&quot;Authorization&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Bearer </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-807"><a href="#L-807"><span class="linenos"> 807</span></a> <span class="s2">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/octet-stream&quot;</span><span class="p">,</span>
</span><span id="L-808"><a href="#L-808"><span class="linenos"> 808</span></a> <span class="p">},</span>
</span><span id="L-809"><a href="#L-809"><span class="linenos"> 809</span></a> <span class="n">params</span><span class="o">=</span><span class="n">query_params</span><span class="p">,</span>
</span><span id="L-810"><a href="#L-810"><span class="linenos"> 810</span></a> <span class="n">content</span><span class="o">=</span><span class="n">content_payload</span><span class="p">,</span>
</span><span id="L-811"><a href="#L-811"><span class="linenos"> 811</span></a> <span class="n">verify</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">verify</span><span class="p">,</span>
</span><span id="L-812"><a href="#L-812"><span class="linenos"> 812</span></a> <span class="n">timeout</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-813"><a href="#L-813"><span class="linenos"> 813</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-814"><a href="#L-814"><span class="linenos"> 814</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-815"><a href="#L-815"><span class="linenos"> 815</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Could not write file to S3&quot;</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span><span id="L-816"><a href="#L-816"><span class="linenos"> 816</span></a> <span class="k">return</span> <span class="n">S3Object</span><span class="p">(</span><span class="n">s3</span><span class="o">=</span><span class="n">response</span><span class="p">[</span><span class="s2">&quot;file_key&quot;</span><span class="p">])</span>
</span><span id="L-817"><a href="#L-817"><span class="linenos"> 817</span></a>
</span><span id="L-818"><a href="#L-818"><span class="linenos"> 818</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">sign_s3_objects</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span><span class="p">]:</span>
</span><span id="L-819"><a href="#L-819"><span class="linenos"> 819</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-820"><a href="#L-820"><span class="linenos"> 820</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/apps/sign_s3_objects&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;s3_objects&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">parse_s3_object</span><span class="p">,</span> <span class="n">s3_objects</span><span class="p">))}</span>
</span><span id="L-821"><a href="#L-821"><span class="linenos"> 821</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-822"><a href="#L-822"><span class="linenos"> 822</span></a>
</span><span id="L-823"><a href="#L-823"><span class="linenos"> 823</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">sign_s3_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="L-824"><a href="#L-824"><span class="linenos"> 824</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-825"><a href="#L-825"><span class="linenos"> 825</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/apps/sign_s3_objects&quot;</span><span class="p">,</span>
</span><span id="L-826"><a href="#L-826"><span class="linenos"> 826</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;s3_objects&quot;</span><span class="p">:</span> <span class="p">[</span><span class="n">s3_object</span><span class="p">]},</span>
</span><span id="L-827"><a href="#L-827"><span class="linenos"> 827</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-828"><a href="#L-828"><span class="linenos"> 828</span></a>
</span><span id="L-829"><a href="#L-829"><span class="linenos"> 829</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_presigned_s3_public_urls</span><span class="p">(</span>
</span><span id="L-830"><a href="#L-830"><span class="linenos"> 830</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-831"><a href="#L-831"><span class="linenos"> 831</span></a> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">],</span>
</span><span id="L-832"><a href="#L-832"><span class="linenos"> 832</span></a> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-833"><a href="#L-833"><span class="linenos"> 833</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span><span id="L-834"><a href="#L-834"><span class="linenos"> 834</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-835"><a href="#L-835"><span class="linenos"> 835</span></a><span class="sd"> Generate presigned public URLs for an array of S3 objects.</span>
</span><span id="L-836"><a href="#L-836"><span class="linenos"> 836</span></a><span class="sd"> If an S3 object is not signed yet, it will be signed first.</span>
</span><span id="L-837"><a href="#L-837"><span class="linenos"> 837</span></a>
</span><span id="L-838"><a href="#L-838"><span class="linenos"> 838</span></a><span class="sd"> Args:</span>
</span><span id="L-839"><a href="#L-839"><span class="linenos"> 839</span></a><span class="sd"> s3_objects: List of S3 objects to sign</span>
</span><span id="L-840"><a href="#L-840"><span class="linenos"> 840</span></a><span class="sd"> base_url: Optional base URL for the presigned URLs (defaults to WM_BASE_URL)</span>
</span><span id="L-841"><a href="#L-841"><span class="linenos"> 841</span></a>
</span><span id="L-842"><a href="#L-842"><span class="linenos"> 842</span></a><span class="sd"> Returns:</span>
</span><span id="L-843"><a href="#L-843"><span class="linenos"> 843</span></a><span class="sd"> List of signed public URLs</span>
</span><span id="L-844"><a href="#L-844"><span class="linenos"> 844</span></a>
</span><span id="L-845"><a href="#L-845"><span class="linenos"> 845</span></a><span class="sd"> Example:</span>
</span><span id="L-846"><a href="#L-846"><span class="linenos"> 846</span></a><span class="sd"> &gt;&gt;&gt; s3_objs = [S3Object(s3=&quot;/path/to/file1.txt&quot;), S3Object(s3=&quot;/path/to/file2.txt&quot;)]</span>
</span><span id="L-847"><a href="#L-847"><span class="linenos"> 847</span></a><span class="sd"> &gt;&gt;&gt; urls = client.get_presigned_s3_public_urls(s3_objs)</span>
</span><span id="L-848"><a href="#L-848"><span class="linenos"> 848</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-849"><a href="#L-849"><span class="linenos"> 849</span></a> <span class="n">base_url</span> <span class="o">=</span> <span class="n">base_url</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_public_base_url</span><span class="p">()</span>
</span><span id="L-850"><a href="#L-850"><span class="linenos"> 850</span></a>
</span><span id="L-851"><a href="#L-851"><span class="linenos"> 851</span></a> <span class="n">s3_objs</span> <span class="o">=</span> <span class="p">[</span><span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3_obj</span><span class="p">)</span> <span class="k">for</span> <span class="n">s3_obj</span> <span class="ow">in</span> <span class="n">s3_objects</span><span class="p">]</span>
</span><span id="L-852"><a href="#L-852"><span class="linenos"> 852</span></a>
</span><span id="L-853"><a href="#L-853"><span class="linenos"> 853</span></a> <span class="c1"># Sign all S3 objects that need to be signed in one go</span>
</span><span id="L-854"><a href="#L-854"><span class="linenos"> 854</span></a> <span class="n">s3_objs_to_sign</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">S3Object</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-855"><a href="#L-855"><span class="linenos"> 855</span></a> <span class="p">(</span><span class="n">s3_obj</span><span class="p">,</span> <span class="n">index</span><span class="p">)</span>
</span><span id="L-856"><a href="#L-856"><span class="linenos"> 856</span></a> <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">s3_obj</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">s3_objs</span><span class="p">)</span>
</span><span id="L-857"><a href="#L-857"><span class="linenos"> 857</span></a> <span class="k">if</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;presigned&quot;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span>
</span><span id="L-858"><a href="#L-858"><span class="linenos"> 858</span></a> <span class="p">]</span>
</span><span id="L-859"><a href="#L-859"><span class="linenos"> 859</span></a>
</span><span id="L-860"><a href="#L-860"><span class="linenos"> 860</span></a> <span class="k">if</span> <span class="n">s3_objs_to_sign</span><span class="p">:</span>
</span><span id="L-861"><a href="#L-861"><span class="linenos"> 861</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Signing </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">s3_objs_to_sign</span><span class="p">)</span><span class="si">}</span><span class="s2"> S3 objects...&quot;</span><span class="p">)</span>
</span><span id="L-862"><a href="#L-862"><span class="linenos"> 862</span></a> <span class="n">signed_s3_objs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sign_s3_objects</span><span class="p">(</span>
</span><span id="L-863"><a href="#L-863"><span class="linenos"> 863</span></a> <span class="p">[</span><span class="n">s3_obj</span> <span class="k">for</span> <span class="n">s3_obj</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">s3_objs_to_sign</span><span class="p">]</span>
</span><span id="L-864"><a href="#L-864"><span class="linenos"> 864</span></a> <span class="p">)</span>
</span><span id="L-865"><a href="#L-865"><span class="linenos"> 865</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="n">original_index</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">s3_objs_to_sign</span><span class="p">):</span>
</span><span id="L-866"><a href="#L-866"><span class="linenos"> 866</span></a> <span class="n">s3_objs</span><span class="p">[</span><span class="n">original_index</span><span class="p">]</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">signed_s3_objs</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span><span id="L-867"><a href="#L-867"><span class="linenos"> 867</span></a>
</span><span id="L-868"><a href="#L-868"><span class="linenos"> 868</span></a> <span class="n">signed_urls</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-869"><a href="#L-869"><span class="linenos"> 869</span></a> <span class="k">for</span> <span class="n">s3_obj</span> <span class="ow">in</span> <span class="n">s3_objs</span><span class="p">:</span>
</span><span id="L-870"><a href="#L-870"><span class="linenos"> 870</span></a> <span class="n">s3</span> <span class="o">=</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;s3&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="L-871"><a href="#L-871"><span class="linenos"> 871</span></a> <span class="n">presigned</span> <span class="o">=</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;presigned&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="L-872"><a href="#L-872"><span class="linenos"> 872</span></a> <span class="n">storage</span> <span class="o">=</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;storage&quot;</span><span class="p">,</span> <span class="s2">&quot;_default_&quot;</span><span class="p">)</span>
</span><span id="L-873"><a href="#L-873"><span class="linenos"> 873</span></a> <span class="n">signed_url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s2">/api/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/s3_proxy/</span><span class="si">{</span><span class="n">storage</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">s3</span><span class="si">}</span><span class="s2">?</span><span class="si">{</span><span class="n">presigned</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-874"><a href="#L-874"><span class="linenos"> 874</span></a> <span class="n">signed_urls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">signed_url</span><span class="p">)</span>
</span><span id="L-875"><a href="#L-875"><span class="linenos"> 875</span></a>
</span><span id="L-876"><a href="#L-876"><span class="linenos"> 876</span></a> <span class="k">return</span> <span class="n">signed_urls</span>
</span><span id="L-877"><a href="#L-877"><span class="linenos"> 877</span></a>
</span><span id="L-878"><a href="#L-878"><span class="linenos"> 878</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_presigned_s3_public_url</span><span class="p">(</span>
</span><span id="L-879"><a href="#L-879"><span class="linenos"> 879</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-880"><a href="#L-880"><span class="linenos"> 880</span></a> <span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-881"><a href="#L-881"><span class="linenos"> 881</span></a> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-882"><a href="#L-882"><span class="linenos"> 882</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-883"><a href="#L-883"><span class="linenos"> 883</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-884"><a href="#L-884"><span class="linenos"> 884</span></a><span class="sd"> Generate a presigned public URL for an S3 object.</span>
</span><span id="L-885"><a href="#L-885"><span class="linenos"> 885</span></a><span class="sd"> If the S3 object is not signed yet, it will be signed first.</span>
</span><span id="L-886"><a href="#L-886"><span class="linenos"> 886</span></a>
</span><span id="L-887"><a href="#L-887"><span class="linenos"> 887</span></a><span class="sd"> Args:</span>
</span><span id="L-888"><a href="#L-888"><span class="linenos"> 888</span></a><span class="sd"> s3_object: S3 object to sign</span>
</span><span id="L-889"><a href="#L-889"><span class="linenos"> 889</span></a><span class="sd"> base_url: Optional base URL for the presigned URL (defaults to WM_BASE_URL)</span>
</span><span id="L-890"><a href="#L-890"><span class="linenos"> 890</span></a>
</span><span id="L-891"><a href="#L-891"><span class="linenos"> 891</span></a><span class="sd"> Returns:</span>
</span><span id="L-892"><a href="#L-892"><span class="linenos"> 892</span></a><span class="sd"> Signed public URL</span>
</span><span id="L-893"><a href="#L-893"><span class="linenos"> 893</span></a>
</span><span id="L-894"><a href="#L-894"><span class="linenos"> 894</span></a><span class="sd"> Example:</span>
</span><span id="L-895"><a href="#L-895"><span class="linenos"> 895</span></a><span class="sd"> &gt;&gt;&gt; s3_obj = S3Object(s3=&quot;/path/to/file.txt&quot;)</span>
</span><span id="L-896"><a href="#L-896"><span class="linenos"> 896</span></a><span class="sd"> &gt;&gt;&gt; url = client.get_presigned_s3_public_url(s3_obj)</span>
</span><span id="L-897"><a href="#L-897"><span class="linenos"> 897</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-898"><a href="#L-898"><span class="linenos"> 898</span></a> <span class="n">urls</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_presigned_s3_public_urls</span><span class="p">([</span><span class="n">s3_object</span><span class="p">],</span> <span class="n">base_url</span><span class="p">)</span>
</span><span id="L-899"><a href="#L-899"><span class="linenos"> 899</span></a> <span class="k">return</span> <span class="n">urls</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-900"><a href="#L-900"><span class="linenos"> 900</span></a>
</span><span id="L-901"><a href="#L-901"><span class="linenos"> 901</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_get_public_base_url</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-902"><a href="#L-902"><span class="linenos"> 902</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the public base URL from environment or default to localhost&quot;&quot;&quot;</span>
</span><span id="L-903"><a href="#L-903"><span class="linenos"> 903</span></a> <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_BASE_URL&quot;</span><span class="p">,</span> <span class="s2">&quot;http://localhost:3000&quot;</span><span class="p">)</span>
</span><span id="L-904"><a href="#L-904"><span class="linenos"> 904</span></a>
</span><span id="L-905"><a href="#L-905"><span class="linenos"> 905</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">__boto3_connection_settings</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s3_resource</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Boto3ConnectionSettings</span><span class="p">:</span>
</span><span id="L-906"><a href="#L-906"><span class="linenos"> 906</span></a> <span class="n">endpoint_url_prefix</span> <span class="o">=</span> <span class="s2">&quot;https://&quot;</span> <span class="k">if</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;useSSL&quot;</span><span class="p">]</span> <span class="k">else</span> <span class="s2">&quot;http://&quot;</span>
</span><span id="L-907"><a href="#L-907"><span class="linenos"> 907</span></a> <span class="k">return</span> <span class="n">Boto3ConnectionSettings</span><span class="p">(</span>
</span><span id="L-908"><a href="#L-908"><span class="linenos"> 908</span></a> <span class="p">{</span>
</span><span id="L-909"><a href="#L-909"><span class="linenos"> 909</span></a> <span class="s2">&quot;endpoint_url&quot;</span><span class="p">:</span> <span class="s2">&quot;</span><span class="si">{}{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
</span><span id="L-910"><a href="#L-910"><span class="linenos"> 910</span></a> <span class="n">endpoint_url_prefix</span><span class="p">,</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;endPoint&quot;</span><span class="p">]</span>
</span><span id="L-911"><a href="#L-911"><span class="linenos"> 911</span></a> <span class="p">),</span>
</span><span id="L-912"><a href="#L-912"><span class="linenos"> 912</span></a> <span class="s2">&quot;region_name&quot;</span><span class="p">:</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;region&quot;</span><span class="p">],</span>
</span><span id="L-913"><a href="#L-913"><span class="linenos"> 913</span></a> <span class="s2">&quot;use_ssl&quot;</span><span class="p">:</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;useSSL&quot;</span><span class="p">],</span>
</span><span id="L-914"><a href="#L-914"><span class="linenos"> 914</span></a> <span class="s2">&quot;aws_access_key_id&quot;</span><span class="p">:</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;accessKey&quot;</span><span class="p">],</span>
</span><span id="L-915"><a href="#L-915"><span class="linenos"> 915</span></a> <span class="s2">&quot;aws_secret_access_key&quot;</span><span class="p">:</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;secretKey&quot;</span><span class="p">],</span>
</span><span id="L-916"><a href="#L-916"><span class="linenos"> 916</span></a> <span class="c1"># no need for path_style here as boto3 is clever enough to determine which one to use</span>
</span><span id="L-917"><a href="#L-917"><span class="linenos"> 917</span></a> <span class="p">}</span>
</span><span id="L-918"><a href="#L-918"><span class="linenos"> 918</span></a> <span class="p">)</span>
</span><span id="L-919"><a href="#L-919"><span class="linenos"> 919</span></a>
</span><span id="L-920"><a href="#L-920"><span class="linenos"> 920</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">whoami</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="L-921"><a href="#L-921"><span class="linenos"> 921</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/users/whoami&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-922"><a href="#L-922"><span class="linenos"> 922</span></a>
</span><span id="L-923"><a href="#L-923"><span class="linenos"> 923</span></a> <span class="nd">@property</span>
</span><span id="L-924"><a href="#L-924"><span class="linenos"> 924</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">user</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="L-925"><a href="#L-925"><span class="linenos"> 925</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">whoami</span><span class="p">()</span>
</span><span id="L-926"><a href="#L-926"><span class="linenos"> 926</span></a>
</span><span id="L-927"><a href="#L-927"><span class="linenos"> 927</span></a> <span class="nd">@property</span>
</span><span id="L-928"><a href="#L-928"><span class="linenos"> 928</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">state_path</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-929"><a href="#L-929"><span class="linenos"> 929</span></a> <span class="n">state_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-930"><a href="#L-930"><span class="linenos"> 930</span></a> <span class="s2">&quot;WM_STATE_PATH_NEW&quot;</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_STATE_PATH&quot;</span><span class="p">)</span>
</span><span id="L-931"><a href="#L-931"><span class="linenos"> 931</span></a> <span class="p">)</span>
</span><span id="L-932"><a href="#L-932"><span class="linenos"> 932</span></a> <span class="k">if</span> <span class="n">state_path</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-933"><a href="#L-933"><span class="linenos"> 933</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;State path not found&quot;</span><span class="p">)</span>
</span><span id="L-934"><a href="#L-934"><span class="linenos"> 934</span></a> <span class="k">return</span> <span class="n">state_path</span>
</span><span id="L-935"><a href="#L-935"><span class="linenos"> 935</span></a>
</span><span id="L-936"><a href="#L-936"><span class="linenos"> 936</span></a> <span class="nd">@property</span>
</span><span id="L-937"><a href="#L-937"><span class="linenos"> 937</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">state</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-938"><a href="#L-938"><span class="linenos"> 938</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_resource</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">state_path</span><span class="p">,</span> <span class="n">none_if_undefined</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-939"><a href="#L-939"><span class="linenos"> 939</span></a>
</span><span id="L-940"><a href="#L-940"><span class="linenos"> 940</span></a> <span class="nd">@state</span><span class="o">.</span><span class="n">setter</span>
</span><span id="L-941"><a href="#L-941"><span class="linenos"> 941</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-942"><a href="#L-942"><span class="linenos"> 942</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span id="L-943"><a href="#L-943"><span class="linenos"> 943</span></a>
</span><span id="L-944"><a href="#L-944"><span class="linenos"> 944</span></a> <span class="nd">@staticmethod</span>
</span><span id="L-945"><a href="#L-945"><span class="linenos"> 945</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_shared_state_pickle</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.pickle&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-946"><a href="#L-946"><span class="linenos"> 946</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-947"><a href="#L-947"><span class="linenos"> 947</span></a><span class="sd"> Set the state in the shared folder using pickle</span>
</span><span id="L-948"><a href="#L-948"><span class="linenos"> 948</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-949"><a href="#L-949"><span class="linenos"> 949</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">pickle</span>
</span><span id="L-950"><a href="#L-950"><span class="linenos"> 950</span></a>
</span><span id="L-951"><a href="#L-951"><span class="linenos"> 951</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;wb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">handle</span><span class="p">:</span>
</span><span id="L-952"><a href="#L-952"><span class="linenos"> 952</span></a> <span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">handle</span><span class="p">,</span> <span class="n">protocol</span><span class="o">=</span><span class="n">pickle</span><span class="o">.</span><span class="n">HIGHEST_PROTOCOL</span><span class="p">)</span>
</span><span id="L-953"><a href="#L-953"><span class="linenos"> 953</span></a>
</span><span id="L-954"><a href="#L-954"><span class="linenos"> 954</span></a> <span class="nd">@staticmethod</span>
</span><span id="L-955"><a href="#L-955"><span class="linenos"> 955</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_shared_state_pickle</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.pickle&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-956"><a href="#L-956"><span class="linenos"> 956</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-957"><a href="#L-957"><span class="linenos"> 957</span></a><span class="sd"> Get the state in the shared folder using pickle</span>
</span><span id="L-958"><a href="#L-958"><span class="linenos"> 958</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-959"><a href="#L-959"><span class="linenos"> 959</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">pickle</span>
</span><span id="L-960"><a href="#L-960"><span class="linenos"> 960</span></a>
</span><span id="L-961"><a href="#L-961"><span class="linenos"> 961</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">handle</span><span class="p">:</span>
</span><span id="L-962"><a href="#L-962"><span class="linenos"> 962</span></a> <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">handle</span><span class="p">)</span>
</span><span id="L-963"><a href="#L-963"><span class="linenos"> 963</span></a>
</span><span id="L-964"><a href="#L-964"><span class="linenos"> 964</span></a> <span class="nd">@staticmethod</span>
</span><span id="L-965"><a href="#L-965"><span class="linenos"> 965</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_shared_state</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.json&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-966"><a href="#L-966"><span class="linenos"> 966</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-967"><a href="#L-967"><span class="linenos"> 967</span></a><span class="sd"> Set the state in the shared folder using pickle</span>
</span><span id="L-968"><a href="#L-968"><span class="linenos"> 968</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-969"><a href="#L-969"><span class="linenos"> 969</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
</span><span id="L-970"><a href="#L-970"><span class="linenos"> 970</span></a>
</span><span id="L-971"><a href="#L-971"><span class="linenos"> 971</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</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="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="L-972"><a href="#L-972"><span class="linenos"> 972</span></a> <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
</span><span id="L-973"><a href="#L-973"><span class="linenos"> 973</span></a>
</span><span id="L-974"><a href="#L-974"><span class="linenos"> 974</span></a> <span class="nd">@staticmethod</span>
</span><span id="L-975"><a href="#L-975"><span class="linenos"> 975</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_shared_state</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.json&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-976"><a href="#L-976"><span class="linenos"> 976</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-977"><a href="#L-977"><span class="linenos"> 977</span></a><span class="sd"> Get the state in the shared folder using pickle</span>
</span><span id="L-978"><a href="#L-978"><span class="linenos"> 978</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-979"><a href="#L-979"><span class="linenos"> 979</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
</span><span id="L-980"><a href="#L-980"><span class="linenos"> 980</span></a>
</span><span id="L-981"><a href="#L-981"><span class="linenos"> 981</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;r&quot;</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="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="L-982"><a href="#L-982"><span class="linenos"> 982</span></a> <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span id="L-983"><a href="#L-983"><span class="linenos"> 983</span></a>
</span><span id="L-984"><a href="#L-984"><span class="linenos"> 984</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_resume_urls</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="L-985"><a href="#L-985"><span class="linenos"> 985</span></a> <span class="n">nonce</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1000000000</span><span class="p">)</span>
</span><span id="L-986"><a href="#L-986"><span class="linenos"> 986</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;NO_ID&quot;</span>
</span><span id="L-987"><a href="#L-987"><span class="linenos"> 987</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-988"><a href="#L-988"><span class="linenos"> 988</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/resume_urls/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">nonce</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-989"><a href="#L-989"><span class="linenos"> 989</span></a> <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;approver&quot;</span><span class="p">:</span> <span class="n">approver</span><span class="p">},</span>
</span><span id="L-990"><a href="#L-990"><span class="linenos"> 990</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-991"><a href="#L-991"><span class="linenos"> 991</span></a>
</span><span id="L-992"><a href="#L-992"><span class="linenos"> 992</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">request_interactive_slack_approval</span><span class="p">(</span>
</span><span id="L-993"><a href="#L-993"><span class="linenos"> 993</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-994"><a href="#L-994"><span class="linenos"> 994</span></a> <span class="n">slack_resource_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-995"><a href="#L-995"><span class="linenos"> 995</span></a> <span class="n">channel_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-996"><a href="#L-996"><span class="linenos"> 996</span></a> <span class="n">message</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-997"><a href="#L-997"><span class="linenos"> 997</span></a> <span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-998"><a href="#L-998"><span class="linenos"> 998</span></a> <span class="n">default_args_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-999"><a href="#L-999"><span class="linenos"> 999</span></a> <span class="n">dynamic_enums_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1000"><a href="#L-1000"><span class="linenos">1000</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1001"><a href="#L-1001"><span class="linenos">1001</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1002"><a href="#L-1002"><span class="linenos">1002</span></a><span class="sd"> Sends an interactive approval request via Slack, allowing optional customization of the message, approver, and form fields.</span>
</span><span id="L-1003"><a href="#L-1003"><span class="linenos">1003</span></a>
</span><span id="L-1004"><a href="#L-1004"><span class="linenos">1004</span></a><span class="sd"> **[Enterprise Edition Only]** To include form fields in the Slack approval request, use the &quot;Advanced -&gt; Suspend -&gt; Form&quot; functionality.</span>
</span><span id="L-1005"><a href="#L-1005"><span class="linenos">1005</span></a><span class="sd"> Learn more at: https://www.windmill.dev/docs/flows/flow_approval#form</span>
</span><span id="L-1006"><a href="#L-1006"><span class="linenos">1006</span></a>
</span><span id="L-1007"><a href="#L-1007"><span class="linenos">1007</span></a><span class="sd"> :param slack_resource_path: The path to the Slack resource in Windmill.</span>
</span><span id="L-1008"><a href="#L-1008"><span class="linenos">1008</span></a><span class="sd"> :type slack_resource_path: str</span>
</span><span id="L-1009"><a href="#L-1009"><span class="linenos">1009</span></a><span class="sd"> :param channel_id: The Slack channel ID where the approval request will be sent.</span>
</span><span id="L-1010"><a href="#L-1010"><span class="linenos">1010</span></a><span class="sd"> :type channel_id: str</span>
</span><span id="L-1011"><a href="#L-1011"><span class="linenos">1011</span></a><span class="sd"> :param message: Optional custom message to include in the Slack approval request.</span>
</span><span id="L-1012"><a href="#L-1012"><span class="linenos">1012</span></a><span class="sd"> :type message: str, optional</span>
</span><span id="L-1013"><a href="#L-1013"><span class="linenos">1013</span></a><span class="sd"> :param approver: Optional user ID or name of the approver for the request.</span>
</span><span id="L-1014"><a href="#L-1014"><span class="linenos">1014</span></a><span class="sd"> :type approver: str, optional</span>
</span><span id="L-1015"><a href="#L-1015"><span class="linenos">1015</span></a><span class="sd"> :param default_args_json: Optional dictionary defining or overriding the default arguments for form fields.</span>
</span><span id="L-1016"><a href="#L-1016"><span class="linenos">1016</span></a><span class="sd"> :type default_args_json: dict, optional</span>
</span><span id="L-1017"><a href="#L-1017"><span class="linenos">1017</span></a><span class="sd"> :param dynamic_enums_json: Optional dictionary overriding the enum default values of enum form fields.</span>
</span><span id="L-1018"><a href="#L-1018"><span class="linenos">1018</span></a><span class="sd"> :type dynamic_enums_json: dict, optional</span>
</span><span id="L-1019"><a href="#L-1019"><span class="linenos">1019</span></a>
</span><span id="L-1020"><a href="#L-1020"><span class="linenos">1020</span></a><span class="sd"> :raises Exception: If the function is not called within a flow or flow preview.</span>
</span><span id="L-1021"><a href="#L-1021"><span class="linenos">1021</span></a><span class="sd"> :raises Exception: If the required flow job or flow step environment variables are not set.</span>
</span><span id="L-1022"><a href="#L-1022"><span class="linenos">1022</span></a>
</span><span id="L-1023"><a href="#L-1023"><span class="linenos">1023</span></a><span class="sd"> :return: None</span>
</span><span id="L-1024"><a href="#L-1024"><span class="linenos">1024</span></a>
</span><span id="L-1025"><a href="#L-1025"><span class="linenos">1025</span></a><span class="sd"> **Usage Example:**</span>
</span><span id="L-1026"><a href="#L-1026"><span class="linenos">1026</span></a><span class="sd"> &gt;&gt;&gt; client.request_interactive_slack_approval(</span>
</span><span id="L-1027"><a href="#L-1027"><span class="linenos">1027</span></a><span class="sd"> ... slack_resource_path=&quot;/u/alex/my_slack_resource&quot;,</span>
</span><span id="L-1028"><a href="#L-1028"><span class="linenos">1028</span></a><span class="sd"> ... channel_id=&quot;admins-slack-channel&quot;,</span>
</span><span id="L-1029"><a href="#L-1029"><span class="linenos">1029</span></a><span class="sd"> ... message=&quot;Please approve this request&quot;,</span>
</span><span id="L-1030"><a href="#L-1030"><span class="linenos">1030</span></a><span class="sd"> ... approver=&quot;approver123&quot;,</span>
</span><span id="L-1031"><a href="#L-1031"><span class="linenos">1031</span></a><span class="sd"> ... default_args_json={&quot;key1&quot;: &quot;value1&quot;, &quot;key2&quot;: 42},</span>
</span><span id="L-1032"><a href="#L-1032"><span class="linenos">1032</span></a><span class="sd"> ... dynamic_enums_json={&quot;foo&quot;: [&quot;choice1&quot;, &quot;choice2&quot;], &quot;bar&quot;: [&quot;optionA&quot;, &quot;optionB&quot;]},</span>
</span><span id="L-1033"><a href="#L-1033"><span class="linenos">1033</span></a><span class="sd"> ... )</span>
</span><span id="L-1034"><a href="#L-1034"><span class="linenos">1034</span></a>
</span><span id="L-1035"><a href="#L-1035"><span class="linenos">1035</span></a><span class="sd"> **Notes:**</span>
</span><span id="L-1036"><a href="#L-1036"><span class="linenos">1036</span></a><span class="sd"> - This function must be executed within a Windmill flow or flow preview.</span>
</span><span id="L-1037"><a href="#L-1037"><span class="linenos">1037</span></a><span class="sd"> - The function checks for required environment variables (`WM_FLOW_JOB_ID`, `WM_FLOW_STEP_ID`) to ensure it is run in the appropriate context.</span>
</span><span id="L-1038"><a href="#L-1038"><span class="linenos">1038</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1039"><a href="#L-1039"><span class="linenos">1039</span></a> <span class="n">workspace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">workspace</span>
</span><span id="L-1040"><a href="#L-1040"><span class="linenos">1040</span></a> <span class="n">flow_job_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="L-1041"><a href="#L-1041"><span class="linenos">1041</span></a>
</span><span id="L-1042"><a href="#L-1042"><span class="linenos">1042</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">flow_job_id</span><span class="p">:</span>
</span><span id="L-1043"><a href="#L-1043"><span class="linenos">1043</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="L-1044"><a href="#L-1044"><span class="linenos">1044</span></a> <span class="s2">&quot;You can&#39;t use &#39;request_interactive_slack_approval&#39; function in a standalone script or flow step preview. Please use it in a flow or a flow preview.&quot;</span>
</span><span id="L-1045"><a href="#L-1045"><span class="linenos">1045</span></a> <span class="p">)</span>
</span><span id="L-1046"><a href="#L-1046"><span class="linenos">1046</span></a>
</span><span id="L-1047"><a href="#L-1047"><span class="linenos">1047</span></a> <span class="c1"># Only include non-empty parameters</span>
</span><span id="L-1048"><a href="#L-1048"><span class="linenos">1048</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-1049"><a href="#L-1049"><span class="linenos">1049</span></a> <span class="k">if</span> <span class="n">message</span><span class="p">:</span>
</span><span id="L-1050"><a href="#L-1050"><span class="linenos">1050</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;message&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">message</span>
</span><span id="L-1051"><a href="#L-1051"><span class="linenos">1051</span></a> <span class="k">if</span> <span class="n">approver</span><span class="p">:</span>
</span><span id="L-1052"><a href="#L-1052"><span class="linenos">1052</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;approver&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">approver</span>
</span><span id="L-1053"><a href="#L-1053"><span class="linenos">1053</span></a> <span class="k">if</span> <span class="n">slack_resource_path</span><span class="p">:</span>
</span><span id="L-1054"><a href="#L-1054"><span class="linenos">1054</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;slack_resource_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">slack_resource_path</span>
</span><span id="L-1055"><a href="#L-1055"><span class="linenos">1055</span></a> <span class="k">if</span> <span class="n">channel_id</span><span class="p">:</span>
</span><span id="L-1056"><a href="#L-1056"><span class="linenos">1056</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;channel_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel_id</span>
</span><span id="L-1057"><a href="#L-1057"><span class="linenos">1057</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_STEP_ID&quot;</span><span class="p">):</span>
</span><span id="L-1058"><a href="#L-1058"><span class="linenos">1058</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;flow_step_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_STEP_ID&quot;</span><span class="p">)</span>
</span><span id="L-1059"><a href="#L-1059"><span class="linenos">1059</span></a> <span class="k">if</span> <span class="n">default_args_json</span><span class="p">:</span>
</span><span id="L-1060"><a href="#L-1060"><span class="linenos">1060</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;default_args_json&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">default_args_json</span><span class="p">)</span>
</span><span id="L-1061"><a href="#L-1061"><span class="linenos">1061</span></a> <span class="k">if</span> <span class="n">dynamic_enums_json</span><span class="p">:</span>
</span><span id="L-1062"><a href="#L-1062"><span class="linenos">1062</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;dynamic_enums_json&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">dynamic_enums_json</span><span class="p">)</span>
</span><span id="L-1063"><a href="#L-1063"><span class="linenos">1063</span></a>
</span><span id="L-1064"><a href="#L-1064"><span class="linenos">1064</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-1065"><a href="#L-1065"><span class="linenos">1065</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/slack_approval/</span><span class="si">{</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;WM_JOB_ID&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;NO_JOB_ID&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-1066"><a href="#L-1066"><span class="linenos">1066</span></a> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span>
</span><span id="L-1067"><a href="#L-1067"><span class="linenos">1067</span></a> <span class="p">)</span>
</span><span id="L-1068"><a href="#L-1068"><span class="linenos">1068</span></a>
</span><span id="L-1069"><a href="#L-1069"><span class="linenos">1069</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">username_to_email</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</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-1070"><a href="#L-1070"><span class="linenos">1070</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1071"><a href="#L-1071"><span class="linenos">1071</span></a><span class="sd"> Get email from workspace username</span>
</span><span id="L-1072"><a href="#L-1072"><span class="linenos">1072</span></a><span class="sd"> This method is particularly useful for apps that require the email address of the viewer.</span>
</span><span id="L-1073"><a href="#L-1073"><span class="linenos">1073</span></a><span class="sd"> Indeed, in the viewer context WM_USERNAME is set to the username of the viewer but WM_EMAIL is set to the email of the creator of the app.</span>
</span><span id="L-1074"><a href="#L-1074"><span class="linenos">1074</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1075"><a href="#L-1075"><span class="linenos">1075</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/users/username_to_email/</span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="L-1076"><a href="#L-1076"><span class="linenos">1076</span></a>
</span><span id="L-1077"><a href="#L-1077"><span class="linenos">1077</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">send_teams_message</span><span class="p">(</span>
</span><span id="L-1078"><a href="#L-1078"><span class="linenos">1078</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-1079"><a href="#L-1079"><span class="linenos">1079</span></a> <span class="n">conversation_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1080"><a href="#L-1080"><span class="linenos">1080</span></a> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1081"><a href="#L-1081"><span class="linenos">1081</span></a> <span class="n">success</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1082"><a href="#L-1082"><span class="linenos">1082</span></a> <span class="n">card_block</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1083"><a href="#L-1083"><span class="linenos">1083</span></a> <span class="p">):</span>
</span><span id="L-1084"><a href="#L-1084"><span class="linenos">1084</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1085"><a href="#L-1085"><span class="linenos">1085</span></a><span class="sd"> Send a message to a Microsoft Teams conversation with conversation_id, where success is used to style the message</span>
</span><span id="L-1086"><a href="#L-1086"><span class="linenos">1086</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1087"><a href="#L-1087"><span class="linenos">1087</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-1088"><a href="#L-1088"><span class="linenos">1088</span></a> <span class="sa">f</span><span class="s2">&quot;/teams/activities&quot;</span><span class="p">,</span>
</span><span id="L-1089"><a href="#L-1089"><span class="linenos">1089</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="L-1090"><a href="#L-1090"><span class="linenos">1090</span></a> <span class="s2">&quot;conversation_id&quot;</span><span class="p">:</span> <span class="n">conversation_id</span><span class="p">,</span>
</span><span id="L-1091"><a href="#L-1091"><span class="linenos">1091</span></a> <span class="s2">&quot;text&quot;</span><span class="p">:</span> <span class="n">text</span><span class="p">,</span>
</span><span id="L-1092"><a href="#L-1092"><span class="linenos">1092</span></a> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="n">success</span><span class="p">,</span>
</span><span id="L-1093"><a href="#L-1093"><span class="linenos">1093</span></a> <span class="s2">&quot;card_block&quot;</span><span class="p">:</span> <span class="n">card_block</span><span class="p">,</span>
</span><span id="L-1094"><a href="#L-1094"><span class="linenos">1094</span></a> <span class="p">},</span>
</span><span id="L-1095"><a href="#L-1095"><span class="linenos">1095</span></a> <span class="p">)</span>
</span><span id="L-1096"><a href="#L-1096"><span class="linenos">1096</span></a>
</span><span id="L-1097"><a href="#L-1097"><span class="linenos">1097</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">datatable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;main&quot;</span><span class="p">):</span>
</span><span id="L-1098"><a href="#L-1098"><span class="linenos">1098</span></a> <span class="k">return</span> <span class="n">DataTableClient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
</span><span id="L-1099"><a href="#L-1099"><span class="linenos">1099</span></a>
</span><span id="L-1100"><a href="#L-1100"><span class="linenos">1100</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">ducklake</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;main&quot;</span><span class="p">):</span>
</span><span id="L-1101"><a href="#L-1101"><span class="linenos">1101</span></a> <span class="k">return</span> <span class="n">DucklakeClient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
</span><span id="L-1102"><a href="#L-1102"><span class="linenos">1102</span></a>
</span><span id="L-1103"><a href="#L-1103"><span class="linenos">1103</span></a>
</span><span id="L-1104"><a href="#L-1104"><span class="linenos">1104</span></a>
</span><span id="L-1105"><a href="#L-1105"><span class="linenos">1105</span></a><span class="k">def</span><span class="w"> </span><span class="nf">init_global_client</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-1106"><a href="#L-1106"><span class="linenos">1106</span></a> <span class="nd">@functools</span><span class="o">.</span><span class="n">wraps</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span id="L-1107"><a href="#L-1107"><span class="linenos">1107</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-1108"><a href="#L-1108"><span class="linenos">1108</span></a> <span class="k">global</span> <span class="n">_client</span>
</span><span id="L-1109"><a href="#L-1109"><span class="linenos">1109</span></a> <span class="k">if</span> <span class="n">_client</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1110"><a href="#L-1110"><span class="linenos">1110</span></a> <span class="n">_client</span> <span class="o">=</span> <span class="n">Windmill</span><span class="p">()</span>
</span><span id="L-1111"><a href="#L-1111"><span class="linenos">1111</span></a> <span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="L-1112"><a href="#L-1112"><span class="linenos">1112</span></a>
</span><span id="L-1113"><a href="#L-1113"><span class="linenos">1113</span></a> <span class="k">return</span> <span class="n">wrapper</span>
</span><span id="L-1114"><a href="#L-1114"><span class="linenos">1114</span></a>
</span><span id="L-1115"><a href="#L-1115"><span class="linenos">1115</span></a>
</span><span id="L-1116"><a href="#L-1116"><span class="linenos">1116</span></a><span class="k">def</span><span class="w"> </span><span class="nf">deprecate</span><span class="p">(</span><span class="n">in_favor_of</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-1117"><a href="#L-1117"><span class="linenos">1117</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-1118"><a href="#L-1118"><span class="linenos">1118</span></a> <span class="nd">@functools</span><span class="o">.</span><span class="n">wraps</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span id="L-1119"><a href="#L-1119"><span class="linenos">1119</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-1120"><a href="#L-1120"><span class="linenos">1120</span></a> <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
</span><span id="L-1121"><a href="#L-1121"><span class="linenos">1121</span></a> <span class="p">(</span>
</span><span id="L-1122"><a href="#L-1122"><span class="linenos">1122</span></a> <span class="sa">f</span><span class="s2">&quot;The &#39;</span><span class="si">{</span><span class="n">f</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">&#39; method is deprecated and may be removed in the future. &quot;</span>
</span><span id="L-1123"><a href="#L-1123"><span class="linenos">1123</span></a> <span class="sa">f</span><span class="s2">&quot;Consider </span><span class="si">{</span><span class="n">in_favor_of</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-1124"><a href="#L-1124"><span class="linenos">1124</span></a> <span class="p">),</span>
</span><span id="L-1125"><a href="#L-1125"><span class="linenos">1125</span></a> <span class="ne">DeprecationWarning</span><span class="p">,</span>
</span><span id="L-1126"><a href="#L-1126"><span class="linenos">1126</span></a> <span class="p">)</span>
</span><span id="L-1127"><a href="#L-1127"><span class="linenos">1127</span></a> <span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="L-1128"><a href="#L-1128"><span class="linenos">1128</span></a>
</span><span id="L-1129"><a href="#L-1129"><span class="linenos">1129</span></a> <span class="k">return</span> <span class="n">wrapper</span>
</span><span id="L-1130"><a href="#L-1130"><span class="linenos">1130</span></a>
</span><span id="L-1131"><a href="#L-1131"><span class="linenos">1131</span></a> <span class="k">return</span> <span class="n">decorator</span>
</span><span id="L-1132"><a href="#L-1132"><span class="linenos">1132</span></a>
</span><span id="L-1133"><a href="#L-1133"><span class="linenos">1133</span></a>
</span><span id="L-1134"><a href="#L-1134"><span class="linenos">1134</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1135"><a href="#L-1135"><span class="linenos">1135</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_workspace</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-1136"><a href="#L-1136"><span class="linenos">1136</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">workspace</span>
</span><span id="L-1137"><a href="#L-1137"><span class="linenos">1137</span></a>
</span><span id="L-1138"><a href="#L-1138"><span class="linenos">1138</span></a>
</span><span id="L-1139"><a href="#L-1139"><span class="linenos">1139</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1140"><a href="#L-1140"><span class="linenos">1140</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_root_job_id</span><span class="p">(</span><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-1141"><a href="#L-1141"><span class="linenos">1141</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_root_job_id</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span><span id="L-1142"><a href="#L-1142"><span class="linenos">1142</span></a>
</span><span id="L-1143"><a href="#L-1143"><span class="linenos">1143</span></a>
</span><span id="L-1144"><a href="#L-1144"><span class="linenos">1144</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1145"><a href="#L-1145"><span class="linenos">1145</span></a><span class="nd">@deprecate</span><span class="p">(</span><span class="s2">&quot;Windmill().version&quot;</span><span class="p">)</span>
</span><span id="L-1146"><a href="#L-1146"><span class="linenos">1146</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_version</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-1147"><a href="#L-1147"><span class="linenos">1147</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">version</span>
</span><span id="L-1148"><a href="#L-1148"><span class="linenos">1148</span></a>
</span><span id="L-1149"><a href="#L-1149"><span class="linenos">1149</span></a>
</span><span id="L-1150"><a href="#L-1150"><span class="linenos">1150</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1151"><a href="#L-1151"><span class="linenos">1151</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_async</span><span class="p">(</span>
</span><span id="L-1152"><a href="#L-1152"><span class="linenos">1152</span></a> <span class="n">hash_or_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1153"><a href="#L-1153"><span class="linenos">1153</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1154"><a href="#L-1154"><span class="linenos">1154</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1155"><a href="#L-1155"><span class="linenos">1155</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-1156"><a href="#L-1156"><span class="linenos">1156</span></a> <span class="n">is_path</span> <span class="o">=</span> <span class="s2">&quot;/&quot;</span> <span class="ow">in</span> <span class="n">hash_or_path</span>
</span><span id="L-1157"><a href="#L-1157"><span class="linenos">1157</span></a> <span class="n">hash_</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="n">is_path</span> <span class="k">else</span> <span class="n">hash_or_path</span>
</span><span id="L-1158"><a href="#L-1158"><span class="linenos">1158</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">hash_or_path</span> <span class="k">if</span> <span class="n">is_path</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="L-1159"><a href="#L-1159"><span class="linenos">1159</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script_async</span><span class="p">(</span>
</span><span id="L-1160"><a href="#L-1160"><span class="linenos">1160</span></a> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span>
</span><span id="L-1161"><a href="#L-1161"><span class="linenos">1161</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="L-1162"><a href="#L-1162"><span class="linenos">1162</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-1163"><a href="#L-1163"><span class="linenos">1163</span></a> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">,</span>
</span><span id="L-1164"><a href="#L-1164"><span class="linenos">1164</span></a> <span class="p">)</span>
</span><span id="L-1165"><a href="#L-1165"><span class="linenos">1165</span></a>
</span><span id="L-1166"><a href="#L-1166"><span class="linenos">1166</span></a>
</span><span id="L-1167"><a href="#L-1167"><span class="linenos">1167</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1168"><a href="#L-1168"><span class="linenos">1168</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_flow_async</span><span class="p">(</span>
</span><span id="L-1169"><a href="#L-1169"><span class="linenos">1169</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1170"><a href="#L-1170"><span class="linenos">1170</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1171"><a href="#L-1171"><span class="linenos">1171</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1172"><a href="#L-1172"><span class="linenos">1172</span></a> <span class="c1"># can only be set to false if this the job will be fully await and not concurrent with any other job</span>
</span><span id="L-1173"><a href="#L-1173"><span class="linenos">1173</span></a> <span class="c1"># as otherwise the child flow and its own child will store their state in the parent job which will</span>
</span><span id="L-1174"><a href="#L-1174"><span class="linenos">1174</span></a> <span class="c1"># lead to incorrectness and failures</span>
</span><span id="L-1175"><a href="#L-1175"><span class="linenos">1175</span></a> <span class="n">do_not_track_in_parent</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1176"><a href="#L-1176"><span class="linenos">1176</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-1177"><a href="#L-1177"><span class="linenos">1177</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_flow_async</span><span class="p">(</span>
</span><span id="L-1178"><a href="#L-1178"><span class="linenos">1178</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="L-1179"><a href="#L-1179"><span class="linenos">1179</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-1180"><a href="#L-1180"><span class="linenos">1180</span></a> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">,</span>
</span><span id="L-1181"><a href="#L-1181"><span class="linenos">1181</span></a> <span class="n">do_not_track_in_parent</span><span class="o">=</span><span class="n">do_not_track_in_parent</span><span class="p">,</span>
</span><span id="L-1182"><a href="#L-1182"><span class="linenos">1182</span></a> <span class="p">)</span>
</span><span id="L-1183"><a href="#L-1183"><span class="linenos">1183</span></a>
</span><span id="L-1184"><a href="#L-1184"><span class="linenos">1184</span></a>
</span><span id="L-1185"><a href="#L-1185"><span class="linenos">1185</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1186"><a href="#L-1186"><span class="linenos">1186</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_sync</span><span class="p">(</span>
</span><span id="L-1187"><a href="#L-1187"><span class="linenos">1187</span></a> <span class="nb">hash</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1188"><a href="#L-1188"><span class="linenos">1188</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1189"><a href="#L-1189"><span class="linenos">1189</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-1190"><a href="#L-1190"><span class="linenos">1190</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1191"><a href="#L-1191"><span class="linenos">1191</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1192"><a href="#L-1192"><span class="linenos">1192</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1193"><a href="#L-1193"><span class="linenos">1193</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-1194"><a href="#L-1194"><span class="linenos">1194</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script</span><span class="p">(</span>
</span><span id="L-1195"><a href="#L-1195"><span class="linenos">1195</span></a> <span class="n">hash_</span><span class="o">=</span><span class="nb">hash</span><span class="p">,</span>
</span><span id="L-1196"><a href="#L-1196"><span class="linenos">1196</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-1197"><a href="#L-1197"><span class="linenos">1197</span></a> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="L-1198"><a href="#L-1198"><span class="linenos">1198</span></a> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span><span class="p">,</span>
</span><span id="L-1199"><a href="#L-1199"><span class="linenos">1199</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span>
</span><span id="L-1200"><a href="#L-1200"><span class="linenos">1200</span></a> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span>
</span><span id="L-1201"><a href="#L-1201"><span class="linenos">1201</span></a> <span class="p">)</span>
</span><span id="L-1202"><a href="#L-1202"><span class="linenos">1202</span></a>
</span><span id="L-1203"><a href="#L-1203"><span class="linenos">1203</span></a>
</span><span id="L-1204"><a href="#L-1204"><span class="linenos">1204</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1205"><a href="#L-1205"><span class="linenos">1205</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_path_async</span><span class="p">(</span>
</span><span id="L-1206"><a href="#L-1206"><span class="linenos">1206</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1207"><a href="#L-1207"><span class="linenos">1207</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1208"><a href="#L-1208"><span class="linenos">1208</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1209"><a href="#L-1209"><span class="linenos">1209</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-1210"><a href="#L-1210"><span class="linenos">1210</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script_by_path_async</span><span class="p">(</span>
</span><span id="L-1211"><a href="#L-1211"><span class="linenos">1211</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="L-1212"><a href="#L-1212"><span class="linenos">1212</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-1213"><a href="#L-1213"><span class="linenos">1213</span></a> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">,</span>
</span><span id="L-1214"><a href="#L-1214"><span class="linenos">1214</span></a> <span class="p">)</span>
</span><span id="L-1215"><a href="#L-1215"><span class="linenos">1215</span></a>
</span><span id="L-1216"><a href="#L-1216"><span class="linenos">1216</span></a>
</span><span id="L-1217"><a href="#L-1217"><span class="linenos">1217</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1218"><a href="#L-1218"><span class="linenos">1218</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_hash_async</span><span class="p">(</span>
</span><span id="L-1219"><a href="#L-1219"><span class="linenos">1219</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1220"><a href="#L-1220"><span class="linenos">1220</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1221"><a href="#L-1221"><span class="linenos">1221</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1222"><a href="#L-1222"><span class="linenos">1222</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-1223"><a href="#L-1223"><span class="linenos">1223</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script_by_hash_async</span><span class="p">(</span>
</span><span id="L-1224"><a href="#L-1224"><span class="linenos">1224</span></a> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span>
</span><span id="L-1225"><a href="#L-1225"><span class="linenos">1225</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-1226"><a href="#L-1226"><span class="linenos">1226</span></a> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">,</span>
</span><span id="L-1227"><a href="#L-1227"><span class="linenos">1227</span></a> <span class="p">)</span>
</span><span id="L-1228"><a href="#L-1228"><span class="linenos">1228</span></a>
</span><span id="L-1229"><a href="#L-1229"><span class="linenos">1229</span></a>
</span><span id="L-1230"><a href="#L-1230"><span class="linenos">1230</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1231"><a href="#L-1231"><span class="linenos">1231</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_path_sync</span><span class="p">(</span>
</span><span id="L-1232"><a href="#L-1232"><span class="linenos">1232</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1233"><a href="#L-1233"><span class="linenos">1233</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1234"><a href="#L-1234"><span class="linenos">1234</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-1235"><a href="#L-1235"><span class="linenos">1235</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1236"><a href="#L-1236"><span class="linenos">1236</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1237"><a href="#L-1237"><span class="linenos">1237</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1238"><a href="#L-1238"><span class="linenos">1238</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-1239"><a href="#L-1239"><span class="linenos">1239</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script</span><span class="p">(</span>
</span><span id="L-1240"><a href="#L-1240"><span class="linenos">1240</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="L-1241"><a href="#L-1241"><span class="linenos">1241</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-1242"><a href="#L-1242"><span class="linenos">1242</span></a> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="L-1243"><a href="#L-1243"><span class="linenos">1243</span></a> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span><span class="p">,</span>
</span><span id="L-1244"><a href="#L-1244"><span class="linenos">1244</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span>
</span><span id="L-1245"><a href="#L-1245"><span class="linenos">1245</span></a> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span>
</span><span id="L-1246"><a href="#L-1246"><span class="linenos">1246</span></a> <span class="p">)</span>
</span><span id="L-1247"><a href="#L-1247"><span class="linenos">1247</span></a>
</span><span id="L-1248"><a href="#L-1248"><span class="linenos">1248</span></a>
</span><span id="L-1249"><a href="#L-1249"><span class="linenos">1249</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1250"><a href="#L-1250"><span class="linenos">1250</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_id_token</span><span class="p">(</span><span class="n">audience</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-1251"><a href="#L-1251"><span class="linenos">1251</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1252"><a href="#L-1252"><span class="linenos">1252</span></a><span class="sd"> Get a JWT token for the given audience for OIDC purposes to login into third parties like AWS, Vault, GCP, etc.</span>
</span><span id="L-1253"><a href="#L-1253"><span class="linenos">1253</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1254"><a href="#L-1254"><span class="linenos">1254</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_id_token</span><span class="p">(</span><span class="n">audience</span><span class="p">)</span>
</span><span id="L-1255"><a href="#L-1255"><span class="linenos">1255</span></a>
</span><span id="L-1256"><a href="#L-1256"><span class="linenos">1256</span></a>
</span><span id="L-1257"><a href="#L-1257"><span class="linenos">1257</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1258"><a href="#L-1258"><span class="linenos">1258</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_job_status</span><span class="p">(</span><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">JobStatus</span><span class="p">:</span>
</span><span id="L-1259"><a href="#L-1259"><span class="linenos">1259</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_job_status</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span><span id="L-1260"><a href="#L-1260"><span class="linenos">1260</span></a>
</span><span id="L-1261"><a href="#L-1261"><span class="linenos">1261</span></a>
</span><span id="L-1262"><a href="#L-1262"><span class="linenos">1262</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1263"><a href="#L-1263"><span class="linenos">1263</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_result</span><span class="p">(</span><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
</span><span id="L-1264"><a href="#L-1264"><span class="linenos">1264</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_result</span><span class="p">(</span>
</span><span id="L-1265"><a href="#L-1265"><span class="linenos">1265</span></a> <span class="n">job_id</span><span class="o">=</span><span class="n">job_id</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span>
</span><span id="L-1266"><a href="#L-1266"><span class="linenos">1266</span></a> <span class="p">)</span>
</span><span id="L-1267"><a href="#L-1267"><span class="linenos">1267</span></a>
</span><span id="L-1268"><a href="#L-1268"><span class="linenos">1268</span></a>
</span><span id="L-1269"><a href="#L-1269"><span class="linenos">1269</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1270"><a href="#L-1270"><span class="linenos">1270</span></a><span class="k">def</span><span class="w"> </span><span class="nf">duckdb_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</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="n">DuckDbConnectionSettings</span><span class="p">:</span>
</span><span id="L-1271"><a href="#L-1271"><span class="linenos">1271</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1272"><a href="#L-1272"><span class="linenos">1272</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="L-1273"><a href="#L-1273"><span class="linenos">1273</span></a><span class="sd"> initiate an S3 connection from DuckDB</span>
</span><span id="L-1274"><a href="#L-1274"><span class="linenos">1274</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1275"><a href="#L-1275"><span class="linenos">1275</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_duckdb_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span>
</span><span id="L-1276"><a href="#L-1276"><span class="linenos">1276</span></a>
</span><span id="L-1277"><a href="#L-1277"><span class="linenos">1277</span></a>
</span><span id="L-1278"><a href="#L-1278"><span class="linenos">1278</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1279"><a href="#L-1279"><span class="linenos">1279</span></a><span class="k">def</span><span class="w"> </span><span class="nf">polars_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</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="n">PolarsConnectionSettings</span><span class="p">:</span>
</span><span id="L-1280"><a href="#L-1280"><span class="linenos">1280</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1281"><a href="#L-1281"><span class="linenos">1281</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="L-1282"><a href="#L-1282"><span class="linenos">1282</span></a><span class="sd"> initiate an S3 connection from Polars</span>
</span><span id="L-1283"><a href="#L-1283"><span class="linenos">1283</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1284"><a href="#L-1284"><span class="linenos">1284</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_polars_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span>
</span><span id="L-1285"><a href="#L-1285"><span class="linenos">1285</span></a>
</span><span id="L-1286"><a href="#L-1286"><span class="linenos">1286</span></a>
</span><span id="L-1287"><a href="#L-1287"><span class="linenos">1287</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1288"><a href="#L-1288"><span class="linenos">1288</span></a><span class="k">def</span><span class="w"> </span><span class="nf">boto3_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</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="n">Boto3ConnectionSettings</span><span class="p">:</span>
</span><span id="L-1289"><a href="#L-1289"><span class="linenos">1289</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1290"><a href="#L-1290"><span class="linenos">1290</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="L-1291"><a href="#L-1291"><span class="linenos">1291</span></a><span class="sd"> initiate an S3 connection using boto3</span>
</span><span id="L-1292"><a href="#L-1292"><span class="linenos">1292</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1293"><a href="#L-1293"><span class="linenos">1293</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_boto3_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span>
</span><span id="L-1294"><a href="#L-1294"><span class="linenos">1294</span></a>
</span><span id="L-1295"><a href="#L-1295"><span class="linenos">1295</span></a>
</span><span id="L-1296"><a href="#L-1296"><span class="linenos">1296</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1297"><a href="#L-1297"><span class="linenos">1297</span></a><span class="k">def</span><span class="w"> </span><span class="nf">load_s3_file</span><span class="p">(</span><span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bytes</span><span class="p">:</span>
</span><span id="L-1298"><a href="#L-1298"><span class="linenos">1298</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1299"><a href="#L-1299"><span class="linenos">1299</span></a><span class="sd"> Load the entire content of a file stored in S3 as bytes</span>
</span><span id="L-1300"><a href="#L-1300"><span class="linenos">1300</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1301"><a href="#L-1301"><span class="linenos">1301</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">load_s3_file</span><span class="p">(</span>
</span><span id="L-1302"><a href="#L-1302"><span class="linenos">1302</span></a> <span class="n">s3object</span><span class="p">,</span> <span class="n">s3_resource_path</span> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="L-1303"><a href="#L-1303"><span class="linenos">1303</span></a> <span class="p">)</span>
</span><span id="L-1304"><a href="#L-1304"><span class="linenos">1304</span></a>
</span><span id="L-1305"><a href="#L-1305"><span class="linenos">1305</span></a>
</span><span id="L-1306"><a href="#L-1306"><span class="linenos">1306</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1307"><a href="#L-1307"><span class="linenos">1307</span></a><span class="k">def</span><span class="w"> </span><span class="nf">load_s3_file_reader</span><span class="p">(</span>
</span><span id="L-1308"><a href="#L-1308"><span class="linenos">1308</span></a> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="L-1309"><a href="#L-1309"><span class="linenos">1309</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">BufferedReader</span><span class="p">:</span>
</span><span id="L-1310"><a href="#L-1310"><span class="linenos">1310</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1311"><a href="#L-1311"><span class="linenos">1311</span></a><span class="sd"> Load the content of a file stored in S3</span>
</span><span id="L-1312"><a href="#L-1312"><span class="linenos">1312</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1313"><a href="#L-1313"><span class="linenos">1313</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">load_s3_file_reader</span><span class="p">(</span>
</span><span id="L-1314"><a href="#L-1314"><span class="linenos">1314</span></a> <span class="n">s3object</span><span class="p">,</span> <span class="n">s3_resource_path</span> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="L-1315"><a href="#L-1315"><span class="linenos">1315</span></a> <span class="p">)</span>
</span><span id="L-1316"><a href="#L-1316"><span class="linenos">1316</span></a>
</span><span id="L-1317"><a href="#L-1317"><span class="linenos">1317</span></a>
</span><span id="L-1318"><a href="#L-1318"><span class="linenos">1318</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1319"><a href="#L-1319"><span class="linenos">1319</span></a><span class="k">def</span><span class="w"> </span><span class="nf">write_s3_file</span><span class="p">(</span>
</span><span id="L-1320"><a href="#L-1320"><span class="linenos">1320</span></a> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1321"><a href="#L-1321"><span class="linenos">1321</span></a> <span class="n">file_content</span><span class="p">:</span> <span class="n">BufferedReader</span> <span class="o">|</span> <span class="nb">bytes</span><span class="p">,</span>
</span><span id="L-1322"><a href="#L-1322"><span class="linenos">1322</span></a> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1323"><a href="#L-1323"><span class="linenos">1323</span></a> <span class="n">content_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1324"><a href="#L-1324"><span class="linenos">1324</span></a> <span class="n">content_disposition</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1325"><a href="#L-1325"><span class="linenos">1325</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="L-1326"><a href="#L-1326"><span class="linenos">1326</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1327"><a href="#L-1327"><span class="linenos">1327</span></a><span class="sd"> Upload a file to S3</span>
</span><span id="L-1328"><a href="#L-1328"><span class="linenos">1328</span></a>
</span><span id="L-1329"><a href="#L-1329"><span class="linenos">1329</span></a><span class="sd"> Content type will be automatically guessed from path extension if left empty</span>
</span><span id="L-1330"><a href="#L-1330"><span class="linenos">1330</span></a>
</span><span id="L-1331"><a href="#L-1331"><span class="linenos">1331</span></a><span class="sd"> See MDN for content_disposition: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition</span>
</span><span id="L-1332"><a href="#L-1332"><span class="linenos">1332</span></a><span class="sd"> and content_type: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type</span>
</span><span id="L-1333"><a href="#L-1333"><span class="linenos">1333</span></a>
</span><span id="L-1334"><a href="#L-1334"><span class="linenos">1334</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1335"><a href="#L-1335"><span class="linenos">1335</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">write_s3_file</span><span class="p">(</span>
</span><span id="L-1336"><a href="#L-1336"><span class="linenos">1336</span></a> <span class="n">s3object</span><span class="p">,</span>
</span><span id="L-1337"><a href="#L-1337"><span class="linenos">1337</span></a> <span class="n">file_content</span><span class="p">,</span>
</span><span id="L-1338"><a href="#L-1338"><span class="linenos">1338</span></a> <span class="n">s3_resource_path</span> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1339"><a href="#L-1339"><span class="linenos">1339</span></a> <span class="n">content_type</span><span class="p">,</span>
</span><span id="L-1340"><a href="#L-1340"><span class="linenos">1340</span></a> <span class="n">content_disposition</span><span class="p">,</span>
</span><span id="L-1341"><a href="#L-1341"><span class="linenos">1341</span></a> <span class="p">)</span>
</span><span id="L-1342"><a href="#L-1342"><span class="linenos">1342</span></a>
</span><span id="L-1343"><a href="#L-1343"><span class="linenos">1343</span></a>
</span><span id="L-1344"><a href="#L-1344"><span class="linenos">1344</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1345"><a href="#L-1345"><span class="linenos">1345</span></a><span class="k">def</span><span class="w"> </span><span class="nf">sign_s3_objects</span><span class="p">(</span><span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span><span class="p">]:</span>
</span><span id="L-1346"><a href="#L-1346"><span class="linenos">1346</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1347"><a href="#L-1347"><span class="linenos">1347</span></a><span class="sd"> Sign S3 objects to be used by anonymous users in public apps</span>
</span><span id="L-1348"><a href="#L-1348"><span class="linenos">1348</span></a><span class="sd"> Returns a list of signed s3 tokens</span>
</span><span id="L-1349"><a href="#L-1349"><span class="linenos">1349</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1350"><a href="#L-1350"><span class="linenos">1350</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">sign_s3_objects</span><span class="p">(</span><span class="n">s3_objects</span><span class="p">)</span>
</span><span id="L-1351"><a href="#L-1351"><span class="linenos">1351</span></a>
</span><span id="L-1352"><a href="#L-1352"><span class="linenos">1352</span></a>
</span><span id="L-1353"><a href="#L-1353"><span class="linenos">1353</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1354"><a href="#L-1354"><span class="linenos">1354</span></a><span class="k">def</span><span class="w"> </span><span class="nf">sign_s3_object</span><span class="p">(</span><span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span><span class="o">|</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="L-1355"><a href="#L-1355"><span class="linenos">1355</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1356"><a href="#L-1356"><span class="linenos">1356</span></a><span class="sd"> Sign S3 object to be used by anonymous users in public apps</span>
</span><span id="L-1357"><a href="#L-1357"><span class="linenos">1357</span></a><span class="sd"> Returns a signed s3 object</span>
</span><span id="L-1358"><a href="#L-1358"><span class="linenos">1358</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1359"><a href="#L-1359"><span class="linenos">1359</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">sign_s3_object</span><span class="p">(</span><span class="n">s3_object</span><span class="p">)</span>
</span><span id="L-1360"><a href="#L-1360"><span class="linenos">1360</span></a>
</span><span id="L-1361"><a href="#L-1361"><span class="linenos">1361</span></a>
</span><span id="L-1362"><a href="#L-1362"><span class="linenos">1362</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1363"><a href="#L-1363"><span class="linenos">1363</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_presigned_s3_public_urls</span><span class="p">(</span>
</span><span id="L-1364"><a href="#L-1364"><span class="linenos">1364</span></a> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">],</span>
</span><span id="L-1365"><a href="#L-1365"><span class="linenos">1365</span></a> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1366"><a href="#L-1366"><span class="linenos">1366</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span><span id="L-1367"><a href="#L-1367"><span class="linenos">1367</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1368"><a href="#L-1368"><span class="linenos">1368</span></a><span class="sd"> Generate presigned public URLs for an array of S3 objects.</span>
</span><span id="L-1369"><a href="#L-1369"><span class="linenos">1369</span></a><span class="sd"> If an S3 object is not signed yet, it will be signed first.</span>
</span><span id="L-1370"><a href="#L-1370"><span class="linenos">1370</span></a>
</span><span id="L-1371"><a href="#L-1371"><span class="linenos">1371</span></a><span class="sd"> Args:</span>
</span><span id="L-1372"><a href="#L-1372"><span class="linenos">1372</span></a><span class="sd"> s3_objects: List of S3 objects to sign</span>
</span><span id="L-1373"><a href="#L-1373"><span class="linenos">1373</span></a><span class="sd"> base_url: Optional base URL for the presigned URLs (defaults to WM_BASE_URL)</span>
</span><span id="L-1374"><a href="#L-1374"><span class="linenos">1374</span></a>
</span><span id="L-1375"><a href="#L-1375"><span class="linenos">1375</span></a><span class="sd"> Returns:</span>
</span><span id="L-1376"><a href="#L-1376"><span class="linenos">1376</span></a><span class="sd"> List of signed public URLs</span>
</span><span id="L-1377"><a href="#L-1377"><span class="linenos">1377</span></a>
</span><span id="L-1378"><a href="#L-1378"><span class="linenos">1378</span></a><span class="sd"> Example:</span>
</span><span id="L-1379"><a href="#L-1379"><span class="linenos">1379</span></a><span class="sd"> &gt;&gt;&gt; import wmill</span>
</span><span id="L-1380"><a href="#L-1380"><span class="linenos">1380</span></a><span class="sd"> &gt;&gt;&gt; from wmill import S3Object</span>
</span><span id="L-1381"><a href="#L-1381"><span class="linenos">1381</span></a><span class="sd"> &gt;&gt;&gt; s3_objs = [S3Object(s3=&quot;/path/to/file1.txt&quot;), S3Object(s3=&quot;/path/to/file2.txt&quot;)]</span>
</span><span id="L-1382"><a href="#L-1382"><span class="linenos">1382</span></a><span class="sd"> &gt;&gt;&gt; urls = wmill.get_presigned_s3_public_urls(s3_objs)</span>
</span><span id="L-1383"><a href="#L-1383"><span class="linenos">1383</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1384"><a href="#L-1384"><span class="linenos">1384</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_presigned_s3_public_urls</span><span class="p">(</span><span class="n">s3_objects</span><span class="p">,</span> <span class="n">base_url</span><span class="p">)</span>
</span><span id="L-1385"><a href="#L-1385"><span class="linenos">1385</span></a>
</span><span id="L-1386"><a href="#L-1386"><span class="linenos">1386</span></a>
</span><span id="L-1387"><a href="#L-1387"><span class="linenos">1387</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1388"><a href="#L-1388"><span class="linenos">1388</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_presigned_s3_public_url</span><span class="p">(</span>
</span><span id="L-1389"><a href="#L-1389"><span class="linenos">1389</span></a> <span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1390"><a href="#L-1390"><span class="linenos">1390</span></a> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1391"><a href="#L-1391"><span class="linenos">1391</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-1392"><a href="#L-1392"><span class="linenos">1392</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1393"><a href="#L-1393"><span class="linenos">1393</span></a><span class="sd"> Generate a presigned public URL for an S3 object.</span>
</span><span id="L-1394"><a href="#L-1394"><span class="linenos">1394</span></a><span class="sd"> If the S3 object is not signed yet, it will be signed first.</span>
</span><span id="L-1395"><a href="#L-1395"><span class="linenos">1395</span></a>
</span><span id="L-1396"><a href="#L-1396"><span class="linenos">1396</span></a><span class="sd"> Args:</span>
</span><span id="L-1397"><a href="#L-1397"><span class="linenos">1397</span></a><span class="sd"> s3_object: S3 object to sign</span>
</span><span id="L-1398"><a href="#L-1398"><span class="linenos">1398</span></a><span class="sd"> base_url: Optional base URL for the presigned URL (defaults to WM_BASE_URL)</span>
</span><span id="L-1399"><a href="#L-1399"><span class="linenos">1399</span></a>
</span><span id="L-1400"><a href="#L-1400"><span class="linenos">1400</span></a><span class="sd"> Returns:</span>
</span><span id="L-1401"><a href="#L-1401"><span class="linenos">1401</span></a><span class="sd"> Signed public URL</span>
</span><span id="L-1402"><a href="#L-1402"><span class="linenos">1402</span></a>
</span><span id="L-1403"><a href="#L-1403"><span class="linenos">1403</span></a><span class="sd"> Example:</span>
</span><span id="L-1404"><a href="#L-1404"><span class="linenos">1404</span></a><span class="sd"> &gt;&gt;&gt; import wmill</span>
</span><span id="L-1405"><a href="#L-1405"><span class="linenos">1405</span></a><span class="sd"> &gt;&gt;&gt; from wmill import S3Object</span>
</span><span id="L-1406"><a href="#L-1406"><span class="linenos">1406</span></a><span class="sd"> &gt;&gt;&gt; s3_obj = S3Object(s3=&quot;/path/to/file.txt&quot;)</span>
</span><span id="L-1407"><a href="#L-1407"><span class="linenos">1407</span></a><span class="sd"> &gt;&gt;&gt; url = wmill.get_presigned_s3_public_url(s3_obj)</span>
</span><span id="L-1408"><a href="#L-1408"><span class="linenos">1408</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1409"><a href="#L-1409"><span class="linenos">1409</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_presigned_s3_public_url</span><span class="p">(</span><span class="n">s3_object</span><span class="p">,</span> <span class="n">base_url</span><span class="p">)</span>
</span><span id="L-1410"><a href="#L-1410"><span class="linenos">1410</span></a>
</span><span id="L-1411"><a href="#L-1411"><span class="linenos">1411</span></a>
</span><span id="L-1412"><a href="#L-1412"><span class="linenos">1412</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1413"><a href="#L-1413"><span class="linenos">1413</span></a><span class="k">def</span><span class="w"> </span><span class="nf">whoami</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="L-1414"><a href="#L-1414"><span class="linenos">1414</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1415"><a href="#L-1415"><span class="linenos">1415</span></a><span class="sd"> Returns the current user</span>
</span><span id="L-1416"><a href="#L-1416"><span class="linenos">1416</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1417"><a href="#L-1417"><span class="linenos">1417</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">user</span>
</span><span id="L-1418"><a href="#L-1418"><span class="linenos">1418</span></a>
</span><span id="L-1419"><a href="#L-1419"><span class="linenos">1419</span></a>
</span><span id="L-1420"><a href="#L-1420"><span class="linenos">1420</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1421"><a href="#L-1421"><span class="linenos">1421</span></a><span class="nd">@deprecate</span><span class="p">(</span><span class="s2">&quot;Windmill().state&quot;</span><span class="p">)</span>
</span><span id="L-1422"><a href="#L-1422"><span class="linenos">1422</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_state</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-1423"><a href="#L-1423"><span class="linenos">1423</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1424"><a href="#L-1424"><span class="linenos">1424</span></a><span class="sd"> Get the state</span>
</span><span id="L-1425"><a href="#L-1425"><span class="linenos">1425</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1426"><a href="#L-1426"><span class="linenos">1426</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">state</span>
</span><span id="L-1427"><a href="#L-1427"><span class="linenos">1427</span></a>
</span><span id="L-1428"><a href="#L-1428"><span class="linenos">1428</span></a>
</span><span id="L-1429"><a href="#L-1429"><span class="linenos">1429</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1430"><a href="#L-1430"><span class="linenos">1430</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_resource</span><span class="p">(</span>
</span><span id="L-1431"><a href="#L-1431"><span class="linenos">1431</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1432"><a href="#L-1432"><span class="linenos">1432</span></a> <span class="n">none_if_undefined</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-1433"><a href="#L-1433"><span class="linenos">1433</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1434"><a href="#L-1434"><span class="linenos">1434</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get resource from Windmill&quot;&quot;&quot;</span>
</span><span id="L-1435"><a href="#L-1435"><span class="linenos">1435</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_resource</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">none_if_undefined</span><span class="p">)</span>
</span><span id="L-1436"><a href="#L-1436"><span class="linenos">1436</span></a>
</span><span id="L-1437"><a href="#L-1437"><span class="linenos">1437</span></a>
</span><span id="L-1438"><a href="#L-1438"><span class="linenos">1438</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1439"><a href="#L-1439"><span class="linenos">1439</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_resource</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;any&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1440"><a href="#L-1440"><span class="linenos">1440</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1441"><a href="#L-1441"><span class="linenos">1441</span></a><span class="sd"> Set the resource at a given path as a string, creating it if it does not exist</span>
</span><span id="L-1442"><a href="#L-1442"><span class="linenos">1442</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1443"><a href="#L-1443"><span class="linenos">1443</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">set_resource</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">resource_type</span><span class="o">=</span><span class="n">resource_type</span><span class="p">)</span>
</span><span id="L-1444"><a href="#L-1444"><span class="linenos">1444</span></a>
</span><span id="L-1445"><a href="#L-1445"><span class="linenos">1445</span></a>
</span><span id="L-1446"><a href="#L-1446"><span class="linenos">1446</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1447"><a href="#L-1447"><span class="linenos">1447</span></a><span class="k">def</span><span class="w"> </span><span class="nf">list_resources</span><span class="p">(</span>
</span><span id="L-1448"><a href="#L-1448"><span class="linenos">1448</span></a> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1449"><a href="#L-1449"><span class="linenos">1449</span></a> <span class="n">page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1450"><a href="#L-1450"><span class="linenos">1450</span></a> <span class="n">per_page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1451"><a href="#L-1451"><span class="linenos">1451</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">dict</span><span class="p">]:</span>
</span><span id="L-1452"><a href="#L-1452"><span class="linenos">1452</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;List resources from Windmill workspace.</span>
</span><span id="L-1453"><a href="#L-1453"><span class="linenos">1453</span></a><span class="sd"> </span>
</span><span id="L-1454"><a href="#L-1454"><span class="linenos">1454</span></a><span class="sd"> Args:</span>
</span><span id="L-1455"><a href="#L-1455"><span class="linenos">1455</span></a><span class="sd"> resource_type: Optional resource type to filter by (e.g., &quot;postgresql&quot;, &quot;mysql&quot;, &quot;s3&quot;)</span>
</span><span id="L-1456"><a href="#L-1456"><span class="linenos">1456</span></a><span class="sd"> page: Optional page number for pagination</span>
</span><span id="L-1457"><a href="#L-1457"><span class="linenos">1457</span></a><span class="sd"> per_page: Optional number of results per page</span>
</span><span id="L-1458"><a href="#L-1458"><span class="linenos">1458</span></a><span class="sd"> </span>
</span><span id="L-1459"><a href="#L-1459"><span class="linenos">1459</span></a><span class="sd"> Returns:</span>
</span><span id="L-1460"><a href="#L-1460"><span class="linenos">1460</span></a><span class="sd"> List of resource dictionaries</span>
</span><span id="L-1461"><a href="#L-1461"><span class="linenos">1461</span></a><span class="sd"> </span>
</span><span id="L-1462"><a href="#L-1462"><span class="linenos">1462</span></a><span class="sd"> Example:</span>
</span><span id="L-1463"><a href="#L-1463"><span class="linenos">1463</span></a><span class="sd"> &gt;&gt;&gt; # Get all resources</span>
</span><span id="L-1464"><a href="#L-1464"><span class="linenos">1464</span></a><span class="sd"> &gt;&gt;&gt; all_resources = wmill.list_resources()</span>
</span><span id="L-1465"><a href="#L-1465"><span class="linenos">1465</span></a><span class="sd"> </span>
</span><span id="L-1466"><a href="#L-1466"><span class="linenos">1466</span></a><span class="sd"> &gt;&gt;&gt; # Get only PostgreSQL resources</span>
</span><span id="L-1467"><a href="#L-1467"><span class="linenos">1467</span></a><span class="sd"> &gt;&gt;&gt; pg_resources = wmill.list_resources(resource_type=&quot;postgresql&quot;)</span>
</span><span id="L-1468"><a href="#L-1468"><span class="linenos">1468</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1469"><a href="#L-1469"><span class="linenos">1469</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">list_resources</span><span class="p">(</span>
</span><span id="L-1470"><a href="#L-1470"><span class="linenos">1470</span></a> <span class="n">resource_type</span><span class="o">=</span><span class="n">resource_type</span><span class="p">,</span>
</span><span id="L-1471"><a href="#L-1471"><span class="linenos">1471</span></a> <span class="n">page</span><span class="o">=</span><span class="n">page</span><span class="p">,</span>
</span><span id="L-1472"><a href="#L-1472"><span class="linenos">1472</span></a> <span class="n">per_page</span><span class="o">=</span><span class="n">per_page</span><span class="p">,</span>
</span><span id="L-1473"><a href="#L-1473"><span class="linenos">1473</span></a> <span class="p">)</span>
</span><span id="L-1474"><a href="#L-1474"><span class="linenos">1474</span></a>
</span><span id="L-1475"><a href="#L-1475"><span class="linenos">1475</span></a>
</span><span id="L-1476"><a href="#L-1476"><span class="linenos">1476</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1477"><a href="#L-1477"><span class="linenos">1477</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_state</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1478"><a href="#L-1478"><span class="linenos">1478</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1479"><a href="#L-1479"><span class="linenos">1479</span></a><span class="sd"> Set the state</span>
</span><span id="L-1480"><a href="#L-1480"><span class="linenos">1480</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1481"><a href="#L-1481"><span class="linenos">1481</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span id="L-1482"><a href="#L-1482"><span class="linenos">1482</span></a>
</span><span id="L-1483"><a href="#L-1483"><span class="linenos">1483</span></a>
</span><span id="L-1484"><a href="#L-1484"><span class="linenos">1484</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1485"><a href="#L-1485"><span class="linenos">1485</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_progress</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1486"><a href="#L-1486"><span class="linenos">1486</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1487"><a href="#L-1487"><span class="linenos">1487</span></a><span class="sd"> Set the progress</span>
</span><span id="L-1488"><a href="#L-1488"><span class="linenos">1488</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1489"><a href="#L-1489"><span class="linenos">1489</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">set_progress</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">job_id</span><span class="p">)</span>
</span><span id="L-1490"><a href="#L-1490"><span class="linenos">1490</span></a>
</span><span id="L-1491"><a href="#L-1491"><span class="linenos">1491</span></a>
</span><span id="L-1492"><a href="#L-1492"><span class="linenos">1492</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1493"><a href="#L-1493"><span class="linenos">1493</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_progress</span><span class="p">(</span><span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-1494"><a href="#L-1494"><span class="linenos">1494</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1495"><a href="#L-1495"><span class="linenos">1495</span></a><span class="sd"> Get the progress</span>
</span><span id="L-1496"><a href="#L-1496"><span class="linenos">1496</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1497"><a href="#L-1497"><span class="linenos">1497</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_progress</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span><span id="L-1498"><a href="#L-1498"><span class="linenos">1498</span></a>
</span><span id="L-1499"><a href="#L-1499"><span class="linenos">1499</span></a>
</span><span id="L-1500"><a href="#L-1500"><span class="linenos">1500</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_shared_state_pickle</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s2">&quot;state.pickle&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1501"><a href="#L-1501"><span class="linenos">1501</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1502"><a href="#L-1502"><span class="linenos">1502</span></a><span class="sd"> Set the state in the shared folder using pickle</span>
</span><span id="L-1503"><a href="#L-1503"><span class="linenos">1503</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1504"><a href="#L-1504"><span class="linenos">1504</span></a> <span class="k">return</span> <span class="n">Windmill</span><span class="o">.</span><span class="n">set_shared_state_pickle</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
</span><span id="L-1505"><a href="#L-1505"><span class="linenos">1505</span></a>
</span><span id="L-1506"><a href="#L-1506"><span class="linenos">1506</span></a>
</span><span id="L-1507"><a href="#L-1507"><span class="linenos">1507</span></a><span class="nd">@deprecate</span><span class="p">(</span><span class="s2">&quot;Windmill.get_shared_state_pickle(...)&quot;</span><span class="p">)</span>
</span><span id="L-1508"><a href="#L-1508"><span class="linenos">1508</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_shared_state_pickle</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s2">&quot;state.pickle&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-1509"><a href="#L-1509"><span class="linenos">1509</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1510"><a href="#L-1510"><span class="linenos">1510</span></a><span class="sd"> Get the state in the shared folder using pickle</span>
</span><span id="L-1511"><a href="#L-1511"><span class="linenos">1511</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1512"><a href="#L-1512"><span class="linenos">1512</span></a> <span class="k">return</span> <span class="n">Windmill</span><span class="o">.</span><span class="n">get_shared_state_pickle</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
</span><span id="L-1513"><a href="#L-1513"><span class="linenos">1513</span></a>
</span><span id="L-1514"><a href="#L-1514"><span class="linenos">1514</span></a>
</span><span id="L-1515"><a href="#L-1515"><span class="linenos">1515</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_shared_state</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s2">&quot;state.json&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1516"><a href="#L-1516"><span class="linenos">1516</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1517"><a href="#L-1517"><span class="linenos">1517</span></a><span class="sd"> Set the state in the shared folder using pickle</span>
</span><span id="L-1518"><a href="#L-1518"><span class="linenos">1518</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1519"><a href="#L-1519"><span class="linenos">1519</span></a> <span class="k">return</span> <span class="n">Windmill</span><span class="o">.</span><span class="n">set_shared_state</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
</span><span id="L-1520"><a href="#L-1520"><span class="linenos">1520</span></a>
</span><span id="L-1521"><a href="#L-1521"><span class="linenos">1521</span></a>
</span><span id="L-1522"><a href="#L-1522"><span class="linenos">1522</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_shared_state</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s2">&quot;state.json&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1523"><a href="#L-1523"><span class="linenos">1523</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1524"><a href="#L-1524"><span class="linenos">1524</span></a><span class="sd"> Get the state in the shared folder using pickle</span>
</span><span id="L-1525"><a href="#L-1525"><span class="linenos">1525</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1526"><a href="#L-1526"><span class="linenos">1526</span></a> <span class="k">return</span> <span class="n">Windmill</span><span class="o">.</span><span class="n">get_shared_state</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
</span><span id="L-1527"><a href="#L-1527"><span class="linenos">1527</span></a>
</span><span id="L-1528"><a href="#L-1528"><span class="linenos">1528</span></a>
</span><span id="L-1529"><a href="#L-1529"><span class="linenos">1529</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1530"><a href="#L-1530"><span class="linenos">1530</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_variable</span><span class="p">(</span><span class="n">path</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-1531"><a href="#L-1531"><span class="linenos">1531</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1532"><a href="#L-1532"><span class="linenos">1532</span></a><span class="sd"> Returns the variable at a given path as a string</span>
</span><span id="L-1533"><a href="#L-1533"><span class="linenos">1533</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1534"><a href="#L-1534"><span class="linenos">1534</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_variable</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span><span id="L-1535"><a href="#L-1535"><span class="linenos">1535</span></a>
</span><span id="L-1536"><a href="#L-1536"><span class="linenos">1536</span></a>
</span><span id="L-1537"><a href="#L-1537"><span class="linenos">1537</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1538"><a href="#L-1538"><span class="linenos">1538</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_variable</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">is_secret</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1539"><a href="#L-1539"><span class="linenos">1539</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1540"><a href="#L-1540"><span class="linenos">1540</span></a><span class="sd"> Set the variable at a given path as a string, creating it if it does not exist</span>
</span><span id="L-1541"><a href="#L-1541"><span class="linenos">1541</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1542"><a href="#L-1542"><span class="linenos">1542</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">set_variable</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">is_secret</span><span class="p">)</span>
</span><span id="L-1543"><a href="#L-1543"><span class="linenos">1543</span></a>
</span><span id="L-1544"><a href="#L-1544"><span class="linenos">1544</span></a>
</span><span id="L-1545"><a href="#L-1545"><span class="linenos">1545</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1546"><a href="#L-1546"><span class="linenos">1546</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_flow_user_state</span><span class="p">(</span><span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-1547"><a href="#L-1547"><span class="linenos">1547</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1548"><a href="#L-1548"><span class="linenos">1548</span></a><span class="sd"> Get the user state of a flow at a given key</span>
</span><span id="L-1549"><a href="#L-1549"><span class="linenos">1549</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1550"><a href="#L-1550"><span class="linenos">1550</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_flow_user_state</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
</span><span id="L-1551"><a href="#L-1551"><span class="linenos">1551</span></a>
</span><span id="L-1552"><a href="#L-1552"><span class="linenos">1552</span></a>
</span><span id="L-1553"><a href="#L-1553"><span class="linenos">1553</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1554"><a href="#L-1554"><span class="linenos">1554</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_flow_user_state</span><span class="p">(</span><span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1555"><a href="#L-1555"><span class="linenos">1555</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1556"><a href="#L-1556"><span class="linenos">1556</span></a><span class="sd"> Set the user state of a flow at a given key</span>
</span><span id="L-1557"><a href="#L-1557"><span class="linenos">1557</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1558"><a href="#L-1558"><span class="linenos">1558</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">set_flow_user_state</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
</span><span id="L-1559"><a href="#L-1559"><span class="linenos">1559</span></a>
</span><span id="L-1560"><a href="#L-1560"><span class="linenos">1560</span></a>
</span><span id="L-1561"><a href="#L-1561"><span class="linenos">1561</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1562"><a href="#L-1562"><span class="linenos">1562</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_state_path</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-1563"><a href="#L-1563"><span class="linenos">1563</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">state_path</span>
</span><span id="L-1564"><a href="#L-1564"><span class="linenos">1564</span></a>
</span><span id="L-1565"><a href="#L-1565"><span class="linenos">1565</span></a>
</span><span id="L-1566"><a href="#L-1566"><span class="linenos">1566</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1567"><a href="#L-1567"><span class="linenos">1567</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_resume_urls</span><span class="p">(</span><span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="L-1568"><a href="#L-1568"><span class="linenos">1568</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_resume_urls</span><span class="p">(</span><span class="n">approver</span><span class="p">)</span>
</span><span id="L-1569"><a href="#L-1569"><span class="linenos">1569</span></a>
</span><span id="L-1570"><a href="#L-1570"><span class="linenos">1570</span></a>
</span><span id="L-1571"><a href="#L-1571"><span class="linenos">1571</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1572"><a href="#L-1572"><span class="linenos">1572</span></a><span class="k">def</span><span class="w"> </span><span class="nf">request_interactive_slack_approval</span><span class="p">(</span>
</span><span id="L-1573"><a href="#L-1573"><span class="linenos">1573</span></a> <span class="n">slack_resource_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1574"><a href="#L-1574"><span class="linenos">1574</span></a> <span class="n">channel_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1575"><a href="#L-1575"><span class="linenos">1575</span></a> <span class="n">message</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1576"><a href="#L-1576"><span class="linenos">1576</span></a> <span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1577"><a href="#L-1577"><span class="linenos">1577</span></a> <span class="n">default_args_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1578"><a href="#L-1578"><span class="linenos">1578</span></a> <span class="n">dynamic_enums_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1579"><a href="#L-1579"><span class="linenos">1579</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1580"><a href="#L-1580"><span class="linenos">1580</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">request_interactive_slack_approval</span><span class="p">(</span>
</span><span id="L-1581"><a href="#L-1581"><span class="linenos">1581</span></a> <span class="n">slack_resource_path</span><span class="o">=</span><span class="n">slack_resource_path</span><span class="p">,</span>
</span><span id="L-1582"><a href="#L-1582"><span class="linenos">1582</span></a> <span class="n">channel_id</span><span class="o">=</span><span class="n">channel_id</span><span class="p">,</span>
</span><span id="L-1583"><a href="#L-1583"><span class="linenos">1583</span></a> <span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span>
</span><span id="L-1584"><a href="#L-1584"><span class="linenos">1584</span></a> <span class="n">approver</span><span class="o">=</span><span class="n">approver</span><span class="p">,</span>
</span><span id="L-1585"><a href="#L-1585"><span class="linenos">1585</span></a> <span class="n">default_args_json</span><span class="o">=</span><span class="n">default_args_json</span><span class="p">,</span>
</span><span id="L-1586"><a href="#L-1586"><span class="linenos">1586</span></a> <span class="n">dynamic_enums_json</span><span class="o">=</span><span class="n">dynamic_enums_json</span><span class="p">,</span>
</span><span id="L-1587"><a href="#L-1587"><span class="linenos">1587</span></a> <span class="p">)</span>
</span><span id="L-1588"><a href="#L-1588"><span class="linenos">1588</span></a>
</span><span id="L-1589"><a href="#L-1589"><span class="linenos">1589</span></a>
</span><span id="L-1590"><a href="#L-1590"><span class="linenos">1590</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1591"><a href="#L-1591"><span class="linenos">1591</span></a><span class="k">def</span><span class="w"> </span><span class="nf">send_teams_message</span><span class="p">(</span>
</span><span id="L-1592"><a href="#L-1592"><span class="linenos">1592</span></a> <span class="n">conversation_id</span><span class="p">:</span> <span class="nb">str</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">success</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span> <span class="n">card_block</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="L-1593"><a href="#L-1593"><span class="linenos">1593</span></a><span class="p">):</span>
</span><span id="L-1594"><a href="#L-1594"><span class="linenos">1594</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">send_teams_message</span><span class="p">(</span><span class="n">conversation_id</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">success</span><span class="p">,</span> <span class="n">card_block</span><span class="p">)</span>
</span><span id="L-1595"><a href="#L-1595"><span class="linenos">1595</span></a>
</span><span id="L-1596"><a href="#L-1596"><span class="linenos">1596</span></a>
</span><span id="L-1597"><a href="#L-1597"><span class="linenos">1597</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1598"><a href="#L-1598"><span class="linenos">1598</span></a><span class="k">def</span><span class="w"> </span><span class="nf">cancel_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-1599"><a href="#L-1599"><span class="linenos">1599</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cancel a specific job by ID.</span>
</span><span id="L-1600"><a href="#L-1600"><span class="linenos">1600</span></a>
</span><span id="L-1601"><a href="#L-1601"><span class="linenos">1601</span></a><span class="sd"> Args:</span>
</span><span id="L-1602"><a href="#L-1602"><span class="linenos">1602</span></a><span class="sd"> job_id: UUID of the job to cancel</span>
</span><span id="L-1603"><a href="#L-1603"><span class="linenos">1603</span></a><span class="sd"> reason: Optional reason for cancellation</span>
</span><span id="L-1604"><a href="#L-1604"><span class="linenos">1604</span></a>
</span><span id="L-1605"><a href="#L-1605"><span class="linenos">1605</span></a><span class="sd"> Returns:</span>
</span><span id="L-1606"><a href="#L-1606"><span class="linenos">1606</span></a><span class="sd"> Response message from the cancel endpoint</span>
</span><span id="L-1607"><a href="#L-1607"><span class="linenos">1607</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1608"><a href="#L-1608"><span class="linenos">1608</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">cancel_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">,</span> <span class="n">reason</span><span class="p">)</span>
</span><span id="L-1609"><a href="#L-1609"><span class="linenos">1609</span></a>
</span><span id="L-1610"><a href="#L-1610"><span class="linenos">1610</span></a>
</span><span id="L-1611"><a href="#L-1611"><span class="linenos">1611</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1612"><a href="#L-1612"><span class="linenos">1612</span></a><span class="k">def</span><span class="w"> </span><span class="nf">cancel_running</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="L-1613"><a href="#L-1613"><span class="linenos">1613</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cancel currently running executions of the same script.&quot;&quot;&quot;</span>
</span><span id="L-1614"><a href="#L-1614"><span class="linenos">1614</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">cancel_running</span><span class="p">()</span>
</span><span id="L-1615"><a href="#L-1615"><span class="linenos">1615</span></a>
</span><span id="L-1616"><a href="#L-1616"><span class="linenos">1616</span></a>
</span><span id="L-1617"><a href="#L-1617"><span class="linenos">1617</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1618"><a href="#L-1618"><span class="linenos">1618</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script</span><span class="p">(</span>
</span><span id="L-1619"><a href="#L-1619"><span class="linenos">1619</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1620"><a href="#L-1620"><span class="linenos">1620</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1621"><a href="#L-1621"><span class="linenos">1621</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1622"><a href="#L-1622"><span class="linenos">1622</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1623"><a href="#L-1623"><span class="linenos">1623</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-1624"><a href="#L-1624"><span class="linenos">1624</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1625"><a href="#L-1625"><span class="linenos">1625</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1626"><a href="#L-1626"><span class="linenos">1626</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-1627"><a href="#L-1627"><span class="linenos">1627</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script synchronously and return its result.</span>
</span><span id="L-1628"><a href="#L-1628"><span class="linenos">1628</span></a><span class="sd"> </span>
</span><span id="L-1629"><a href="#L-1629"><span class="linenos">1629</span></a><span class="sd"> .. deprecated:: Use run_script_by_path or run_script_by_hash instead.</span>
</span><span id="L-1630"><a href="#L-1630"><span class="linenos">1630</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1631"><a href="#L-1631"><span class="linenos">1631</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script</span><span class="p">(</span>
</span><span id="L-1632"><a href="#L-1632"><span class="linenos">1632</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="L-1633"><a href="#L-1633"><span class="linenos">1633</span></a> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span>
</span><span id="L-1634"><a href="#L-1634"><span class="linenos">1634</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-1635"><a href="#L-1635"><span class="linenos">1635</span></a> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="L-1636"><a href="#L-1636"><span class="linenos">1636</span></a> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span><span class="p">,</span>
</span><span id="L-1637"><a href="#L-1637"><span class="linenos">1637</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span>
</span><span id="L-1638"><a href="#L-1638"><span class="linenos">1638</span></a> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span>
</span><span id="L-1639"><a href="#L-1639"><span class="linenos">1639</span></a> <span class="p">)</span>
</span><span id="L-1640"><a href="#L-1640"><span class="linenos">1640</span></a>
</span><span id="L-1641"><a href="#L-1641"><span class="linenos">1641</span></a>
</span><span id="L-1642"><a href="#L-1642"><span class="linenos">1642</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1643"><a href="#L-1643"><span class="linenos">1643</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_path</span><span class="p">(</span>
</span><span id="L-1644"><a href="#L-1644"><span class="linenos">1644</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1645"><a href="#L-1645"><span class="linenos">1645</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1646"><a href="#L-1646"><span class="linenos">1646</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1647"><a href="#L-1647"><span class="linenos">1647</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-1648"><a href="#L-1648"><span class="linenos">1648</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1649"><a href="#L-1649"><span class="linenos">1649</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1650"><a href="#L-1650"><span class="linenos">1650</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-1651"><a href="#L-1651"><span class="linenos">1651</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script by path synchronously and return its result.&quot;&quot;&quot;</span>
</span><span id="L-1652"><a href="#L-1652"><span class="linenos">1652</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script_by_path</span><span class="p">(</span>
</span><span id="L-1653"><a href="#L-1653"><span class="linenos">1653</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="L-1654"><a href="#L-1654"><span class="linenos">1654</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-1655"><a href="#L-1655"><span class="linenos">1655</span></a> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="L-1656"><a href="#L-1656"><span class="linenos">1656</span></a> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span><span class="p">,</span>
</span><span id="L-1657"><a href="#L-1657"><span class="linenos">1657</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span>
</span><span id="L-1658"><a href="#L-1658"><span class="linenos">1658</span></a> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span>
</span><span id="L-1659"><a href="#L-1659"><span class="linenos">1659</span></a> <span class="p">)</span>
</span><span id="L-1660"><a href="#L-1660"><span class="linenos">1660</span></a>
</span><span id="L-1661"><a href="#L-1661"><span class="linenos">1661</span></a>
</span><span id="L-1662"><a href="#L-1662"><span class="linenos">1662</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1663"><a href="#L-1663"><span class="linenos">1663</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_hash</span><span class="p">(</span>
</span><span id="L-1664"><a href="#L-1664"><span class="linenos">1664</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1665"><a href="#L-1665"><span class="linenos">1665</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1666"><a href="#L-1666"><span class="linenos">1666</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1667"><a href="#L-1667"><span class="linenos">1667</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-1668"><a href="#L-1668"><span class="linenos">1668</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1669"><a href="#L-1669"><span class="linenos">1669</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-1670"><a href="#L-1670"><span class="linenos">1670</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-1671"><a href="#L-1671"><span class="linenos">1671</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script by hash synchronously and return its result.&quot;&quot;&quot;</span>
</span><span id="L-1672"><a href="#L-1672"><span class="linenos">1672</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script_by_hash</span><span class="p">(</span>
</span><span id="L-1673"><a href="#L-1673"><span class="linenos">1673</span></a> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span>
</span><span id="L-1674"><a href="#L-1674"><span class="linenos">1674</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-1675"><a href="#L-1675"><span class="linenos">1675</span></a> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="L-1676"><a href="#L-1676"><span class="linenos">1676</span></a> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span><span class="p">,</span>
</span><span id="L-1677"><a href="#L-1677"><span class="linenos">1677</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span>
</span><span id="L-1678"><a href="#L-1678"><span class="linenos">1678</span></a> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span>
</span><span id="L-1679"><a href="#L-1679"><span class="linenos">1679</span></a> <span class="p">)</span>
</span><span id="L-1680"><a href="#L-1680"><span class="linenos">1680</span></a>
</span><span id="L-1681"><a href="#L-1681"><span class="linenos">1681</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1682"><a href="#L-1682"><span class="linenos">1682</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_inline_script_preview</span><span class="p">(</span>
</span><span id="L-1683"><a href="#L-1683"><span class="linenos">1683</span></a> <span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1684"><a href="#L-1684"><span class="linenos">1684</span></a> <span class="n">language</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="L-1685"><a href="#L-1685"><span class="linenos">1685</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-1686"><a href="#L-1686"><span class="linenos">1686</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="L-1687"><a href="#L-1687"><span class="linenos">1687</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run a script on the current worker without creating a job&quot;&quot;&quot;</span>
</span><span id="L-1688"><a href="#L-1688"><span class="linenos">1688</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_inline_script_preview</span><span class="p">(</span>
</span><span id="L-1689"><a href="#L-1689"><span class="linenos">1689</span></a> <span class="n">content</span><span class="o">=</span><span class="n">content</span><span class="p">,</span>
</span><span id="L-1690"><a href="#L-1690"><span class="linenos">1690</span></a> <span class="n">language</span><span class="o">=</span><span class="n">language</span><span class="p">,</span>
</span><span id="L-1691"><a href="#L-1691"><span class="linenos">1691</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-1692"><a href="#L-1692"><span class="linenos">1692</span></a> <span class="p">)</span>
</span><span id="L-1693"><a href="#L-1693"><span class="linenos">1693</span></a>
</span><span id="L-1694"><a href="#L-1694"><span class="linenos">1694</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1695"><a href="#L-1695"><span class="linenos">1695</span></a><span class="k">def</span><span class="w"> </span><span class="nf">username_to_email</span><span class="p">(</span><span class="n">username</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-1696"><a href="#L-1696"><span class="linenos">1696</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1697"><a href="#L-1697"><span class="linenos">1697</span></a><span class="sd"> Get email from workspace username</span>
</span><span id="L-1698"><a href="#L-1698"><span class="linenos">1698</span></a><span class="sd"> This method is particularly useful for apps that require the email address of the viewer.</span>
</span><span id="L-1699"><a href="#L-1699"><span class="linenos">1699</span></a><span class="sd"> Indeed, in the viewer context WM_USERNAME is set to the username of the viewer but WM_EMAIL is set to the email of the creator of the app.</span>
</span><span id="L-1700"><a href="#L-1700"><span class="linenos">1700</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1701"><a href="#L-1701"><span class="linenos">1701</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">username_to_email</span><span class="p">(</span><span class="n">username</span><span class="p">)</span>
</span><span id="L-1702"><a href="#L-1702"><span class="linenos">1702</span></a>
</span><span id="L-1703"><a href="#L-1703"><span class="linenos">1703</span></a>
</span><span id="L-1704"><a href="#L-1704"><span class="linenos">1704</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1705"><a href="#L-1705"><span class="linenos">1705</span></a><span class="k">def</span><span class="w"> </span><span class="nf">datatable</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;main&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DataTableClient</span><span class="p">:</span>
</span><span id="L-1706"><a href="#L-1706"><span class="linenos">1706</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">datatable</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span><span id="L-1707"><a href="#L-1707"><span class="linenos">1707</span></a>
</span><span id="L-1708"><a href="#L-1708"><span class="linenos">1708</span></a><span class="nd">@init_global_client</span>
</span><span id="L-1709"><a href="#L-1709"><span class="linenos">1709</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ducklake</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;main&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DucklakeClient</span><span class="p">:</span>
</span><span id="L-1710"><a href="#L-1710"><span class="linenos">1710</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">ducklake</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span><span id="L-1711"><a href="#L-1711"><span class="linenos">1711</span></a>
</span><span id="L-1712"><a href="#L-1712"><span class="linenos">1712</span></a><span class="k">def</span><span class="w"> </span><span class="nf">task</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-1713"><a href="#L-1713"><span class="linenos">1713</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">inspect</span><span class="w"> </span><span class="kn">import</span> <span class="n">signature</span>
</span><span id="L-1714"><a href="#L-1714"><span class="linenos">1714</span></a>
</span><span id="L-1715"><a href="#L-1715"><span class="linenos">1715</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">f</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">tag</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
</span><span id="L-1716"><a href="#L-1716"><span class="linenos">1716</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-1717"><a href="#L-1717"><span class="linenos">1717</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span>
</span><span id="L-1718"><a href="#L-1718"><span class="linenos">1718</span></a> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;MAIN_OVERRIDE&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="n">func</span><span class="o">.</span><span class="vm">__name__</span>
</span><span id="L-1719"><a href="#L-1719"><span class="linenos">1719</span></a> <span class="p">):</span>
</span><span id="L-1720"><a href="#L-1720"><span class="linenos">1720</span></a>
</span><span id="L-1721"><a href="#L-1721"><span class="linenos">1721</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">inner</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-1722"><a href="#L-1722"><span class="linenos">1722</span></a> <span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="L-1723"><a href="#L-1723"><span class="linenos">1723</span></a>
</span><span id="L-1724"><a href="#L-1724"><span class="linenos">1724</span></a> <span class="k">return</span> <span class="n">inner</span>
</span><span id="L-1725"><a href="#L-1725"><span class="linenos">1725</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-1726"><a href="#L-1726"><span class="linenos">1726</span></a>
</span><span id="L-1727"><a href="#L-1727"><span class="linenos">1727</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">inner</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-1728"><a href="#L-1728"><span class="linenos">1728</span></a> <span class="k">global</span> <span class="n">_client</span>
</span><span id="L-1729"><a href="#L-1729"><span class="linenos">1729</span></a> <span class="k">if</span> <span class="n">_client</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1730"><a href="#L-1730"><span class="linenos">1730</span></a> <span class="n">_client</span> <span class="o">=</span> <span class="n">Windmill</span><span class="p">()</span>
</span><span id="L-1731"><a href="#L-1731"><span class="linenos">1731</span></a> <span class="n">w_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_WORKSPACE&quot;</span><span class="p">)</span>
</span><span id="L-1732"><a href="#L-1732"><span class="linenos">1732</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="L-1733"><a href="#L-1733"><span class="linenos">1733</span></a> <span class="n">f_name</span> <span class="o">=</span> <span class="n">func</span><span class="o">.</span><span class="vm">__name__</span>
</span><span id="L-1734"><a href="#L-1734"><span class="linenos">1734</span></a> <span class="n">json</span> <span class="o">=</span> <span class="n">kwargs</span>
</span><span id="L-1735"><a href="#L-1735"><span class="linenos">1735</span></a> <span class="n">params</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">signature</span><span class="p">(</span><span class="n">func</span><span class="p">)</span><span class="o">.</span><span class="n">parameters</span><span class="p">)</span>
</span><span id="L-1736"><a href="#L-1736"><span class="linenos">1736</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">arg</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
</span><span id="L-1737"><a href="#L-1737"><span class="linenos">1737</span></a> <span class="k">if</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">params</span><span class="p">):</span>
</span><span id="L-1738"><a href="#L-1738"><span class="linenos">1738</span></a> <span class="n">p</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span><span id="L-1739"><a href="#L-1739"><span class="linenos">1739</span></a> <span class="n">key</span> <span class="o">=</span> <span class="n">p</span>
</span><span id="L-1740"><a href="#L-1740"><span class="linenos">1740</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="L-1741"><a href="#L-1741"><span class="linenos">1741</span></a> <span class="n">json</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">arg</span>
</span><span id="L-1742"><a href="#L-1742"><span class="linenos">1742</span></a>
</span><span id="L-1743"><a href="#L-1743"><span class="linenos">1743</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-1744"><a href="#L-1744"><span class="linenos">1744</span></a> <span class="k">if</span> <span class="n">tag</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1745"><a href="#L-1745"><span class="linenos">1745</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;tag&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tag</span>
</span><span id="L-1746"><a href="#L-1746"><span class="linenos">1746</span></a> <span class="n">w_as_code_response</span> <span class="o">=</span> <span class="n">_client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-1747"><a href="#L-1747"><span class="linenos">1747</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="n">w_id</span><span class="si">}</span><span class="s2">/jobs/run/workflow_as_code/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">f_name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-1748"><a href="#L-1748"><span class="linenos">1748</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;args&quot;</span><span class="p">:</span> <span class="n">json</span><span class="p">},</span>
</span><span id="L-1749"><a href="#L-1749"><span class="linenos">1749</span></a> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span>
</span><span id="L-1750"><a href="#L-1750"><span class="linenos">1750</span></a> <span class="p">)</span>
</span><span id="L-1751"><a href="#L-1751"><span class="linenos">1751</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">w_as_code_response</span><span class="o">.</span><span class="n">text</span>
</span><span id="L-1752"><a href="#L-1752"><span class="linenos">1752</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Executing task </span><span class="si">{</span><span class="n">func</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> on job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-1753"><a href="#L-1753"><span class="linenos">1753</span></a> <span class="n">job_result</span> <span class="o">=</span> <span class="n">_client</span><span class="o">.</span><span class="n">wait_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span><span id="L-1754"><a href="#L-1754"><span class="linenos">1754</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Task </span><span class="si">{</span><span class="n">func</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">) completed&quot;</span><span class="p">)</span>
</span><span id="L-1755"><a href="#L-1755"><span class="linenos">1755</span></a> <span class="k">return</span> <span class="n">job_result</span>
</span><span id="L-1756"><a href="#L-1756"><span class="linenos">1756</span></a>
</span><span id="L-1757"><a href="#L-1757"><span class="linenos">1757</span></a> <span class="k">return</span> <span class="n">inner</span>
</span><span id="L-1758"><a href="#L-1758"><span class="linenos">1758</span></a>
</span><span id="L-1759"><a href="#L-1759"><span class="linenos">1759</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="nb">callable</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
</span><span id="L-1760"><a href="#L-1760"><span class="linenos">1760</span></a> <span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-1761"><a href="#L-1761"><span class="linenos">1761</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-1762"><a href="#L-1762"><span class="linenos">1762</span></a> <span class="k">return</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;tag&quot;</span><span class="p">))</span>
</span><span id="L-1763"><a href="#L-1763"><span class="linenos">1763</span></a>
</span><span id="L-1764"><a href="#L-1764"><span class="linenos">1764</span></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_resource_syntax</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span><span id="L-1765"><a href="#L-1765"><span class="linenos">1765</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse resource syntax from string.&quot;&quot;&quot;</span>
</span><span id="L-1766"><a href="#L-1766"><span class="linenos">1766</span></a> <span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1767"><a href="#L-1767"><span class="linenos">1767</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-1768"><a href="#L-1768"><span class="linenos">1768</span></a> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;$res:&quot;</span><span class="p">):</span>
</span><span id="L-1769"><a href="#L-1769"><span class="linenos">1769</span></a> <span class="k">return</span> <span class="n">s</span><span class="p">[</span><span class="mi">5</span><span class="p">:]</span>
</span><span id="L-1770"><a href="#L-1770"><span class="linenos">1770</span></a> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;res://&quot;</span><span class="p">):</span>
</span><span id="L-1771"><a href="#L-1771"><span class="linenos">1771</span></a> <span class="k">return</span> <span class="n">s</span><span class="p">[</span><span class="mi">6</span><span class="p">:]</span>
</span><span id="L-1772"><a href="#L-1772"><span class="linenos">1772</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-1773"><a href="#L-1773"><span class="linenos">1773</span></a>
</span><span id="L-1774"><a href="#L-1774"><span class="linenos">1774</span></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_s3_object</span><span class="p">(</span><span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="L-1775"><a href="#L-1775"><span class="linenos">1775</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse S3 object from string or S3Object format.&quot;&quot;&quot;</span>
</span><span id="L-1776"><a href="#L-1776"><span class="linenos">1776</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s3_object</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-1777"><a href="#L-1777"><span class="linenos">1777</span></a> <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;^s3://([^/]*)/(.*)$&#39;</span><span class="p">,</span> <span class="n">s3_object</span><span class="p">)</span>
</span><span id="L-1778"><a href="#L-1778"><span class="linenos">1778</span></a> <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
</span><span id="L-1779"><a href="#L-1779"><span class="linenos">1779</span></a> <span class="k">return</span> <span class="n">S3Object</span><span class="p">(</span><span class="n">s3</span><span class="o">=</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">storage</span><span class="o">=</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-1780"><a href="#L-1780"><span class="linenos">1780</span></a> <span class="k">return</span> <span class="n">S3Object</span><span class="p">(</span><span class="n">s3</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="L-1781"><a href="#L-1781"><span class="linenos">1781</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-1782"><a href="#L-1782"><span class="linenos">1782</span></a> <span class="k">return</span> <span class="n">s3_object</span>
</span><span id="L-1783"><a href="#L-1783"><span class="linenos">1783</span></a>
</span><span id="L-1784"><a href="#L-1784"><span class="linenos">1784</span></a>
</span><span id="L-1785"><a href="#L-1785"><span class="linenos">1785</span></a>
</span><span id="L-1786"><a href="#L-1786"><span class="linenos">1786</span></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_variable_syntax</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span><span id="L-1787"><a href="#L-1787"><span class="linenos">1787</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse variable syntax from string.&quot;&quot;&quot;</span>
</span><span id="L-1788"><a href="#L-1788"><span class="linenos">1788</span></a> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;var://&quot;</span><span class="p">):</span>
</span><span id="L-1789"><a href="#L-1789"><span class="linenos">1789</span></a> <span class="k">return</span> <span class="n">s</span><span class="p">[</span><span class="mi">6</span><span class="p">:]</span>
</span><span id="L-1790"><a href="#L-1790"><span class="linenos">1790</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-1791"><a href="#L-1791"><span class="linenos">1791</span></a>
</span><span id="L-1792"><a href="#L-1792"><span class="linenos">1792</span></a>
</span><span id="L-1793"><a href="#L-1793"><span class="linenos">1793</span></a><span class="k">def</span><span class="w"> </span><span class="nf">append_to_result_stream</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="kc">None</span><span class="p">:</span>
</span><span id="L-1794"><a href="#L-1794"><span class="linenos">1794</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Append a text to the result stream.</span>
</span><span id="L-1795"><a href="#L-1795"><span class="linenos">1795</span></a><span class="sd"> </span>
</span><span id="L-1796"><a href="#L-1796"><span class="linenos">1796</span></a><span class="sd"> Args:</span>
</span><span id="L-1797"><a href="#L-1797"><span class="linenos">1797</span></a><span class="sd"> text: text to append to the result stream</span>
</span><span id="L-1798"><a href="#L-1798"><span class="linenos">1798</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1799"><a href="#L-1799"><span class="linenos">1799</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;WM_STREAM: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">text</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">n&#39;</span><span class="p">)))</span>
</span><span id="L-1800"><a href="#L-1800"><span class="linenos">1800</span></a>
</span><span id="L-1801"><a href="#L-1801"><span class="linenos">1801</span></a><span class="k">def</span><span class="w"> </span><span class="nf">stream_result</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1802"><a href="#L-1802"><span class="linenos">1802</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Stream to the result stream.</span>
</span><span id="L-1803"><a href="#L-1803"><span class="linenos">1803</span></a><span class="sd"> </span>
</span><span id="L-1804"><a href="#L-1804"><span class="linenos">1804</span></a><span class="sd"> Args:</span>
</span><span id="L-1805"><a href="#L-1805"><span class="linenos">1805</span></a><span class="sd"> stream: stream to stream to the result stream</span>
</span><span id="L-1806"><a href="#L-1806"><span class="linenos">1806</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1807"><a href="#L-1807"><span class="linenos">1807</span></a> <span class="k">for</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">stream</span><span class="p">:</span>
</span><span id="L-1808"><a href="#L-1808"><span class="linenos">1808</span></a> <span class="n">append_to_result_stream</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span><span id="L-1809"><a href="#L-1809"><span class="linenos">1809</span></a>
</span><span id="L-1810"><a href="#L-1810"><span class="linenos">1810</span></a><span class="k">class</span><span class="w"> </span><span class="nc">DataTableClient</span><span class="p">:</span>
</span><span id="L-1811"><a href="#L-1811"><span class="linenos">1811</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">client</span><span class="p">:</span> <span class="n">Windmill</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-1812"><a href="#L-1812"><span class="linenos">1812</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">client</span>
</span><span id="L-1813"><a href="#L-1813"><span class="linenos">1813</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
</span><span id="L-1814"><a href="#L-1814"><span class="linenos">1814</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">query</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
</span><span id="L-1815"><a href="#L-1815"><span class="linenos">1815</span></a> <span class="n">args_dict</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-1816"><a href="#L-1816"><span class="linenos">1816</span></a> <span class="n">args_def</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-1817"><a href="#L-1817"><span class="linenos">1817</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">arg</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
</span><span id="L-1818"><a href="#L-1818"><span class="linenos">1818</span></a> <span class="n">args_dict</span><span class="p">[</span><span class="sa">f</span><span class="s2">&quot;arg</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">arg</span>
</span><span id="L-1819"><a href="#L-1819"><span class="linenos">1819</span></a> <span class="n">args_def</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot;-- $</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2"> arg</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span id="L-1820"><a href="#L-1820"><span class="linenos">1820</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="n">args_def</span> <span class="o">+</span> <span class="n">sql</span>
</span><span id="L-1821"><a href="#L-1821"><span class="linenos">1821</span></a> <span class="k">return</span> <span class="n">SqlQuery</span><span class="p">(</span>
</span><span id="L-1822"><a href="#L-1822"><span class="linenos">1822</span></a> <span class="n">sql</span><span class="p">,</span>
</span><span id="L-1823"><a href="#L-1823"><span class="linenos">1823</span></a> <span class="k">lambda</span> <span class="n">sql</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">run_inline_script_preview</span><span class="p">(</span>
</span><span id="L-1824"><a href="#L-1824"><span class="linenos">1824</span></a> <span class="n">content</span><span class="o">=</span><span class="n">sql</span><span class="p">,</span>
</span><span id="L-1825"><a href="#L-1825"><span class="linenos">1825</span></a> <span class="n">language</span><span class="o">=</span><span class="s2">&quot;postgresql&quot;</span><span class="p">,</span>
</span><span id="L-1826"><a href="#L-1826"><span class="linenos">1826</span></a> <span class="n">args</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;database&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;datatable://</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">args_dict</span><span class="p">},</span>
</span><span id="L-1827"><a href="#L-1827"><span class="linenos">1827</span></a> <span class="p">)</span>
</span><span id="L-1828"><a href="#L-1828"><span class="linenos">1828</span></a> <span class="p">)</span>
</span><span id="L-1829"><a href="#L-1829"><span class="linenos">1829</span></a>
</span><span id="L-1830"><a href="#L-1830"><span class="linenos">1830</span></a><span class="k">class</span><span class="w"> </span><span class="nc">DucklakeClient</span><span class="p">:</span>
</span><span id="L-1831"><a href="#L-1831"><span class="linenos">1831</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">client</span><span class="p">:</span> <span class="n">Windmill</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-1832"><a href="#L-1832"><span class="linenos">1832</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">client</span>
</span><span id="L-1833"><a href="#L-1833"><span class="linenos">1833</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
</span><span id="L-1834"><a href="#L-1834"><span class="linenos">1834</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">query</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-1835"><a href="#L-1835"><span class="linenos">1835</span></a> <span class="n">args_dict</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-1836"><a href="#L-1836"><span class="linenos">1836</span></a> <span class="n">args_def</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-1837"><a href="#L-1837"><span class="linenos">1837</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="L-1838"><a href="#L-1838"><span class="linenos">1838</span></a> <span class="n">args_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
</span><span id="L-1839"><a href="#L-1839"><span class="linenos">1839</span></a> <span class="n">args_def</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot;-- $</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">infer_sql_type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span id="L-1840"><a href="#L-1840"><span class="linenos">1840</span></a> <span class="n">attach</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;ATTACH &#39;ducklake://</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39; AS dl;USE dl;</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span id="L-1841"><a href="#L-1841"><span class="linenos">1841</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="n">args_def</span> <span class="o">+</span> <span class="n">attach</span> <span class="o">+</span> <span class="n">sql</span>
</span><span id="L-1842"><a href="#L-1842"><span class="linenos">1842</span></a> <span class="k">return</span> <span class="n">SqlQuery</span><span class="p">(</span>
</span><span id="L-1843"><a href="#L-1843"><span class="linenos">1843</span></a> <span class="n">sql</span><span class="p">,</span>
</span><span id="L-1844"><a href="#L-1844"><span class="linenos">1844</span></a> <span class="k">lambda</span> <span class="n">sql</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">run_inline_script_preview</span><span class="p">(</span>
</span><span id="L-1845"><a href="#L-1845"><span class="linenos">1845</span></a> <span class="n">content</span><span class="o">=</span><span class="n">sql</span><span class="p">,</span>
</span><span id="L-1846"><a href="#L-1846"><span class="linenos">1846</span></a> <span class="n">language</span><span class="o">=</span><span class="s2">&quot;duckdb&quot;</span><span class="p">,</span>
</span><span id="L-1847"><a href="#L-1847"><span class="linenos">1847</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args_dict</span><span class="p">,</span>
</span><span id="L-1848"><a href="#L-1848"><span class="linenos">1848</span></a> <span class="p">)</span>
</span><span id="L-1849"><a href="#L-1849"><span class="linenos">1849</span></a> <span class="p">)</span>
</span><span id="L-1850"><a href="#L-1850"><span class="linenos">1850</span></a>
</span><span id="L-1851"><a href="#L-1851"><span class="linenos">1851</span></a><span class="k">class</span><span class="w"> </span><span class="nc">SqlQuery</span><span class="p">:</span>
</span><span id="L-1852"><a href="#L-1852"><span class="linenos">1852</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">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">fetch_fn</span><span class="p">):</span>
</span><span id="L-1853"><a href="#L-1853"><span class="linenos">1853</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span> <span class="o">=</span> <span class="n">sql</span>
</span><span id="L-1854"><a href="#L-1854"><span class="linenos">1854</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">fetch_fn</span> <span class="o">=</span> <span class="n">fetch_fn</span>
</span><span id="L-1855"><a href="#L-1855"><span class="linenos">1855</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">fetch</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result_collection</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
</span><span id="L-1856"><a href="#L-1856"><span class="linenos">1856</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span>
</span><span id="L-1857"><a href="#L-1857"><span class="linenos">1857</span></a> <span class="k">if</span> <span class="n">result_collection</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1858"><a href="#L-1858"><span class="linenos">1858</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;-- result_collection=</span><span class="si">{</span><span class="n">result_collection</span><span class="si">}</span><span class="se">\n</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s1">&#39;</span>
</span><span id="L-1859"><a href="#L-1859"><span class="linenos">1859</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fetch_fn</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
</span><span id="L-1860"><a href="#L-1860"><span class="linenos">1860</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">fetch_one</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-1861"><a href="#L-1861"><span class="linenos">1861</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="n">result_collection</span><span class="o">=</span><span class="s2">&quot;last_statement_first_row&quot;</span><span class="p">)</span>
</span><span id="L-1862"><a href="#L-1862"><span class="linenos">1862</span></a>
</span><span id="L-1863"><a href="#L-1863"><span class="linenos">1863</span></a><span class="k">def</span><span class="w"> </span><span class="nf">infer_sql_type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-1864"><a href="#L-1864"><span class="linenos">1864</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-1865"><a href="#L-1865"><span class="linenos">1865</span></a><span class="sd"> DuckDB executor requires explicit argument types at declaration</span>
</span><span id="L-1866"><a href="#L-1866"><span class="linenos">1866</span></a><span class="sd"> These types exist in both DuckDB and Postgres</span>
</span><span id="L-1867"><a href="#L-1867"><span class="linenos">1867</span></a><span class="sd"> Check that the types exist if you plan to extend this function for other SQL engines.</span>
</span><span id="L-1868"><a href="#L-1868"><span class="linenos">1868</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-1869"><a href="#L-1869"><span class="linenos">1869</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><span id="L-1870"><a href="#L-1870"><span class="linenos">1870</span></a> <span class="c1"># Check bool before int since bool is a subclass of int in Python</span>
</span><span id="L-1871"><a href="#L-1871"><span class="linenos">1871</span></a> <span class="k">return</span> <span class="s2">&quot;BOOLEAN&quot;</span>
</span><span id="L-1872"><a href="#L-1872"><span class="linenos">1872</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
</span><span id="L-1873"><a href="#L-1873"><span class="linenos">1873</span></a> <span class="k">return</span> <span class="s2">&quot;BIGINT&quot;</span>
</span><span id="L-1874"><a href="#L-1874"><span class="linenos">1874</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span>
</span><span id="L-1875"><a href="#L-1875"><span class="linenos">1875</span></a> <span class="k">return</span> <span class="s2">&quot;DOUBLE PRECISION&quot;</span>
</span><span id="L-1876"><a href="#L-1876"><span class="linenos">1876</span></a> <span class="k">elif</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1877"><a href="#L-1877"><span class="linenos">1877</span></a> <span class="k">return</span> <span class="s2">&quot;TEXT&quot;</span>
</span><span id="L-1878"><a href="#L-1878"><span class="linenos">1878</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-1879"><a href="#L-1879"><span class="linenos">1879</span></a> <span class="k">return</span> <span class="s2">&quot;TEXT&quot;</span>
</span><span id="L-1880"><a href="#L-1880"><span class="linenos">1880</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
</span><span id="L-1881"><a href="#L-1881"><span class="linenos">1881</span></a> <span class="k">return</span> <span class="s2">&quot;JSON&quot;</span>
</span><span id="L-1882"><a href="#L-1882"><span class="linenos">1882</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-1883"><a href="#L-1883"><span class="linenos">1883</span></a> <span class="k">return</span> <span class="s2">&quot;TEXT&quot;</span>
</span></pre></div>
</section>
<section id="logger">
<div class="attr variable">
<span class="name">logger</span> =
<span class="default_value">&lt;Logger windmill_client (WARNING)&gt;</span>
</div>
<a class="headerlink" href="#logger"></a>
</section>
<section id="JobStatus">
<div class="attr variable">
<span class="name">JobStatus</span> =
<span class="default_value">typing.Literal[&#39;RUNNING&#39;, &#39;WAITING&#39;, &#39;COMPLETED&#39;]</span>
</div>
<a class="headerlink" href="#JobStatus"></a>
</section>
<section id="Windmill">
<input id="Windmill-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">Windmill</span>:
<label class="view-source-button" for="Windmill-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill-35"><a href="#Windmill-35"><span class="linenos"> 35</span></a><span class="k">class</span><span class="w"> </span><span class="nc">Windmill</span><span class="p">:</span>
</span><span id="Windmill-36"><a href="#Windmill-36"><span class="linenos"> 36</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">base_url</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">token</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">workspace</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">verify</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
</span><span id="Windmill-37"><a href="#Windmill-37"><span class="linenos"> 37</span></a> <span class="n">base</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="Windmill-38"><a href="#Windmill-38"><span class="linenos"> 38</span></a> <span class="n">base_url</span>
</span><span id="Windmill-39"><a href="#Windmill-39"><span class="linenos"> 39</span></a> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;BASE_INTERNAL_URL&quot;</span><span class="p">)</span>
</span><span id="Windmill-40"><a href="#Windmill-40"><span class="linenos"> 40</span></a> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_BASE_URL&quot;</span><span class="p">)</span>
</span><span id="Windmill-41"><a href="#Windmill-41"><span class="linenos"> 41</span></a> <span class="p">)</span>
</span><span id="Windmill-42"><a href="#Windmill-42"><span class="linenos"> 42</span></a>
</span><span id="Windmill-43"><a href="#Windmill-43"><span class="linenos"> 43</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_url</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">/api&quot;</span>
</span><span id="Windmill-44"><a href="#Windmill-44"><span class="linenos"> 44</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="n">token</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_TOKEN&quot;</span><span class="p">)</span>
</span><span id="Windmill-45"><a href="#Windmill-45"><span class="linenos"> 45</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Windmill-46"><a href="#Windmill-46"><span class="linenos"> 46</span></a> <span class="s2">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span>
</span><span id="Windmill-47"><a href="#Windmill-47"><span class="linenos"> 47</span></a> <span class="s2">&quot;Authorization&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Bearer </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-48"><a href="#Windmill-48"><span class="linenos"> 48</span></a> <span class="p">}</span>
</span><span id="Windmill-49"><a href="#Windmill-49"><span class="linenos"> 49</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">verify</span> <span class="o">=</span> <span class="n">verify</span>
</span><span id="Windmill-50"><a href="#Windmill-50"><span class="linenos"> 50</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_client</span><span class="p">()</span>
</span><span id="Windmill-51"><a href="#Windmill-51"><span class="linenos"> 51</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">workspace</span> <span class="o">=</span> <span class="n">workspace</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_WORKSPACE&quot;</span><span class="p">)</span>
</span><span id="Windmill-52"><a href="#Windmill-52"><span class="linenos"> 52</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_PATH&quot;</span><span class="p">)</span>
</span><span id="Windmill-53"><a href="#Windmill-53"><span class="linenos"> 53</span></a>
</span><span id="Windmill-54"><a href="#Windmill-54"><span class="linenos"> 54</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_mocked_api</span><span class="p">()</span>
</span><span id="Windmill-55"><a href="#Windmill-55"><span class="linenos"> 55</span></a>
</span><span id="Windmill-56"><a href="#Windmill-56"><span class="linenos"> 56</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="p">,</span> <span class="p">(</span>
</span><span id="Windmill-57"><a href="#Windmill-57"><span class="linenos"> 57</span></a> <span class="sa">f</span><span class="s2">&quot;workspace required as an argument or as WM_WORKSPACE environment variable&quot;</span>
</span><span id="Windmill-58"><a href="#Windmill-58"><span class="linenos"> 58</span></a> <span class="p">)</span>
</span><span id="Windmill-59"><a href="#Windmill-59"><span class="linenos"> 59</span></a>
</span><span id="Windmill-60"><a href="#Windmill-60"><span class="linenos"> 60</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_mocked_api</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span><span class="p">]:</span>
</span><span id="Windmill-61"><a href="#Windmill-61"><span class="linenos"> 61</span></a> <span class="n">mocked_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_MOCKED_API_FILE&quot;</span><span class="p">)</span>
</span><span id="Windmill-62"><a href="#Windmill-62"><span class="linenos"> 62</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">mocked_path</span><span class="p">:</span>
</span><span id="Windmill-63"><a href="#Windmill-63"><span class="linenos"> 63</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="Windmill-64"><a href="#Windmill-64"><span class="linenos"> 64</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Using mocked API from </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">mocked_path</span><span class="p">)</span>
</span><span id="Windmill-65"><a href="#Windmill-65"><span class="linenos"> 65</span></a> <span class="n">mocked_api</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;variables&quot;</span><span class="p">:</span> <span class="p">{},</span> <span class="s2">&quot;resources&quot;</span><span class="p">:</span> <span class="p">{}}</span>
</span><span id="Windmill-66"><a href="#Windmill-66"><span class="linenos"> 66</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill-67"><a href="#Windmill-67"><span class="linenos"> 67</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">mocked_path</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="Windmill-68"><a href="#Windmill-68"><span class="linenos"> 68</span></a> <span class="n">incoming_mocked_api</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span id="Windmill-69"><a href="#Windmill-69"><span class="linenos"> 69</span></a> <span class="n">mocked_api</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">mocked_api</span><span class="p">,</span> <span class="o">**</span><span class="n">incoming_mocked_api</span><span class="p">}</span>
</span><span id="Windmill-70"><a href="#Windmill-70"><span class="linenos"> 70</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill-71"><a href="#Windmill-71"><span class="linenos"> 71</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
</span><span id="Windmill-72"><a href="#Windmill-72"><span class="linenos"> 72</span></a> <span class="s2">&quot;Error parsing mocked API file at path </span><span class="si">%s</span><span class="s2"> Using empty mocked API.&quot;</span><span class="p">,</span>
</span><span id="Windmill-73"><a href="#Windmill-73"><span class="linenos"> 73</span></a> <span class="n">mocked_path</span><span class="p">,</span>
</span><span id="Windmill-74"><a href="#Windmill-74"><span class="linenos"> 74</span></a> <span class="p">)</span>
</span><span id="Windmill-75"><a href="#Windmill-75"><span class="linenos"> 75</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="Windmill-76"><a href="#Windmill-76"><span class="linenos"> 76</span></a> <span class="k">return</span> <span class="n">mocked_api</span>
</span><span id="Windmill-77"><a href="#Windmill-77"><span class="linenos"> 77</span></a>
</span><span id="Windmill-78"><a href="#Windmill-78"><span class="linenos"> 78</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_client</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span><span class="p">:</span>
</span><span id="Windmill-79"><a href="#Windmill-79"><span class="linenos"> 79</span></a> <span class="k">return</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span>
</span><span id="Windmill-80"><a href="#Windmill-80"><span class="linenos"> 80</span></a> <span class="n">base_url</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">base_url</span><span class="p">,</span>
</span><span id="Windmill-81"><a href="#Windmill-81"><span class="linenos"> 81</span></a> <span class="n">headers</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">,</span>
</span><span id="Windmill-82"><a href="#Windmill-82"><span class="linenos"> 82</span></a> <span class="n">verify</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">verify</span><span class="p">,</span>
</span><span id="Windmill-83"><a href="#Windmill-83"><span class="linenos"> 83</span></a> <span class="p">)</span>
</span><span id="Windmill-84"><a href="#Windmill-84"><span class="linenos"> 84</span></a>
</span><span id="Windmill-85"><a href="#Windmill-85"><span class="linenos"> 85</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">True</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">httpx</span><span class="o">.</span><span class="n">Response</span><span class="p">:</span>
</span><span id="Windmill-86"><a href="#Windmill-86"><span class="linenos"> 86</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
</span><span id="Windmill-87"><a href="#Windmill-87"><span class="linenos"> 87</span></a> <span class="n">resp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/</span><span class="si">{</span><span class="n">endpoint</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="Windmill-88"><a href="#Windmill-88"><span class="linenos"> 88</span></a> <span class="k">if</span> <span class="n">raise_for_status</span><span class="p">:</span>
</span><span id="Windmill-89"><a href="#Windmill-89"><span class="linenos"> 89</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill-90"><a href="#Windmill-90"><span class="linenos"> 90</span></a> <span class="n">resp</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="Windmill-91"><a href="#Windmill-91"><span class="linenos"> 91</span></a> <span class="k">except</span> <span class="n">httpx</span><span class="o">.</span><span class="n">HTTPStatusError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
</span><span id="Windmill-92"><a href="#Windmill-92"><span class="linenos"> 92</span></a> <span class="n">error</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill-93"><a href="#Windmill-93"><span class="linenos"> 93</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span id="Windmill-94"><a href="#Windmill-94"><span class="linenos"> 94</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span id="Windmill-95"><a href="#Windmill-95"><span class="linenos"> 95</span></a> <span class="k">return</span> <span class="n">resp</span>
</span><span id="Windmill-96"><a href="#Windmill-96"><span class="linenos"> 96</span></a>
</span><span id="Windmill-97"><a href="#Windmill-97"><span class="linenos"> 97</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">True</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">httpx</span><span class="o">.</span><span class="n">Response</span><span class="p">:</span>
</span><span id="Windmill-98"><a href="#Windmill-98"><span class="linenos"> 98</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
</span><span id="Windmill-99"><a href="#Windmill-99"><span class="linenos"> 99</span></a> <span class="n">resp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/</span><span class="si">{</span><span class="n">endpoint</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="Windmill-100"><a href="#Windmill-100"><span class="linenos"> 100</span></a> <span class="k">if</span> <span class="n">raise_for_status</span><span class="p">:</span>
</span><span id="Windmill-101"><a href="#Windmill-101"><span class="linenos"> 101</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill-102"><a href="#Windmill-102"><span class="linenos"> 102</span></a> <span class="n">resp</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="Windmill-103"><a href="#Windmill-103"><span class="linenos"> 103</span></a> <span class="k">except</span> <span class="n">httpx</span><span class="o">.</span><span class="n">HTTPStatusError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
</span><span id="Windmill-104"><a href="#Windmill-104"><span class="linenos"> 104</span></a> <span class="n">error</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill-105"><a href="#Windmill-105"><span class="linenos"> 105</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span id="Windmill-106"><a href="#Windmill-106"><span class="linenos"> 106</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span id="Windmill-107"><a href="#Windmill-107"><span class="linenos"> 107</span></a> <span class="k">return</span> <span class="n">resp</span>
</span><span id="Windmill-108"><a href="#Windmill-108"><span class="linenos"> 108</span></a>
</span><span id="Windmill-109"><a href="#Windmill-109"><span class="linenos"> 109</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">create_token</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">duration</span><span class="o">=</span><span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill-110"><a href="#Windmill-110"><span class="linenos"> 110</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="s2">&quot;/users/tokens/create&quot;</span>
</span><span id="Windmill-111"><a href="#Windmill-111"><span class="linenos"> 111</span></a> <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Windmill-112"><a href="#Windmill-112"><span class="linenos"> 112</span></a> <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;refresh </span><span class="si">{</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-113"><a href="#Windmill-113"><span class="linenos"> 113</span></a> <span class="s2">&quot;expiration&quot;</span><span class="p">:</span> <span class="p">(</span><span class="n">dt</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="o">+</span> <span class="n">duration</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%Y-%m-</span><span class="si">%d</span><span class="s2">T%H:%M:%SZ&quot;</span><span class="p">),</span>
</span><span id="Windmill-114"><a href="#Windmill-114"><span class="linenos"> 114</span></a> <span class="p">}</span>
</span><span id="Windmill-115"><a href="#Windmill-115"><span class="linenos"> 115</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="Windmill-116"><a href="#Windmill-116"><span class="linenos"> 116</span></a>
</span><span id="Windmill-117"><a href="#Windmill-117"><span class="linenos"> 117</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_async</span><span class="p">(</span>
</span><span id="Windmill-118"><a href="#Windmill-118"><span class="linenos"> 118</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-119"><a href="#Windmill-119"><span class="linenos"> 119</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-120"><a href="#Windmill-120"><span class="linenos"> 120</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-121"><a href="#Windmill-121"><span class="linenos"> 121</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-122"><a href="#Windmill-122"><span class="linenos"> 122</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-123"><a href="#Windmill-123"><span class="linenos"> 123</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill-124"><a href="#Windmill-124"><span class="linenos"> 124</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a script job and return its job id.</span>
</span><span id="Windmill-125"><a href="#Windmill-125"><span class="linenos"> 125</span></a><span class="sd"> </span>
</span><span id="Windmill-126"><a href="#Windmill-126"><span class="linenos"> 126</span></a><span class="sd"> .. deprecated:: Use run_script_by_path_async or run_script_by_hash_async instead.</span>
</span><span id="Windmill-127"><a href="#Windmill-127"><span class="linenos"> 127</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-128"><a href="#Windmill-128"><span class="linenos"> 128</span></a> <span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
</span><span id="Windmill-129"><a href="#Windmill-129"><span class="linenos"> 129</span></a> <span class="s2">&quot;run_script_async is deprecated. Use run_script_by_path_async or run_script_by_hash_async instead.&quot;</span><span class="p">,</span>
</span><span id="Windmill-130"><a href="#Windmill-130"><span class="linenos"> 130</span></a> <span class="p">)</span>
</span><span id="Windmill-131"><a href="#Windmill-131"><span class="linenos"> 131</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="p">(</span><span class="n">path</span> <span class="ow">and</span> <span class="n">hash_</span><span class="p">),</span> <span class="s2">&quot;path and hash_ are mutually exclusive&quot;</span>
</span><span id="Windmill-132"><a href="#Windmill-132"><span class="linenos"> 132</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_async_internal</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">)</span>
</span><span id="Windmill-133"><a href="#Windmill-133"><span class="linenos"> 133</span></a>
</span><span id="Windmill-134"><a href="#Windmill-134"><span class="linenos"> 134</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_run_script_async_internal</span><span class="p">(</span>
</span><span id="Windmill-135"><a href="#Windmill-135"><span class="linenos"> 135</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-136"><a href="#Windmill-136"><span class="linenos"> 136</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-137"><a href="#Windmill-137"><span class="linenos"> 137</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-138"><a href="#Windmill-138"><span class="linenos"> 138</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-139"><a href="#Windmill-139"><span class="linenos"> 139</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-140"><a href="#Windmill-140"><span class="linenos"> 140</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill-141"><a href="#Windmill-141"><span class="linenos"> 141</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Internal helper for running scripts asynchronously.&quot;&quot;&quot;</span>
</span><span id="Windmill-142"><a href="#Windmill-142"><span class="linenos"> 142</span></a> <span class="n">args</span> <span class="o">=</span> <span class="n">args</span> <span class="ow">or</span> <span class="p">{}</span>
</span><span id="Windmill-143"><a href="#Windmill-143"><span class="linenos"> 143</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;scheduled_in_secs&quot;</span><span class="p">:</span> <span class="n">scheduled_in_secs</span><span class="p">}</span> <span class="k">if</span> <span class="n">scheduled_in_secs</span> <span class="k">else</span> <span class="p">{}</span>
</span><span id="Windmill-144"><a href="#Windmill-144"><span class="linenos"> 144</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">):</span>
</span><span id="Windmill-145"><a href="#Windmill-145"><span class="linenos"> 145</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;parent_job&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill-146"><a href="#Windmill-146"><span class="linenos"> 146</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_ROOT_FLOW_JOB_ID&quot;</span><span class="p">):</span>
</span><span id="Windmill-147"><a href="#Windmill-147"><span class="linenos"> 147</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;root_job&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_ROOT_FLOW_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill-148"><a href="#Windmill-148"><span class="linenos"> 148</span></a>
</span><span id="Windmill-149"><a href="#Windmill-149"><span class="linenos"> 149</span></a> <span class="k">if</span> <span class="n">path</span><span class="p">:</span>
</span><span id="Windmill-150"><a href="#Windmill-150"><span class="linenos"> 150</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/run/p/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill-151"><a href="#Windmill-151"><span class="linenos"> 151</span></a> <span class="k">elif</span> <span class="n">hash_</span><span class="p">:</span>
</span><span id="Windmill-152"><a href="#Windmill-152"><span class="linenos"> 152</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/run/h/</span><span class="si">{</span><span class="n">hash_</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill-153"><a href="#Windmill-153"><span class="linenos"> 153</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill-154"><a href="#Windmill-154"><span class="linenos"> 154</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;path or hash_ must be provided&quot;</span><span class="p">)</span>
</span><span id="Windmill-155"><a href="#Windmill-155"><span class="linenos"> 155</span></a>
</span><span id="Windmill-156"><a href="#Windmill-156"><span class="linenos"> 156</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="Windmill-157"><a href="#Windmill-157"><span class="linenos"> 157</span></a>
</span><span id="Windmill-158"><a href="#Windmill-158"><span class="linenos"> 158</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_path_async</span><span class="p">(</span>
</span><span id="Windmill-159"><a href="#Windmill-159"><span class="linenos"> 159</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-160"><a href="#Windmill-160"><span class="linenos"> 160</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-161"><a href="#Windmill-161"><span class="linenos"> 161</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-162"><a href="#Windmill-162"><span class="linenos"> 162</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-163"><a href="#Windmill-163"><span class="linenos"> 163</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill-164"><a href="#Windmill-164"><span class="linenos"> 164</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a script job by path and return its job id.&quot;&quot;&quot;</span>
</span><span id="Windmill-165"><a href="#Windmill-165"><span class="linenos"> 165</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_async_internal</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">)</span>
</span><span id="Windmill-166"><a href="#Windmill-166"><span class="linenos"> 166</span></a>
</span><span id="Windmill-167"><a href="#Windmill-167"><span class="linenos"> 167</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_hash_async</span><span class="p">(</span>
</span><span id="Windmill-168"><a href="#Windmill-168"><span class="linenos"> 168</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-169"><a href="#Windmill-169"><span class="linenos"> 169</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-170"><a href="#Windmill-170"><span class="linenos"> 170</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-171"><a href="#Windmill-171"><span class="linenos"> 171</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-172"><a href="#Windmill-172"><span class="linenos"> 172</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill-173"><a href="#Windmill-173"><span class="linenos"> 173</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a script job by hash and return its job id.&quot;&quot;&quot;</span>
</span><span id="Windmill-174"><a href="#Windmill-174"><span class="linenos"> 174</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_async_internal</span><span class="p">(</span><span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">)</span>
</span><span id="Windmill-175"><a href="#Windmill-175"><span class="linenos"> 175</span></a>
</span><span id="Windmill-176"><a href="#Windmill-176"><span class="linenos"> 176</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_flow_async</span><span class="p">(</span>
</span><span id="Windmill-177"><a href="#Windmill-177"><span class="linenos"> 177</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-178"><a href="#Windmill-178"><span class="linenos"> 178</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-179"><a href="#Windmill-179"><span class="linenos"> 179</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-180"><a href="#Windmill-180"><span class="linenos"> 180</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-181"><a href="#Windmill-181"><span class="linenos"> 181</span></a> <span class="c1"># can only be set to false if this the job will be fully await and not concurrent with any other job</span>
</span><span id="Windmill-182"><a href="#Windmill-182"><span class="linenos"> 182</span></a> <span class="c1"># as otherwise the child flow and its own child will store their state in the parent job which will</span>
</span><span id="Windmill-183"><a href="#Windmill-183"><span class="linenos"> 183</span></a> <span class="c1"># lead to incorrectness and failures</span>
</span><span id="Windmill-184"><a href="#Windmill-184"><span class="linenos"> 184</span></a> <span class="n">do_not_track_in_parent</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill-185"><a href="#Windmill-185"><span class="linenos"> 185</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill-186"><a href="#Windmill-186"><span class="linenos"> 186</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a flow job and return its job id.&quot;&quot;&quot;</span>
</span><span id="Windmill-187"><a href="#Windmill-187"><span class="linenos"> 187</span></a> <span class="n">args</span> <span class="o">=</span> <span class="n">args</span> <span class="ow">or</span> <span class="p">{}</span>
</span><span id="Windmill-188"><a href="#Windmill-188"><span class="linenos"> 188</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;scheduled_in_secs&quot;</span><span class="p">:</span> <span class="n">scheduled_in_secs</span><span class="p">}</span> <span class="k">if</span> <span class="n">scheduled_in_secs</span> <span class="k">else</span> <span class="p">{}</span>
</span><span id="Windmill-189"><a href="#Windmill-189"><span class="linenos"> 189</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">do_not_track_in_parent</span><span class="p">:</span>
</span><span id="Windmill-190"><a href="#Windmill-190"><span class="linenos"> 190</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">):</span>
</span><span id="Windmill-191"><a href="#Windmill-191"><span class="linenos"> 191</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;parent_job&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill-192"><a href="#Windmill-192"><span class="linenos"> 192</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_ROOT_FLOW_JOB_ID&quot;</span><span class="p">):</span>
</span><span id="Windmill-193"><a href="#Windmill-193"><span class="linenos"> 193</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;root_job&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_ROOT_FLOW_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill-194"><a href="#Windmill-194"><span class="linenos"> 194</span></a> <span class="k">if</span> <span class="n">path</span><span class="p">:</span>
</span><span id="Windmill-195"><a href="#Windmill-195"><span class="linenos"> 195</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/run/f/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill-196"><a href="#Windmill-196"><span class="linenos"> 196</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill-197"><a href="#Windmill-197"><span class="linenos"> 197</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;path must be provided&quot;</span><span class="p">)</span>
</span><span id="Windmill-198"><a href="#Windmill-198"><span class="linenos"> 198</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="Windmill-199"><a href="#Windmill-199"><span class="linenos"> 199</span></a>
</span><span id="Windmill-200"><a href="#Windmill-200"><span class="linenos"> 200</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script</span><span class="p">(</span>
</span><span id="Windmill-201"><a href="#Windmill-201"><span class="linenos"> 201</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-202"><a href="#Windmill-202"><span class="linenos"> 202</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-203"><a href="#Windmill-203"><span class="linenos"> 203</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-204"><a href="#Windmill-204"><span class="linenos"> 204</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-205"><a href="#Windmill-205"><span class="linenos"> 205</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-206"><a href="#Windmill-206"><span class="linenos"> 206</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-207"><a href="#Windmill-207"><span class="linenos"> 207</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill-208"><a href="#Windmill-208"><span class="linenos"> 208</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-209"><a href="#Windmill-209"><span class="linenos"> 209</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill-210"><a href="#Windmill-210"><span class="linenos"> 210</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script synchronously and return its result.</span>
</span><span id="Windmill-211"><a href="#Windmill-211"><span class="linenos"> 211</span></a><span class="sd"> </span>
</span><span id="Windmill-212"><a href="#Windmill-212"><span class="linenos"> 212</span></a><span class="sd"> .. deprecated:: Use run_script_by_path or run_script_by_hash instead.</span>
</span><span id="Windmill-213"><a href="#Windmill-213"><span class="linenos"> 213</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-214"><a href="#Windmill-214"><span class="linenos"> 214</span></a> <span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
</span><span id="Windmill-215"><a href="#Windmill-215"><span class="linenos"> 215</span></a> <span class="s2">&quot;run_script is deprecated. Use run_script_by_path or run_script_by_hash instead.&quot;</span><span class="p">,</span>
</span><span id="Windmill-216"><a href="#Windmill-216"><span class="linenos"> 216</span></a> <span class="p">)</span>
</span><span id="Windmill-217"><a href="#Windmill-217"><span class="linenos"> 217</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="p">(</span><span class="n">path</span> <span class="ow">and</span> <span class="n">hash_</span><span class="p">),</span> <span class="s2">&quot;path and hash_ are mutually exclusive&quot;</span>
</span><span id="Windmill-218"><a href="#Windmill-218"><span class="linenos"> 218</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_internal</span><span class="p">(</span>
</span><span id="Windmill-219"><a href="#Windmill-219"><span class="linenos"> 219</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="Windmill-220"><a href="#Windmill-220"><span class="linenos"> 220</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span>
</span><span id="Windmill-221"><a href="#Windmill-221"><span class="linenos"> 221</span></a> <span class="p">)</span>
</span><span id="Windmill-222"><a href="#Windmill-222"><span class="linenos"> 222</span></a>
</span><span id="Windmill-223"><a href="#Windmill-223"><span class="linenos"> 223</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_run_script_internal</span><span class="p">(</span>
</span><span id="Windmill-224"><a href="#Windmill-224"><span class="linenos"> 224</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-225"><a href="#Windmill-225"><span class="linenos"> 225</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-226"><a href="#Windmill-226"><span class="linenos"> 226</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-227"><a href="#Windmill-227"><span class="linenos"> 227</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-228"><a href="#Windmill-228"><span class="linenos"> 228</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-229"><a href="#Windmill-229"><span class="linenos"> 229</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-230"><a href="#Windmill-230"><span class="linenos"> 230</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill-231"><a href="#Windmill-231"><span class="linenos"> 231</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-232"><a href="#Windmill-232"><span class="linenos"> 232</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill-233"><a href="#Windmill-233"><span class="linenos"> 233</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Internal helper for running scripts synchronously.&quot;&quot;&quot;</span>
</span><span id="Windmill-234"><a href="#Windmill-234"><span class="linenos"> 234</span></a> <span class="n">args</span> <span class="o">=</span> <span class="n">args</span> <span class="ow">or</span> <span class="p">{}</span>
</span><span id="Windmill-235"><a href="#Windmill-235"><span class="linenos"> 235</span></a>
</span><span id="Windmill-236"><a href="#Windmill-236"><span class="linenos"> 236</span></a> <span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
</span><span id="Windmill-237"><a href="#Windmill-237"><span class="linenos"> 237</span></a> <span class="k">if</span> <span class="n">path</span><span class="p">:</span>
</span><span id="Windmill-238"><a href="#Windmill-238"><span class="linenos"> 238</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;running `</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">` synchronously with </span><span class="si">{</span><span class="n">args</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill-239"><a href="#Windmill-239"><span class="linenos"> 239</span></a> <span class="k">elif</span> <span class="n">hash_</span><span class="p">:</span>
</span><span id="Windmill-240"><a href="#Windmill-240"><span class="linenos"> 240</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;running script with hash `</span><span class="si">{</span><span class="n">hash_</span><span class="si">}</span><span class="s2">` synchronously with </span><span class="si">{</span><span class="n">args</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill-241"><a href="#Windmill-241"><span class="linenos"> 241</span></a>
</span><span id="Windmill-242"><a href="#Windmill-242"><span class="linenos"> 242</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">timeout</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span><span class="p">):</span>
</span><span id="Windmill-243"><a href="#Windmill-243"><span class="linenos"> 243</span></a> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="o">.</span><span class="n">total_seconds</span><span class="p">()</span>
</span><span id="Windmill-244"><a href="#Windmill-244"><span class="linenos"> 244</span></a>
</span><span id="Windmill-245"><a href="#Windmill-245"><span class="linenos"> 245</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_async_internal</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">)</span>
</span><span id="Windmill-246"><a href="#Windmill-246"><span class="linenos"> 246</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wait_job</span><span class="p">(</span>
</span><span id="Windmill-247"><a href="#Windmill-247"><span class="linenos"> 247</span></a> <span class="n">job_id</span><span class="p">,</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">verbose</span><span class="p">,</span> <span class="n">cleanup</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span>
</span><span id="Windmill-248"><a href="#Windmill-248"><span class="linenos"> 248</span></a> <span class="p">)</span>
</span><span id="Windmill-249"><a href="#Windmill-249"><span class="linenos"> 249</span></a>
</span><span id="Windmill-250"><a href="#Windmill-250"><span class="linenos"> 250</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_path</span><span class="p">(</span>
</span><span id="Windmill-251"><a href="#Windmill-251"><span class="linenos"> 251</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-252"><a href="#Windmill-252"><span class="linenos"> 252</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-253"><a href="#Windmill-253"><span class="linenos"> 253</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-254"><a href="#Windmill-254"><span class="linenos"> 254</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-255"><a href="#Windmill-255"><span class="linenos"> 255</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-256"><a href="#Windmill-256"><span class="linenos"> 256</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill-257"><a href="#Windmill-257"><span class="linenos"> 257</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-258"><a href="#Windmill-258"><span class="linenos"> 258</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill-259"><a href="#Windmill-259"><span class="linenos"> 259</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script by path synchronously and return its result.&quot;&quot;&quot;</span>
</span><span id="Windmill-260"><a href="#Windmill-260"><span class="linenos"> 260</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_internal</span><span class="p">(</span>
</span><span id="Windmill-261"><a href="#Windmill-261"><span class="linenos"> 261</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="Windmill-262"><a href="#Windmill-262"><span class="linenos"> 262</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span>
</span><span id="Windmill-263"><a href="#Windmill-263"><span class="linenos"> 263</span></a> <span class="p">)</span>
</span><span id="Windmill-264"><a href="#Windmill-264"><span class="linenos"> 264</span></a>
</span><span id="Windmill-265"><a href="#Windmill-265"><span class="linenos"> 265</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_hash</span><span class="p">(</span>
</span><span id="Windmill-266"><a href="#Windmill-266"><span class="linenos"> 266</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-267"><a href="#Windmill-267"><span class="linenos"> 267</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-268"><a href="#Windmill-268"><span class="linenos"> 268</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-269"><a href="#Windmill-269"><span class="linenos"> 269</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-270"><a href="#Windmill-270"><span class="linenos"> 270</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-271"><a href="#Windmill-271"><span class="linenos"> 271</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill-272"><a href="#Windmill-272"><span class="linenos"> 272</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-273"><a href="#Windmill-273"><span class="linenos"> 273</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill-274"><a href="#Windmill-274"><span class="linenos"> 274</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script by hash synchronously and return its result.&quot;&quot;&quot;</span>
</span><span id="Windmill-275"><a href="#Windmill-275"><span class="linenos"> 275</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_internal</span><span class="p">(</span>
</span><span id="Windmill-276"><a href="#Windmill-276"><span class="linenos"> 276</span></a> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="Windmill-277"><a href="#Windmill-277"><span class="linenos"> 277</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span>
</span><span id="Windmill-278"><a href="#Windmill-278"><span class="linenos"> 278</span></a> <span class="p">)</span>
</span><span id="Windmill-279"><a href="#Windmill-279"><span class="linenos"> 279</span></a>
</span><span id="Windmill-280"><a href="#Windmill-280"><span class="linenos"> 280</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_inline_script_preview</span><span class="p">(</span>
</span><span id="Windmill-281"><a href="#Windmill-281"><span class="linenos"> 281</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-282"><a href="#Windmill-282"><span class="linenos"> 282</span></a> <span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-283"><a href="#Windmill-283"><span class="linenos"> 283</span></a> <span class="n">language</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-284"><a href="#Windmill-284"><span class="linenos"> 284</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-285"><a href="#Windmill-285"><span class="linenos"> 285</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill-286"><a href="#Windmill-286"><span class="linenos"> 286</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run a script on the current worker without creating a job&quot;&quot;&quot;</span>
</span><span id="Windmill-287"><a href="#Windmill-287"><span class="linenos"> 287</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/run_inline/preview&quot;</span>
</span><span id="Windmill-288"><a href="#Windmill-288"><span class="linenos"> 288</span></a> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Windmill-289"><a href="#Windmill-289"><span class="linenos"> 289</span></a> <span class="s2">&quot;content&quot;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
</span><span id="Windmill-290"><a href="#Windmill-290"><span class="linenos"> 290</span></a> <span class="s2">&quot;language&quot;</span><span class="p">:</span> <span class="n">language</span><span class="p">,</span>
</span><span id="Windmill-291"><a href="#Windmill-291"><span class="linenos"> 291</span></a> <span class="s2">&quot;args&quot;</span><span class="p">:</span> <span class="n">args</span> <span class="ow">or</span> <span class="p">{},</span>
</span><span id="Windmill-292"><a href="#Windmill-292"><span class="linenos"> 292</span></a> <span class="p">}</span>
</span><span id="Windmill-293"><a href="#Windmill-293"><span class="linenos"> 293</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">body</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="Windmill-294"><a href="#Windmill-294"><span class="linenos"> 294</span></a>
</span><span id="Windmill-295"><a href="#Windmill-295"><span class="linenos"> 295</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">wait_job</span><span class="p">(</span>
</span><span id="Windmill-296"><a href="#Windmill-296"><span class="linenos"> 296</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-297"><a href="#Windmill-297"><span class="linenos"> 297</span></a> <span class="n">job_id</span><span class="p">,</span>
</span><span id="Windmill-298"><a href="#Windmill-298"><span class="linenos"> 298</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-299"><a href="#Windmill-299"><span class="linenos"> 299</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-300"><a href="#Windmill-300"><span class="linenos"> 300</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill-301"><a href="#Windmill-301"><span class="linenos"> 301</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-302"><a href="#Windmill-302"><span class="linenos"> 302</span></a> <span class="p">):</span>
</span><span id="Windmill-303"><a href="#Windmill-303"><span class="linenos"> 303</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">cancel_job</span><span class="p">():</span>
</span><span id="Windmill-304"><a href="#Windmill-304"><span class="linenos"> 304</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;cancelling job: </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill-305"><a href="#Windmill-305"><span class="linenos"> 305</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-306"><a href="#Windmill-306"><span class="linenos"> 306</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-307"><a href="#Windmill-307"><span class="linenos"> 307</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="s2">&quot;parent script cancelled&quot;</span><span class="p">},</span>
</span><span id="Windmill-308"><a href="#Windmill-308"><span class="linenos"> 308</span></a> <span class="p">)</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="Windmill-309"><a href="#Windmill-309"><span class="linenos"> 309</span></a>
</span><span id="Windmill-310"><a href="#Windmill-310"><span class="linenos"> 310</span></a> <span class="k">if</span> <span class="n">cleanup</span><span class="p">:</span>
</span><span id="Windmill-311"><a href="#Windmill-311"><span class="linenos"> 311</span></a> <span class="n">atexit</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">cancel_job</span><span class="p">)</span>
</span><span id="Windmill-312"><a href="#Windmill-312"><span class="linenos"> 312</span></a>
</span><span id="Windmill-313"><a href="#Windmill-313"><span class="linenos"> 313</span></a> <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span><span id="Windmill-314"><a href="#Windmill-314"><span class="linenos"> 314</span></a>
</span><span id="Windmill-315"><a href="#Windmill-315"><span class="linenos"> 315</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">timeout</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span><span class="p">):</span>
</span><span id="Windmill-316"><a href="#Windmill-316"><span class="linenos"> 316</span></a> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="o">.</span><span class="n">total_seconds</span><span class="p">()</span>
</span><span id="Windmill-317"><a href="#Windmill-317"><span class="linenos"> 317</span></a>
</span><span id="Windmill-318"><a href="#Windmill-318"><span class="linenos"> 318</span></a> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="Windmill-319"><a href="#Windmill-319"><span class="linenos"> 319</span></a> <span class="n">result_res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill-320"><a href="#Windmill-320"><span class="linenos"> 320</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/completed/get_result_maybe/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="kc">True</span>
</span><span id="Windmill-321"><a href="#Windmill-321"><span class="linenos"> 321</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-322"><a href="#Windmill-322"><span class="linenos"> 322</span></a>
</span><span id="Windmill-323"><a href="#Windmill-323"><span class="linenos"> 323</span></a> <span class="n">started</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;started&quot;</span><span class="p">]</span>
</span><span id="Windmill-324"><a href="#Windmill-324"><span class="linenos"> 324</span></a> <span class="n">completed</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;completed&quot;</span><span class="p">]</span>
</span><span id="Windmill-325"><a href="#Windmill-325"><span class="linenos"> 325</span></a> <span class="n">success</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;success&quot;</span><span class="p">]</span>
</span><span id="Windmill-326"><a href="#Windmill-326"><span class="linenos"> 326</span></a>
</span><span id="Windmill-327"><a href="#Windmill-327"><span class="linenos"> 327</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">started</span> <span class="ow">and</span> <span class="n">verbose</span><span class="p">:</span>
</span><span id="Windmill-328"><a href="#Windmill-328"><span class="linenos"> 328</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2"> has not started yet&quot;</span><span class="p">)</span>
</span><span id="Windmill-329"><a href="#Windmill-329"><span class="linenos"> 329</span></a>
</span><span id="Windmill-330"><a href="#Windmill-330"><span class="linenos"> 330</span></a> <span class="k">if</span> <span class="n">cleanup</span> <span class="ow">and</span> <span class="n">completed</span><span class="p">:</span>
</span><span id="Windmill-331"><a href="#Windmill-331"><span class="linenos"> 331</span></a> <span class="n">atexit</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="n">cancel_job</span><span class="p">)</span>
</span><span id="Windmill-332"><a href="#Windmill-332"><span class="linenos"> 332</span></a>
</span><span id="Windmill-333"><a href="#Windmill-333"><span class="linenos"> 333</span></a> <span class="k">if</span> <span class="n">completed</span><span class="p">:</span>
</span><span id="Windmill-334"><a href="#Windmill-334"><span class="linenos"> 334</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;result&quot;</span><span class="p">]</span>
</span><span id="Windmill-335"><a href="#Windmill-335"><span class="linenos"> 335</span></a> <span class="k">if</span> <span class="n">success</span><span class="p">:</span>
</span><span id="Windmill-336"><a href="#Windmill-336"><span class="linenos"> 336</span></a> <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">assert_result_is_not_none</span><span class="p">:</span>
</span><span id="Windmill-337"><a href="#Windmill-337"><span class="linenos"> 337</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Result was none&quot;</span><span class="p">)</span>
</span><span id="Windmill-338"><a href="#Windmill-338"><span class="linenos"> 338</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="Windmill-339"><a href="#Windmill-339"><span class="linenos"> 339</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill-340"><a href="#Windmill-340"><span class="linenos"> 340</span></a> <span class="n">error</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s2">&quot;error&quot;</span><span class="p">]</span>
</span><span id="Windmill-341"><a href="#Windmill-341"><span class="linenos"> 341</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2"> was not successful: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">error</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill-342"><a href="#Windmill-342"><span class="linenos"> 342</span></a>
</span><span id="Windmill-343"><a href="#Windmill-343"><span class="linenos"> 343</span></a> <span class="k">if</span> <span class="n">timeout</span> <span class="ow">and</span> <span class="p">((</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">timeout</span><span class="p">):</span>
</span><span id="Windmill-344"><a href="#Windmill-344"><span class="linenos"> 344</span></a> <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;reached timeout&quot;</span>
</span><span id="Windmill-345"><a href="#Windmill-345"><span class="linenos"> 345</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</span><span id="Windmill-346"><a href="#Windmill-346"><span class="linenos"> 346</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-347"><a href="#Windmill-347"><span class="linenos"> 347</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-348"><a href="#Windmill-348"><span class="linenos"> 348</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="n">msg</span><span class="p">},</span>
</span><span id="Windmill-349"><a href="#Windmill-349"><span class="linenos"> 349</span></a> <span class="p">)</span>
</span><span id="Windmill-350"><a href="#Windmill-350"><span class="linenos"> 350</span></a> <span class="k">raise</span> <span class="ne">TimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</span><span id="Windmill-351"><a href="#Windmill-351"><span class="linenos"> 351</span></a> <span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
</span><span id="Windmill-352"><a href="#Windmill-352"><span class="linenos"> 352</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;sleeping 0.5 seconds for </span><span class="si">{</span><span class="n">job_id</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill-353"><a href="#Windmill-353"><span class="linenos"> 353</span></a>
</span><span id="Windmill-354"><a href="#Windmill-354"><span class="linenos"> 354</span></a> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
</span><span id="Windmill-355"><a href="#Windmill-355"><span class="linenos"> 355</span></a>
</span><span id="Windmill-356"><a href="#Windmill-356"><span class="linenos"> 356</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">cancel_job</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill-357"><a href="#Windmill-357"><span class="linenos"> 357</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cancel a specific job by ID.</span>
</span><span id="Windmill-358"><a href="#Windmill-358"><span class="linenos"> 358</span></a>
</span><span id="Windmill-359"><a href="#Windmill-359"><span class="linenos"> 359</span></a><span class="sd"> Args:</span>
</span><span id="Windmill-360"><a href="#Windmill-360"><span class="linenos"> 360</span></a><span class="sd"> job_id: UUID of the job to cancel</span>
</span><span id="Windmill-361"><a href="#Windmill-361"><span class="linenos"> 361</span></a><span class="sd"> reason: Optional reason for cancellation</span>
</span><span id="Windmill-362"><a href="#Windmill-362"><span class="linenos"> 362</span></a>
</span><span id="Windmill-363"><a href="#Windmill-363"><span class="linenos"> 363</span></a><span class="sd"> Returns:</span>
</span><span id="Windmill-364"><a href="#Windmill-364"><span class="linenos"> 364</span></a><span class="sd"> Response message from the cancel endpoint</span>
</span><span id="Windmill-365"><a href="#Windmill-365"><span class="linenos"> 365</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-366"><a href="#Windmill-366"><span class="linenos"> 366</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;cancelling job: </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill-367"><a href="#Windmill-367"><span class="linenos"> 367</span></a>
</span><span id="Windmill-368"><a href="#Windmill-368"><span class="linenos"> 368</span></a> <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="n">reason</span> <span class="ow">or</span> <span class="s2">&quot;cancelled via cancel_job method&quot;</span><span class="p">}</span>
</span><span id="Windmill-369"><a href="#Windmill-369"><span class="linenos"> 369</span></a>
</span><span id="Windmill-370"><a href="#Windmill-370"><span class="linenos"> 370</span></a> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-371"><a href="#Windmill-371"><span class="linenos"> 371</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-372"><a href="#Windmill-372"><span class="linenos"> 372</span></a> <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
</span><span id="Windmill-373"><a href="#Windmill-373"><span class="linenos"> 373</span></a> <span class="p">)</span>
</span><span id="Windmill-374"><a href="#Windmill-374"><span class="linenos"> 374</span></a>
</span><span id="Windmill-375"><a href="#Windmill-375"><span class="linenos"> 375</span></a> <span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span>
</span><span id="Windmill-376"><a href="#Windmill-376"><span class="linenos"> 376</span></a>
</span><span id="Windmill-377"><a href="#Windmill-377"><span class="linenos"> 377</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">cancel_running</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill-378"><a href="#Windmill-378"><span class="linenos"> 378</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cancel currently running executions of the same script.&quot;&quot;&quot;</span>
</span><span id="Windmill-379"><a href="#Windmill-379"><span class="linenos"> 379</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;canceling running executions of this script&quot;</span><span class="p">)</span>
</span><span id="Windmill-380"><a href="#Windmill-380"><span class="linenos"> 380</span></a>
</span><span id="Windmill-381"><a href="#Windmill-381"><span class="linenos"> 381</span></a> <span class="n">jobs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill-382"><a href="#Windmill-382"><span class="linenos"> 382</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/list&quot;</span><span class="p">,</span>
</span><span id="Windmill-383"><a href="#Windmill-383"><span class="linenos"> 383</span></a> <span class="n">params</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill-384"><a href="#Windmill-384"><span class="linenos"> 384</span></a> <span class="s2">&quot;running&quot;</span><span class="p">:</span> <span class="s2">&quot;true&quot;</span><span class="p">,</span>
</span><span id="Windmill-385"><a href="#Windmill-385"><span class="linenos"> 385</span></a> <span class="s2">&quot;script_path_exact&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span>
</span><span id="Windmill-386"><a href="#Windmill-386"><span class="linenos"> 386</span></a> <span class="p">},</span>
</span><span id="Windmill-387"><a href="#Windmill-387"><span class="linenos"> 387</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-388"><a href="#Windmill-388"><span class="linenos"> 388</span></a>
</span><span id="Windmill-389"><a href="#Windmill-389"><span class="linenos"> 389</span></a> <span class="n">current_job_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill-390"><a href="#Windmill-390"><span class="linenos"> 390</span></a>
</span><span id="Windmill-391"><a href="#Windmill-391"><span class="linenos"> 391</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">current_job_id</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill-392"><a href="#Windmill-392"><span class="linenos"> 392</span></a>
</span><span id="Windmill-393"><a href="#Windmill-393"><span class="linenos"> 393</span></a> <span class="n">job_ids</span> <span class="o">=</span> <span class="p">[</span><span class="n">j</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">jobs</span> <span class="k">if</span> <span class="n">j</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="n">current_job_id</span><span class="p">]</span>
</span><span id="Windmill-394"><a href="#Windmill-394"><span class="linenos"> 394</span></a>
</span><span id="Windmill-395"><a href="#Windmill-395"><span class="linenos"> 395</span></a> <span class="k">if</span> <span class="n">job_ids</span><span class="p">:</span>
</span><span id="Windmill-396"><a href="#Windmill-396"><span class="linenos"> 396</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;cancelling the following job ids: </span><span class="si">{</span><span class="n">job_ids</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill-397"><a href="#Windmill-397"><span class="linenos"> 397</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill-398"><a href="#Windmill-398"><span class="linenos"> 398</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;no previous executions to cancel&quot;</span><span class="p">)</span>
</span><span id="Windmill-399"><a href="#Windmill-399"><span class="linenos"> 399</span></a>
</span><span id="Windmill-400"><a href="#Windmill-400"><span class="linenos"> 400</span></a> <span class="n">result</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="Windmill-401"><a href="#Windmill-401"><span class="linenos"> 401</span></a>
</span><span id="Windmill-402"><a href="#Windmill-402"><span class="linenos"> 402</span></a> <span class="k">for</span> <span class="n">id_</span> <span class="ow">in</span> <span class="n">job_ids</span><span class="p">:</span>
</span><span id="Windmill-403"><a href="#Windmill-403"><span class="linenos"> 403</span></a> <span class="n">result</span><span class="p">[</span><span class="n">id_</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-404"><a href="#Windmill-404"><span class="linenos"> 404</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">id_</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-405"><a href="#Windmill-405"><span class="linenos"> 405</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="s2">&quot;killed by `cancel_running` method&quot;</span><span class="p">},</span>
</span><span id="Windmill-406"><a href="#Windmill-406"><span class="linenos"> 406</span></a> <span class="p">)</span>
</span><span id="Windmill-407"><a href="#Windmill-407"><span class="linenos"> 407</span></a>
</span><span id="Windmill-408"><a href="#Windmill-408"><span class="linenos"> 408</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="Windmill-409"><a href="#Windmill-409"><span class="linenos"> 409</span></a>
</span><span id="Windmill-410"><a href="#Windmill-410"><span class="linenos"> 410</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_job</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill-411"><a href="#Windmill-411"><span class="linenos"> 411</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/get/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-412"><a href="#Windmill-412"><span class="linenos"> 412</span></a>
</span><span id="Windmill-413"><a href="#Windmill-413"><span class="linenos"> 413</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_root_job_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill-414"><a href="#Windmill-414"><span class="linenos"> 414</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">job_id</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill-415"><a href="#Windmill-415"><span class="linenos"> 415</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/get_root_job_id/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-416"><a href="#Windmill-416"><span class="linenos"> 416</span></a>
</span><span id="Windmill-417"><a href="#Windmill-417"><span class="linenos"> 417</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_id_token</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">audience</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">expires_in</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill-418"><a href="#Windmill-418"><span class="linenos"> 418</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="Windmill-419"><a href="#Windmill-419"><span class="linenos"> 419</span></a> <span class="k">if</span> <span class="n">expires_in</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-420"><a href="#Windmill-420"><span class="linenos"> 420</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;expires_in&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">expires_in</span>
</span><span id="Windmill-421"><a href="#Windmill-421"><span class="linenos"> 421</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/oidc/token/</span><span class="si">{</span><span class="n">audience</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="Windmill-422"><a href="#Windmill-422"><span class="linenos"> 422</span></a>
</span><span id="Windmill-423"><a href="#Windmill-423"><span class="linenos"> 423</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_job_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">JobStatus</span><span class="p">:</span>
</span><span id="Windmill-424"><a href="#Windmill-424"><span class="linenos"> 424</span></a> <span class="n">job</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span><span id="Windmill-425"><a href="#Windmill-425"><span class="linenos"> 425</span></a> <span class="n">job_type</span> <span class="o">=</span> <span class="n">job</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;type&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="Windmill-426"><a href="#Windmill-426"><span class="linenos"> 426</span></a> <span class="k">assert</span> <span class="n">job_type</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">job</span><span class="si">}</span><span class="s2"> is not a valid job&quot;</span>
</span><span id="Windmill-427"><a href="#Windmill-427"><span class="linenos"> 427</span></a> <span class="k">if</span> <span class="n">job_type</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">&quot;completedjob&quot;</span><span class="p">:</span>
</span><span id="Windmill-428"><a href="#Windmill-428"><span class="linenos"> 428</span></a> <span class="k">return</span> <span class="s2">&quot;COMPLETED&quot;</span>
</span><span id="Windmill-429"><a href="#Windmill-429"><span class="linenos"> 429</span></a> <span class="k">if</span> <span class="n">job</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;running&quot;</span><span class="p">):</span>
</span><span id="Windmill-430"><a href="#Windmill-430"><span class="linenos"> 430</span></a> <span class="k">return</span> <span class="s2">&quot;RUNNING&quot;</span>
</span><span id="Windmill-431"><a href="#Windmill-431"><span class="linenos"> 431</span></a> <span class="k">return</span> <span class="s2">&quot;WAITING&quot;</span>
</span><span id="Windmill-432"><a href="#Windmill-432"><span class="linenos"> 432</span></a>
</span><span id="Windmill-433"><a href="#Windmill-433"><span class="linenos"> 433</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_result</span><span class="p">(</span>
</span><span id="Windmill-434"><a href="#Windmill-434"><span class="linenos"> 434</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-435"><a href="#Windmill-435"><span class="linenos"> 435</span></a> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-436"><a href="#Windmill-436"><span class="linenos"> 436</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill-437"><a href="#Windmill-437"><span class="linenos"> 437</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill-438"><a href="#Windmill-438"><span class="linenos"> 438</span></a> <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/completed/get_result/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill-439"><a href="#Windmill-439"><span class="linenos"> 439</span></a> <span class="n">result_text</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span>
</span><span id="Windmill-440"><a href="#Windmill-440"><span class="linenos"> 440</span></a> <span class="k">if</span> <span class="n">assert_result_is_not_none</span> <span class="ow">and</span> <span class="n">result_text</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-441"><a href="#Windmill-441"><span class="linenos"> 441</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;result is None for </span><span class="si">{</span><span class="n">job_id</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill-442"><a href="#Windmill-442"><span class="linenos"> 442</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill-443"><a href="#Windmill-443"><span class="linenos"> 443</span></a> <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-444"><a href="#Windmill-444"><span class="linenos"> 444</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span><span class="p">:</span>
</span><span id="Windmill-445"><a href="#Windmill-445"><span class="linenos"> 445</span></a> <span class="k">return</span> <span class="n">result_text</span>
</span><span id="Windmill-446"><a href="#Windmill-446"><span class="linenos"> 446</span></a>
</span><span id="Windmill-447"><a href="#Windmill-447"><span class="linenos"> 447</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</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="Windmill-448"><a href="#Windmill-448"><span class="linenos"> 448</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_variable_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="Windmill-449"><a href="#Windmill-449"><span class="linenos"> 449</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-450"><a href="#Windmill-450"><span class="linenos"> 450</span></a> <span class="n">variables</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;variables&quot;</span><span class="p">]</span>
</span><span id="Windmill-451"><a href="#Windmill-451"><span class="linenos"> 451</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill-452"><a href="#Windmill-452"><span class="linenos"> 452</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">variables</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
</span><span id="Windmill-453"><a href="#Windmill-453"><span class="linenos"> 453</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="Windmill-454"><a href="#Windmill-454"><span class="linenos"> 454</span></a> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
</span><span id="Windmill-455"><a href="#Windmill-455"><span class="linenos"> 455</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span><span id="Windmill-456"><a href="#Windmill-456"><span class="linenos"> 456</span></a> <span class="sa">f</span><span class="s2">&quot;MockedAPI present, but variable not found at </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">, falling back to real API&quot;</span>
</span><span id="Windmill-457"><a href="#Windmill-457"><span class="linenos"> 457</span></a> <span class="p">)</span>
</span><span id="Windmill-458"><a href="#Windmill-458"><span class="linenos"> 458</span></a>
</span><span id="Windmill-459"><a href="#Windmill-459"><span class="linenos"> 459</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get variable from Windmill&quot;&quot;&quot;</span>
</span><span id="Windmill-460"><a href="#Windmill-460"><span class="linenos"> 460</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/get_value/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-461"><a href="#Windmill-461"><span class="linenos"> 461</span></a>
</span><span id="Windmill-462"><a href="#Windmill-462"><span class="linenos"> 462</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">is_secret</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-463"><a href="#Windmill-463"><span class="linenos"> 463</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_variable_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="Windmill-464"><a href="#Windmill-464"><span class="linenos"> 464</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-465"><a href="#Windmill-465"><span class="linenos"> 465</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;variables&quot;</span><span class="p">][</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
</span><span id="Windmill-466"><a href="#Windmill-466"><span class="linenos"> 466</span></a> <span class="k">return</span>
</span><span id="Windmill-467"><a href="#Windmill-467"><span class="linenos"> 467</span></a>
</span><span id="Windmill-468"><a href="#Windmill-468"><span class="linenos"> 468</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Set variable from Windmill&quot;&quot;&quot;</span>
</span><span id="Windmill-469"><a href="#Windmill-469"><span class="linenos"> 469</span></a> <span class="c1"># check if variable exists</span>
</span><span id="Windmill-470"><a href="#Windmill-470"><span class="linenos"> 470</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill-471"><a href="#Windmill-471"><span class="linenos"> 471</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/get/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span>
</span><span id="Windmill-472"><a href="#Windmill-472"><span class="linenos"> 472</span></a> <span class="p">)</span>
</span><span id="Windmill-473"><a href="#Windmill-473"><span class="linenos"> 473</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="Windmill-474"><a href="#Windmill-474"><span class="linenos"> 474</span></a> <span class="c1"># create variable</span>
</span><span id="Windmill-475"><a href="#Windmill-475"><span class="linenos"> 475</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-476"><a href="#Windmill-476"><span class="linenos"> 476</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/create&quot;</span><span class="p">,</span>
</span><span id="Windmill-477"><a href="#Windmill-477"><span class="linenos"> 477</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill-478"><a href="#Windmill-478"><span class="linenos"> 478</span></a> <span class="s2">&quot;path&quot;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
</span><span id="Windmill-479"><a href="#Windmill-479"><span class="linenos"> 479</span></a> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span>
</span><span id="Windmill-480"><a href="#Windmill-480"><span class="linenos"> 480</span></a> <span class="s2">&quot;is_secret&quot;</span><span class="p">:</span> <span class="n">is_secret</span><span class="p">,</span>
</span><span id="Windmill-481"><a href="#Windmill-481"><span class="linenos"> 481</span></a> <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="Windmill-482"><a href="#Windmill-482"><span class="linenos"> 482</span></a> <span class="p">},</span>
</span><span id="Windmill-483"><a href="#Windmill-483"><span class="linenos"> 483</span></a> <span class="p">)</span>
</span><span id="Windmill-484"><a href="#Windmill-484"><span class="linenos"> 484</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill-485"><a href="#Windmill-485"><span class="linenos"> 485</span></a> <span class="c1"># update variable</span>
</span><span id="Windmill-486"><a href="#Windmill-486"><span class="linenos"> 486</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-487"><a href="#Windmill-487"><span class="linenos"> 487</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/update/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-488"><a href="#Windmill-488"><span class="linenos"> 488</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
</span><span id="Windmill-489"><a href="#Windmill-489"><span class="linenos"> 489</span></a> <span class="p">)</span>
</span><span id="Windmill-490"><a href="#Windmill-490"><span class="linenos"> 490</span></a>
</span><span id="Windmill-491"><a href="#Windmill-491"><span class="linenos"> 491</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_resource</span><span class="p">(</span>
</span><span id="Windmill-492"><a href="#Windmill-492"><span class="linenos"> 492</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-493"><a href="#Windmill-493"><span class="linenos"> 493</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-494"><a href="#Windmill-494"><span class="linenos"> 494</span></a> <span class="n">none_if_undefined</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-495"><a href="#Windmill-495"><span class="linenos"> 495</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-496"><a href="#Windmill-496"><span class="linenos"> 496</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="Windmill-497"><a href="#Windmill-497"><span class="linenos"> 497</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-498"><a href="#Windmill-498"><span class="linenos"> 498</span></a> <span class="n">resources</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;resources&quot;</span><span class="p">]</span>
</span><span id="Windmill-499"><a href="#Windmill-499"><span class="linenos"> 499</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill-500"><a href="#Windmill-500"><span class="linenos"> 500</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">resources</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
</span><span id="Windmill-501"><a href="#Windmill-501"><span class="linenos"> 501</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="Windmill-502"><a href="#Windmill-502"><span class="linenos"> 502</span></a> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
</span><span id="Windmill-503"><a href="#Windmill-503"><span class="linenos"> 503</span></a> <span class="c1"># NOTE: should mocked_api respect `none_if_undefined`?</span>
</span><span id="Windmill-504"><a href="#Windmill-504"><span class="linenos"> 504</span></a> <span class="k">if</span> <span class="n">none_if_undefined</span><span class="p">:</span>
</span><span id="Windmill-505"><a href="#Windmill-505"><span class="linenos"> 505</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span><span id="Windmill-506"><a href="#Windmill-506"><span class="linenos"> 506</span></a> <span class="sa">f</span><span class="s2">&quot;resource not found at $</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">, but none_if_undefined is True, so returning None&quot;</span>
</span><span id="Windmill-507"><a href="#Windmill-507"><span class="linenos"> 507</span></a> <span class="p">)</span>
</span><span id="Windmill-508"><a href="#Windmill-508"><span class="linenos"> 508</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="Windmill-509"><a href="#Windmill-509"><span class="linenos"> 509</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span><span id="Windmill-510"><a href="#Windmill-510"><span class="linenos"> 510</span></a> <span class="sa">f</span><span class="s2">&quot;MockedAPI present, but resource not found at $</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">, falling back to real API&quot;</span>
</span><span id="Windmill-511"><a href="#Windmill-511"><span class="linenos"> 511</span></a> <span class="p">)</span>
</span><span id="Windmill-512"><a href="#Windmill-512"><span class="linenos"> 512</span></a>
</span><span id="Windmill-513"><a href="#Windmill-513"><span class="linenos"> 513</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get resource from Windmill&quot;&quot;&quot;</span>
</span><span id="Windmill-514"><a href="#Windmill-514"><span class="linenos"> 514</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill-515"><a href="#Windmill-515"><span class="linenos"> 515</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill-516"><a href="#Windmill-516"><span class="linenos"> 516</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/get_value_interpolated/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill-517"><a href="#Windmill-517"><span class="linenos"> 517</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-518"><a href="#Windmill-518"><span class="linenos"> 518</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill-519"><a href="#Windmill-519"><span class="linenos"> 519</span></a> <span class="k">if</span> <span class="n">none_if_undefined</span><span class="p">:</span>
</span><span id="Windmill-520"><a href="#Windmill-520"><span class="linenos"> 520</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="Windmill-521"><a href="#Windmill-521"><span class="linenos"> 521</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="Windmill-522"><a href="#Windmill-522"><span class="linenos"> 522</span></a> <span class="k">raise</span> <span class="n">e</span>
</span><span id="Windmill-523"><a href="#Windmill-523"><span class="linenos"> 523</span></a>
</span><span id="Windmill-524"><a href="#Windmill-524"><span class="linenos"> 524</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_resource</span><span class="p">(</span>
</span><span id="Windmill-525"><a href="#Windmill-525"><span class="linenos"> 525</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-526"><a href="#Windmill-526"><span class="linenos"> 526</span></a> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span>
</span><span id="Windmill-527"><a href="#Windmill-527"><span class="linenos"> 527</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-528"><a href="#Windmill-528"><span class="linenos"> 528</span></a> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-529"><a href="#Windmill-529"><span class="linenos"> 529</span></a> <span class="p">):</span>
</span><span id="Windmill-530"><a href="#Windmill-530"><span class="linenos"> 530</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="Windmill-531"><a href="#Windmill-531"><span class="linenos"> 531</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-532"><a href="#Windmill-532"><span class="linenos"> 532</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;resources&quot;</span><span class="p">][</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
</span><span id="Windmill-533"><a href="#Windmill-533"><span class="linenos"> 533</span></a> <span class="k">return</span>
</span><span id="Windmill-534"><a href="#Windmill-534"><span class="linenos"> 534</span></a>
</span><span id="Windmill-535"><a href="#Windmill-535"><span class="linenos"> 535</span></a> <span class="c1"># check if resource exists</span>
</span><span id="Windmill-536"><a href="#Windmill-536"><span class="linenos"> 536</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill-537"><a href="#Windmill-537"><span class="linenos"> 537</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/get/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span>
</span><span id="Windmill-538"><a href="#Windmill-538"><span class="linenos"> 538</span></a> <span class="p">)</span>
</span><span id="Windmill-539"><a href="#Windmill-539"><span class="linenos"> 539</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="Windmill-540"><a href="#Windmill-540"><span class="linenos"> 540</span></a> <span class="c1"># create resource</span>
</span><span id="Windmill-541"><a href="#Windmill-541"><span class="linenos"> 541</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-542"><a href="#Windmill-542"><span class="linenos"> 542</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/create&quot;</span><span class="p">,</span>
</span><span id="Windmill-543"><a href="#Windmill-543"><span class="linenos"> 543</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill-544"><a href="#Windmill-544"><span class="linenos"> 544</span></a> <span class="s2">&quot;path&quot;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
</span><span id="Windmill-545"><a href="#Windmill-545"><span class="linenos"> 545</span></a> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span>
</span><span id="Windmill-546"><a href="#Windmill-546"><span class="linenos"> 546</span></a> <span class="s2">&quot;resource_type&quot;</span><span class="p">:</span> <span class="n">resource_type</span><span class="p">,</span>
</span><span id="Windmill-547"><a href="#Windmill-547"><span class="linenos"> 547</span></a> <span class="p">},</span>
</span><span id="Windmill-548"><a href="#Windmill-548"><span class="linenos"> 548</span></a> <span class="p">)</span>
</span><span id="Windmill-549"><a href="#Windmill-549"><span class="linenos"> 549</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill-550"><a href="#Windmill-550"><span class="linenos"> 550</span></a> <span class="c1"># update resource</span>
</span><span id="Windmill-551"><a href="#Windmill-551"><span class="linenos"> 551</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-552"><a href="#Windmill-552"><span class="linenos"> 552</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/update_value/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-553"><a href="#Windmill-553"><span class="linenos"> 553</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
</span><span id="Windmill-554"><a href="#Windmill-554"><span class="linenos"> 554</span></a> <span class="p">)</span>
</span><span id="Windmill-555"><a href="#Windmill-555"><span class="linenos"> 555</span></a>
</span><span id="Windmill-556"><a href="#Windmill-556"><span class="linenos"> 556</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">list_resources</span><span class="p">(</span>
</span><span id="Windmill-557"><a href="#Windmill-557"><span class="linenos"> 557</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-558"><a href="#Windmill-558"><span class="linenos"> 558</span></a> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-559"><a href="#Windmill-559"><span class="linenos"> 559</span></a> <span class="n">page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-560"><a href="#Windmill-560"><span class="linenos"> 560</span></a> <span class="n">per_page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-561"><a href="#Windmill-561"><span class="linenos"> 561</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">dict</span><span class="p">]:</span>
</span><span id="Windmill-562"><a href="#Windmill-562"><span class="linenos"> 562</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;List resources from Windmill workspace.</span>
</span><span id="Windmill-563"><a href="#Windmill-563"><span class="linenos"> 563</span></a><span class="sd"> </span>
</span><span id="Windmill-564"><a href="#Windmill-564"><span class="linenos"> 564</span></a><span class="sd"> Args:</span>
</span><span id="Windmill-565"><a href="#Windmill-565"><span class="linenos"> 565</span></a><span class="sd"> resource_type: Optional resource type to filter by (e.g., &quot;postgresql&quot;, &quot;mysql&quot;, &quot;s3&quot;)</span>
</span><span id="Windmill-566"><a href="#Windmill-566"><span class="linenos"> 566</span></a><span class="sd"> page: Optional page number for pagination</span>
</span><span id="Windmill-567"><a href="#Windmill-567"><span class="linenos"> 567</span></a><span class="sd"> per_page: Optional number of results per page</span>
</span><span id="Windmill-568"><a href="#Windmill-568"><span class="linenos"> 568</span></a><span class="sd"> </span>
</span><span id="Windmill-569"><a href="#Windmill-569"><span class="linenos"> 569</span></a><span class="sd"> Returns:</span>
</span><span id="Windmill-570"><a href="#Windmill-570"><span class="linenos"> 570</span></a><span class="sd"> List of resource dictionaries</span>
</span><span id="Windmill-571"><a href="#Windmill-571"><span class="linenos"> 571</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-572"><a href="#Windmill-572"><span class="linenos"> 572</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="Windmill-573"><a href="#Windmill-573"><span class="linenos"> 573</span></a> <span class="k">if</span> <span class="n">resource_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-574"><a href="#Windmill-574"><span class="linenos"> 574</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;resource_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">resource_type</span>
</span><span id="Windmill-575"><a href="#Windmill-575"><span class="linenos"> 575</span></a> <span class="k">if</span> <span class="n">page</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-576"><a href="#Windmill-576"><span class="linenos"> 576</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;page&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">page</span>
</span><span id="Windmill-577"><a href="#Windmill-577"><span class="linenos"> 577</span></a> <span class="k">if</span> <span class="n">per_page</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-578"><a href="#Windmill-578"><span class="linenos"> 578</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;per_page&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">per_page</span>
</span><span id="Windmill-579"><a href="#Windmill-579"><span class="linenos"> 579</span></a>
</span><span id="Windmill-580"><a href="#Windmill-580"><span class="linenos"> 580</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill-581"><a href="#Windmill-581"><span class="linenos"> 581</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/list&quot;</span><span class="p">,</span>
</span><span id="Windmill-582"><a href="#Windmill-582"><span class="linenos"> 582</span></a> <span class="n">params</span><span class="o">=</span><span class="n">params</span> <span class="k">if</span> <span class="n">params</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-583"><a href="#Windmill-583"><span class="linenos"> 583</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-584"><a href="#Windmill-584"><span class="linenos"> 584</span></a>
</span><span id="Windmill-585"><a href="#Windmill-585"><span class="linenos"> 585</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">):</span>
</span><span id="Windmill-586"><a href="#Windmill-586"><span class="linenos"> 586</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">set_resource</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">state_path</span><span class="p">,</span> <span class="n">resource_type</span><span class="o">=</span><span class="s2">&quot;state&quot;</span><span class="p">)</span>
</span><span id="Windmill-587"><a href="#Windmill-587"><span class="linenos"> 587</span></a>
</span><span id="Windmill-588"><a href="#Windmill-588"><span class="linenos"> 588</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_progress</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
</span><span id="Windmill-589"><a href="#Windmill-589"><span class="linenos"> 589</span></a> <span class="n">workspace</span> <span class="o">=</span> <span class="n">get_workspace</span><span class="p">()</span>
</span><span id="Windmill-590"><a href="#Windmill-590"><span class="linenos"> 590</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill-591"><a href="#Windmill-591"><span class="linenos"> 591</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">job_id</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill-592"><a href="#Windmill-592"><span class="linenos"> 592</span></a>
</span><span id="Windmill-593"><a href="#Windmill-593"><span class="linenos"> 593</span></a> <span class="k">if</span> <span class="n">job_id</span> <span class="o">!=</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-594"><a href="#Windmill-594"><span class="linenos"> 594</span></a> <span class="n">job</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span><span id="Windmill-595"><a href="#Windmill-595"><span class="linenos"> 595</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="n">job</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;parent_job&quot;</span><span class="p">)</span>
</span><span id="Windmill-596"><a href="#Windmill-596"><span class="linenos"> 596</span></a>
</span><span id="Windmill-597"><a href="#Windmill-597"><span class="linenos"> 597</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-598"><a href="#Windmill-598"><span class="linenos"> 598</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_metrics/set_progress/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-599"><a href="#Windmill-599"><span class="linenos"> 599</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill-600"><a href="#Windmill-600"><span class="linenos"> 600</span></a> <span class="s2">&quot;percent&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span>
</span><span id="Windmill-601"><a href="#Windmill-601"><span class="linenos"> 601</span></a> <span class="s2">&quot;flow_job_id&quot;</span><span class="p">:</span> <span class="n">flow_id</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-602"><a href="#Windmill-602"><span class="linenos"> 602</span></a> <span class="p">},</span>
</span><span id="Windmill-603"><a href="#Windmill-603"><span class="linenos"> 603</span></a> <span class="p">)</span>
</span><span id="Windmill-604"><a href="#Windmill-604"><span class="linenos"> 604</span></a>
</span><span id="Windmill-605"><a href="#Windmill-605"><span class="linenos"> 605</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_progress</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill-606"><a href="#Windmill-606"><span class="linenos"> 606</span></a> <span class="n">workspace</span> <span class="o">=</span> <span class="n">get_workspace</span><span class="p">()</span>
</span><span id="Windmill-607"><a href="#Windmill-607"><span class="linenos"> 607</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">job_id</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill-608"><a href="#Windmill-608"><span class="linenos"> 608</span></a>
</span><span id="Windmill-609"><a href="#Windmill-609"><span class="linenos"> 609</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill-610"><a href="#Windmill-610"><span class="linenos"> 610</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_metrics/get_progress/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-611"><a href="#Windmill-611"><span class="linenos"> 611</span></a> <span class="p">)</span>
</span><span id="Windmill-612"><a href="#Windmill-612"><span class="linenos"> 612</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="Windmill-613"><a href="#Windmill-613"><span class="linenos"> 613</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2"> does not exist&quot;</span><span class="p">)</span>
</span><span id="Windmill-614"><a href="#Windmill-614"><span class="linenos"> 614</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="Windmill-615"><a href="#Windmill-615"><span class="linenos"> 615</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill-616"><a href="#Windmill-616"><span class="linenos"> 616</span></a> <span class="k">return</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-617"><a href="#Windmill-617"><span class="linenos"> 617</span></a>
</span><span id="Windmill-618"><a href="#Windmill-618"><span class="linenos"> 618</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_flow_user_state</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="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-619"><a href="#Windmill-619"><span class="linenos"> 619</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Set the user state of a flow at a given key&quot;&quot;&quot;</span>
</span><span id="Windmill-620"><a href="#Windmill-620"><span class="linenos"> 620</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_root_job_id</span><span class="p">()</span>
</span><span id="Windmill-621"><a href="#Windmill-621"><span class="linenos"> 621</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-622"><a href="#Windmill-622"><span class="linenos"> 622</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/flow/user_states/</span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-623"><a href="#Windmill-623"><span class="linenos"> 623</span></a> <span class="n">json</span><span class="o">=</span><span class="n">value</span><span class="p">,</span>
</span><span id="Windmill-624"><a href="#Windmill-624"><span class="linenos"> 624</span></a> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-625"><a href="#Windmill-625"><span class="linenos"> 625</span></a> <span class="p">)</span>
</span><span id="Windmill-626"><a href="#Windmill-626"><span class="linenos"> 626</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="Windmill-627"><a href="#Windmill-627"><span class="linenos"> 627</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2"> does not exist or is not a flow&quot;</span><span class="p">)</span>
</span><span id="Windmill-628"><a href="#Windmill-628"><span class="linenos"> 628</span></a>
</span><span id="Windmill-629"><a href="#Windmill-629"><span class="linenos"> 629</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_flow_user_state</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="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill-630"><a href="#Windmill-630"><span class="linenos"> 630</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the user state of a flow at a given key&quot;&quot;&quot;</span>
</span><span id="Windmill-631"><a href="#Windmill-631"><span class="linenos"> 631</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_root_job_id</span><span class="p">()</span>
</span><span id="Windmill-632"><a href="#Windmill-632"><span class="linenos"> 632</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill-633"><a href="#Windmill-633"><span class="linenos"> 633</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/flow/user_states/</span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-634"><a href="#Windmill-634"><span class="linenos"> 634</span></a> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill-635"><a href="#Windmill-635"><span class="linenos"> 635</span></a> <span class="p">)</span>
</span><span id="Windmill-636"><a href="#Windmill-636"><span class="linenos"> 636</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="Windmill-637"><a href="#Windmill-637"><span class="linenos"> 637</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2"> does not exist or is not a flow&quot;</span><span class="p">)</span>
</span><span id="Windmill-638"><a href="#Windmill-638"><span class="linenos"> 638</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="Windmill-639"><a href="#Windmill-639"><span class="linenos"> 639</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill-640"><a href="#Windmill-640"><span class="linenos"> 640</span></a> <span class="k">return</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-641"><a href="#Windmill-641"><span class="linenos"> 641</span></a>
</span><span id="Windmill-642"><a href="#Windmill-642"><span class="linenos"> 642</span></a> <span class="nd">@property</span>
</span><span id="Windmill-643"><a href="#Windmill-643"><span class="linenos"> 643</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="Windmill-644"><a href="#Windmill-644"><span class="linenos"> 644</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;version&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="Windmill-645"><a href="#Windmill-645"><span class="linenos"> 645</span></a>
</span><span id="Windmill-646"><a href="#Windmill-646"><span class="linenos"> 646</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_duckdb_connection_settings</span><span class="p">(</span>
</span><span id="Windmill-647"><a href="#Windmill-647"><span class="linenos"> 647</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-648"><a href="#Windmill-648"><span class="linenos"> 648</span></a> <span class="n">s3_resource_path</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><span id="Windmill-649"><a href="#Windmill-649"><span class="linenos"> 649</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DuckDbConnectionSettings</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-650"><a href="#Windmill-650"><span class="linenos"> 650</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-651"><a href="#Windmill-651"><span class="linenos"> 651</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="Windmill-652"><a href="#Windmill-652"><span class="linenos"> 652</span></a><span class="sd"> initiate an S3 connection from DuckDB</span>
</span><span id="Windmill-653"><a href="#Windmill-653"><span class="linenos"> 653</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-654"><a href="#Windmill-654"><span class="linenos"> 654</span></a> <span class="n">s3_resource_path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">s3_resource_path</span>
</span><span id="Windmill-655"><a href="#Windmill-655"><span class="linenos"> 655</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill-656"><a href="#Windmill-656"><span class="linenos"> 656</span></a> <span class="n">raw_obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-657"><a href="#Windmill-657"><span class="linenos"> 657</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/v2/duckdb_connection_settings&quot;</span><span class="p">,</span>
</span><span id="Windmill-658"><a href="#Windmill-658"><span class="linenos"> 658</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{}</span>
</span><span id="Windmill-659"><a href="#Windmill-659"><span class="linenos"> 659</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span>
</span><span id="Windmill-660"><a href="#Windmill-660"><span class="linenos"> 660</span></a> <span class="k">else</span> <span class="p">{</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">:</span> <span class="n">s3_resource_path</span><span class="p">},</span>
</span><span id="Windmill-661"><a href="#Windmill-661"><span class="linenos"> 661</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-662"><a href="#Windmill-662"><span class="linenos"> 662</span></a> <span class="k">return</span> <span class="n">DuckDbConnectionSettings</span><span class="p">(</span><span class="n">raw_obj</span><span class="p">)</span>
</span><span id="Windmill-663"><a href="#Windmill-663"><span class="linenos"> 663</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill-664"><a href="#Windmill-664"><span class="linenos"> 664</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="Windmill-665"><a href="#Windmill-665"><span class="linenos"> 665</span></a> <span class="s2">&quot;Could not generate DuckDB S3 connection settings from the provided resource&quot;</span>
</span><span id="Windmill-666"><a href="#Windmill-666"><span class="linenos"> 666</span></a> <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span><span id="Windmill-667"><a href="#Windmill-667"><span class="linenos"> 667</span></a>
</span><span id="Windmill-668"><a href="#Windmill-668"><span class="linenos"> 668</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_polars_connection_settings</span><span class="p">(</span>
</span><span id="Windmill-669"><a href="#Windmill-669"><span class="linenos"> 669</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-670"><a href="#Windmill-670"><span class="linenos"> 670</span></a> <span class="n">s3_resource_path</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><span id="Windmill-671"><a href="#Windmill-671"><span class="linenos"> 671</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">PolarsConnectionSettings</span><span class="p">:</span>
</span><span id="Windmill-672"><a href="#Windmill-672"><span class="linenos"> 672</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-673"><a href="#Windmill-673"><span class="linenos"> 673</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="Windmill-674"><a href="#Windmill-674"><span class="linenos"> 674</span></a><span class="sd"> initiate an S3 connection from Polars</span>
</span><span id="Windmill-675"><a href="#Windmill-675"><span class="linenos"> 675</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-676"><a href="#Windmill-676"><span class="linenos"> 676</span></a> <span class="n">s3_resource_path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">s3_resource_path</span>
</span><span id="Windmill-677"><a href="#Windmill-677"><span class="linenos"> 677</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill-678"><a href="#Windmill-678"><span class="linenos"> 678</span></a> <span class="n">raw_obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-679"><a href="#Windmill-679"><span class="linenos"> 679</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/v2/polars_connection_settings&quot;</span><span class="p">,</span>
</span><span id="Windmill-680"><a href="#Windmill-680"><span class="linenos"> 680</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{}</span>
</span><span id="Windmill-681"><a href="#Windmill-681"><span class="linenos"> 681</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span>
</span><span id="Windmill-682"><a href="#Windmill-682"><span class="linenos"> 682</span></a> <span class="k">else</span> <span class="p">{</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">:</span> <span class="n">s3_resource_path</span><span class="p">},</span>
</span><span id="Windmill-683"><a href="#Windmill-683"><span class="linenos"> 683</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-684"><a href="#Windmill-684"><span class="linenos"> 684</span></a> <span class="k">return</span> <span class="n">PolarsConnectionSettings</span><span class="p">(</span><span class="n">raw_obj</span><span class="p">)</span>
</span><span id="Windmill-685"><a href="#Windmill-685"><span class="linenos"> 685</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill-686"><a href="#Windmill-686"><span class="linenos"> 686</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="Windmill-687"><a href="#Windmill-687"><span class="linenos"> 687</span></a> <span class="s2">&quot;Could not generate Polars S3 connection settings from the provided resource&quot;</span>
</span><span id="Windmill-688"><a href="#Windmill-688"><span class="linenos"> 688</span></a> <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span><span id="Windmill-689"><a href="#Windmill-689"><span class="linenos"> 689</span></a>
</span><span id="Windmill-690"><a href="#Windmill-690"><span class="linenos"> 690</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_boto3_connection_settings</span><span class="p">(</span>
</span><span id="Windmill-691"><a href="#Windmill-691"><span class="linenos"> 691</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-692"><a href="#Windmill-692"><span class="linenos"> 692</span></a> <span class="n">s3_resource_path</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><span id="Windmill-693"><a href="#Windmill-693"><span class="linenos"> 693</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Boto3ConnectionSettings</span><span class="p">:</span>
</span><span id="Windmill-694"><a href="#Windmill-694"><span class="linenos"> 694</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-695"><a href="#Windmill-695"><span class="linenos"> 695</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="Windmill-696"><a href="#Windmill-696"><span class="linenos"> 696</span></a><span class="sd"> initiate an S3 connection using boto3</span>
</span><span id="Windmill-697"><a href="#Windmill-697"><span class="linenos"> 697</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-698"><a href="#Windmill-698"><span class="linenos"> 698</span></a> <span class="n">s3_resource_path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">s3_resource_path</span>
</span><span id="Windmill-699"><a href="#Windmill-699"><span class="linenos"> 699</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill-700"><a href="#Windmill-700"><span class="linenos"> 700</span></a> <span class="n">s3_resource</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-701"><a href="#Windmill-701"><span class="linenos"> 701</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/v2/s3_resource_info&quot;</span><span class="p">,</span>
</span><span id="Windmill-702"><a href="#Windmill-702"><span class="linenos"> 702</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{}</span>
</span><span id="Windmill-703"><a href="#Windmill-703"><span class="linenos"> 703</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span>
</span><span id="Windmill-704"><a href="#Windmill-704"><span class="linenos"> 704</span></a> <span class="k">else</span> <span class="p">{</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">:</span> <span class="n">s3_resource_path</span><span class="p">},</span>
</span><span id="Windmill-705"><a href="#Windmill-705"><span class="linenos"> 705</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-706"><a href="#Windmill-706"><span class="linenos"> 706</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__boto3_connection_settings</span><span class="p">(</span><span class="n">s3_resource</span><span class="p">)</span>
</span><span id="Windmill-707"><a href="#Windmill-707"><span class="linenos"> 707</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill-708"><a href="#Windmill-708"><span class="linenos"> 708</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="Windmill-709"><a href="#Windmill-709"><span class="linenos"> 709</span></a> <span class="s2">&quot;Could not generate Boto3 S3 connection settings from the provided resource&quot;</span>
</span><span id="Windmill-710"><a href="#Windmill-710"><span class="linenos"> 710</span></a> <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span><span id="Windmill-711"><a href="#Windmill-711"><span class="linenos"> 711</span></a>
</span><span id="Windmill-712"><a href="#Windmill-712"><span class="linenos"> 712</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">load_s3_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bytes</span><span class="p">:</span>
</span><span id="Windmill-713"><a href="#Windmill-713"><span class="linenos"> 713</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-714"><a href="#Windmill-714"><span class="linenos"> 714</span></a><span class="sd"> Load a file from the workspace s3 bucket and returns its content as bytes.</span>
</span><span id="Windmill-715"><a href="#Windmill-715"><span class="linenos"> 715</span></a>
</span><span id="Windmill-716"><a href="#Windmill-716"><span class="linenos"> 716</span></a><span class="sd"> &#39;&#39;&#39;python</span>
</span><span id="Windmill-717"><a href="#Windmill-717"><span class="linenos"> 717</span></a><span class="sd"> from wmill import S3Object</span>
</span><span id="Windmill-718"><a href="#Windmill-718"><span class="linenos"> 718</span></a>
</span><span id="Windmill-719"><a href="#Windmill-719"><span class="linenos"> 719</span></a><span class="sd"> s3_obj = S3Object(s3=&quot;/path/to/my_file.txt&quot;)</span>
</span><span id="Windmill-720"><a href="#Windmill-720"><span class="linenos"> 720</span></a><span class="sd"> my_obj_content = client.load_s3_file(s3_obj)</span>
</span><span id="Windmill-721"><a href="#Windmill-721"><span class="linenos"> 721</span></a><span class="sd"> file_content = my_obj_content.decode(&quot;utf-8&quot;)</span>
</span><span id="Windmill-722"><a href="#Windmill-722"><span class="linenos"> 722</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="Windmill-723"><a href="#Windmill-723"><span class="linenos"> 723</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-724"><a href="#Windmill-724"><span class="linenos"> 724</span></a> <span class="n">s3object</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3object</span><span class="p">)</span>
</span><span id="Windmill-725"><a href="#Windmill-725"><span class="linenos"> 725</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_s3_file_reader</span><span class="p">(</span><span class="n">s3object</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">)</span> <span class="k">as</span> <span class="n">file_reader</span><span class="p">:</span>
</span><span id="Windmill-726"><a href="#Windmill-726"><span class="linenos"> 726</span></a> <span class="k">return</span> <span class="n">file_reader</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span><span id="Windmill-727"><a href="#Windmill-727"><span class="linenos"> 727</span></a>
</span><span id="Windmill-728"><a href="#Windmill-728"><span class="linenos"> 728</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">load_s3_file_reader</span><span class="p">(</span>
</span><span id="Windmill-729"><a href="#Windmill-729"><span class="linenos"> 729</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span>
</span><span id="Windmill-730"><a href="#Windmill-730"><span class="linenos"> 730</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">BufferedReader</span><span class="p">:</span>
</span><span id="Windmill-731"><a href="#Windmill-731"><span class="linenos"> 731</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-732"><a href="#Windmill-732"><span class="linenos"> 732</span></a><span class="sd"> Load a file from the workspace s3 bucket and returns the bytes stream.</span>
</span><span id="Windmill-733"><a href="#Windmill-733"><span class="linenos"> 733</span></a>
</span><span id="Windmill-734"><a href="#Windmill-734"><span class="linenos"> 734</span></a><span class="sd"> &#39;&#39;&#39;python</span>
</span><span id="Windmill-735"><a href="#Windmill-735"><span class="linenos"> 735</span></a><span class="sd"> from wmill import S3Object</span>
</span><span id="Windmill-736"><a href="#Windmill-736"><span class="linenos"> 736</span></a>
</span><span id="Windmill-737"><a href="#Windmill-737"><span class="linenos"> 737</span></a><span class="sd"> s3_obj = S3Object(s3=&quot;/path/to/my_file.txt&quot;)</span>
</span><span id="Windmill-738"><a href="#Windmill-738"><span class="linenos"> 738</span></a><span class="sd"> with wmill.load_s3_file_reader(s3object, s3_resource_path) as file_reader:</span>
</span><span id="Windmill-739"><a href="#Windmill-739"><span class="linenos"> 739</span></a><span class="sd"> print(file_reader.read())</span>
</span><span id="Windmill-740"><a href="#Windmill-740"><span class="linenos"> 740</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="Windmill-741"><a href="#Windmill-741"><span class="linenos"> 741</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-742"><a href="#Windmill-742"><span class="linenos"> 742</span></a> <span class="n">s3object</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3object</span><span class="p">)</span>
</span><span id="Windmill-743"><a href="#Windmill-743"><span class="linenos"> 743</span></a> <span class="n">reader</span> <span class="o">=</span> <span class="n">S3BufferedReader</span><span class="p">(</span>
</span><span id="Windmill-744"><a href="#Windmill-744"><span class="linenos"> 744</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-745"><a href="#Windmill-745"><span class="linenos"> 745</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="p">,</span>
</span><span id="Windmill-746"><a href="#Windmill-746"><span class="linenos"> 746</span></a> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;s3&quot;</span><span class="p">],</span>
</span><span id="Windmill-747"><a href="#Windmill-747"><span class="linenos"> 747</span></a> <span class="n">s3_resource_path</span><span class="p">,</span>
</span><span id="Windmill-748"><a href="#Windmill-748"><span class="linenos"> 748</span></a> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span> <span class="k">if</span> <span class="s2">&quot;storage&quot;</span> <span class="ow">in</span> <span class="n">s3object</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-749"><a href="#Windmill-749"><span class="linenos"> 749</span></a> <span class="p">)</span>
</span><span id="Windmill-750"><a href="#Windmill-750"><span class="linenos"> 750</span></a> <span class="k">return</span> <span class="n">reader</span>
</span><span id="Windmill-751"><a href="#Windmill-751"><span class="linenos"> 751</span></a>
</span><span id="Windmill-752"><a href="#Windmill-752"><span class="linenos"> 752</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">write_s3_file</span><span class="p">(</span>
</span><span id="Windmill-753"><a href="#Windmill-753"><span class="linenos"> 753</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-754"><a href="#Windmill-754"><span class="linenos"> 754</span></a> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-755"><a href="#Windmill-755"><span class="linenos"> 755</span></a> <span class="n">file_content</span><span class="p">:</span> <span class="n">BufferedReader</span> <span class="o">|</span> <span class="nb">bytes</span><span class="p">,</span>
</span><span id="Windmill-756"><a href="#Windmill-756"><span class="linenos"> 756</span></a> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-757"><a href="#Windmill-757"><span class="linenos"> 757</span></a> <span class="n">content_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-758"><a href="#Windmill-758"><span class="linenos"> 758</span></a> <span class="n">content_disposition</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-759"><a href="#Windmill-759"><span class="linenos"> 759</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="Windmill-760"><a href="#Windmill-760"><span class="linenos"> 760</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-761"><a href="#Windmill-761"><span class="linenos"> 761</span></a><span class="sd"> Write a file to the workspace S3 bucket</span>
</span><span id="Windmill-762"><a href="#Windmill-762"><span class="linenos"> 762</span></a>
</span><span id="Windmill-763"><a href="#Windmill-763"><span class="linenos"> 763</span></a><span class="sd"> &#39;&#39;&#39;python</span>
</span><span id="Windmill-764"><a href="#Windmill-764"><span class="linenos"> 764</span></a><span class="sd"> from wmill import S3Object</span>
</span><span id="Windmill-765"><a href="#Windmill-765"><span class="linenos"> 765</span></a>
</span><span id="Windmill-766"><a href="#Windmill-766"><span class="linenos"> 766</span></a><span class="sd"> s3_obj = S3Object(s3=&quot;/path/to/my_file.txt&quot;)</span>
</span><span id="Windmill-767"><a href="#Windmill-767"><span class="linenos"> 767</span></a>
</span><span id="Windmill-768"><a href="#Windmill-768"><span class="linenos"> 768</span></a><span class="sd"> # for an in memory bytes array:</span>
</span><span id="Windmill-769"><a href="#Windmill-769"><span class="linenos"> 769</span></a><span class="sd"> file_content = b&#39;Hello Windmill!&#39;</span>
</span><span id="Windmill-770"><a href="#Windmill-770"><span class="linenos"> 770</span></a><span class="sd"> client.write_s3_file(s3_obj, file_content)</span>
</span><span id="Windmill-771"><a href="#Windmill-771"><span class="linenos"> 771</span></a>
</span><span id="Windmill-772"><a href="#Windmill-772"><span class="linenos"> 772</span></a><span class="sd"> # for a file:</span>
</span><span id="Windmill-773"><a href="#Windmill-773"><span class="linenos"> 773</span></a><span class="sd"> with open(&quot;my_file.txt&quot;, &quot;rb&quot;) as my_file:</span>
</span><span id="Windmill-774"><a href="#Windmill-774"><span class="linenos"> 774</span></a><span class="sd"> client.write_s3_file(s3_obj, my_file)</span>
</span><span id="Windmill-775"><a href="#Windmill-775"><span class="linenos"> 775</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="Windmill-776"><a href="#Windmill-776"><span class="linenos"> 776</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-777"><a href="#Windmill-777"><span class="linenos"> 777</span></a> <span class="n">s3object</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3object</span><span class="p">)</span>
</span><span id="Windmill-778"><a href="#Windmill-778"><span class="linenos"> 778</span></a> <span class="c1"># httpx accepts either bytes or &quot;a bytes generator&quot; as content. If it&#39;s a BufferedReader, we need to convert it to a generator</span>
</span><span id="Windmill-779"><a href="#Windmill-779"><span class="linenos"> 779</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_content</span><span class="p">,</span> <span class="n">BufferedReader</span><span class="p">):</span>
</span><span id="Windmill-780"><a href="#Windmill-780"><span class="linenos"> 780</span></a> <span class="n">content_payload</span> <span class="o">=</span> <span class="n">bytes_generator</span><span class="p">(</span><span class="n">file_content</span><span class="p">)</span>
</span><span id="Windmill-781"><a href="#Windmill-781"><span class="linenos"> 781</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_content</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
</span><span id="Windmill-782"><a href="#Windmill-782"><span class="linenos"> 782</span></a> <span class="n">content_payload</span> <span class="o">=</span> <span class="n">file_content</span>
</span><span id="Windmill-783"><a href="#Windmill-783"><span class="linenos"> 783</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill-784"><a href="#Windmill-784"><span class="linenos"> 784</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Type of file_content not supported&quot;</span><span class="p">)</span>
</span><span id="Windmill-785"><a href="#Windmill-785"><span class="linenos"> 785</span></a>
</span><span id="Windmill-786"><a href="#Windmill-786"><span class="linenos"> 786</span></a> <span class="n">query_params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="Windmill-787"><a href="#Windmill-787"><span class="linenos"> 787</span></a> <span class="k">if</span> <span class="n">s3object</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;s3&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
</span><span id="Windmill-788"><a href="#Windmill-788"><span class="linenos"> 788</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;file_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;s3&quot;</span><span class="p">]</span>
</span><span id="Windmill-789"><a href="#Windmill-789"><span class="linenos"> 789</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">s3_resource_path</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
</span><span id="Windmill-790"><a href="#Windmill-790"><span class="linenos"> 790</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">s3_resource_path</span>
</span><span id="Windmill-791"><a href="#Windmill-791"><span class="linenos"> 791</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="Windmill-792"><a href="#Windmill-792"><span class="linenos"> 792</span></a> <span class="n">s3object</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
</span><span id="Windmill-793"><a href="#Windmill-793"><span class="linenos"> 793</span></a> <span class="ow">and</span> <span class="s2">&quot;storage&quot;</span> <span class="ow">in</span> <span class="n">s3object</span>
</span><span id="Windmill-794"><a href="#Windmill-794"><span class="linenos"> 794</span></a> <span class="ow">and</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
</span><span id="Windmill-795"><a href="#Windmill-795"><span class="linenos"> 795</span></a> <span class="p">):</span>
</span><span id="Windmill-796"><a href="#Windmill-796"><span class="linenos"> 796</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span>
</span><span id="Windmill-797"><a href="#Windmill-797"><span class="linenos"> 797</span></a> <span class="k">if</span> <span class="n">content_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-798"><a href="#Windmill-798"><span class="linenos"> 798</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;content_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">content_type</span>
</span><span id="Windmill-799"><a href="#Windmill-799"><span class="linenos"> 799</span></a> <span class="k">if</span> <span class="n">content_disposition</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-800"><a href="#Windmill-800"><span class="linenos"> 800</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;content_disposition&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">content_disposition</span>
</span><span id="Windmill-801"><a href="#Windmill-801"><span class="linenos"> 801</span></a>
</span><span id="Windmill-802"><a href="#Windmill-802"><span class="linenos"> 802</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill-803"><a href="#Windmill-803"><span class="linenos"> 803</span></a> <span class="c1"># need a vanilla client b/c content-type is not application/json here</span>
</span><span id="Windmill-804"><a href="#Windmill-804"><span class="linenos"> 804</span></a> <span class="n">response</span> <span class="o">=</span> <span class="n">httpx</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-805"><a href="#Windmill-805"><span class="linenos"> 805</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_url</span><span class="si">}</span><span class="s2">/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/upload_s3_file&quot;</span><span class="p">,</span>
</span><span id="Windmill-806"><a href="#Windmill-806"><span class="linenos"> 806</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill-807"><a href="#Windmill-807"><span class="linenos"> 807</span></a> <span class="s2">&quot;Authorization&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Bearer </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-808"><a href="#Windmill-808"><span class="linenos"> 808</span></a> <span class="s2">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/octet-stream&quot;</span><span class="p">,</span>
</span><span id="Windmill-809"><a href="#Windmill-809"><span class="linenos"> 809</span></a> <span class="p">},</span>
</span><span id="Windmill-810"><a href="#Windmill-810"><span class="linenos"> 810</span></a> <span class="n">params</span><span class="o">=</span><span class="n">query_params</span><span class="p">,</span>
</span><span id="Windmill-811"><a href="#Windmill-811"><span class="linenos"> 811</span></a> <span class="n">content</span><span class="o">=</span><span class="n">content_payload</span><span class="p">,</span>
</span><span id="Windmill-812"><a href="#Windmill-812"><span class="linenos"> 812</span></a> <span class="n">verify</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">verify</span><span class="p">,</span>
</span><span id="Windmill-813"><a href="#Windmill-813"><span class="linenos"> 813</span></a> <span class="n">timeout</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-814"><a href="#Windmill-814"><span class="linenos"> 814</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-815"><a href="#Windmill-815"><span class="linenos"> 815</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill-816"><a href="#Windmill-816"><span class="linenos"> 816</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Could not write file to S3&quot;</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span><span id="Windmill-817"><a href="#Windmill-817"><span class="linenos"> 817</span></a> <span class="k">return</span> <span class="n">S3Object</span><span class="p">(</span><span class="n">s3</span><span class="o">=</span><span class="n">response</span><span class="p">[</span><span class="s2">&quot;file_key&quot;</span><span class="p">])</span>
</span><span id="Windmill-818"><a href="#Windmill-818"><span class="linenos"> 818</span></a>
</span><span id="Windmill-819"><a href="#Windmill-819"><span class="linenos"> 819</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">sign_s3_objects</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span><span class="p">]:</span>
</span><span id="Windmill-820"><a href="#Windmill-820"><span class="linenos"> 820</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-821"><a href="#Windmill-821"><span class="linenos"> 821</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/apps/sign_s3_objects&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;s3_objects&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">parse_s3_object</span><span class="p">,</span> <span class="n">s3_objects</span><span class="p">))}</span>
</span><span id="Windmill-822"><a href="#Windmill-822"><span class="linenos"> 822</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-823"><a href="#Windmill-823"><span class="linenos"> 823</span></a>
</span><span id="Windmill-824"><a href="#Windmill-824"><span class="linenos"> 824</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">sign_s3_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="Windmill-825"><a href="#Windmill-825"><span class="linenos"> 825</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-826"><a href="#Windmill-826"><span class="linenos"> 826</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/apps/sign_s3_objects&quot;</span><span class="p">,</span>
</span><span id="Windmill-827"><a href="#Windmill-827"><span class="linenos"> 827</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;s3_objects&quot;</span><span class="p">:</span> <span class="p">[</span><span class="n">s3_object</span><span class="p">]},</span>
</span><span id="Windmill-828"><a href="#Windmill-828"><span class="linenos"> 828</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="Windmill-829"><a href="#Windmill-829"><span class="linenos"> 829</span></a>
</span><span id="Windmill-830"><a href="#Windmill-830"><span class="linenos"> 830</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_presigned_s3_public_urls</span><span class="p">(</span>
</span><span id="Windmill-831"><a href="#Windmill-831"><span class="linenos"> 831</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-832"><a href="#Windmill-832"><span class="linenos"> 832</span></a> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">],</span>
</span><span id="Windmill-833"><a href="#Windmill-833"><span class="linenos"> 833</span></a> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-834"><a href="#Windmill-834"><span class="linenos"> 834</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span><span id="Windmill-835"><a href="#Windmill-835"><span class="linenos"> 835</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-836"><a href="#Windmill-836"><span class="linenos"> 836</span></a><span class="sd"> Generate presigned public URLs for an array of S3 objects.</span>
</span><span id="Windmill-837"><a href="#Windmill-837"><span class="linenos"> 837</span></a><span class="sd"> If an S3 object is not signed yet, it will be signed first.</span>
</span><span id="Windmill-838"><a href="#Windmill-838"><span class="linenos"> 838</span></a>
</span><span id="Windmill-839"><a href="#Windmill-839"><span class="linenos"> 839</span></a><span class="sd"> Args:</span>
</span><span id="Windmill-840"><a href="#Windmill-840"><span class="linenos"> 840</span></a><span class="sd"> s3_objects: List of S3 objects to sign</span>
</span><span id="Windmill-841"><a href="#Windmill-841"><span class="linenos"> 841</span></a><span class="sd"> base_url: Optional base URL for the presigned URLs (defaults to WM_BASE_URL)</span>
</span><span id="Windmill-842"><a href="#Windmill-842"><span class="linenos"> 842</span></a>
</span><span id="Windmill-843"><a href="#Windmill-843"><span class="linenos"> 843</span></a><span class="sd"> Returns:</span>
</span><span id="Windmill-844"><a href="#Windmill-844"><span class="linenos"> 844</span></a><span class="sd"> List of signed public URLs</span>
</span><span id="Windmill-845"><a href="#Windmill-845"><span class="linenos"> 845</span></a>
</span><span id="Windmill-846"><a href="#Windmill-846"><span class="linenos"> 846</span></a><span class="sd"> Example:</span>
</span><span id="Windmill-847"><a href="#Windmill-847"><span class="linenos"> 847</span></a><span class="sd"> &gt;&gt;&gt; s3_objs = [S3Object(s3=&quot;/path/to/file1.txt&quot;), S3Object(s3=&quot;/path/to/file2.txt&quot;)]</span>
</span><span id="Windmill-848"><a href="#Windmill-848"><span class="linenos"> 848</span></a><span class="sd"> &gt;&gt;&gt; urls = client.get_presigned_s3_public_urls(s3_objs)</span>
</span><span id="Windmill-849"><a href="#Windmill-849"><span class="linenos"> 849</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-850"><a href="#Windmill-850"><span class="linenos"> 850</span></a> <span class="n">base_url</span> <span class="o">=</span> <span class="n">base_url</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_public_base_url</span><span class="p">()</span>
</span><span id="Windmill-851"><a href="#Windmill-851"><span class="linenos"> 851</span></a>
</span><span id="Windmill-852"><a href="#Windmill-852"><span class="linenos"> 852</span></a> <span class="n">s3_objs</span> <span class="o">=</span> <span class="p">[</span><span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3_obj</span><span class="p">)</span> <span class="k">for</span> <span class="n">s3_obj</span> <span class="ow">in</span> <span class="n">s3_objects</span><span class="p">]</span>
</span><span id="Windmill-853"><a href="#Windmill-853"><span class="linenos"> 853</span></a>
</span><span id="Windmill-854"><a href="#Windmill-854"><span class="linenos"> 854</span></a> <span class="c1"># Sign all S3 objects that need to be signed in one go</span>
</span><span id="Windmill-855"><a href="#Windmill-855"><span class="linenos"> 855</span></a> <span class="n">s3_objs_to_sign</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">S3Object</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="Windmill-856"><a href="#Windmill-856"><span class="linenos"> 856</span></a> <span class="p">(</span><span class="n">s3_obj</span><span class="p">,</span> <span class="n">index</span><span class="p">)</span>
</span><span id="Windmill-857"><a href="#Windmill-857"><span class="linenos"> 857</span></a> <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">s3_obj</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">s3_objs</span><span class="p">)</span>
</span><span id="Windmill-858"><a href="#Windmill-858"><span class="linenos"> 858</span></a> <span class="k">if</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;presigned&quot;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span>
</span><span id="Windmill-859"><a href="#Windmill-859"><span class="linenos"> 859</span></a> <span class="p">]</span>
</span><span id="Windmill-860"><a href="#Windmill-860"><span class="linenos"> 860</span></a>
</span><span id="Windmill-861"><a href="#Windmill-861"><span class="linenos"> 861</span></a> <span class="k">if</span> <span class="n">s3_objs_to_sign</span><span class="p">:</span>
</span><span id="Windmill-862"><a href="#Windmill-862"><span class="linenos"> 862</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Signing </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">s3_objs_to_sign</span><span class="p">)</span><span class="si">}</span><span class="s2"> S3 objects...&quot;</span><span class="p">)</span>
</span><span id="Windmill-863"><a href="#Windmill-863"><span class="linenos"> 863</span></a> <span class="n">signed_s3_objs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sign_s3_objects</span><span class="p">(</span>
</span><span id="Windmill-864"><a href="#Windmill-864"><span class="linenos"> 864</span></a> <span class="p">[</span><span class="n">s3_obj</span> <span class="k">for</span> <span class="n">s3_obj</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">s3_objs_to_sign</span><span class="p">]</span>
</span><span id="Windmill-865"><a href="#Windmill-865"><span class="linenos"> 865</span></a> <span class="p">)</span>
</span><span id="Windmill-866"><a href="#Windmill-866"><span class="linenos"> 866</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="n">original_index</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">s3_objs_to_sign</span><span class="p">):</span>
</span><span id="Windmill-867"><a href="#Windmill-867"><span class="linenos"> 867</span></a> <span class="n">s3_objs</span><span class="p">[</span><span class="n">original_index</span><span class="p">]</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">signed_s3_objs</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span><span id="Windmill-868"><a href="#Windmill-868"><span class="linenos"> 868</span></a>
</span><span id="Windmill-869"><a href="#Windmill-869"><span class="linenos"> 869</span></a> <span class="n">signed_urls</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="Windmill-870"><a href="#Windmill-870"><span class="linenos"> 870</span></a> <span class="k">for</span> <span class="n">s3_obj</span> <span class="ow">in</span> <span class="n">s3_objs</span><span class="p">:</span>
</span><span id="Windmill-871"><a href="#Windmill-871"><span class="linenos"> 871</span></a> <span class="n">s3</span> <span class="o">=</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;s3&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="Windmill-872"><a href="#Windmill-872"><span class="linenos"> 872</span></a> <span class="n">presigned</span> <span class="o">=</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;presigned&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="Windmill-873"><a href="#Windmill-873"><span class="linenos"> 873</span></a> <span class="n">storage</span> <span class="o">=</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;storage&quot;</span><span class="p">,</span> <span class="s2">&quot;_default_&quot;</span><span class="p">)</span>
</span><span id="Windmill-874"><a href="#Windmill-874"><span class="linenos"> 874</span></a> <span class="n">signed_url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s2">/api/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/s3_proxy/</span><span class="si">{</span><span class="n">storage</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">s3</span><span class="si">}</span><span class="s2">?</span><span class="si">{</span><span class="n">presigned</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill-875"><a href="#Windmill-875"><span class="linenos"> 875</span></a> <span class="n">signed_urls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">signed_url</span><span class="p">)</span>
</span><span id="Windmill-876"><a href="#Windmill-876"><span class="linenos"> 876</span></a>
</span><span id="Windmill-877"><a href="#Windmill-877"><span class="linenos"> 877</span></a> <span class="k">return</span> <span class="n">signed_urls</span>
</span><span id="Windmill-878"><a href="#Windmill-878"><span class="linenos"> 878</span></a>
</span><span id="Windmill-879"><a href="#Windmill-879"><span class="linenos"> 879</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_presigned_s3_public_url</span><span class="p">(</span>
</span><span id="Windmill-880"><a href="#Windmill-880"><span class="linenos"> 880</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-881"><a href="#Windmill-881"><span class="linenos"> 881</span></a> <span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-882"><a href="#Windmill-882"><span class="linenos"> 882</span></a> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-883"><a href="#Windmill-883"><span class="linenos"> 883</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill-884"><a href="#Windmill-884"><span class="linenos"> 884</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-885"><a href="#Windmill-885"><span class="linenos"> 885</span></a><span class="sd"> Generate a presigned public URL for an S3 object.</span>
</span><span id="Windmill-886"><a href="#Windmill-886"><span class="linenos"> 886</span></a><span class="sd"> If the S3 object is not signed yet, it will be signed first.</span>
</span><span id="Windmill-887"><a href="#Windmill-887"><span class="linenos"> 887</span></a>
</span><span id="Windmill-888"><a href="#Windmill-888"><span class="linenos"> 888</span></a><span class="sd"> Args:</span>
</span><span id="Windmill-889"><a href="#Windmill-889"><span class="linenos"> 889</span></a><span class="sd"> s3_object: S3 object to sign</span>
</span><span id="Windmill-890"><a href="#Windmill-890"><span class="linenos"> 890</span></a><span class="sd"> base_url: Optional base URL for the presigned URL (defaults to WM_BASE_URL)</span>
</span><span id="Windmill-891"><a href="#Windmill-891"><span class="linenos"> 891</span></a>
</span><span id="Windmill-892"><a href="#Windmill-892"><span class="linenos"> 892</span></a><span class="sd"> Returns:</span>
</span><span id="Windmill-893"><a href="#Windmill-893"><span class="linenos"> 893</span></a><span class="sd"> Signed public URL</span>
</span><span id="Windmill-894"><a href="#Windmill-894"><span class="linenos"> 894</span></a>
</span><span id="Windmill-895"><a href="#Windmill-895"><span class="linenos"> 895</span></a><span class="sd"> Example:</span>
</span><span id="Windmill-896"><a href="#Windmill-896"><span class="linenos"> 896</span></a><span class="sd"> &gt;&gt;&gt; s3_obj = S3Object(s3=&quot;/path/to/file.txt&quot;)</span>
</span><span id="Windmill-897"><a href="#Windmill-897"><span class="linenos"> 897</span></a><span class="sd"> &gt;&gt;&gt; url = client.get_presigned_s3_public_url(s3_obj)</span>
</span><span id="Windmill-898"><a href="#Windmill-898"><span class="linenos"> 898</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-899"><a href="#Windmill-899"><span class="linenos"> 899</span></a> <span class="n">urls</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_presigned_s3_public_urls</span><span class="p">([</span><span class="n">s3_object</span><span class="p">],</span> <span class="n">base_url</span><span class="p">)</span>
</span><span id="Windmill-900"><a href="#Windmill-900"><span class="linenos"> 900</span></a> <span class="k">return</span> <span class="n">urls</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="Windmill-901"><a href="#Windmill-901"><span class="linenos"> 901</span></a>
</span><span id="Windmill-902"><a href="#Windmill-902"><span class="linenos"> 902</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_get_public_base_url</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill-903"><a href="#Windmill-903"><span class="linenos"> 903</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the public base URL from environment or default to localhost&quot;&quot;&quot;</span>
</span><span id="Windmill-904"><a href="#Windmill-904"><span class="linenos"> 904</span></a> <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_BASE_URL&quot;</span><span class="p">,</span> <span class="s2">&quot;http://localhost:3000&quot;</span><span class="p">)</span>
</span><span id="Windmill-905"><a href="#Windmill-905"><span class="linenos"> 905</span></a>
</span><span id="Windmill-906"><a href="#Windmill-906"><span class="linenos"> 906</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">__boto3_connection_settings</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s3_resource</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Boto3ConnectionSettings</span><span class="p">:</span>
</span><span id="Windmill-907"><a href="#Windmill-907"><span class="linenos"> 907</span></a> <span class="n">endpoint_url_prefix</span> <span class="o">=</span> <span class="s2">&quot;https://&quot;</span> <span class="k">if</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;useSSL&quot;</span><span class="p">]</span> <span class="k">else</span> <span class="s2">&quot;http://&quot;</span>
</span><span id="Windmill-908"><a href="#Windmill-908"><span class="linenos"> 908</span></a> <span class="k">return</span> <span class="n">Boto3ConnectionSettings</span><span class="p">(</span>
</span><span id="Windmill-909"><a href="#Windmill-909"><span class="linenos"> 909</span></a> <span class="p">{</span>
</span><span id="Windmill-910"><a href="#Windmill-910"><span class="linenos"> 910</span></a> <span class="s2">&quot;endpoint_url&quot;</span><span class="p">:</span> <span class="s2">&quot;</span><span class="si">{}{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
</span><span id="Windmill-911"><a href="#Windmill-911"><span class="linenos"> 911</span></a> <span class="n">endpoint_url_prefix</span><span class="p">,</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;endPoint&quot;</span><span class="p">]</span>
</span><span id="Windmill-912"><a href="#Windmill-912"><span class="linenos"> 912</span></a> <span class="p">),</span>
</span><span id="Windmill-913"><a href="#Windmill-913"><span class="linenos"> 913</span></a> <span class="s2">&quot;region_name&quot;</span><span class="p">:</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;region&quot;</span><span class="p">],</span>
</span><span id="Windmill-914"><a href="#Windmill-914"><span class="linenos"> 914</span></a> <span class="s2">&quot;use_ssl&quot;</span><span class="p">:</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;useSSL&quot;</span><span class="p">],</span>
</span><span id="Windmill-915"><a href="#Windmill-915"><span class="linenos"> 915</span></a> <span class="s2">&quot;aws_access_key_id&quot;</span><span class="p">:</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;accessKey&quot;</span><span class="p">],</span>
</span><span id="Windmill-916"><a href="#Windmill-916"><span class="linenos"> 916</span></a> <span class="s2">&quot;aws_secret_access_key&quot;</span><span class="p">:</span> <span class="n">s3_resource</span><span class="p">[</span><span class="s2">&quot;secretKey&quot;</span><span class="p">],</span>
</span><span id="Windmill-917"><a href="#Windmill-917"><span class="linenos"> 917</span></a> <span class="c1"># no need for path_style here as boto3 is clever enough to determine which one to use</span>
</span><span id="Windmill-918"><a href="#Windmill-918"><span class="linenos"> 918</span></a> <span class="p">}</span>
</span><span id="Windmill-919"><a href="#Windmill-919"><span class="linenos"> 919</span></a> <span class="p">)</span>
</span><span id="Windmill-920"><a href="#Windmill-920"><span class="linenos"> 920</span></a>
</span><span id="Windmill-921"><a href="#Windmill-921"><span class="linenos"> 921</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">whoami</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill-922"><a href="#Windmill-922"><span class="linenos"> 922</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/users/whoami&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-923"><a href="#Windmill-923"><span class="linenos"> 923</span></a>
</span><span id="Windmill-924"><a href="#Windmill-924"><span class="linenos"> 924</span></a> <span class="nd">@property</span>
</span><span id="Windmill-925"><a href="#Windmill-925"><span class="linenos"> 925</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">user</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill-926"><a href="#Windmill-926"><span class="linenos"> 926</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">whoami</span><span class="p">()</span>
</span><span id="Windmill-927"><a href="#Windmill-927"><span class="linenos"> 927</span></a>
</span><span id="Windmill-928"><a href="#Windmill-928"><span class="linenos"> 928</span></a> <span class="nd">@property</span>
</span><span id="Windmill-929"><a href="#Windmill-929"><span class="linenos"> 929</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">state_path</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill-930"><a href="#Windmill-930"><span class="linenos"> 930</span></a> <span class="n">state_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill-931"><a href="#Windmill-931"><span class="linenos"> 931</span></a> <span class="s2">&quot;WM_STATE_PATH_NEW&quot;</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_STATE_PATH&quot;</span><span class="p">)</span>
</span><span id="Windmill-932"><a href="#Windmill-932"><span class="linenos"> 932</span></a> <span class="p">)</span>
</span><span id="Windmill-933"><a href="#Windmill-933"><span class="linenos"> 933</span></a> <span class="k">if</span> <span class="n">state_path</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-934"><a href="#Windmill-934"><span class="linenos"> 934</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;State path not found&quot;</span><span class="p">)</span>
</span><span id="Windmill-935"><a href="#Windmill-935"><span class="linenos"> 935</span></a> <span class="k">return</span> <span class="n">state_path</span>
</span><span id="Windmill-936"><a href="#Windmill-936"><span class="linenos"> 936</span></a>
</span><span id="Windmill-937"><a href="#Windmill-937"><span class="linenos"> 937</span></a> <span class="nd">@property</span>
</span><span id="Windmill-938"><a href="#Windmill-938"><span class="linenos"> 938</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">state</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill-939"><a href="#Windmill-939"><span class="linenos"> 939</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_resource</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">state_path</span><span class="p">,</span> <span class="n">none_if_undefined</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="Windmill-940"><a href="#Windmill-940"><span class="linenos"> 940</span></a>
</span><span id="Windmill-941"><a href="#Windmill-941"><span class="linenos"> 941</span></a> <span class="nd">@state</span><span class="o">.</span><span class="n">setter</span>
</span><span id="Windmill-942"><a href="#Windmill-942"><span class="linenos"> 942</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-943"><a href="#Windmill-943"><span class="linenos"> 943</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span id="Windmill-944"><a href="#Windmill-944"><span class="linenos"> 944</span></a>
</span><span id="Windmill-945"><a href="#Windmill-945"><span class="linenos"> 945</span></a> <span class="nd">@staticmethod</span>
</span><span id="Windmill-946"><a href="#Windmill-946"><span class="linenos"> 946</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_shared_state_pickle</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.pickle&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-947"><a href="#Windmill-947"><span class="linenos"> 947</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-948"><a href="#Windmill-948"><span class="linenos"> 948</span></a><span class="sd"> Set the state in the shared folder using pickle</span>
</span><span id="Windmill-949"><a href="#Windmill-949"><span class="linenos"> 949</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-950"><a href="#Windmill-950"><span class="linenos"> 950</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">pickle</span>
</span><span id="Windmill-951"><a href="#Windmill-951"><span class="linenos"> 951</span></a>
</span><span id="Windmill-952"><a href="#Windmill-952"><span class="linenos"> 952</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;wb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">handle</span><span class="p">:</span>
</span><span id="Windmill-953"><a href="#Windmill-953"><span class="linenos"> 953</span></a> <span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">handle</span><span class="p">,</span> <span class="n">protocol</span><span class="o">=</span><span class="n">pickle</span><span class="o">.</span><span class="n">HIGHEST_PROTOCOL</span><span class="p">)</span>
</span><span id="Windmill-954"><a href="#Windmill-954"><span class="linenos"> 954</span></a>
</span><span id="Windmill-955"><a href="#Windmill-955"><span class="linenos"> 955</span></a> <span class="nd">@staticmethod</span>
</span><span id="Windmill-956"><a href="#Windmill-956"><span class="linenos"> 956</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_shared_state_pickle</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.pickle&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill-957"><a href="#Windmill-957"><span class="linenos"> 957</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-958"><a href="#Windmill-958"><span class="linenos"> 958</span></a><span class="sd"> Get the state in the shared folder using pickle</span>
</span><span id="Windmill-959"><a href="#Windmill-959"><span class="linenos"> 959</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-960"><a href="#Windmill-960"><span class="linenos"> 960</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">pickle</span>
</span><span id="Windmill-961"><a href="#Windmill-961"><span class="linenos"> 961</span></a>
</span><span id="Windmill-962"><a href="#Windmill-962"><span class="linenos"> 962</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">handle</span><span class="p">:</span>
</span><span id="Windmill-963"><a href="#Windmill-963"><span class="linenos"> 963</span></a> <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">handle</span><span class="p">)</span>
</span><span id="Windmill-964"><a href="#Windmill-964"><span class="linenos"> 964</span></a>
</span><span id="Windmill-965"><a href="#Windmill-965"><span class="linenos"> 965</span></a> <span class="nd">@staticmethod</span>
</span><span id="Windmill-966"><a href="#Windmill-966"><span class="linenos"> 966</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_shared_state</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.json&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-967"><a href="#Windmill-967"><span class="linenos"> 967</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-968"><a href="#Windmill-968"><span class="linenos"> 968</span></a><span class="sd"> Set the state in the shared folder using pickle</span>
</span><span id="Windmill-969"><a href="#Windmill-969"><span class="linenos"> 969</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-970"><a href="#Windmill-970"><span class="linenos"> 970</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
</span><span id="Windmill-971"><a href="#Windmill-971"><span class="linenos"> 971</span></a>
</span><span id="Windmill-972"><a href="#Windmill-972"><span class="linenos"> 972</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</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="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="Windmill-973"><a href="#Windmill-973"><span class="linenos"> 973</span></a> <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
</span><span id="Windmill-974"><a href="#Windmill-974"><span class="linenos"> 974</span></a>
</span><span id="Windmill-975"><a href="#Windmill-975"><span class="linenos"> 975</span></a> <span class="nd">@staticmethod</span>
</span><span id="Windmill-976"><a href="#Windmill-976"><span class="linenos"> 976</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_shared_state</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.json&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-977"><a href="#Windmill-977"><span class="linenos"> 977</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-978"><a href="#Windmill-978"><span class="linenos"> 978</span></a><span class="sd"> Get the state in the shared folder using pickle</span>
</span><span id="Windmill-979"><a href="#Windmill-979"><span class="linenos"> 979</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-980"><a href="#Windmill-980"><span class="linenos"> 980</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
</span><span id="Windmill-981"><a href="#Windmill-981"><span class="linenos"> 981</span></a>
</span><span id="Windmill-982"><a href="#Windmill-982"><span class="linenos"> 982</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;r&quot;</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="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="Windmill-983"><a href="#Windmill-983"><span class="linenos"> 983</span></a> <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span id="Windmill-984"><a href="#Windmill-984"><span class="linenos"> 984</span></a>
</span><span id="Windmill-985"><a href="#Windmill-985"><span class="linenos"> 985</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_resume_urls</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill-986"><a href="#Windmill-986"><span class="linenos"> 986</span></a> <span class="n">nonce</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1000000000</span><span class="p">)</span>
</span><span id="Windmill-987"><a href="#Windmill-987"><span class="linenos"> 987</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;NO_ID&quot;</span>
</span><span id="Windmill-988"><a href="#Windmill-988"><span class="linenos"> 988</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill-989"><a href="#Windmill-989"><span class="linenos"> 989</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/resume_urls/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">nonce</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-990"><a href="#Windmill-990"><span class="linenos"> 990</span></a> <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;approver&quot;</span><span class="p">:</span> <span class="n">approver</span><span class="p">},</span>
</span><span id="Windmill-991"><a href="#Windmill-991"><span class="linenos"> 991</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill-992"><a href="#Windmill-992"><span class="linenos"> 992</span></a>
</span><span id="Windmill-993"><a href="#Windmill-993"><span class="linenos"> 993</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">request_interactive_slack_approval</span><span class="p">(</span>
</span><span id="Windmill-994"><a href="#Windmill-994"><span class="linenos"> 994</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-995"><a href="#Windmill-995"><span class="linenos"> 995</span></a> <span class="n">slack_resource_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-996"><a href="#Windmill-996"><span class="linenos"> 996</span></a> <span class="n">channel_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-997"><a href="#Windmill-997"><span class="linenos"> 997</span></a> <span class="n">message</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-998"><a href="#Windmill-998"><span class="linenos"> 998</span></a> <span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-999"><a href="#Windmill-999"><span class="linenos"> 999</span></a> <span class="n">default_args_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-1000"><a href="#Windmill-1000"><span class="linenos">1000</span></a> <span class="n">dynamic_enums_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-1001"><a href="#Windmill-1001"><span class="linenos">1001</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill-1002"><a href="#Windmill-1002"><span class="linenos">1002</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-1003"><a href="#Windmill-1003"><span class="linenos">1003</span></a><span class="sd"> Sends an interactive approval request via Slack, allowing optional customization of the message, approver, and form fields.</span>
</span><span id="Windmill-1004"><a href="#Windmill-1004"><span class="linenos">1004</span></a>
</span><span id="Windmill-1005"><a href="#Windmill-1005"><span class="linenos">1005</span></a><span class="sd"> **[Enterprise Edition Only]** To include form fields in the Slack approval request, use the &quot;Advanced -&gt; Suspend -&gt; Form&quot; functionality.</span>
</span><span id="Windmill-1006"><a href="#Windmill-1006"><span class="linenos">1006</span></a><span class="sd"> Learn more at: https://www.windmill.dev/docs/flows/flow_approval#form</span>
</span><span id="Windmill-1007"><a href="#Windmill-1007"><span class="linenos">1007</span></a>
</span><span id="Windmill-1008"><a href="#Windmill-1008"><span class="linenos">1008</span></a><span class="sd"> :param slack_resource_path: The path to the Slack resource in Windmill.</span>
</span><span id="Windmill-1009"><a href="#Windmill-1009"><span class="linenos">1009</span></a><span class="sd"> :type slack_resource_path: str</span>
</span><span id="Windmill-1010"><a href="#Windmill-1010"><span class="linenos">1010</span></a><span class="sd"> :param channel_id: The Slack channel ID where the approval request will be sent.</span>
</span><span id="Windmill-1011"><a href="#Windmill-1011"><span class="linenos">1011</span></a><span class="sd"> :type channel_id: str</span>
</span><span id="Windmill-1012"><a href="#Windmill-1012"><span class="linenos">1012</span></a><span class="sd"> :param message: Optional custom message to include in the Slack approval request.</span>
</span><span id="Windmill-1013"><a href="#Windmill-1013"><span class="linenos">1013</span></a><span class="sd"> :type message: str, optional</span>
</span><span id="Windmill-1014"><a href="#Windmill-1014"><span class="linenos">1014</span></a><span class="sd"> :param approver: Optional user ID or name of the approver for the request.</span>
</span><span id="Windmill-1015"><a href="#Windmill-1015"><span class="linenos">1015</span></a><span class="sd"> :type approver: str, optional</span>
</span><span id="Windmill-1016"><a href="#Windmill-1016"><span class="linenos">1016</span></a><span class="sd"> :param default_args_json: Optional dictionary defining or overriding the default arguments for form fields.</span>
</span><span id="Windmill-1017"><a href="#Windmill-1017"><span class="linenos">1017</span></a><span class="sd"> :type default_args_json: dict, optional</span>
</span><span id="Windmill-1018"><a href="#Windmill-1018"><span class="linenos">1018</span></a><span class="sd"> :param dynamic_enums_json: Optional dictionary overriding the enum default values of enum form fields.</span>
</span><span id="Windmill-1019"><a href="#Windmill-1019"><span class="linenos">1019</span></a><span class="sd"> :type dynamic_enums_json: dict, optional</span>
</span><span id="Windmill-1020"><a href="#Windmill-1020"><span class="linenos">1020</span></a>
</span><span id="Windmill-1021"><a href="#Windmill-1021"><span class="linenos">1021</span></a><span class="sd"> :raises Exception: If the function is not called within a flow or flow preview.</span>
</span><span id="Windmill-1022"><a href="#Windmill-1022"><span class="linenos">1022</span></a><span class="sd"> :raises Exception: If the required flow job or flow step environment variables are not set.</span>
</span><span id="Windmill-1023"><a href="#Windmill-1023"><span class="linenos">1023</span></a>
</span><span id="Windmill-1024"><a href="#Windmill-1024"><span class="linenos">1024</span></a><span class="sd"> :return: None</span>
</span><span id="Windmill-1025"><a href="#Windmill-1025"><span class="linenos">1025</span></a>
</span><span id="Windmill-1026"><a href="#Windmill-1026"><span class="linenos">1026</span></a><span class="sd"> **Usage Example:**</span>
</span><span id="Windmill-1027"><a href="#Windmill-1027"><span class="linenos">1027</span></a><span class="sd"> &gt;&gt;&gt; client.request_interactive_slack_approval(</span>
</span><span id="Windmill-1028"><a href="#Windmill-1028"><span class="linenos">1028</span></a><span class="sd"> ... slack_resource_path=&quot;/u/alex/my_slack_resource&quot;,</span>
</span><span id="Windmill-1029"><a href="#Windmill-1029"><span class="linenos">1029</span></a><span class="sd"> ... channel_id=&quot;admins-slack-channel&quot;,</span>
</span><span id="Windmill-1030"><a href="#Windmill-1030"><span class="linenos">1030</span></a><span class="sd"> ... message=&quot;Please approve this request&quot;,</span>
</span><span id="Windmill-1031"><a href="#Windmill-1031"><span class="linenos">1031</span></a><span class="sd"> ... approver=&quot;approver123&quot;,</span>
</span><span id="Windmill-1032"><a href="#Windmill-1032"><span class="linenos">1032</span></a><span class="sd"> ... default_args_json={&quot;key1&quot;: &quot;value1&quot;, &quot;key2&quot;: 42},</span>
</span><span id="Windmill-1033"><a href="#Windmill-1033"><span class="linenos">1033</span></a><span class="sd"> ... dynamic_enums_json={&quot;foo&quot;: [&quot;choice1&quot;, &quot;choice2&quot;], &quot;bar&quot;: [&quot;optionA&quot;, &quot;optionB&quot;]},</span>
</span><span id="Windmill-1034"><a href="#Windmill-1034"><span class="linenos">1034</span></a><span class="sd"> ... )</span>
</span><span id="Windmill-1035"><a href="#Windmill-1035"><span class="linenos">1035</span></a>
</span><span id="Windmill-1036"><a href="#Windmill-1036"><span class="linenos">1036</span></a><span class="sd"> **Notes:**</span>
</span><span id="Windmill-1037"><a href="#Windmill-1037"><span class="linenos">1037</span></a><span class="sd"> - This function must be executed within a Windmill flow or flow preview.</span>
</span><span id="Windmill-1038"><a href="#Windmill-1038"><span class="linenos">1038</span></a><span class="sd"> - The function checks for required environment variables (`WM_FLOW_JOB_ID`, `WM_FLOW_STEP_ID`) to ensure it is run in the appropriate context.</span>
</span><span id="Windmill-1039"><a href="#Windmill-1039"><span class="linenos">1039</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-1040"><a href="#Windmill-1040"><span class="linenos">1040</span></a> <span class="n">workspace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">workspace</span>
</span><span id="Windmill-1041"><a href="#Windmill-1041"><span class="linenos">1041</span></a> <span class="n">flow_job_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill-1042"><a href="#Windmill-1042"><span class="linenos">1042</span></a>
</span><span id="Windmill-1043"><a href="#Windmill-1043"><span class="linenos">1043</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">flow_job_id</span><span class="p">:</span>
</span><span id="Windmill-1044"><a href="#Windmill-1044"><span class="linenos">1044</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="Windmill-1045"><a href="#Windmill-1045"><span class="linenos">1045</span></a> <span class="s2">&quot;You can&#39;t use &#39;request_interactive_slack_approval&#39; function in a standalone script or flow step preview. Please use it in a flow or a flow preview.&quot;</span>
</span><span id="Windmill-1046"><a href="#Windmill-1046"><span class="linenos">1046</span></a> <span class="p">)</span>
</span><span id="Windmill-1047"><a href="#Windmill-1047"><span class="linenos">1047</span></a>
</span><span id="Windmill-1048"><a href="#Windmill-1048"><span class="linenos">1048</span></a> <span class="c1"># Only include non-empty parameters</span>
</span><span id="Windmill-1049"><a href="#Windmill-1049"><span class="linenos">1049</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="Windmill-1050"><a href="#Windmill-1050"><span class="linenos">1050</span></a> <span class="k">if</span> <span class="n">message</span><span class="p">:</span>
</span><span id="Windmill-1051"><a href="#Windmill-1051"><span class="linenos">1051</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;message&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">message</span>
</span><span id="Windmill-1052"><a href="#Windmill-1052"><span class="linenos">1052</span></a> <span class="k">if</span> <span class="n">approver</span><span class="p">:</span>
</span><span id="Windmill-1053"><a href="#Windmill-1053"><span class="linenos">1053</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;approver&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">approver</span>
</span><span id="Windmill-1054"><a href="#Windmill-1054"><span class="linenos">1054</span></a> <span class="k">if</span> <span class="n">slack_resource_path</span><span class="p">:</span>
</span><span id="Windmill-1055"><a href="#Windmill-1055"><span class="linenos">1055</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;slack_resource_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">slack_resource_path</span>
</span><span id="Windmill-1056"><a href="#Windmill-1056"><span class="linenos">1056</span></a> <span class="k">if</span> <span class="n">channel_id</span><span class="p">:</span>
</span><span id="Windmill-1057"><a href="#Windmill-1057"><span class="linenos">1057</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;channel_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel_id</span>
</span><span id="Windmill-1058"><a href="#Windmill-1058"><span class="linenos">1058</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_STEP_ID&quot;</span><span class="p">):</span>
</span><span id="Windmill-1059"><a href="#Windmill-1059"><span class="linenos">1059</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;flow_step_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_STEP_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill-1060"><a href="#Windmill-1060"><span class="linenos">1060</span></a> <span class="k">if</span> <span class="n">default_args_json</span><span class="p">:</span>
</span><span id="Windmill-1061"><a href="#Windmill-1061"><span class="linenos">1061</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;default_args_json&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">default_args_json</span><span class="p">)</span>
</span><span id="Windmill-1062"><a href="#Windmill-1062"><span class="linenos">1062</span></a> <span class="k">if</span> <span class="n">dynamic_enums_json</span><span class="p">:</span>
</span><span id="Windmill-1063"><a href="#Windmill-1063"><span class="linenos">1063</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;dynamic_enums_json&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">dynamic_enums_json</span><span class="p">)</span>
</span><span id="Windmill-1064"><a href="#Windmill-1064"><span class="linenos">1064</span></a>
</span><span id="Windmill-1065"><a href="#Windmill-1065"><span class="linenos">1065</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill-1066"><a href="#Windmill-1066"><span class="linenos">1066</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/slack_approval/</span><span class="si">{</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;WM_JOB_ID&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;NO_JOB_ID&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill-1067"><a href="#Windmill-1067"><span class="linenos">1067</span></a> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span>
</span><span id="Windmill-1068"><a href="#Windmill-1068"><span class="linenos">1068</span></a> <span class="p">)</span>
</span><span id="Windmill-1069"><a href="#Windmill-1069"><span class="linenos">1069</span></a>
</span><span id="Windmill-1070"><a href="#Windmill-1070"><span class="linenos">1070</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">username_to_email</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</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="Windmill-1071"><a href="#Windmill-1071"><span class="linenos">1071</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-1072"><a href="#Windmill-1072"><span class="linenos">1072</span></a><span class="sd"> Get email from workspace username</span>
</span><span id="Windmill-1073"><a href="#Windmill-1073"><span class="linenos">1073</span></a><span class="sd"> This method is particularly useful for apps that require the email address of the viewer.</span>
</span><span id="Windmill-1074"><a href="#Windmill-1074"><span class="linenos">1074</span></a><span class="sd"> Indeed, in the viewer context WM_USERNAME is set to the username of the viewer but WM_EMAIL is set to the email of the creator of the app.</span>
</span><span id="Windmill-1075"><a href="#Windmill-1075"><span class="linenos">1075</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-1076"><a href="#Windmill-1076"><span class="linenos">1076</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/users/username_to_email/</span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span><span id="Windmill-1077"><a href="#Windmill-1077"><span class="linenos">1077</span></a>
</span><span id="Windmill-1078"><a href="#Windmill-1078"><span class="linenos">1078</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">send_teams_message</span><span class="p">(</span>
</span><span id="Windmill-1079"><a href="#Windmill-1079"><span class="linenos">1079</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill-1080"><a href="#Windmill-1080"><span class="linenos">1080</span></a> <span class="n">conversation_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-1081"><a href="#Windmill-1081"><span class="linenos">1081</span></a> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill-1082"><a href="#Windmill-1082"><span class="linenos">1082</span></a> <span class="n">success</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill-1083"><a href="#Windmill-1083"><span class="linenos">1083</span></a> <span class="n">card_block</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill-1084"><a href="#Windmill-1084"><span class="linenos">1084</span></a> <span class="p">):</span>
</span><span id="Windmill-1085"><a href="#Windmill-1085"><span class="linenos">1085</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill-1086"><a href="#Windmill-1086"><span class="linenos">1086</span></a><span class="sd"> Send a message to a Microsoft Teams conversation with conversation_id, where success is used to style the message</span>
</span><span id="Windmill-1087"><a href="#Windmill-1087"><span class="linenos">1087</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill-1088"><a href="#Windmill-1088"><span class="linenos">1088</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill-1089"><a href="#Windmill-1089"><span class="linenos">1089</span></a> <span class="sa">f</span><span class="s2">&quot;/teams/activities&quot;</span><span class="p">,</span>
</span><span id="Windmill-1090"><a href="#Windmill-1090"><span class="linenos">1090</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill-1091"><a href="#Windmill-1091"><span class="linenos">1091</span></a> <span class="s2">&quot;conversation_id&quot;</span><span class="p">:</span> <span class="n">conversation_id</span><span class="p">,</span>
</span><span id="Windmill-1092"><a href="#Windmill-1092"><span class="linenos">1092</span></a> <span class="s2">&quot;text&quot;</span><span class="p">:</span> <span class="n">text</span><span class="p">,</span>
</span><span id="Windmill-1093"><a href="#Windmill-1093"><span class="linenos">1093</span></a> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="n">success</span><span class="p">,</span>
</span><span id="Windmill-1094"><a href="#Windmill-1094"><span class="linenos">1094</span></a> <span class="s2">&quot;card_block&quot;</span><span class="p">:</span> <span class="n">card_block</span><span class="p">,</span>
</span><span id="Windmill-1095"><a href="#Windmill-1095"><span class="linenos">1095</span></a> <span class="p">},</span>
</span><span id="Windmill-1096"><a href="#Windmill-1096"><span class="linenos">1096</span></a> <span class="p">)</span>
</span><span id="Windmill-1097"><a href="#Windmill-1097"><span class="linenos">1097</span></a>
</span><span id="Windmill-1098"><a href="#Windmill-1098"><span class="linenos">1098</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">datatable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;main&quot;</span><span class="p">):</span>
</span><span id="Windmill-1099"><a href="#Windmill-1099"><span class="linenos">1099</span></a> <span class="k">return</span> <span class="n">DataTableClient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
</span><span id="Windmill-1100"><a href="#Windmill-1100"><span class="linenos">1100</span></a>
</span><span id="Windmill-1101"><a href="#Windmill-1101"><span class="linenos">1101</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">ducklake</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;main&quot;</span><span class="p">):</span>
</span><span id="Windmill-1102"><a href="#Windmill-1102"><span class="linenos">1102</span></a> <span class="k">return</span> <span class="n">DucklakeClient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
</span></pre></div>
<div id="Windmill.__init__" class="classattr">
<input id="Windmill.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="name">Windmill</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">base_url</span><span class="o">=</span><span class="kc">None</span>, </span><span class="param"><span class="n">token</span><span class="o">=</span><span class="kc">None</span>, </span><span class="param"><span class="n">workspace</span><span class="o">=</span><span class="kc">None</span>, </span><span class="param"><span class="n">verify</span><span class="o">=</span><span class="kc">True</span></span>)</span>
<label class="view-source-button" for="Windmill.__init__-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.__init__"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.__init__-36"><a href="#Windmill.__init__-36"><span class="linenos">36</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">base_url</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">token</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">workspace</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">verify</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
</span><span id="Windmill.__init__-37"><a href="#Windmill.__init__-37"><span class="linenos">37</span></a> <span class="n">base</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="Windmill.__init__-38"><a href="#Windmill.__init__-38"><span class="linenos">38</span></a> <span class="n">base_url</span>
</span><span id="Windmill.__init__-39"><a href="#Windmill.__init__-39"><span class="linenos">39</span></a> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;BASE_INTERNAL_URL&quot;</span><span class="p">)</span>
</span><span id="Windmill.__init__-40"><a href="#Windmill.__init__-40"><span class="linenos">40</span></a> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_BASE_URL&quot;</span><span class="p">)</span>
</span><span id="Windmill.__init__-41"><a href="#Windmill.__init__-41"><span class="linenos">41</span></a> <span class="p">)</span>
</span><span id="Windmill.__init__-42"><a href="#Windmill.__init__-42"><span class="linenos">42</span></a>
</span><span id="Windmill.__init__-43"><a href="#Windmill.__init__-43"><span class="linenos">43</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">base_url</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">/api&quot;</span>
</span><span id="Windmill.__init__-44"><a href="#Windmill.__init__-44"><span class="linenos">44</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="n">token</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_TOKEN&quot;</span><span class="p">)</span>
</span><span id="Windmill.__init__-45"><a href="#Windmill.__init__-45"><span class="linenos">45</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Windmill.__init__-46"><a href="#Windmill.__init__-46"><span class="linenos">46</span></a> <span class="s2">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span>
</span><span id="Windmill.__init__-47"><a href="#Windmill.__init__-47"><span class="linenos">47</span></a> <span class="s2">&quot;Authorization&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Bearer </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.__init__-48"><a href="#Windmill.__init__-48"><span class="linenos">48</span></a> <span class="p">}</span>
</span><span id="Windmill.__init__-49"><a href="#Windmill.__init__-49"><span class="linenos">49</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">verify</span> <span class="o">=</span> <span class="n">verify</span>
</span><span id="Windmill.__init__-50"><a href="#Windmill.__init__-50"><span class="linenos">50</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_client</span><span class="p">()</span>
</span><span id="Windmill.__init__-51"><a href="#Windmill.__init__-51"><span class="linenos">51</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">workspace</span> <span class="o">=</span> <span class="n">workspace</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_WORKSPACE&quot;</span><span class="p">)</span>
</span><span id="Windmill.__init__-52"><a href="#Windmill.__init__-52"><span class="linenos">52</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_PATH&quot;</span><span class="p">)</span>
</span><span id="Windmill.__init__-53"><a href="#Windmill.__init__-53"><span class="linenos">53</span></a>
</span><span id="Windmill.__init__-54"><a href="#Windmill.__init__-54"><span class="linenos">54</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_mocked_api</span><span class="p">()</span>
</span><span id="Windmill.__init__-55"><a href="#Windmill.__init__-55"><span class="linenos">55</span></a>
</span><span id="Windmill.__init__-56"><a href="#Windmill.__init__-56"><span class="linenos">56</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="p">,</span> <span class="p">(</span>
</span><span id="Windmill.__init__-57"><a href="#Windmill.__init__-57"><span class="linenos">57</span></a> <span class="sa">f</span><span class="s2">&quot;workspace required as an argument or as WM_WORKSPACE environment variable&quot;</span>
</span><span id="Windmill.__init__-58"><a href="#Windmill.__init__-58"><span class="linenos">58</span></a> <span class="p">)</span>
</span></pre></div>
</div>
<div id="Windmill.base_url" class="classattr">
<div class="attr variable">
<span class="name">base_url</span>
</div>
<a class="headerlink" href="#Windmill.base_url"></a>
</div>
<div id="Windmill.token" class="classattr">
<div class="attr variable">
<span class="name">token</span>
</div>
<a class="headerlink" href="#Windmill.token"></a>
</div>
<div id="Windmill.headers" class="classattr">
<div class="attr variable">
<span class="name">headers</span>
</div>
<a class="headerlink" href="#Windmill.headers"></a>
</div>
<div id="Windmill.verify" class="classattr">
<div class="attr variable">
<span class="name">verify</span>
</div>
<a class="headerlink" href="#Windmill.verify"></a>
</div>
<div id="Windmill.client" class="classattr">
<div class="attr variable">
<span class="name">client</span>
</div>
<a class="headerlink" href="#Windmill.client"></a>
</div>
<div id="Windmill.workspace" class="classattr">
<div class="attr variable">
<span class="name">workspace</span>
</div>
<a class="headerlink" href="#Windmill.workspace"></a>
</div>
<div id="Windmill.path" class="classattr">
<div class="attr variable">
<span class="name">path</span>
</div>
<a class="headerlink" href="#Windmill.path"></a>
</div>
<div id="Windmill.mocked_api" class="classattr">
<div class="attr variable">
<span class="name">mocked_api</span>
</div>
<a class="headerlink" href="#Windmill.mocked_api"></a>
</div>
<div id="Windmill.get_mocked_api" class="classattr">
<input id="Windmill.get_mocked_api-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">get_mocked_api</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span></span><span class="return-annotation">) -> <span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="Windmill.get_mocked_api-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_mocked_api"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_mocked_api-60"><a href="#Windmill.get_mocked_api-60"><span class="linenos">60</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_mocked_api</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span><span class="p">]:</span>
</span><span id="Windmill.get_mocked_api-61"><a href="#Windmill.get_mocked_api-61"><span class="linenos">61</span></a> <span class="n">mocked_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_MOCKED_API_FILE&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_mocked_api-62"><a href="#Windmill.get_mocked_api-62"><span class="linenos">62</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">mocked_path</span><span class="p">:</span>
</span><span id="Windmill.get_mocked_api-63"><a href="#Windmill.get_mocked_api-63"><span class="linenos">63</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="Windmill.get_mocked_api-64"><a href="#Windmill.get_mocked_api-64"><span class="linenos">64</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Using mocked API from </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">mocked_path</span><span class="p">)</span>
</span><span id="Windmill.get_mocked_api-65"><a href="#Windmill.get_mocked_api-65"><span class="linenos">65</span></a> <span class="n">mocked_api</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;variables&quot;</span><span class="p">:</span> <span class="p">{},</span> <span class="s2">&quot;resources&quot;</span><span class="p">:</span> <span class="p">{}}</span>
</span><span id="Windmill.get_mocked_api-66"><a href="#Windmill.get_mocked_api-66"><span class="linenos">66</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill.get_mocked_api-67"><a href="#Windmill.get_mocked_api-67"><span class="linenos">67</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">mocked_path</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="Windmill.get_mocked_api-68"><a href="#Windmill.get_mocked_api-68"><span class="linenos">68</span></a> <span class="n">incoming_mocked_api</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span id="Windmill.get_mocked_api-69"><a href="#Windmill.get_mocked_api-69"><span class="linenos">69</span></a> <span class="n">mocked_api</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">mocked_api</span><span class="p">,</span> <span class="o">**</span><span class="n">incoming_mocked_api</span><span class="p">}</span>
</span><span id="Windmill.get_mocked_api-70"><a href="#Windmill.get_mocked_api-70"><span class="linenos">70</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill.get_mocked_api-71"><a href="#Windmill.get_mocked_api-71"><span class="linenos">71</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
</span><span id="Windmill.get_mocked_api-72"><a href="#Windmill.get_mocked_api-72"><span class="linenos">72</span></a> <span class="s2">&quot;Error parsing mocked API file at path </span><span class="si">%s</span><span class="s2"> Using empty mocked API.&quot;</span><span class="p">,</span>
</span><span id="Windmill.get_mocked_api-73"><a href="#Windmill.get_mocked_api-73"><span class="linenos">73</span></a> <span class="n">mocked_path</span><span class="p">,</span>
</span><span id="Windmill.get_mocked_api-74"><a href="#Windmill.get_mocked_api-74"><span class="linenos">74</span></a> <span class="p">)</span>
</span><span id="Windmill.get_mocked_api-75"><a href="#Windmill.get_mocked_api-75"><span class="linenos">75</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="Windmill.get_mocked_api-76"><a href="#Windmill.get_mocked_api-76"><span class="linenos">76</span></a> <span class="k">return</span> <span class="n">mocked_api</span>
</span></pre></div>
</div>
<div id="Windmill.get_client" class="classattr">
<input id="Windmill.get_client-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">get_client</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span></span><span class="return-annotation">) -> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span>:</span></span>
<label class="view-source-button" for="Windmill.get_client-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_client"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_client-78"><a href="#Windmill.get_client-78"><span class="linenos">78</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_client</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span><span class="p">:</span>
</span><span id="Windmill.get_client-79"><a href="#Windmill.get_client-79"><span class="linenos">79</span></a> <span class="k">return</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span>
</span><span id="Windmill.get_client-80"><a href="#Windmill.get_client-80"><span class="linenos">80</span></a> <span class="n">base_url</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">base_url</span><span class="p">,</span>
</span><span id="Windmill.get_client-81"><a href="#Windmill.get_client-81"><span class="linenos">81</span></a> <span class="n">headers</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">,</span>
</span><span id="Windmill.get_client-82"><a href="#Windmill.get_client-82"><span class="linenos">82</span></a> <span class="n">verify</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">verify</span><span class="p">,</span>
</span><span id="Windmill.get_client-83"><a href="#Windmill.get_client-83"><span class="linenos">83</span></a> <span class="p">)</span>
</span></pre></div>
</div>
<div id="Windmill.get" class="classattr">
<input id="Windmill.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">get</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">endpoint</span>, </span><span class="param"><span class="n">raise_for_status</span><span class="o">=</span><span class="kc">True</span>, </span><span class="param"><span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n">httpx</span><span class="o">.</span><span class="n">Response</span>:</span></span>
<label class="view-source-button" for="Windmill.get-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get-85"><a href="#Windmill.get-85"><span class="linenos">85</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">True</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">httpx</span><span class="o">.</span><span class="n">Response</span><span class="p">:</span>
</span><span id="Windmill.get-86"><a href="#Windmill.get-86"><span class="linenos">86</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
</span><span id="Windmill.get-87"><a href="#Windmill.get-87"><span class="linenos">87</span></a> <span class="n">resp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/</span><span class="si">{</span><span class="n">endpoint</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="Windmill.get-88"><a href="#Windmill.get-88"><span class="linenos">88</span></a> <span class="k">if</span> <span class="n">raise_for_status</span><span class="p">:</span>
</span><span id="Windmill.get-89"><a href="#Windmill.get-89"><span class="linenos">89</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill.get-90"><a href="#Windmill.get-90"><span class="linenos">90</span></a> <span class="n">resp</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="Windmill.get-91"><a href="#Windmill.get-91"><span class="linenos">91</span></a> <span class="k">except</span> <span class="n">httpx</span><span class="o">.</span><span class="n">HTTPStatusError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
</span><span id="Windmill.get-92"><a href="#Windmill.get-92"><span class="linenos">92</span></a> <span class="n">error</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill.get-93"><a href="#Windmill.get-93"><span class="linenos">93</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span id="Windmill.get-94"><a href="#Windmill.get-94"><span class="linenos">94</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span id="Windmill.get-95"><a href="#Windmill.get-95"><span class="linenos">95</span></a> <span class="k">return</span> <span class="n">resp</span>
</span></pre></div>
</div>
<div id="Windmill.post" class="classattr">
<input id="Windmill.post-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">post</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">endpoint</span>, </span><span class="param"><span class="n">raise_for_status</span><span class="o">=</span><span class="kc">True</span>, </span><span class="param"><span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n">httpx</span><span class="o">.</span><span class="n">Response</span>:</span></span>
<label class="view-source-button" for="Windmill.post-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.post"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.post-97"><a href="#Windmill.post-97"><span class="linenos"> 97</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">True</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">httpx</span><span class="o">.</span><span class="n">Response</span><span class="p">:</span>
</span><span id="Windmill.post-98"><a href="#Windmill.post-98"><span class="linenos"> 98</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
</span><span id="Windmill.post-99"><a href="#Windmill.post-99"><span class="linenos"> 99</span></a> <span class="n">resp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/</span><span class="si">{</span><span class="n">endpoint</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="Windmill.post-100"><a href="#Windmill.post-100"><span class="linenos">100</span></a> <span class="k">if</span> <span class="n">raise_for_status</span><span class="p">:</span>
</span><span id="Windmill.post-101"><a href="#Windmill.post-101"><span class="linenos">101</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill.post-102"><a href="#Windmill.post-102"><span class="linenos">102</span></a> <span class="n">resp</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="Windmill.post-103"><a href="#Windmill.post-103"><span class="linenos">103</span></a> <span class="k">except</span> <span class="n">httpx</span><span class="o">.</span><span class="n">HTTPStatusError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
</span><span id="Windmill.post-104"><a href="#Windmill.post-104"><span class="linenos">104</span></a> <span class="n">error</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill.post-105"><a href="#Windmill.post-105"><span class="linenos">105</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span id="Windmill.post-106"><a href="#Windmill.post-106"><span class="linenos">106</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span id="Windmill.post-107"><a href="#Windmill.post-107"><span class="linenos">107</span></a> <span class="k">return</span> <span class="n">resp</span>
</span></pre></div>
</div>
<div id="Windmill.create_token" class="classattr">
<input id="Windmill.create_token-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">create_token</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">duration</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="Windmill.create_token-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.create_token"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.create_token-109"><a href="#Windmill.create_token-109"><span class="linenos">109</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">create_token</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">duration</span><span class="o">=</span><span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill.create_token-110"><a href="#Windmill.create_token-110"><span class="linenos">110</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="s2">&quot;/users/tokens/create&quot;</span>
</span><span id="Windmill.create_token-111"><a href="#Windmill.create_token-111"><span class="linenos">111</span></a> <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Windmill.create_token-112"><a href="#Windmill.create_token-112"><span class="linenos">112</span></a> <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;refresh </span><span class="si">{</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.create_token-113"><a href="#Windmill.create_token-113"><span class="linenos">113</span></a> <span class="s2">&quot;expiration&quot;</span><span class="p">:</span> <span class="p">(</span><span class="n">dt</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="o">+</span> <span class="n">duration</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%Y-%m-</span><span class="si">%d</span><span class="s2">T%H:%M:%SZ&quot;</span><span class="p">),</span>
</span><span id="Windmill.create_token-114"><a href="#Windmill.create_token-114"><span class="linenos">114</span></a> <span class="p">}</span>
</span><span id="Windmill.create_token-115"><a href="#Windmill.create_token-115"><span class="linenos">115</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span></pre></div>
</div>
<div id="Windmill.run_script_async" class="classattr">
<input id="Windmill.run_script_async-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">run_script_async</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="Windmill.run_script_async-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.run_script_async"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.run_script_async-117"><a href="#Windmill.run_script_async-117"><span class="linenos">117</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_async</span><span class="p">(</span>
</span><span id="Windmill.run_script_async-118"><a href="#Windmill.run_script_async-118"><span class="linenos">118</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.run_script_async-119"><a href="#Windmill.run_script_async-119"><span class="linenos">119</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_async-120"><a href="#Windmill.run_script_async-120"><span class="linenos">120</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_async-121"><a href="#Windmill.run_script_async-121"><span class="linenos">121</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_async-122"><a href="#Windmill.run_script_async-122"><span class="linenos">122</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_async-123"><a href="#Windmill.run_script_async-123"><span class="linenos">123</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill.run_script_async-124"><a href="#Windmill.run_script_async-124"><span class="linenos">124</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a script job and return its job id.</span>
</span><span id="Windmill.run_script_async-125"><a href="#Windmill.run_script_async-125"><span class="linenos">125</span></a><span class="sd"> </span>
</span><span id="Windmill.run_script_async-126"><a href="#Windmill.run_script_async-126"><span class="linenos">126</span></a><span class="sd"> .. deprecated:: Use run_script_by_path_async or run_script_by_hash_async instead.</span>
</span><span id="Windmill.run_script_async-127"><a href="#Windmill.run_script_async-127"><span class="linenos">127</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.run_script_async-128"><a href="#Windmill.run_script_async-128"><span class="linenos">128</span></a> <span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
</span><span id="Windmill.run_script_async-129"><a href="#Windmill.run_script_async-129"><span class="linenos">129</span></a> <span class="s2">&quot;run_script_async is deprecated. Use run_script_by_path_async or run_script_by_hash_async instead.&quot;</span><span class="p">,</span>
</span><span id="Windmill.run_script_async-130"><a href="#Windmill.run_script_async-130"><span class="linenos">130</span></a> <span class="p">)</span>
</span><span id="Windmill.run_script_async-131"><a href="#Windmill.run_script_async-131"><span class="linenos">131</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="p">(</span><span class="n">path</span> <span class="ow">and</span> <span class="n">hash_</span><span class="p">),</span> <span class="s2">&quot;path and hash_ are mutually exclusive&quot;</span>
</span><span id="Windmill.run_script_async-132"><a href="#Windmill.run_script_async-132"><span class="linenos">132</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_async_internal</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Create a script job and return its job id.</p>
<p><em>Deprecated since version Use run_script_by_path_async or run_script_by_hash_async instead..</em></p>
</div>
</div>
<div id="Windmill.run_script_by_path_async" class="classattr">
<input id="Windmill.run_script_by_path_async-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">run_script_by_path_async</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">path</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>, </span><span class="param"><span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="Windmill.run_script_by_path_async-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.run_script_by_path_async"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.run_script_by_path_async-158"><a href="#Windmill.run_script_by_path_async-158"><span class="linenos">158</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_path_async</span><span class="p">(</span>
</span><span id="Windmill.run_script_by_path_async-159"><a href="#Windmill.run_script_by_path_async-159"><span class="linenos">159</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path_async-160"><a href="#Windmill.run_script_by_path_async-160"><span class="linenos">160</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path_async-161"><a href="#Windmill.run_script_by_path_async-161"><span class="linenos">161</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path_async-162"><a href="#Windmill.run_script_by_path_async-162"><span class="linenos">162</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path_async-163"><a href="#Windmill.run_script_by_path_async-163"><span class="linenos">163</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill.run_script_by_path_async-164"><a href="#Windmill.run_script_by_path_async-164"><span class="linenos">164</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a script job by path and return its job id.&quot;&quot;&quot;</span>
</span><span id="Windmill.run_script_by_path_async-165"><a href="#Windmill.run_script_by_path_async-165"><span class="linenos">165</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_async_internal</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Create a script job by path and return its job id.</p>
</div>
</div>
<div id="Windmill.run_script_by_hash_async" class="classattr">
<input id="Windmill.run_script_by_hash_async-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">run_script_by_hash_async</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="Windmill.run_script_by_hash_async-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.run_script_by_hash_async"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.run_script_by_hash_async-167"><a href="#Windmill.run_script_by_hash_async-167"><span class="linenos">167</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_hash_async</span><span class="p">(</span>
</span><span id="Windmill.run_script_by_hash_async-168"><a href="#Windmill.run_script_by_hash_async-168"><span class="linenos">168</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash_async-169"><a href="#Windmill.run_script_by_hash_async-169"><span class="linenos">169</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash_async-170"><a href="#Windmill.run_script_by_hash_async-170"><span class="linenos">170</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash_async-171"><a href="#Windmill.run_script_by_hash_async-171"><span class="linenos">171</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash_async-172"><a href="#Windmill.run_script_by_hash_async-172"><span class="linenos">172</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill.run_script_by_hash_async-173"><a href="#Windmill.run_script_by_hash_async-173"><span class="linenos">173</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a script job by hash and return its job id.&quot;&quot;&quot;</span>
</span><span id="Windmill.run_script_by_hash_async-174"><a href="#Windmill.run_script_by_hash_async-174"><span class="linenos">174</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_async_internal</span><span class="p">(</span><span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Create a script job by hash and return its job id.</p>
</div>
</div>
<div id="Windmill.run_flow_async" class="classattr">
<input id="Windmill.run_flow_async-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">run_flow_async</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">do_not_track_in_parent</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="nb">str</span>:</span></span>
<label class="view-source-button" for="Windmill.run_flow_async-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.run_flow_async"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.run_flow_async-176"><a href="#Windmill.run_flow_async-176"><span class="linenos">176</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_flow_async</span><span class="p">(</span>
</span><span id="Windmill.run_flow_async-177"><a href="#Windmill.run_flow_async-177"><span class="linenos">177</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.run_flow_async-178"><a href="#Windmill.run_flow_async-178"><span class="linenos">178</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.run_flow_async-179"><a href="#Windmill.run_flow_async-179"><span class="linenos">179</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_flow_async-180"><a href="#Windmill.run_flow_async-180"><span class="linenos">180</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_flow_async-181"><a href="#Windmill.run_flow_async-181"><span class="linenos">181</span></a> <span class="c1"># can only be set to false if this the job will be fully await and not concurrent with any other job</span>
</span><span id="Windmill.run_flow_async-182"><a href="#Windmill.run_flow_async-182"><span class="linenos">182</span></a> <span class="c1"># as otherwise the child flow and its own child will store their state in the parent job which will</span>
</span><span id="Windmill.run_flow_async-183"><a href="#Windmill.run_flow_async-183"><span class="linenos">183</span></a> <span class="c1"># lead to incorrectness and failures</span>
</span><span id="Windmill.run_flow_async-184"><a href="#Windmill.run_flow_async-184"><span class="linenos">184</span></a> <span class="n">do_not_track_in_parent</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill.run_flow_async-185"><a href="#Windmill.run_flow_async-185"><span class="linenos">185</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill.run_flow_async-186"><a href="#Windmill.run_flow_async-186"><span class="linenos">186</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a flow job and return its job id.&quot;&quot;&quot;</span>
</span><span id="Windmill.run_flow_async-187"><a href="#Windmill.run_flow_async-187"><span class="linenos">187</span></a> <span class="n">args</span> <span class="o">=</span> <span class="n">args</span> <span class="ow">or</span> <span class="p">{}</span>
</span><span id="Windmill.run_flow_async-188"><a href="#Windmill.run_flow_async-188"><span class="linenos">188</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;scheduled_in_secs&quot;</span><span class="p">:</span> <span class="n">scheduled_in_secs</span><span class="p">}</span> <span class="k">if</span> <span class="n">scheduled_in_secs</span> <span class="k">else</span> <span class="p">{}</span>
</span><span id="Windmill.run_flow_async-189"><a href="#Windmill.run_flow_async-189"><span class="linenos">189</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">do_not_track_in_parent</span><span class="p">:</span>
</span><span id="Windmill.run_flow_async-190"><a href="#Windmill.run_flow_async-190"><span class="linenos">190</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">):</span>
</span><span id="Windmill.run_flow_async-191"><a href="#Windmill.run_flow_async-191"><span class="linenos">191</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;parent_job&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill.run_flow_async-192"><a href="#Windmill.run_flow_async-192"><span class="linenos">192</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_ROOT_FLOW_JOB_ID&quot;</span><span class="p">):</span>
</span><span id="Windmill.run_flow_async-193"><a href="#Windmill.run_flow_async-193"><span class="linenos">193</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;root_job&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_ROOT_FLOW_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill.run_flow_async-194"><a href="#Windmill.run_flow_async-194"><span class="linenos">194</span></a> <span class="k">if</span> <span class="n">path</span><span class="p">:</span>
</span><span id="Windmill.run_flow_async-195"><a href="#Windmill.run_flow_async-195"><span class="linenos">195</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/run/f/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill.run_flow_async-196"><a href="#Windmill.run_flow_async-196"><span class="linenos">196</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill.run_flow_async-197"><a href="#Windmill.run_flow_async-197"><span class="linenos">197</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;path must be provided&quot;</span><span class="p">)</span>
</span><span id="Windmill.run_flow_async-198"><a href="#Windmill.run_flow_async-198"><span class="linenos">198</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span></pre></div>
<div class="docstring"><p>Create a flow job and return its job id.</p>
</div>
</div>
<div id="Windmill.run_script" class="classattr">
<input id="Windmill.run_script-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">run_script</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">timeout</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="Windmill.run_script-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.run_script"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.run_script-200"><a href="#Windmill.run_script-200"><span class="linenos">200</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script</span><span class="p">(</span>
</span><span id="Windmill.run_script-201"><a href="#Windmill.run_script-201"><span class="linenos">201</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.run_script-202"><a href="#Windmill.run_script-202"><span class="linenos">202</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script-203"><a href="#Windmill.run_script-203"><span class="linenos">203</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script-204"><a href="#Windmill.run_script-204"><span class="linenos">204</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script-205"><a href="#Windmill.run_script-205"><span class="linenos">205</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script-206"><a href="#Windmill.run_script-206"><span class="linenos">206</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill.run_script-207"><a href="#Windmill.run_script-207"><span class="linenos">207</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill.run_script-208"><a href="#Windmill.run_script-208"><span class="linenos">208</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill.run_script-209"><a href="#Windmill.run_script-209"><span class="linenos">209</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill.run_script-210"><a href="#Windmill.run_script-210"><span class="linenos">210</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script synchronously and return its result.</span>
</span><span id="Windmill.run_script-211"><a href="#Windmill.run_script-211"><span class="linenos">211</span></a><span class="sd"> </span>
</span><span id="Windmill.run_script-212"><a href="#Windmill.run_script-212"><span class="linenos">212</span></a><span class="sd"> .. deprecated:: Use run_script_by_path or run_script_by_hash instead.</span>
</span><span id="Windmill.run_script-213"><a href="#Windmill.run_script-213"><span class="linenos">213</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.run_script-214"><a href="#Windmill.run_script-214"><span class="linenos">214</span></a> <span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
</span><span id="Windmill.run_script-215"><a href="#Windmill.run_script-215"><span class="linenos">215</span></a> <span class="s2">&quot;run_script is deprecated. Use run_script_by_path or run_script_by_hash instead.&quot;</span><span class="p">,</span>
</span><span id="Windmill.run_script-216"><a href="#Windmill.run_script-216"><span class="linenos">216</span></a> <span class="p">)</span>
</span><span id="Windmill.run_script-217"><a href="#Windmill.run_script-217"><span class="linenos">217</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="p">(</span><span class="n">path</span> <span class="ow">and</span> <span class="n">hash_</span><span class="p">),</span> <span class="s2">&quot;path and hash_ are mutually exclusive&quot;</span>
</span><span id="Windmill.run_script-218"><a href="#Windmill.run_script-218"><span class="linenos">218</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_internal</span><span class="p">(</span>
</span><span id="Windmill.run_script-219"><a href="#Windmill.run_script-219"><span class="linenos">219</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="Windmill.run_script-220"><a href="#Windmill.run_script-220"><span class="linenos">220</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span>
</span><span id="Windmill.run_script-221"><a href="#Windmill.run_script-221"><span class="linenos">221</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Run script synchronously and return its result.</p>
<p><em>Deprecated since version Use run_script_by_path or run_script_by_hash instead..</em></p>
</div>
</div>
<div id="Windmill.run_script_by_path" class="classattr">
<input id="Windmill.run_script_by_path-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">run_script_by_path</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">timeout</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="Windmill.run_script_by_path-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.run_script_by_path"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.run_script_by_path-250"><a href="#Windmill.run_script_by_path-250"><span class="linenos">250</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_path</span><span class="p">(</span>
</span><span id="Windmill.run_script_by_path-251"><a href="#Windmill.run_script_by_path-251"><span class="linenos">251</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path-252"><a href="#Windmill.run_script_by_path-252"><span class="linenos">252</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path-253"><a href="#Windmill.run_script_by_path-253"><span class="linenos">253</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path-254"><a href="#Windmill.run_script_by_path-254"><span class="linenos">254</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path-255"><a href="#Windmill.run_script_by_path-255"><span class="linenos">255</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path-256"><a href="#Windmill.run_script_by_path-256"><span class="linenos">256</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path-257"><a href="#Windmill.run_script_by_path-257"><span class="linenos">257</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path-258"><a href="#Windmill.run_script_by_path-258"><span class="linenos">258</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill.run_script_by_path-259"><a href="#Windmill.run_script_by_path-259"><span class="linenos">259</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script by path synchronously and return its result.&quot;&quot;&quot;</span>
</span><span id="Windmill.run_script_by_path-260"><a href="#Windmill.run_script_by_path-260"><span class="linenos">260</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_internal</span><span class="p">(</span>
</span><span id="Windmill.run_script_by_path-261"><a href="#Windmill.run_script_by_path-261"><span class="linenos">261</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_path-262"><a href="#Windmill.run_script_by_path-262"><span class="linenos">262</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span>
</span><span id="Windmill.run_script_by_path-263"><a href="#Windmill.run_script_by_path-263"><span class="linenos">263</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Run script by path synchronously and return its result.</p>
</div>
</div>
<div id="Windmill.run_script_by_hash" class="classattr">
<input id="Windmill.run_script_by_hash-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">run_script_by_hash</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">timeout</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="Windmill.run_script_by_hash-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.run_script_by_hash"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.run_script_by_hash-265"><a href="#Windmill.run_script_by_hash-265"><span class="linenos">265</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_hash</span><span class="p">(</span>
</span><span id="Windmill.run_script_by_hash-266"><a href="#Windmill.run_script_by_hash-266"><span class="linenos">266</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash-267"><a href="#Windmill.run_script_by_hash-267"><span class="linenos">267</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash-268"><a href="#Windmill.run_script_by_hash-268"><span class="linenos">268</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash-269"><a href="#Windmill.run_script_by_hash-269"><span class="linenos">269</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash-270"><a href="#Windmill.run_script_by_hash-270"><span class="linenos">270</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash-271"><a href="#Windmill.run_script_by_hash-271"><span class="linenos">271</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash-272"><a href="#Windmill.run_script_by_hash-272"><span class="linenos">272</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash-273"><a href="#Windmill.run_script_by_hash-273"><span class="linenos">273</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill.run_script_by_hash-274"><a href="#Windmill.run_script_by_hash-274"><span class="linenos">274</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script by hash synchronously and return its result.&quot;&quot;&quot;</span>
</span><span id="Windmill.run_script_by_hash-275"><a href="#Windmill.run_script_by_hash-275"><span class="linenos">275</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_script_internal</span><span class="p">(</span>
</span><span id="Windmill.run_script_by_hash-276"><a href="#Windmill.run_script_by_hash-276"><span class="linenos">276</span></a> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="Windmill.run_script_by_hash-277"><a href="#Windmill.run_script_by_hash-277"><span class="linenos">277</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span>
</span><span id="Windmill.run_script_by_hash-278"><a href="#Windmill.run_script_by_hash-278"><span class="linenos">278</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Run script by hash synchronously and return its result.</p>
</div>
</div>
<div id="Windmill.run_inline_script_preview" class="classattr">
<input id="Windmill.run_inline_script_preview-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">run_inline_script_preview</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">content</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">language</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="Windmill.run_inline_script_preview-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.run_inline_script_preview"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.run_inline_script_preview-280"><a href="#Windmill.run_inline_script_preview-280"><span class="linenos">280</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">run_inline_script_preview</span><span class="p">(</span>
</span><span id="Windmill.run_inline_script_preview-281"><a href="#Windmill.run_inline_script_preview-281"><span class="linenos">281</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.run_inline_script_preview-282"><a href="#Windmill.run_inline_script_preview-282"><span class="linenos">282</span></a> <span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.run_inline_script_preview-283"><a href="#Windmill.run_inline_script_preview-283"><span class="linenos">283</span></a> <span class="n">language</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.run_inline_script_preview-284"><a href="#Windmill.run_inline_script_preview-284"><span class="linenos">284</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.run_inline_script_preview-285"><a href="#Windmill.run_inline_script_preview-285"><span class="linenos">285</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill.run_inline_script_preview-286"><a href="#Windmill.run_inline_script_preview-286"><span class="linenos">286</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run a script on the current worker without creating a job&quot;&quot;&quot;</span>
</span><span id="Windmill.run_inline_script_preview-287"><a href="#Windmill.run_inline_script_preview-287"><span class="linenos">287</span></a> <span class="n">endpoint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/run_inline/preview&quot;</span>
</span><span id="Windmill.run_inline_script_preview-288"><a href="#Windmill.run_inline_script_preview-288"><span class="linenos">288</span></a> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Windmill.run_inline_script_preview-289"><a href="#Windmill.run_inline_script_preview-289"><span class="linenos">289</span></a> <span class="s2">&quot;content&quot;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
</span><span id="Windmill.run_inline_script_preview-290"><a href="#Windmill.run_inline_script_preview-290"><span class="linenos">290</span></a> <span class="s2">&quot;language&quot;</span><span class="p">:</span> <span class="n">language</span><span class="p">,</span>
</span><span id="Windmill.run_inline_script_preview-291"><a href="#Windmill.run_inline_script_preview-291"><span class="linenos">291</span></a> <span class="s2">&quot;args&quot;</span><span class="p">:</span> <span class="n">args</span> <span class="ow">or</span> <span class="p">{},</span>
</span><span id="Windmill.run_inline_script_preview-292"><a href="#Windmill.run_inline_script_preview-292"><span class="linenos">292</span></a> <span class="p">}</span>
</span><span id="Windmill.run_inline_script_preview-293"><a href="#Windmill.run_inline_script_preview-293"><span class="linenos">293</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">body</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span></pre></div>
<div class="docstring"><p>Run a script on the current worker without creating a job</p>
</div>
</div>
<div id="Windmill.wait_job" class="classattr">
<input id="Windmill.wait_job-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">wait_job</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">job_id</span>,</span><span class="param"> <span class="n">timeout</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="Windmill.wait_job-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.wait_job"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.wait_job-295"><a href="#Windmill.wait_job-295"><span class="linenos">295</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">wait_job</span><span class="p">(</span>
</span><span id="Windmill.wait_job-296"><a href="#Windmill.wait_job-296"><span class="linenos">296</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.wait_job-297"><a href="#Windmill.wait_job-297"><span class="linenos">297</span></a> <span class="n">job_id</span><span class="p">,</span>
</span><span id="Windmill.wait_job-298"><a href="#Windmill.wait_job-298"><span class="linenos">298</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.wait_job-299"><a href="#Windmill.wait_job-299"><span class="linenos">299</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill.wait_job-300"><a href="#Windmill.wait_job-300"><span class="linenos">300</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill.wait_job-301"><a href="#Windmill.wait_job-301"><span class="linenos">301</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill.wait_job-302"><a href="#Windmill.wait_job-302"><span class="linenos">302</span></a> <span class="p">):</span>
</span><span id="Windmill.wait_job-303"><a href="#Windmill.wait_job-303"><span class="linenos">303</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">cancel_job</span><span class="p">():</span>
</span><span id="Windmill.wait_job-304"><a href="#Windmill.wait_job-304"><span class="linenos">304</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;cancelling job: </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill.wait_job-305"><a href="#Windmill.wait_job-305"><span class="linenos">305</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.wait_job-306"><a href="#Windmill.wait_job-306"><span class="linenos">306</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.wait_job-307"><a href="#Windmill.wait_job-307"><span class="linenos">307</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="s2">&quot;parent script cancelled&quot;</span><span class="p">},</span>
</span><span id="Windmill.wait_job-308"><a href="#Windmill.wait_job-308"><span class="linenos">308</span></a> <span class="p">)</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="Windmill.wait_job-309"><a href="#Windmill.wait_job-309"><span class="linenos">309</span></a>
</span><span id="Windmill.wait_job-310"><a href="#Windmill.wait_job-310"><span class="linenos">310</span></a> <span class="k">if</span> <span class="n">cleanup</span><span class="p">:</span>
</span><span id="Windmill.wait_job-311"><a href="#Windmill.wait_job-311"><span class="linenos">311</span></a> <span class="n">atexit</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">cancel_job</span><span class="p">)</span>
</span><span id="Windmill.wait_job-312"><a href="#Windmill.wait_job-312"><span class="linenos">312</span></a>
</span><span id="Windmill.wait_job-313"><a href="#Windmill.wait_job-313"><span class="linenos">313</span></a> <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span><span id="Windmill.wait_job-314"><a href="#Windmill.wait_job-314"><span class="linenos">314</span></a>
</span><span id="Windmill.wait_job-315"><a href="#Windmill.wait_job-315"><span class="linenos">315</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">timeout</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span><span class="p">):</span>
</span><span id="Windmill.wait_job-316"><a href="#Windmill.wait_job-316"><span class="linenos">316</span></a> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="o">.</span><span class="n">total_seconds</span><span class="p">()</span>
</span><span id="Windmill.wait_job-317"><a href="#Windmill.wait_job-317"><span class="linenos">317</span></a>
</span><span id="Windmill.wait_job-318"><a href="#Windmill.wait_job-318"><span class="linenos">318</span></a> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="Windmill.wait_job-319"><a href="#Windmill.wait_job-319"><span class="linenos">319</span></a> <span class="n">result_res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill.wait_job-320"><a href="#Windmill.wait_job-320"><span class="linenos">320</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/completed/get_result_maybe/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="kc">True</span>
</span><span id="Windmill.wait_job-321"><a href="#Windmill.wait_job-321"><span class="linenos">321</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill.wait_job-322"><a href="#Windmill.wait_job-322"><span class="linenos">322</span></a>
</span><span id="Windmill.wait_job-323"><a href="#Windmill.wait_job-323"><span class="linenos">323</span></a> <span class="n">started</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;started&quot;</span><span class="p">]</span>
</span><span id="Windmill.wait_job-324"><a href="#Windmill.wait_job-324"><span class="linenos">324</span></a> <span class="n">completed</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;completed&quot;</span><span class="p">]</span>
</span><span id="Windmill.wait_job-325"><a href="#Windmill.wait_job-325"><span class="linenos">325</span></a> <span class="n">success</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;success&quot;</span><span class="p">]</span>
</span><span id="Windmill.wait_job-326"><a href="#Windmill.wait_job-326"><span class="linenos">326</span></a>
</span><span id="Windmill.wait_job-327"><a href="#Windmill.wait_job-327"><span class="linenos">327</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">started</span> <span class="ow">and</span> <span class="n">verbose</span><span class="p">:</span>
</span><span id="Windmill.wait_job-328"><a href="#Windmill.wait_job-328"><span class="linenos">328</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2"> has not started yet&quot;</span><span class="p">)</span>
</span><span id="Windmill.wait_job-329"><a href="#Windmill.wait_job-329"><span class="linenos">329</span></a>
</span><span id="Windmill.wait_job-330"><a href="#Windmill.wait_job-330"><span class="linenos">330</span></a> <span class="k">if</span> <span class="n">cleanup</span> <span class="ow">and</span> <span class="n">completed</span><span class="p">:</span>
</span><span id="Windmill.wait_job-331"><a href="#Windmill.wait_job-331"><span class="linenos">331</span></a> <span class="n">atexit</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="n">cancel_job</span><span class="p">)</span>
</span><span id="Windmill.wait_job-332"><a href="#Windmill.wait_job-332"><span class="linenos">332</span></a>
</span><span id="Windmill.wait_job-333"><a href="#Windmill.wait_job-333"><span class="linenos">333</span></a> <span class="k">if</span> <span class="n">completed</span><span class="p">:</span>
</span><span id="Windmill.wait_job-334"><a href="#Windmill.wait_job-334"><span class="linenos">334</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">result_res</span><span class="p">[</span><span class="s2">&quot;result&quot;</span><span class="p">]</span>
</span><span id="Windmill.wait_job-335"><a href="#Windmill.wait_job-335"><span class="linenos">335</span></a> <span class="k">if</span> <span class="n">success</span><span class="p">:</span>
</span><span id="Windmill.wait_job-336"><a href="#Windmill.wait_job-336"><span class="linenos">336</span></a> <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">assert_result_is_not_none</span><span class="p">:</span>
</span><span id="Windmill.wait_job-337"><a href="#Windmill.wait_job-337"><span class="linenos">337</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Result was none&quot;</span><span class="p">)</span>
</span><span id="Windmill.wait_job-338"><a href="#Windmill.wait_job-338"><span class="linenos">338</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="Windmill.wait_job-339"><a href="#Windmill.wait_job-339"><span class="linenos">339</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill.wait_job-340"><a href="#Windmill.wait_job-340"><span class="linenos">340</span></a> <span class="n">error</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s2">&quot;error&quot;</span><span class="p">]</span>
</span><span id="Windmill.wait_job-341"><a href="#Windmill.wait_job-341"><span class="linenos">341</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2"> was not successful: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">error</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill.wait_job-342"><a href="#Windmill.wait_job-342"><span class="linenos">342</span></a>
</span><span id="Windmill.wait_job-343"><a href="#Windmill.wait_job-343"><span class="linenos">343</span></a> <span class="k">if</span> <span class="n">timeout</span> <span class="ow">and</span> <span class="p">((</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">timeout</span><span class="p">):</span>
</span><span id="Windmill.wait_job-344"><a href="#Windmill.wait_job-344"><span class="linenos">344</span></a> <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;reached timeout&quot;</span>
</span><span id="Windmill.wait_job-345"><a href="#Windmill.wait_job-345"><span class="linenos">345</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</span><span id="Windmill.wait_job-346"><a href="#Windmill.wait_job-346"><span class="linenos">346</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.wait_job-347"><a href="#Windmill.wait_job-347"><span class="linenos">347</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.wait_job-348"><a href="#Windmill.wait_job-348"><span class="linenos">348</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="n">msg</span><span class="p">},</span>
</span><span id="Windmill.wait_job-349"><a href="#Windmill.wait_job-349"><span class="linenos">349</span></a> <span class="p">)</span>
</span><span id="Windmill.wait_job-350"><a href="#Windmill.wait_job-350"><span class="linenos">350</span></a> <span class="k">raise</span> <span class="ne">TimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</span><span id="Windmill.wait_job-351"><a href="#Windmill.wait_job-351"><span class="linenos">351</span></a> <span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
</span><span id="Windmill.wait_job-352"><a href="#Windmill.wait_job-352"><span class="linenos">352</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;sleeping 0.5 seconds for </span><span class="si">{</span><span class="n">job_id</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill.wait_job-353"><a href="#Windmill.wait_job-353"><span class="linenos">353</span></a>
</span><span id="Windmill.wait_job-354"><a href="#Windmill.wait_job-354"><span class="linenos">354</span></a> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
</span></pre></div>
</div>
<div id="Windmill.cancel_job" class="classattr">
<input id="Windmill.cancel_job-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">cancel_job</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">reason</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="Windmill.cancel_job-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.cancel_job"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.cancel_job-356"><a href="#Windmill.cancel_job-356"><span class="linenos">356</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">cancel_job</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill.cancel_job-357"><a href="#Windmill.cancel_job-357"><span class="linenos">357</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cancel a specific job by ID.</span>
</span><span id="Windmill.cancel_job-358"><a href="#Windmill.cancel_job-358"><span class="linenos">358</span></a>
</span><span id="Windmill.cancel_job-359"><a href="#Windmill.cancel_job-359"><span class="linenos">359</span></a><span class="sd"> Args:</span>
</span><span id="Windmill.cancel_job-360"><a href="#Windmill.cancel_job-360"><span class="linenos">360</span></a><span class="sd"> job_id: UUID of the job to cancel</span>
</span><span id="Windmill.cancel_job-361"><a href="#Windmill.cancel_job-361"><span class="linenos">361</span></a><span class="sd"> reason: Optional reason for cancellation</span>
</span><span id="Windmill.cancel_job-362"><a href="#Windmill.cancel_job-362"><span class="linenos">362</span></a>
</span><span id="Windmill.cancel_job-363"><a href="#Windmill.cancel_job-363"><span class="linenos">363</span></a><span class="sd"> Returns:</span>
</span><span id="Windmill.cancel_job-364"><a href="#Windmill.cancel_job-364"><span class="linenos">364</span></a><span class="sd"> Response message from the cancel endpoint</span>
</span><span id="Windmill.cancel_job-365"><a href="#Windmill.cancel_job-365"><span class="linenos">365</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.cancel_job-366"><a href="#Windmill.cancel_job-366"><span class="linenos">366</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;cancelling job: </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill.cancel_job-367"><a href="#Windmill.cancel_job-367"><span class="linenos">367</span></a>
</span><span id="Windmill.cancel_job-368"><a href="#Windmill.cancel_job-368"><span class="linenos">368</span></a> <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="n">reason</span> <span class="ow">or</span> <span class="s2">&quot;cancelled via cancel_job method&quot;</span><span class="p">}</span>
</span><span id="Windmill.cancel_job-369"><a href="#Windmill.cancel_job-369"><span class="linenos">369</span></a>
</span><span id="Windmill.cancel_job-370"><a href="#Windmill.cancel_job-370"><span class="linenos">370</span></a> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.cancel_job-371"><a href="#Windmill.cancel_job-371"><span class="linenos">371</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.cancel_job-372"><a href="#Windmill.cancel_job-372"><span class="linenos">372</span></a> <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
</span><span id="Windmill.cancel_job-373"><a href="#Windmill.cancel_job-373"><span class="linenos">373</span></a> <span class="p">)</span>
</span><span id="Windmill.cancel_job-374"><a href="#Windmill.cancel_job-374"><span class="linenos">374</span></a>
</span><span id="Windmill.cancel_job-375"><a href="#Windmill.cancel_job-375"><span class="linenos">375</span></a> <span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span>
</span></pre></div>
<div class="docstring"><p>Cancel a specific job by ID.</p>
<p>Args:
job_id: UUID of the job to cancel
reason: Optional reason for cancellation</p>
<p>Returns:
Response message from the cancel endpoint</p>
</div>
</div>
<div id="Windmill.cancel_running" class="classattr">
<input id="Windmill.cancel_running-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">cancel_running</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span></span><span class="return-annotation">) -> <span class="nb">dict</span>:</span></span>
<label class="view-source-button" for="Windmill.cancel_running-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.cancel_running"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.cancel_running-377"><a href="#Windmill.cancel_running-377"><span class="linenos">377</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">cancel_running</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill.cancel_running-378"><a href="#Windmill.cancel_running-378"><span class="linenos">378</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cancel currently running executions of the same script.&quot;&quot;&quot;</span>
</span><span id="Windmill.cancel_running-379"><a href="#Windmill.cancel_running-379"><span class="linenos">379</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;canceling running executions of this script&quot;</span><span class="p">)</span>
</span><span id="Windmill.cancel_running-380"><a href="#Windmill.cancel_running-380"><span class="linenos">380</span></a>
</span><span id="Windmill.cancel_running-381"><a href="#Windmill.cancel_running-381"><span class="linenos">381</span></a> <span class="n">jobs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill.cancel_running-382"><a href="#Windmill.cancel_running-382"><span class="linenos">382</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/list&quot;</span><span class="p">,</span>
</span><span id="Windmill.cancel_running-383"><a href="#Windmill.cancel_running-383"><span class="linenos">383</span></a> <span class="n">params</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill.cancel_running-384"><a href="#Windmill.cancel_running-384"><span class="linenos">384</span></a> <span class="s2">&quot;running&quot;</span><span class="p">:</span> <span class="s2">&quot;true&quot;</span><span class="p">,</span>
</span><span id="Windmill.cancel_running-385"><a href="#Windmill.cancel_running-385"><span class="linenos">385</span></a> <span class="s2">&quot;script_path_exact&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span>
</span><span id="Windmill.cancel_running-386"><a href="#Windmill.cancel_running-386"><span class="linenos">386</span></a> <span class="p">},</span>
</span><span id="Windmill.cancel_running-387"><a href="#Windmill.cancel_running-387"><span class="linenos">387</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill.cancel_running-388"><a href="#Windmill.cancel_running-388"><span class="linenos">388</span></a>
</span><span id="Windmill.cancel_running-389"><a href="#Windmill.cancel_running-389"><span class="linenos">389</span></a> <span class="n">current_job_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill.cancel_running-390"><a href="#Windmill.cancel_running-390"><span class="linenos">390</span></a>
</span><span id="Windmill.cancel_running-391"><a href="#Windmill.cancel_running-391"><span class="linenos">391</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">current_job_id</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill.cancel_running-392"><a href="#Windmill.cancel_running-392"><span class="linenos">392</span></a>
</span><span id="Windmill.cancel_running-393"><a href="#Windmill.cancel_running-393"><span class="linenos">393</span></a> <span class="n">job_ids</span> <span class="o">=</span> <span class="p">[</span><span class="n">j</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">jobs</span> <span class="k">if</span> <span class="n">j</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="n">current_job_id</span><span class="p">]</span>
</span><span id="Windmill.cancel_running-394"><a href="#Windmill.cancel_running-394"><span class="linenos">394</span></a>
</span><span id="Windmill.cancel_running-395"><a href="#Windmill.cancel_running-395"><span class="linenos">395</span></a> <span class="k">if</span> <span class="n">job_ids</span><span class="p">:</span>
</span><span id="Windmill.cancel_running-396"><a href="#Windmill.cancel_running-396"><span class="linenos">396</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;cancelling the following job ids: </span><span class="si">{</span><span class="n">job_ids</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill.cancel_running-397"><a href="#Windmill.cancel_running-397"><span class="linenos">397</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill.cancel_running-398"><a href="#Windmill.cancel_running-398"><span class="linenos">398</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;no previous executions to cancel&quot;</span><span class="p">)</span>
</span><span id="Windmill.cancel_running-399"><a href="#Windmill.cancel_running-399"><span class="linenos">399</span></a>
</span><span id="Windmill.cancel_running-400"><a href="#Windmill.cancel_running-400"><span class="linenos">400</span></a> <span class="n">result</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="Windmill.cancel_running-401"><a href="#Windmill.cancel_running-401"><span class="linenos">401</span></a>
</span><span id="Windmill.cancel_running-402"><a href="#Windmill.cancel_running-402"><span class="linenos">402</span></a> <span class="k">for</span> <span class="n">id_</span> <span class="ow">in</span> <span class="n">job_ids</span><span class="p">:</span>
</span><span id="Windmill.cancel_running-403"><a href="#Windmill.cancel_running-403"><span class="linenos">403</span></a> <span class="n">result</span><span class="p">[</span><span class="n">id_</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.cancel_running-404"><a href="#Windmill.cancel_running-404"><span class="linenos">404</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/queue/cancel/</span><span class="si">{</span><span class="n">id_</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.cancel_running-405"><a href="#Windmill.cancel_running-405"><span class="linenos">405</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;reason&quot;</span><span class="p">:</span> <span class="s2">&quot;killed by `cancel_running` method&quot;</span><span class="p">},</span>
</span><span id="Windmill.cancel_running-406"><a href="#Windmill.cancel_running-406"><span class="linenos">406</span></a> <span class="p">)</span>
</span><span id="Windmill.cancel_running-407"><a href="#Windmill.cancel_running-407"><span class="linenos">407</span></a>
</span><span id="Windmill.cancel_running-408"><a href="#Windmill.cancel_running-408"><span class="linenos">408</span></a> <span class="k">return</span> <span class="n">result</span>
</span></pre></div>
<div class="docstring"><p>Cancel currently running executions of the same script.</p>
</div>
</div>
<div id="Windmill.get_job" class="classattr">
<input id="Windmill.get_job-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">get_job</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="nb">dict</span>:</span></span>
<label class="view-source-button" for="Windmill.get_job-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_job"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_job-410"><a href="#Windmill.get_job-410"><span class="linenos">410</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_job</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill.get_job-411"><a href="#Windmill.get_job-411"><span class="linenos">411</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/get/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></pre></div>
</div>
<div id="Windmill.get_root_job_id" class="classattr">
<input id="Windmill.get_root_job_id-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">get_root_job_id</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">dict</span>:</span></span>
<label class="view-source-button" for="Windmill.get_root_job_id-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_root_job_id"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_root_job_id-413"><a href="#Windmill.get_root_job_id-413"><span class="linenos">413</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_root_job_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill.get_root_job_id-414"><a href="#Windmill.get_root_job_id-414"><span class="linenos">414</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">job_id</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_root_job_id-415"><a href="#Windmill.get_root_job_id-415"><span class="linenos">415</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/get_root_job_id/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></pre></div>
</div>
<div id="Windmill.get_id_token" class="classattr">
<input id="Windmill.get_id_token-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">get_id_token</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">audience</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">expires_in</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="Windmill.get_id_token-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_id_token"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_id_token-417"><a href="#Windmill.get_id_token-417"><span class="linenos">417</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_id_token</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">audience</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">expires_in</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill.get_id_token-418"><a href="#Windmill.get_id_token-418"><span class="linenos">418</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="Windmill.get_id_token-419"><a href="#Windmill.get_id_token-419"><span class="linenos">419</span></a> <span class="k">if</span> <span class="n">expires_in</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.get_id_token-420"><a href="#Windmill.get_id_token-420"><span class="linenos">420</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;expires_in&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">expires_in</span>
</span><span id="Windmill.get_id_token-421"><a href="#Windmill.get_id_token-421"><span class="linenos">421</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/oidc/token/</span><span class="si">{</span><span class="n">audience</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span></pre></div>
</div>
<div id="Windmill.get_job_status" class="classattr">
<input id="Windmill.get_job_status-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">get_job_status</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="n">Literal</span><span class="p">[</span><span class="s1">&#39;RUNNING&#39;</span><span class="p">,</span> <span class="s1">&#39;WAITING&#39;</span><span class="p">,</span> <span class="s1">&#39;COMPLETED&#39;</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="Windmill.get_job_status-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_job_status"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_job_status-423"><a href="#Windmill.get_job_status-423"><span class="linenos">423</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_job_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">JobStatus</span><span class="p">:</span>
</span><span id="Windmill.get_job_status-424"><a href="#Windmill.get_job_status-424"><span class="linenos">424</span></a> <span class="n">job</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span><span id="Windmill.get_job_status-425"><a href="#Windmill.get_job_status-425"><span class="linenos">425</span></a> <span class="n">job_type</span> <span class="o">=</span> <span class="n">job</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;type&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_job_status-426"><a href="#Windmill.get_job_status-426"><span class="linenos">426</span></a> <span class="k">assert</span> <span class="n">job_type</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">job</span><span class="si">}</span><span class="s2"> is not a valid job&quot;</span>
</span><span id="Windmill.get_job_status-427"><a href="#Windmill.get_job_status-427"><span class="linenos">427</span></a> <span class="k">if</span> <span class="n">job_type</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">&quot;completedjob&quot;</span><span class="p">:</span>
</span><span id="Windmill.get_job_status-428"><a href="#Windmill.get_job_status-428"><span class="linenos">428</span></a> <span class="k">return</span> <span class="s2">&quot;COMPLETED&quot;</span>
</span><span id="Windmill.get_job_status-429"><a href="#Windmill.get_job_status-429"><span class="linenos">429</span></a> <span class="k">if</span> <span class="n">job</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;running&quot;</span><span class="p">):</span>
</span><span id="Windmill.get_job_status-430"><a href="#Windmill.get_job_status-430"><span class="linenos">430</span></a> <span class="k">return</span> <span class="s2">&quot;RUNNING&quot;</span>
</span><span id="Windmill.get_job_status-431"><a href="#Windmill.get_job_status-431"><span class="linenos">431</span></a> <span class="k">return</span> <span class="s2">&quot;WAITING&quot;</span>
</span></pre></div>
</div>
<div id="Windmill.get_result" class="classattr">
<input id="Windmill.get_result-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">get_result</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">assert_result_is_not_none</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">Any</span>:</span></span>
<label class="view-source-button" for="Windmill.get_result-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_result"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_result-433"><a href="#Windmill.get_result-433"><span class="linenos">433</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_result</span><span class="p">(</span>
</span><span id="Windmill.get_result-434"><a href="#Windmill.get_result-434"><span class="linenos">434</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.get_result-435"><a href="#Windmill.get_result-435"><span class="linenos">435</span></a> <span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.get_result-436"><a href="#Windmill.get_result-436"><span class="linenos">436</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill.get_result-437"><a href="#Windmill.get_result-437"><span class="linenos">437</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill.get_result-438"><a href="#Windmill.get_result-438"><span class="linenos">438</span></a> <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs_u/completed/get_result/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_result-439"><a href="#Windmill.get_result-439"><span class="linenos">439</span></a> <span class="n">result_text</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span>
</span><span id="Windmill.get_result-440"><a href="#Windmill.get_result-440"><span class="linenos">440</span></a> <span class="k">if</span> <span class="n">assert_result_is_not_none</span> <span class="ow">and</span> <span class="n">result_text</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.get_result-441"><a href="#Windmill.get_result-441"><span class="linenos">441</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;result is None for </span><span class="si">{</span><span class="n">job_id</span><span class="w"> </span><span class="si">= }</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_result-442"><a href="#Windmill.get_result-442"><span class="linenos">442</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill.get_result-443"><a href="#Windmill.get_result-443"><span class="linenos">443</span></a> <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill.get_result-444"><a href="#Windmill.get_result-444"><span class="linenos">444</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span><span class="p">:</span>
</span><span id="Windmill.get_result-445"><a href="#Windmill.get_result-445"><span class="linenos">445</span></a> <span class="k">return</span> <span class="n">result_text</span>
</span></pre></div>
</div>
<div id="Windmill.get_variable" class="classattr">
<input id="Windmill.get_variable-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">get_variable</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">path</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="Windmill.get_variable-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_variable"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_variable-447"><a href="#Windmill.get_variable-447"><span class="linenos">447</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</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="Windmill.get_variable-448"><a href="#Windmill.get_variable-448"><span class="linenos">448</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_variable_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="Windmill.get_variable-449"><a href="#Windmill.get_variable-449"><span class="linenos">449</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.get_variable-450"><a href="#Windmill.get_variable-450"><span class="linenos">450</span></a> <span class="n">variables</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;variables&quot;</span><span class="p">]</span>
</span><span id="Windmill.get_variable-451"><a href="#Windmill.get_variable-451"><span class="linenos">451</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill.get_variable-452"><a href="#Windmill.get_variable-452"><span class="linenos">452</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">variables</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
</span><span id="Windmill.get_variable-453"><a href="#Windmill.get_variable-453"><span class="linenos">453</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="Windmill.get_variable-454"><a href="#Windmill.get_variable-454"><span class="linenos">454</span></a> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
</span><span id="Windmill.get_variable-455"><a href="#Windmill.get_variable-455"><span class="linenos">455</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span><span id="Windmill.get_variable-456"><a href="#Windmill.get_variable-456"><span class="linenos">456</span></a> <span class="sa">f</span><span class="s2">&quot;MockedAPI present, but variable not found at </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">, falling back to real API&quot;</span>
</span><span id="Windmill.get_variable-457"><a href="#Windmill.get_variable-457"><span class="linenos">457</span></a> <span class="p">)</span>
</span><span id="Windmill.get_variable-458"><a href="#Windmill.get_variable-458"><span class="linenos">458</span></a>
</span><span id="Windmill.get_variable-459"><a href="#Windmill.get_variable-459"><span class="linenos">459</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get variable from Windmill&quot;&quot;&quot;</span>
</span><span id="Windmill.get_variable-460"><a href="#Windmill.get_variable-460"><span class="linenos">460</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/get_value/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></pre></div>
</div>
<div id="Windmill.set_variable" class="classattr">
<input id="Windmill.set_variable-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">set_variable</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">path</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">value</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">is_secret</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="Windmill.set_variable-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.set_variable"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.set_variable-462"><a href="#Windmill.set_variable-462"><span class="linenos">462</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">is_secret</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.set_variable-463"><a href="#Windmill.set_variable-463"><span class="linenos">463</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_variable_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="Windmill.set_variable-464"><a href="#Windmill.set_variable-464"><span class="linenos">464</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.set_variable-465"><a href="#Windmill.set_variable-465"><span class="linenos">465</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;variables&quot;</span><span class="p">][</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
</span><span id="Windmill.set_variable-466"><a href="#Windmill.set_variable-466"><span class="linenos">466</span></a> <span class="k">return</span>
</span><span id="Windmill.set_variable-467"><a href="#Windmill.set_variable-467"><span class="linenos">467</span></a>
</span><span id="Windmill.set_variable-468"><a href="#Windmill.set_variable-468"><span class="linenos">468</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Set variable from Windmill&quot;&quot;&quot;</span>
</span><span id="Windmill.set_variable-469"><a href="#Windmill.set_variable-469"><span class="linenos">469</span></a> <span class="c1"># check if variable exists</span>
</span><span id="Windmill.set_variable-470"><a href="#Windmill.set_variable-470"><span class="linenos">470</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill.set_variable-471"><a href="#Windmill.set_variable-471"><span class="linenos">471</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/get/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span>
</span><span id="Windmill.set_variable-472"><a href="#Windmill.set_variable-472"><span class="linenos">472</span></a> <span class="p">)</span>
</span><span id="Windmill.set_variable-473"><a href="#Windmill.set_variable-473"><span class="linenos">473</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="Windmill.set_variable-474"><a href="#Windmill.set_variable-474"><span class="linenos">474</span></a> <span class="c1"># create variable</span>
</span><span id="Windmill.set_variable-475"><a href="#Windmill.set_variable-475"><span class="linenos">475</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.set_variable-476"><a href="#Windmill.set_variable-476"><span class="linenos">476</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/create&quot;</span><span class="p">,</span>
</span><span id="Windmill.set_variable-477"><a href="#Windmill.set_variable-477"><span class="linenos">477</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill.set_variable-478"><a href="#Windmill.set_variable-478"><span class="linenos">478</span></a> <span class="s2">&quot;path&quot;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
</span><span id="Windmill.set_variable-479"><a href="#Windmill.set_variable-479"><span class="linenos">479</span></a> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span>
</span><span id="Windmill.set_variable-480"><a href="#Windmill.set_variable-480"><span class="linenos">480</span></a> <span class="s2">&quot;is_secret&quot;</span><span class="p">:</span> <span class="n">is_secret</span><span class="p">,</span>
</span><span id="Windmill.set_variable-481"><a href="#Windmill.set_variable-481"><span class="linenos">481</span></a> <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="Windmill.set_variable-482"><a href="#Windmill.set_variable-482"><span class="linenos">482</span></a> <span class="p">},</span>
</span><span id="Windmill.set_variable-483"><a href="#Windmill.set_variable-483"><span class="linenos">483</span></a> <span class="p">)</span>
</span><span id="Windmill.set_variable-484"><a href="#Windmill.set_variable-484"><span class="linenos">484</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill.set_variable-485"><a href="#Windmill.set_variable-485"><span class="linenos">485</span></a> <span class="c1"># update variable</span>
</span><span id="Windmill.set_variable-486"><a href="#Windmill.set_variable-486"><span class="linenos">486</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.set_variable-487"><a href="#Windmill.set_variable-487"><span class="linenos">487</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/variables/update/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.set_variable-488"><a href="#Windmill.set_variable-488"><span class="linenos">488</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
</span><span id="Windmill.set_variable-489"><a href="#Windmill.set_variable-489"><span class="linenos">489</span></a> <span class="p">)</span>
</span></pre></div>
</div>
<div id="Windmill.get_resource" class="classattr">
<input id="Windmill.get_resource-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">get_resource</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">path</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">none_if_undefined</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="nb">dict</span> <span class="o">|</span> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="Windmill.get_resource-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_resource"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_resource-491"><a href="#Windmill.get_resource-491"><span class="linenos">491</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_resource</span><span class="p">(</span>
</span><span id="Windmill.get_resource-492"><a href="#Windmill.get_resource-492"><span class="linenos">492</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.get_resource-493"><a href="#Windmill.get_resource-493"><span class="linenos">493</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.get_resource-494"><a href="#Windmill.get_resource-494"><span class="linenos">494</span></a> <span class="n">none_if_undefined</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill.get_resource-495"><a href="#Windmill.get_resource-495"><span class="linenos">495</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.get_resource-496"><a href="#Windmill.get_resource-496"><span class="linenos">496</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="Windmill.get_resource-497"><a href="#Windmill.get_resource-497"><span class="linenos">497</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.get_resource-498"><a href="#Windmill.get_resource-498"><span class="linenos">498</span></a> <span class="n">resources</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;resources&quot;</span><span class="p">]</span>
</span><span id="Windmill.get_resource-499"><a href="#Windmill.get_resource-499"><span class="linenos">499</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill.get_resource-500"><a href="#Windmill.get_resource-500"><span class="linenos">500</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">resources</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
</span><span id="Windmill.get_resource-501"><a href="#Windmill.get_resource-501"><span class="linenos">501</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="Windmill.get_resource-502"><a href="#Windmill.get_resource-502"><span class="linenos">502</span></a> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
</span><span id="Windmill.get_resource-503"><a href="#Windmill.get_resource-503"><span class="linenos">503</span></a> <span class="c1"># NOTE: should mocked_api respect `none_if_undefined`?</span>
</span><span id="Windmill.get_resource-504"><a href="#Windmill.get_resource-504"><span class="linenos">504</span></a> <span class="k">if</span> <span class="n">none_if_undefined</span><span class="p">:</span>
</span><span id="Windmill.get_resource-505"><a href="#Windmill.get_resource-505"><span class="linenos">505</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span><span id="Windmill.get_resource-506"><a href="#Windmill.get_resource-506"><span class="linenos">506</span></a> <span class="sa">f</span><span class="s2">&quot;resource not found at $</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">, but none_if_undefined is True, so returning None&quot;</span>
</span><span id="Windmill.get_resource-507"><a href="#Windmill.get_resource-507"><span class="linenos">507</span></a> <span class="p">)</span>
</span><span id="Windmill.get_resource-508"><a href="#Windmill.get_resource-508"><span class="linenos">508</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="Windmill.get_resource-509"><a href="#Windmill.get_resource-509"><span class="linenos">509</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span><span id="Windmill.get_resource-510"><a href="#Windmill.get_resource-510"><span class="linenos">510</span></a> <span class="sa">f</span><span class="s2">&quot;MockedAPI present, but resource not found at $</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">, falling back to real API&quot;</span>
</span><span id="Windmill.get_resource-511"><a href="#Windmill.get_resource-511"><span class="linenos">511</span></a> <span class="p">)</span>
</span><span id="Windmill.get_resource-512"><a href="#Windmill.get_resource-512"><span class="linenos">512</span></a>
</span><span id="Windmill.get_resource-513"><a href="#Windmill.get_resource-513"><span class="linenos">513</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get resource from Windmill&quot;&quot;&quot;</span>
</span><span id="Windmill.get_resource-514"><a href="#Windmill.get_resource-514"><span class="linenos">514</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill.get_resource-515"><a href="#Windmill.get_resource-515"><span class="linenos">515</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill.get_resource-516"><a href="#Windmill.get_resource-516"><span class="linenos">516</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/get_value_interpolated/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill.get_resource-517"><a href="#Windmill.get_resource-517"><span class="linenos">517</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill.get_resource-518"><a href="#Windmill.get_resource-518"><span class="linenos">518</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill.get_resource-519"><a href="#Windmill.get_resource-519"><span class="linenos">519</span></a> <span class="k">if</span> <span class="n">none_if_undefined</span><span class="p">:</span>
</span><span id="Windmill.get_resource-520"><a href="#Windmill.get_resource-520"><span class="linenos">520</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="Windmill.get_resource-521"><a href="#Windmill.get_resource-521"><span class="linenos">521</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="Windmill.get_resource-522"><a href="#Windmill.get_resource-522"><span class="linenos">522</span></a> <span class="k">raise</span> <span class="n">e</span>
</span></pre></div>
</div>
<div id="Windmill.set_resource" class="classattr">
<input id="Windmill.set_resource-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">set_resource</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">value</span><span class="p">:</span> <span class="n">Any</span>, </span><span class="param"><span class="n">path</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="Windmill.set_resource-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.set_resource"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.set_resource-524"><a href="#Windmill.set_resource-524"><span class="linenos">524</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_resource</span><span class="p">(</span>
</span><span id="Windmill.set_resource-525"><a href="#Windmill.set_resource-525"><span class="linenos">525</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.set_resource-526"><a href="#Windmill.set_resource-526"><span class="linenos">526</span></a> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span>
</span><span id="Windmill.set_resource-527"><a href="#Windmill.set_resource-527"><span class="linenos">527</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.set_resource-528"><a href="#Windmill.set_resource-528"><span class="linenos">528</span></a> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.set_resource-529"><a href="#Windmill.set_resource-529"><span class="linenos">529</span></a> <span class="p">):</span>
</span><span id="Windmill.set_resource-530"><a href="#Windmill.set_resource-530"><span class="linenos">530</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">path</span>
</span><span id="Windmill.set_resource-531"><a href="#Windmill.set_resource-531"><span class="linenos">531</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.set_resource-532"><a href="#Windmill.set_resource-532"><span class="linenos">532</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">mocked_api</span><span class="p">[</span><span class="s2">&quot;resources&quot;</span><span class="p">][</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
</span><span id="Windmill.set_resource-533"><a href="#Windmill.set_resource-533"><span class="linenos">533</span></a> <span class="k">return</span>
</span><span id="Windmill.set_resource-534"><a href="#Windmill.set_resource-534"><span class="linenos">534</span></a>
</span><span id="Windmill.set_resource-535"><a href="#Windmill.set_resource-535"><span class="linenos">535</span></a> <span class="c1"># check if resource exists</span>
</span><span id="Windmill.set_resource-536"><a href="#Windmill.set_resource-536"><span class="linenos">536</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill.set_resource-537"><a href="#Windmill.set_resource-537"><span class="linenos">537</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/get/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span>
</span><span id="Windmill.set_resource-538"><a href="#Windmill.set_resource-538"><span class="linenos">538</span></a> <span class="p">)</span>
</span><span id="Windmill.set_resource-539"><a href="#Windmill.set_resource-539"><span class="linenos">539</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="Windmill.set_resource-540"><a href="#Windmill.set_resource-540"><span class="linenos">540</span></a> <span class="c1"># create resource</span>
</span><span id="Windmill.set_resource-541"><a href="#Windmill.set_resource-541"><span class="linenos">541</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.set_resource-542"><a href="#Windmill.set_resource-542"><span class="linenos">542</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/create&quot;</span><span class="p">,</span>
</span><span id="Windmill.set_resource-543"><a href="#Windmill.set_resource-543"><span class="linenos">543</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill.set_resource-544"><a href="#Windmill.set_resource-544"><span class="linenos">544</span></a> <span class="s2">&quot;path&quot;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
</span><span id="Windmill.set_resource-545"><a href="#Windmill.set_resource-545"><span class="linenos">545</span></a> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span>
</span><span id="Windmill.set_resource-546"><a href="#Windmill.set_resource-546"><span class="linenos">546</span></a> <span class="s2">&quot;resource_type&quot;</span><span class="p">:</span> <span class="n">resource_type</span><span class="p">,</span>
</span><span id="Windmill.set_resource-547"><a href="#Windmill.set_resource-547"><span class="linenos">547</span></a> <span class="p">},</span>
</span><span id="Windmill.set_resource-548"><a href="#Windmill.set_resource-548"><span class="linenos">548</span></a> <span class="p">)</span>
</span><span id="Windmill.set_resource-549"><a href="#Windmill.set_resource-549"><span class="linenos">549</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill.set_resource-550"><a href="#Windmill.set_resource-550"><span class="linenos">550</span></a> <span class="c1"># update resource</span>
</span><span id="Windmill.set_resource-551"><a href="#Windmill.set_resource-551"><span class="linenos">551</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.set_resource-552"><a href="#Windmill.set_resource-552"><span class="linenos">552</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/update_value/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.set_resource-553"><a href="#Windmill.set_resource-553"><span class="linenos">553</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
</span><span id="Windmill.set_resource-554"><a href="#Windmill.set_resource-554"><span class="linenos">554</span></a> <span class="p">)</span>
</span></pre></div>
</div>
<div id="Windmill.list_resources" class="classattr">
<input id="Windmill.list_resources-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">list_resources</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">per_page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">list</span><span class="p">[</span><span class="nb">dict</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="Windmill.list_resources-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.list_resources"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.list_resources-556"><a href="#Windmill.list_resources-556"><span class="linenos">556</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">list_resources</span><span class="p">(</span>
</span><span id="Windmill.list_resources-557"><a href="#Windmill.list_resources-557"><span class="linenos">557</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.list_resources-558"><a href="#Windmill.list_resources-558"><span class="linenos">558</span></a> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.list_resources-559"><a href="#Windmill.list_resources-559"><span class="linenos">559</span></a> <span class="n">page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.list_resources-560"><a href="#Windmill.list_resources-560"><span class="linenos">560</span></a> <span class="n">per_page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.list_resources-561"><a href="#Windmill.list_resources-561"><span class="linenos">561</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">dict</span><span class="p">]:</span>
</span><span id="Windmill.list_resources-562"><a href="#Windmill.list_resources-562"><span class="linenos">562</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;List resources from Windmill workspace.</span>
</span><span id="Windmill.list_resources-563"><a href="#Windmill.list_resources-563"><span class="linenos">563</span></a><span class="sd"> </span>
</span><span id="Windmill.list_resources-564"><a href="#Windmill.list_resources-564"><span class="linenos">564</span></a><span class="sd"> Args:</span>
</span><span id="Windmill.list_resources-565"><a href="#Windmill.list_resources-565"><span class="linenos">565</span></a><span class="sd"> resource_type: Optional resource type to filter by (e.g., &quot;postgresql&quot;, &quot;mysql&quot;, &quot;s3&quot;)</span>
</span><span id="Windmill.list_resources-566"><a href="#Windmill.list_resources-566"><span class="linenos">566</span></a><span class="sd"> page: Optional page number for pagination</span>
</span><span id="Windmill.list_resources-567"><a href="#Windmill.list_resources-567"><span class="linenos">567</span></a><span class="sd"> per_page: Optional number of results per page</span>
</span><span id="Windmill.list_resources-568"><a href="#Windmill.list_resources-568"><span class="linenos">568</span></a><span class="sd"> </span>
</span><span id="Windmill.list_resources-569"><a href="#Windmill.list_resources-569"><span class="linenos">569</span></a><span class="sd"> Returns:</span>
</span><span id="Windmill.list_resources-570"><a href="#Windmill.list_resources-570"><span class="linenos">570</span></a><span class="sd"> List of resource dictionaries</span>
</span><span id="Windmill.list_resources-571"><a href="#Windmill.list_resources-571"><span class="linenos">571</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.list_resources-572"><a href="#Windmill.list_resources-572"><span class="linenos">572</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="Windmill.list_resources-573"><a href="#Windmill.list_resources-573"><span class="linenos">573</span></a> <span class="k">if</span> <span class="n">resource_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.list_resources-574"><a href="#Windmill.list_resources-574"><span class="linenos">574</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;resource_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">resource_type</span>
</span><span id="Windmill.list_resources-575"><a href="#Windmill.list_resources-575"><span class="linenos">575</span></a> <span class="k">if</span> <span class="n">page</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.list_resources-576"><a href="#Windmill.list_resources-576"><span class="linenos">576</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;page&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">page</span>
</span><span id="Windmill.list_resources-577"><a href="#Windmill.list_resources-577"><span class="linenos">577</span></a> <span class="k">if</span> <span class="n">per_page</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.list_resources-578"><a href="#Windmill.list_resources-578"><span class="linenos">578</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;per_page&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">per_page</span>
</span><span id="Windmill.list_resources-579"><a href="#Windmill.list_resources-579"><span class="linenos">579</span></a>
</span><span id="Windmill.list_resources-580"><a href="#Windmill.list_resources-580"><span class="linenos">580</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill.list_resources-581"><a href="#Windmill.list_resources-581"><span class="linenos">581</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/resources/list&quot;</span><span class="p">,</span>
</span><span id="Windmill.list_resources-582"><a href="#Windmill.list_resources-582"><span class="linenos">582</span></a> <span class="n">params</span><span class="o">=</span><span class="n">params</span> <span class="k">if</span> <span class="n">params</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.list_resources-583"><a href="#Windmill.list_resources-583"><span class="linenos">583</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></pre></div>
<div class="docstring"><p>List resources from Windmill workspace.</p>
<p>Args:
resource_type: Optional resource type to filter by (e.g., "postgresql", "mysql", "s3")
page: Optional page number for pagination
per_page: Optional number of results per page</p>
<p>Returns:
List of resource dictionaries</p>
</div>
</div>
<div id="Windmill.set_state" class="classattr">
<input id="Windmill.set_state-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">set_state</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">value</span><span class="p">:</span> <span class="n">Any</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="Windmill.set_state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.set_state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.set_state-585"><a href="#Windmill.set_state-585"><span class="linenos">585</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">):</span>
</span><span id="Windmill.set_state-586"><a href="#Windmill.set_state-586"><span class="linenos">586</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">set_resource</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">state_path</span><span class="p">,</span> <span class="n">resource_type</span><span class="o">=</span><span class="s2">&quot;state&quot;</span><span class="p">)</span>
</span></pre></div>
</div>
<div id="Windmill.set_progress" class="classattr">
<input id="Windmill.set_progress-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">set_progress</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">value</span><span class="p">:</span> <span class="nb">int</span>, </span><span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="Windmill.set_progress-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.set_progress"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.set_progress-588"><a href="#Windmill.set_progress-588"><span class="linenos">588</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_progress</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
</span><span id="Windmill.set_progress-589"><a href="#Windmill.set_progress-589"><span class="linenos">589</span></a> <span class="n">workspace</span> <span class="o">=</span> <span class="n">get_workspace</span><span class="p">()</span>
</span><span id="Windmill.set_progress-590"><a href="#Windmill.set_progress-590"><span class="linenos">590</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill.set_progress-591"><a href="#Windmill.set_progress-591"><span class="linenos">591</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">job_id</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill.set_progress-592"><a href="#Windmill.set_progress-592"><span class="linenos">592</span></a>
</span><span id="Windmill.set_progress-593"><a href="#Windmill.set_progress-593"><span class="linenos">593</span></a> <span class="k">if</span> <span class="n">job_id</span> <span class="o">!=</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.set_progress-594"><a href="#Windmill.set_progress-594"><span class="linenos">594</span></a> <span class="n">job</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span><span id="Windmill.set_progress-595"><a href="#Windmill.set_progress-595"><span class="linenos">595</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="n">job</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;parent_job&quot;</span><span class="p">)</span>
</span><span id="Windmill.set_progress-596"><a href="#Windmill.set_progress-596"><span class="linenos">596</span></a>
</span><span id="Windmill.set_progress-597"><a href="#Windmill.set_progress-597"><span class="linenos">597</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.set_progress-598"><a href="#Windmill.set_progress-598"><span class="linenos">598</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_metrics/set_progress/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.set_progress-599"><a href="#Windmill.set_progress-599"><span class="linenos">599</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill.set_progress-600"><a href="#Windmill.set_progress-600"><span class="linenos">600</span></a> <span class="s2">&quot;percent&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span>
</span><span id="Windmill.set_progress-601"><a href="#Windmill.set_progress-601"><span class="linenos">601</span></a> <span class="s2">&quot;flow_job_id&quot;</span><span class="p">:</span> <span class="n">flow_id</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.set_progress-602"><a href="#Windmill.set_progress-602"><span class="linenos">602</span></a> <span class="p">},</span>
</span><span id="Windmill.set_progress-603"><a href="#Windmill.set_progress-603"><span class="linenos">603</span></a> <span class="p">)</span>
</span></pre></div>
</div>
<div id="Windmill.get_progress" class="classattr">
<input id="Windmill.get_progress-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">get_progress</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="Windmill.get_progress-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_progress"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_progress-605"><a href="#Windmill.get_progress-605"><span class="linenos">605</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_progress</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill.get_progress-606"><a href="#Windmill.get_progress-606"><span class="linenos">606</span></a> <span class="n">workspace</span> <span class="o">=</span> <span class="n">get_workspace</span><span class="p">()</span>
</span><span id="Windmill.get_progress-607"><a href="#Windmill.get_progress-607"><span class="linenos">607</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">job_id</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_progress-608"><a href="#Windmill.get_progress-608"><span class="linenos">608</span></a>
</span><span id="Windmill.get_progress-609"><a href="#Windmill.get_progress-609"><span class="linenos">609</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill.get_progress-610"><a href="#Windmill.get_progress-610"><span class="linenos">610</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_metrics/get_progress/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.get_progress-611"><a href="#Windmill.get_progress-611"><span class="linenos">611</span></a> <span class="p">)</span>
</span><span id="Windmill.get_progress-612"><a href="#Windmill.get_progress-612"><span class="linenos">612</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="Windmill.get_progress-613"><a href="#Windmill.get_progress-613"><span class="linenos">613</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2"> does not exist&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_progress-614"><a href="#Windmill.get_progress-614"><span class="linenos">614</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="Windmill.get_progress-615"><a href="#Windmill.get_progress-615"><span class="linenos">615</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill.get_progress-616"><a href="#Windmill.get_progress-616"><span class="linenos">616</span></a> <span class="k">return</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></pre></div>
</div>
<div id="Windmill.set_flow_user_state" class="classattr">
<input id="Windmill.set_flow_user_state-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">set_flow_user_state</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">key</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">value</span><span class="p">:</span> <span class="n">Any</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="Windmill.set_flow_user_state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.set_flow_user_state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.set_flow_user_state-618"><a href="#Windmill.set_flow_user_state-618"><span class="linenos">618</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_flow_user_state</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="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.set_flow_user_state-619"><a href="#Windmill.set_flow_user_state-619"><span class="linenos">619</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Set the user state of a flow at a given key&quot;&quot;&quot;</span>
</span><span id="Windmill.set_flow_user_state-620"><a href="#Windmill.set_flow_user_state-620"><span class="linenos">620</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_root_job_id</span><span class="p">()</span>
</span><span id="Windmill.set_flow_user_state-621"><a href="#Windmill.set_flow_user_state-621"><span class="linenos">621</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.set_flow_user_state-622"><a href="#Windmill.set_flow_user_state-622"><span class="linenos">622</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/flow/user_states/</span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.set_flow_user_state-623"><a href="#Windmill.set_flow_user_state-623"><span class="linenos">623</span></a> <span class="n">json</span><span class="o">=</span><span class="n">value</span><span class="p">,</span>
</span><span id="Windmill.set_flow_user_state-624"><a href="#Windmill.set_flow_user_state-624"><span class="linenos">624</span></a> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill.set_flow_user_state-625"><a href="#Windmill.set_flow_user_state-625"><span class="linenos">625</span></a> <span class="p">)</span>
</span><span id="Windmill.set_flow_user_state-626"><a href="#Windmill.set_flow_user_state-626"><span class="linenos">626</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="Windmill.set_flow_user_state-627"><a href="#Windmill.set_flow_user_state-627"><span class="linenos">627</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2"> does not exist or is not a flow&quot;</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Set the user state of a flow at a given key</p>
</div>
</div>
<div id="Windmill.get_flow_user_state" class="classattr">
<input id="Windmill.get_flow_user_state-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">get_flow_user_state</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">key</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="Windmill.get_flow_user_state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_flow_user_state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_flow_user_state-629"><a href="#Windmill.get_flow_user_state-629"><span class="linenos">629</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_flow_user_state</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="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill.get_flow_user_state-630"><a href="#Windmill.get_flow_user_state-630"><span class="linenos">630</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the user state of a flow at a given key&quot;&quot;&quot;</span>
</span><span id="Windmill.get_flow_user_state-631"><a href="#Windmill.get_flow_user_state-631"><span class="linenos">631</span></a> <span class="n">flow_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_root_job_id</span><span class="p">()</span>
</span><span id="Windmill.get_flow_user_state-632"><a href="#Windmill.get_flow_user_state-632"><span class="linenos">632</span></a> <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill.get_flow_user_state-633"><a href="#Windmill.get_flow_user_state-633"><span class="linenos">633</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/flow/user_states/</span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.get_flow_user_state-634"><a href="#Windmill.get_flow_user_state-634"><span class="linenos">634</span></a> <span class="n">raise_for_status</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="Windmill.get_flow_user_state-635"><a href="#Windmill.get_flow_user_state-635"><span class="linenos">635</span></a> <span class="p">)</span>
</span><span id="Windmill.get_flow_user_state-636"><a href="#Windmill.get_flow_user_state-636"><span class="linenos">636</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="Windmill.get_flow_user_state-637"><a href="#Windmill.get_flow_user_state-637"><span class="linenos">637</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Job </span><span class="si">{</span><span class="n">flow_id</span><span class="si">}</span><span class="s2"> does not exist or is not a flow&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_flow_user_state-638"><a href="#Windmill.get_flow_user_state-638"><span class="linenos">638</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="Windmill.get_flow_user_state-639"><a href="#Windmill.get_flow_user_state-639"><span class="linenos">639</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill.get_flow_user_state-640"><a href="#Windmill.get_flow_user_state-640"><span class="linenos">640</span></a> <span class="k">return</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></pre></div>
<div class="docstring"><p>Get the user state of a flow at a given key</p>
</div>
</div>
<div id="Windmill.version" class="classattr">
<input id="Windmill.version-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">version</span>
<label class="view-source-button" for="Windmill.version-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.version"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.version-642"><a href="#Windmill.version-642"><span class="linenos">642</span></a> <span class="nd">@property</span>
</span><span id="Windmill.version-643"><a href="#Windmill.version-643"><span class="linenos">643</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="Windmill.version-644"><a href="#Windmill.version-644"><span class="linenos">644</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;version&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span></pre></div>
</div>
<div id="Windmill.get_duckdb_connection_settings" class="classattr">
<input id="Windmill.get_duckdb_connection_settings-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">get_duckdb_connection_settings</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">s3_resource_path</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="n"><a href="s3_types.html#DuckDbConnectionSettings">wmill.s3_types.DuckDbConnectionSettings</a></span> <span class="o">|</span> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="Windmill.get_duckdb_connection_settings-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_duckdb_connection_settings"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_duckdb_connection_settings-646"><a href="#Windmill.get_duckdb_connection_settings-646"><span class="linenos">646</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_duckdb_connection_settings</span><span class="p">(</span>
</span><span id="Windmill.get_duckdb_connection_settings-647"><a href="#Windmill.get_duckdb_connection_settings-647"><span class="linenos">647</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.get_duckdb_connection_settings-648"><a href="#Windmill.get_duckdb_connection_settings-648"><span class="linenos">648</span></a> <span class="n">s3_resource_path</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><span id="Windmill.get_duckdb_connection_settings-649"><a href="#Windmill.get_duckdb_connection_settings-649"><span class="linenos">649</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DuckDbConnectionSettings</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.get_duckdb_connection_settings-650"><a href="#Windmill.get_duckdb_connection_settings-650"><span class="linenos">650</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.get_duckdb_connection_settings-651"><a href="#Windmill.get_duckdb_connection_settings-651"><span class="linenos">651</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="Windmill.get_duckdb_connection_settings-652"><a href="#Windmill.get_duckdb_connection_settings-652"><span class="linenos">652</span></a><span class="sd"> initiate an S3 connection from DuckDB</span>
</span><span id="Windmill.get_duckdb_connection_settings-653"><a href="#Windmill.get_duckdb_connection_settings-653"><span class="linenos">653</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.get_duckdb_connection_settings-654"><a href="#Windmill.get_duckdb_connection_settings-654"><span class="linenos">654</span></a> <span class="n">s3_resource_path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">s3_resource_path</span>
</span><span id="Windmill.get_duckdb_connection_settings-655"><a href="#Windmill.get_duckdb_connection_settings-655"><span class="linenos">655</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill.get_duckdb_connection_settings-656"><a href="#Windmill.get_duckdb_connection_settings-656"><span class="linenos">656</span></a> <span class="n">raw_obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.get_duckdb_connection_settings-657"><a href="#Windmill.get_duckdb_connection_settings-657"><span class="linenos">657</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/v2/duckdb_connection_settings&quot;</span><span class="p">,</span>
</span><span id="Windmill.get_duckdb_connection_settings-658"><a href="#Windmill.get_duckdb_connection_settings-658"><span class="linenos">658</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{}</span>
</span><span id="Windmill.get_duckdb_connection_settings-659"><a href="#Windmill.get_duckdb_connection_settings-659"><span class="linenos">659</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span>
</span><span id="Windmill.get_duckdb_connection_settings-660"><a href="#Windmill.get_duckdb_connection_settings-660"><span class="linenos">660</span></a> <span class="k">else</span> <span class="p">{</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">:</span> <span class="n">s3_resource_path</span><span class="p">},</span>
</span><span id="Windmill.get_duckdb_connection_settings-661"><a href="#Windmill.get_duckdb_connection_settings-661"><span class="linenos">661</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill.get_duckdb_connection_settings-662"><a href="#Windmill.get_duckdb_connection_settings-662"><span class="linenos">662</span></a> <span class="k">return</span> <span class="n">DuckDbConnectionSettings</span><span class="p">(</span><span class="n">raw_obj</span><span class="p">)</span>
</span><span id="Windmill.get_duckdb_connection_settings-663"><a href="#Windmill.get_duckdb_connection_settings-663"><span class="linenos">663</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill.get_duckdb_connection_settings-664"><a href="#Windmill.get_duckdb_connection_settings-664"><span class="linenos">664</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="Windmill.get_duckdb_connection_settings-665"><a href="#Windmill.get_duckdb_connection_settings-665"><span class="linenos">665</span></a> <span class="s2">&quot;Could not generate DuckDB S3 connection settings from the provided resource&quot;</span>
</span><span id="Windmill.get_duckdb_connection_settings-666"><a href="#Windmill.get_duckdb_connection_settings-666"><span class="linenos">666</span></a> <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span></pre></div>
<div class="docstring"><p>Convenient helpers that takes an S3 resource as input and returns the settings necessary to
initiate an S3 connection from DuckDB</p>
</div>
</div>
<div id="Windmill.get_polars_connection_settings" class="classattr">
<input id="Windmill.get_polars_connection_settings-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">get_polars_connection_settings</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">s3_resource_path</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="n"><a href="s3_types.html#PolarsConnectionSettings">wmill.s3_types.PolarsConnectionSettings</a></span>:</span></span>
<label class="view-source-button" for="Windmill.get_polars_connection_settings-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_polars_connection_settings"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_polars_connection_settings-668"><a href="#Windmill.get_polars_connection_settings-668"><span class="linenos">668</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_polars_connection_settings</span><span class="p">(</span>
</span><span id="Windmill.get_polars_connection_settings-669"><a href="#Windmill.get_polars_connection_settings-669"><span class="linenos">669</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.get_polars_connection_settings-670"><a href="#Windmill.get_polars_connection_settings-670"><span class="linenos">670</span></a> <span class="n">s3_resource_path</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><span id="Windmill.get_polars_connection_settings-671"><a href="#Windmill.get_polars_connection_settings-671"><span class="linenos">671</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">PolarsConnectionSettings</span><span class="p">:</span>
</span><span id="Windmill.get_polars_connection_settings-672"><a href="#Windmill.get_polars_connection_settings-672"><span class="linenos">672</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.get_polars_connection_settings-673"><a href="#Windmill.get_polars_connection_settings-673"><span class="linenos">673</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="Windmill.get_polars_connection_settings-674"><a href="#Windmill.get_polars_connection_settings-674"><span class="linenos">674</span></a><span class="sd"> initiate an S3 connection from Polars</span>
</span><span id="Windmill.get_polars_connection_settings-675"><a href="#Windmill.get_polars_connection_settings-675"><span class="linenos">675</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.get_polars_connection_settings-676"><a href="#Windmill.get_polars_connection_settings-676"><span class="linenos">676</span></a> <span class="n">s3_resource_path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">s3_resource_path</span>
</span><span id="Windmill.get_polars_connection_settings-677"><a href="#Windmill.get_polars_connection_settings-677"><span class="linenos">677</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill.get_polars_connection_settings-678"><a href="#Windmill.get_polars_connection_settings-678"><span class="linenos">678</span></a> <span class="n">raw_obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.get_polars_connection_settings-679"><a href="#Windmill.get_polars_connection_settings-679"><span class="linenos">679</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/v2/polars_connection_settings&quot;</span><span class="p">,</span>
</span><span id="Windmill.get_polars_connection_settings-680"><a href="#Windmill.get_polars_connection_settings-680"><span class="linenos">680</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{}</span>
</span><span id="Windmill.get_polars_connection_settings-681"><a href="#Windmill.get_polars_connection_settings-681"><span class="linenos">681</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span>
</span><span id="Windmill.get_polars_connection_settings-682"><a href="#Windmill.get_polars_connection_settings-682"><span class="linenos">682</span></a> <span class="k">else</span> <span class="p">{</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">:</span> <span class="n">s3_resource_path</span><span class="p">},</span>
</span><span id="Windmill.get_polars_connection_settings-683"><a href="#Windmill.get_polars_connection_settings-683"><span class="linenos">683</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill.get_polars_connection_settings-684"><a href="#Windmill.get_polars_connection_settings-684"><span class="linenos">684</span></a> <span class="k">return</span> <span class="n">PolarsConnectionSettings</span><span class="p">(</span><span class="n">raw_obj</span><span class="p">)</span>
</span><span id="Windmill.get_polars_connection_settings-685"><a href="#Windmill.get_polars_connection_settings-685"><span class="linenos">685</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill.get_polars_connection_settings-686"><a href="#Windmill.get_polars_connection_settings-686"><span class="linenos">686</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="Windmill.get_polars_connection_settings-687"><a href="#Windmill.get_polars_connection_settings-687"><span class="linenos">687</span></a> <span class="s2">&quot;Could not generate Polars S3 connection settings from the provided resource&quot;</span>
</span><span id="Windmill.get_polars_connection_settings-688"><a href="#Windmill.get_polars_connection_settings-688"><span class="linenos">688</span></a> <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span></pre></div>
<div class="docstring"><p>Convenient helpers that takes an S3 resource as input and returns the settings necessary to
initiate an S3 connection from Polars</p>
</div>
</div>
<div id="Windmill.get_boto3_connection_settings" class="classattr">
<input id="Windmill.get_boto3_connection_settings-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">get_boto3_connection_settings</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">s3_resource_path</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="n"><a href="s3_types.html#Boto3ConnectionSettings">wmill.s3_types.Boto3ConnectionSettings</a></span>:</span></span>
<label class="view-source-button" for="Windmill.get_boto3_connection_settings-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_boto3_connection_settings"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_boto3_connection_settings-690"><a href="#Windmill.get_boto3_connection_settings-690"><span class="linenos">690</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_boto3_connection_settings</span><span class="p">(</span>
</span><span id="Windmill.get_boto3_connection_settings-691"><a href="#Windmill.get_boto3_connection_settings-691"><span class="linenos">691</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.get_boto3_connection_settings-692"><a href="#Windmill.get_boto3_connection_settings-692"><span class="linenos">692</span></a> <span class="n">s3_resource_path</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><span id="Windmill.get_boto3_connection_settings-693"><a href="#Windmill.get_boto3_connection_settings-693"><span class="linenos">693</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Boto3ConnectionSettings</span><span class="p">:</span>
</span><span id="Windmill.get_boto3_connection_settings-694"><a href="#Windmill.get_boto3_connection_settings-694"><span class="linenos">694</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.get_boto3_connection_settings-695"><a href="#Windmill.get_boto3_connection_settings-695"><span class="linenos">695</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="Windmill.get_boto3_connection_settings-696"><a href="#Windmill.get_boto3_connection_settings-696"><span class="linenos">696</span></a><span class="sd"> initiate an S3 connection using boto3</span>
</span><span id="Windmill.get_boto3_connection_settings-697"><a href="#Windmill.get_boto3_connection_settings-697"><span class="linenos">697</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.get_boto3_connection_settings-698"><a href="#Windmill.get_boto3_connection_settings-698"><span class="linenos">698</span></a> <span class="n">s3_resource_path</span> <span class="o">=</span> <span class="n">parse_resource_syntax</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">s3_resource_path</span>
</span><span id="Windmill.get_boto3_connection_settings-699"><a href="#Windmill.get_boto3_connection_settings-699"><span class="linenos">699</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill.get_boto3_connection_settings-700"><a href="#Windmill.get_boto3_connection_settings-700"><span class="linenos">700</span></a> <span class="n">s3_resource</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.get_boto3_connection_settings-701"><a href="#Windmill.get_boto3_connection_settings-701"><span class="linenos">701</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/v2/s3_resource_info&quot;</span><span class="p">,</span>
</span><span id="Windmill.get_boto3_connection_settings-702"><a href="#Windmill.get_boto3_connection_settings-702"><span class="linenos">702</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{}</span>
</span><span id="Windmill.get_boto3_connection_settings-703"><a href="#Windmill.get_boto3_connection_settings-703"><span class="linenos">703</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span>
</span><span id="Windmill.get_boto3_connection_settings-704"><a href="#Windmill.get_boto3_connection_settings-704"><span class="linenos">704</span></a> <span class="k">else</span> <span class="p">{</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">:</span> <span class="n">s3_resource_path</span><span class="p">},</span>
</span><span id="Windmill.get_boto3_connection_settings-705"><a href="#Windmill.get_boto3_connection_settings-705"><span class="linenos">705</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill.get_boto3_connection_settings-706"><a href="#Windmill.get_boto3_connection_settings-706"><span class="linenos">706</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__boto3_connection_settings</span><span class="p">(</span><span class="n">s3_resource</span><span class="p">)</span>
</span><span id="Windmill.get_boto3_connection_settings-707"><a href="#Windmill.get_boto3_connection_settings-707"><span class="linenos">707</span></a> <span class="k">except</span> <span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill.get_boto3_connection_settings-708"><a href="#Windmill.get_boto3_connection_settings-708"><span class="linenos">708</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="Windmill.get_boto3_connection_settings-709"><a href="#Windmill.get_boto3_connection_settings-709"><span class="linenos">709</span></a> <span class="s2">&quot;Could not generate Boto3 S3 connection settings from the provided resource&quot;</span>
</span><span id="Windmill.get_boto3_connection_settings-710"><a href="#Windmill.get_boto3_connection_settings-710"><span class="linenos">710</span></a> <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span></pre></div>
<div class="docstring"><p>Convenient helpers that takes an S3 resource as input and returns the settings necessary to
initiate an S3 connection using boto3</p>
</div>
</div>
<div id="Windmill.load_s3_file" class="classattr">
<input id="Windmill.load_s3_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">load_s3_file</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">s3object</span><span class="p">:</span> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">bytes</span>:</span></span>
<label class="view-source-button" for="Windmill.load_s3_file-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.load_s3_file"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.load_s3_file-712"><a href="#Windmill.load_s3_file-712"><span class="linenos">712</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">load_s3_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bytes</span><span class="p">:</span>
</span><span id="Windmill.load_s3_file-713"><a href="#Windmill.load_s3_file-713"><span class="linenos">713</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.load_s3_file-714"><a href="#Windmill.load_s3_file-714"><span class="linenos">714</span></a><span class="sd"> Load a file from the workspace s3 bucket and returns its content as bytes.</span>
</span><span id="Windmill.load_s3_file-715"><a href="#Windmill.load_s3_file-715"><span class="linenos">715</span></a>
</span><span id="Windmill.load_s3_file-716"><a href="#Windmill.load_s3_file-716"><span class="linenos">716</span></a><span class="sd"> &#39;&#39;&#39;python</span>
</span><span id="Windmill.load_s3_file-717"><a href="#Windmill.load_s3_file-717"><span class="linenos">717</span></a><span class="sd"> from wmill import S3Object</span>
</span><span id="Windmill.load_s3_file-718"><a href="#Windmill.load_s3_file-718"><span class="linenos">718</span></a>
</span><span id="Windmill.load_s3_file-719"><a href="#Windmill.load_s3_file-719"><span class="linenos">719</span></a><span class="sd"> s3_obj = S3Object(s3=&quot;/path/to/my_file.txt&quot;)</span>
</span><span id="Windmill.load_s3_file-720"><a href="#Windmill.load_s3_file-720"><span class="linenos">720</span></a><span class="sd"> my_obj_content = client.load_s3_file(s3_obj)</span>
</span><span id="Windmill.load_s3_file-721"><a href="#Windmill.load_s3_file-721"><span class="linenos">721</span></a><span class="sd"> file_content = my_obj_content.decode(&quot;utf-8&quot;)</span>
</span><span id="Windmill.load_s3_file-722"><a href="#Windmill.load_s3_file-722"><span class="linenos">722</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="Windmill.load_s3_file-723"><a href="#Windmill.load_s3_file-723"><span class="linenos">723</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.load_s3_file-724"><a href="#Windmill.load_s3_file-724"><span class="linenos">724</span></a> <span class="n">s3object</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3object</span><span class="p">)</span>
</span><span id="Windmill.load_s3_file-725"><a href="#Windmill.load_s3_file-725"><span class="linenos">725</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_s3_file_reader</span><span class="p">(</span><span class="n">s3object</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">)</span> <span class="k">as</span> <span class="n">file_reader</span><span class="p">:</span>
</span><span id="Windmill.load_s3_file-726"><a href="#Windmill.load_s3_file-726"><span class="linenos">726</span></a> <span class="k">return</span> <span class="n">file_reader</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></pre></div>
<div class="docstring"><p>Load a file from the workspace s3 bucket and returns its content as bytes.</p>
<p>'''python
from wmill import S3Object</p>
<p>s3_obj = S3Object(s3="/path/to/my_file.txt")
my_obj_content = client.load_s3_file(s3_obj)
file_content = my_obj_content.decode("utf-8")
'''</p>
</div>
</div>
<div id="Windmill.load_s3_file_reader" class="classattr">
<input id="Windmill.load_s3_file_reader-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">load_s3_file_reader</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">s3object</span><span class="p">:</span> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n">_io</span><span class="o">.</span><span class="n">BufferedReader</span>:</span></span>
<label class="view-source-button" for="Windmill.load_s3_file_reader-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.load_s3_file_reader"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.load_s3_file_reader-728"><a href="#Windmill.load_s3_file_reader-728"><span class="linenos">728</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">load_s3_file_reader</span><span class="p">(</span>
</span><span id="Windmill.load_s3_file_reader-729"><a href="#Windmill.load_s3_file_reader-729"><span class="linenos">729</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span>
</span><span id="Windmill.load_s3_file_reader-730"><a href="#Windmill.load_s3_file_reader-730"><span class="linenos">730</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">BufferedReader</span><span class="p">:</span>
</span><span id="Windmill.load_s3_file_reader-731"><a href="#Windmill.load_s3_file_reader-731"><span class="linenos">731</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.load_s3_file_reader-732"><a href="#Windmill.load_s3_file_reader-732"><span class="linenos">732</span></a><span class="sd"> Load a file from the workspace s3 bucket and returns the bytes stream.</span>
</span><span id="Windmill.load_s3_file_reader-733"><a href="#Windmill.load_s3_file_reader-733"><span class="linenos">733</span></a>
</span><span id="Windmill.load_s3_file_reader-734"><a href="#Windmill.load_s3_file_reader-734"><span class="linenos">734</span></a><span class="sd"> &#39;&#39;&#39;python</span>
</span><span id="Windmill.load_s3_file_reader-735"><a href="#Windmill.load_s3_file_reader-735"><span class="linenos">735</span></a><span class="sd"> from wmill import S3Object</span>
</span><span id="Windmill.load_s3_file_reader-736"><a href="#Windmill.load_s3_file_reader-736"><span class="linenos">736</span></a>
</span><span id="Windmill.load_s3_file_reader-737"><a href="#Windmill.load_s3_file_reader-737"><span class="linenos">737</span></a><span class="sd"> s3_obj = S3Object(s3=&quot;/path/to/my_file.txt&quot;)</span>
</span><span id="Windmill.load_s3_file_reader-738"><a href="#Windmill.load_s3_file_reader-738"><span class="linenos">738</span></a><span class="sd"> with wmill.load_s3_file_reader(s3object, s3_resource_path) as file_reader:</span>
</span><span id="Windmill.load_s3_file_reader-739"><a href="#Windmill.load_s3_file_reader-739"><span class="linenos">739</span></a><span class="sd"> print(file_reader.read())</span>
</span><span id="Windmill.load_s3_file_reader-740"><a href="#Windmill.load_s3_file_reader-740"><span class="linenos">740</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="Windmill.load_s3_file_reader-741"><a href="#Windmill.load_s3_file_reader-741"><span class="linenos">741</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.load_s3_file_reader-742"><a href="#Windmill.load_s3_file_reader-742"><span class="linenos">742</span></a> <span class="n">s3object</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3object</span><span class="p">)</span>
</span><span id="Windmill.load_s3_file_reader-743"><a href="#Windmill.load_s3_file_reader-743"><span class="linenos">743</span></a> <span class="n">reader</span> <span class="o">=</span> <span class="n">S3BufferedReader</span><span class="p">(</span>
</span><span id="Windmill.load_s3_file_reader-744"><a href="#Windmill.load_s3_file_reader-744"><span class="linenos">744</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.load_s3_file_reader-745"><a href="#Windmill.load_s3_file_reader-745"><span class="linenos">745</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="p">,</span>
</span><span id="Windmill.load_s3_file_reader-746"><a href="#Windmill.load_s3_file_reader-746"><span class="linenos">746</span></a> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;s3&quot;</span><span class="p">],</span>
</span><span id="Windmill.load_s3_file_reader-747"><a href="#Windmill.load_s3_file_reader-747"><span class="linenos">747</span></a> <span class="n">s3_resource_path</span><span class="p">,</span>
</span><span id="Windmill.load_s3_file_reader-748"><a href="#Windmill.load_s3_file_reader-748"><span class="linenos">748</span></a> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span> <span class="k">if</span> <span class="s2">&quot;storage&quot;</span> <span class="ow">in</span> <span class="n">s3object</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.load_s3_file_reader-749"><a href="#Windmill.load_s3_file_reader-749"><span class="linenos">749</span></a> <span class="p">)</span>
</span><span id="Windmill.load_s3_file_reader-750"><a href="#Windmill.load_s3_file_reader-750"><span class="linenos">750</span></a> <span class="k">return</span> <span class="n">reader</span>
</span></pre></div>
<div class="docstring"><p>Load a file from the workspace s3 bucket and returns the bytes stream.</p>
<p>'''python
from wmill import S3Object</p>
<p>s3_obj = S3Object(s3="/path/to/my_file.txt")
with <a href="#load_s3_file_reader">wmill.load_s3_file_reader</a>(s3object, s3_resource_path) as file_reader:
print(file_reader.read())
'''</p>
</div>
</div>
<div id="Windmill.write_s3_file" class="classattr">
<input id="Windmill.write_s3_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">write_s3_file</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">s3object</span><span class="p">:</span> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">file_content</span><span class="p">:</span> <span class="n">_io</span><span class="o">.</span><span class="n">BufferedReader</span> <span class="o">|</span> <span class="nb">bytes</span>,</span><span class="param"> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">content_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">content_disposition</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span>:</span></span>
<label class="view-source-button" for="Windmill.write_s3_file-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.write_s3_file"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.write_s3_file-752"><a href="#Windmill.write_s3_file-752"><span class="linenos">752</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">write_s3_file</span><span class="p">(</span>
</span><span id="Windmill.write_s3_file-753"><a href="#Windmill.write_s3_file-753"><span class="linenos">753</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-754"><a href="#Windmill.write_s3_file-754"><span class="linenos">754</span></a> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-755"><a href="#Windmill.write_s3_file-755"><span class="linenos">755</span></a> <span class="n">file_content</span><span class="p">:</span> <span class="n">BufferedReader</span> <span class="o">|</span> <span class="nb">bytes</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-756"><a href="#Windmill.write_s3_file-756"><span class="linenos">756</span></a> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-757"><a href="#Windmill.write_s3_file-757"><span class="linenos">757</span></a> <span class="n">content_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-758"><a href="#Windmill.write_s3_file-758"><span class="linenos">758</span></a> <span class="n">content_disposition</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-759"><a href="#Windmill.write_s3_file-759"><span class="linenos">759</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="Windmill.write_s3_file-760"><a href="#Windmill.write_s3_file-760"><span class="linenos">760</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.write_s3_file-761"><a href="#Windmill.write_s3_file-761"><span class="linenos">761</span></a><span class="sd"> Write a file to the workspace S3 bucket</span>
</span><span id="Windmill.write_s3_file-762"><a href="#Windmill.write_s3_file-762"><span class="linenos">762</span></a>
</span><span id="Windmill.write_s3_file-763"><a href="#Windmill.write_s3_file-763"><span class="linenos">763</span></a><span class="sd"> &#39;&#39;&#39;python</span>
</span><span id="Windmill.write_s3_file-764"><a href="#Windmill.write_s3_file-764"><span class="linenos">764</span></a><span class="sd"> from wmill import S3Object</span>
</span><span id="Windmill.write_s3_file-765"><a href="#Windmill.write_s3_file-765"><span class="linenos">765</span></a>
</span><span id="Windmill.write_s3_file-766"><a href="#Windmill.write_s3_file-766"><span class="linenos">766</span></a><span class="sd"> s3_obj = S3Object(s3=&quot;/path/to/my_file.txt&quot;)</span>
</span><span id="Windmill.write_s3_file-767"><a href="#Windmill.write_s3_file-767"><span class="linenos">767</span></a>
</span><span id="Windmill.write_s3_file-768"><a href="#Windmill.write_s3_file-768"><span class="linenos">768</span></a><span class="sd"> # for an in memory bytes array:</span>
</span><span id="Windmill.write_s3_file-769"><a href="#Windmill.write_s3_file-769"><span class="linenos">769</span></a><span class="sd"> file_content = b&#39;Hello Windmill!&#39;</span>
</span><span id="Windmill.write_s3_file-770"><a href="#Windmill.write_s3_file-770"><span class="linenos">770</span></a><span class="sd"> client.write_s3_file(s3_obj, file_content)</span>
</span><span id="Windmill.write_s3_file-771"><a href="#Windmill.write_s3_file-771"><span class="linenos">771</span></a>
</span><span id="Windmill.write_s3_file-772"><a href="#Windmill.write_s3_file-772"><span class="linenos">772</span></a><span class="sd"> # for a file:</span>
</span><span id="Windmill.write_s3_file-773"><a href="#Windmill.write_s3_file-773"><span class="linenos">773</span></a><span class="sd"> with open(&quot;my_file.txt&quot;, &quot;rb&quot;) as my_file:</span>
</span><span id="Windmill.write_s3_file-774"><a href="#Windmill.write_s3_file-774"><span class="linenos">774</span></a><span class="sd"> client.write_s3_file(s3_obj, my_file)</span>
</span><span id="Windmill.write_s3_file-775"><a href="#Windmill.write_s3_file-775"><span class="linenos">775</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="Windmill.write_s3_file-776"><a href="#Windmill.write_s3_file-776"><span class="linenos">776</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.write_s3_file-777"><a href="#Windmill.write_s3_file-777"><span class="linenos">777</span></a> <span class="n">s3object</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3object</span><span class="p">)</span>
</span><span id="Windmill.write_s3_file-778"><a href="#Windmill.write_s3_file-778"><span class="linenos">778</span></a> <span class="c1"># httpx accepts either bytes or &quot;a bytes generator&quot; as content. If it&#39;s a BufferedReader, we need to convert it to a generator</span>
</span><span id="Windmill.write_s3_file-779"><a href="#Windmill.write_s3_file-779"><span class="linenos">779</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_content</span><span class="p">,</span> <span class="n">BufferedReader</span><span class="p">):</span>
</span><span id="Windmill.write_s3_file-780"><a href="#Windmill.write_s3_file-780"><span class="linenos">780</span></a> <span class="n">content_payload</span> <span class="o">=</span> <span class="n">bytes_generator</span><span class="p">(</span><span class="n">file_content</span><span class="p">)</span>
</span><span id="Windmill.write_s3_file-781"><a href="#Windmill.write_s3_file-781"><span class="linenos">781</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_content</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
</span><span id="Windmill.write_s3_file-782"><a href="#Windmill.write_s3_file-782"><span class="linenos">782</span></a> <span class="n">content_payload</span> <span class="o">=</span> <span class="n">file_content</span>
</span><span id="Windmill.write_s3_file-783"><a href="#Windmill.write_s3_file-783"><span class="linenos">783</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Windmill.write_s3_file-784"><a href="#Windmill.write_s3_file-784"><span class="linenos">784</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Type of file_content not supported&quot;</span><span class="p">)</span>
</span><span id="Windmill.write_s3_file-785"><a href="#Windmill.write_s3_file-785"><span class="linenos">785</span></a>
</span><span id="Windmill.write_s3_file-786"><a href="#Windmill.write_s3_file-786"><span class="linenos">786</span></a> <span class="n">query_params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="Windmill.write_s3_file-787"><a href="#Windmill.write_s3_file-787"><span class="linenos">787</span></a> <span class="k">if</span> <span class="n">s3object</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;s3&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
</span><span id="Windmill.write_s3_file-788"><a href="#Windmill.write_s3_file-788"><span class="linenos">788</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;file_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;s3&quot;</span><span class="p">]</span>
</span><span id="Windmill.write_s3_file-789"><a href="#Windmill.write_s3_file-789"><span class="linenos">789</span></a> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">s3_resource_path</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
</span><span id="Windmill.write_s3_file-790"><a href="#Windmill.write_s3_file-790"><span class="linenos">790</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;s3_resource_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">s3_resource_path</span>
</span><span id="Windmill.write_s3_file-791"><a href="#Windmill.write_s3_file-791"><span class="linenos">791</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="Windmill.write_s3_file-792"><a href="#Windmill.write_s3_file-792"><span class="linenos">792</span></a> <span class="n">s3object</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
</span><span id="Windmill.write_s3_file-793"><a href="#Windmill.write_s3_file-793"><span class="linenos">793</span></a> <span class="ow">and</span> <span class="s2">&quot;storage&quot;</span> <span class="ow">in</span> <span class="n">s3object</span>
</span><span id="Windmill.write_s3_file-794"><a href="#Windmill.write_s3_file-794"><span class="linenos">794</span></a> <span class="ow">and</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
</span><span id="Windmill.write_s3_file-795"><a href="#Windmill.write_s3_file-795"><span class="linenos">795</span></a> <span class="p">):</span>
</span><span id="Windmill.write_s3_file-796"><a href="#Windmill.write_s3_file-796"><span class="linenos">796</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">s3object</span><span class="p">[</span><span class="s2">&quot;storage&quot;</span><span class="p">]</span>
</span><span id="Windmill.write_s3_file-797"><a href="#Windmill.write_s3_file-797"><span class="linenos">797</span></a> <span class="k">if</span> <span class="n">content_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.write_s3_file-798"><a href="#Windmill.write_s3_file-798"><span class="linenos">798</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;content_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">content_type</span>
</span><span id="Windmill.write_s3_file-799"><a href="#Windmill.write_s3_file-799"><span class="linenos">799</span></a> <span class="k">if</span> <span class="n">content_disposition</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.write_s3_file-800"><a href="#Windmill.write_s3_file-800"><span class="linenos">800</span></a> <span class="n">query_params</span><span class="p">[</span><span class="s2">&quot;content_disposition&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">content_disposition</span>
</span><span id="Windmill.write_s3_file-801"><a href="#Windmill.write_s3_file-801"><span class="linenos">801</span></a>
</span><span id="Windmill.write_s3_file-802"><a href="#Windmill.write_s3_file-802"><span class="linenos">802</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="Windmill.write_s3_file-803"><a href="#Windmill.write_s3_file-803"><span class="linenos">803</span></a> <span class="c1"># need a vanilla client b/c content-type is not application/json here</span>
</span><span id="Windmill.write_s3_file-804"><a href="#Windmill.write_s3_file-804"><span class="linenos">804</span></a> <span class="n">response</span> <span class="o">=</span> <span class="n">httpx</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.write_s3_file-805"><a href="#Windmill.write_s3_file-805"><span class="linenos">805</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_url</span><span class="si">}</span><span class="s2">/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/job_helpers/upload_s3_file&quot;</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-806"><a href="#Windmill.write_s3_file-806"><span class="linenos">806</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill.write_s3_file-807"><a href="#Windmill.write_s3_file-807"><span class="linenos">807</span></a> <span class="s2">&quot;Authorization&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Bearer </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-808"><a href="#Windmill.write_s3_file-808"><span class="linenos">808</span></a> <span class="s2">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/octet-stream&quot;</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-809"><a href="#Windmill.write_s3_file-809"><span class="linenos">809</span></a> <span class="p">},</span>
</span><span id="Windmill.write_s3_file-810"><a href="#Windmill.write_s3_file-810"><span class="linenos">810</span></a> <span class="n">params</span><span class="o">=</span><span class="n">query_params</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-811"><a href="#Windmill.write_s3_file-811"><span class="linenos">811</span></a> <span class="n">content</span><span class="o">=</span><span class="n">content_payload</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-812"><a href="#Windmill.write_s3_file-812"><span class="linenos">812</span></a> <span class="n">verify</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">verify</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-813"><a href="#Windmill.write_s3_file-813"><span class="linenos">813</span></a> <span class="n">timeout</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.write_s3_file-814"><a href="#Windmill.write_s3_file-814"><span class="linenos">814</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="Windmill.write_s3_file-815"><a href="#Windmill.write_s3_file-815"><span class="linenos">815</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="Windmill.write_s3_file-816"><a href="#Windmill.write_s3_file-816"><span class="linenos">816</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Could not write file to S3&quot;</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span><span id="Windmill.write_s3_file-817"><a href="#Windmill.write_s3_file-817"><span class="linenos">817</span></a> <span class="k">return</span> <span class="n">S3Object</span><span class="p">(</span><span class="n">s3</span><span class="o">=</span><span class="n">response</span><span class="p">[</span><span class="s2">&quot;file_key&quot;</span><span class="p">])</span>
</span></pre></div>
<div class="docstring"><p>Write a file to the workspace S3 bucket</p>
<p>'''python
from wmill import S3Object</p>
<p>s3_obj = S3Object(s3="/path/to/my_file.txt")</p>
<h1 id="for-an-in-memory-bytes-array">for an in memory bytes array:</h1>
<p>file_content = b'Hello Windmill!'
client.write_s3_file(s3_obj, file_content)</p>
<h1 id="for-a-file">for a file:</h1>
<p>with open("my_file.txt", "rb") as my_file:
client.write_s3_file(s3_obj, my_file)
'''</p>
</div>
</div>
<div id="Windmill.sign_s3_objects" class="classattr">
<input id="Windmill.sign_s3_objects-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">sign_s3_objects</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="nb">list</span><span class="p">[</span><span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="Windmill.sign_s3_objects-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.sign_s3_objects"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.sign_s3_objects-819"><a href="#Windmill.sign_s3_objects-819"><span class="linenos">819</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">sign_s3_objects</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span><span class="p">]:</span>
</span><span id="Windmill.sign_s3_objects-820"><a href="#Windmill.sign_s3_objects-820"><span class="linenos">820</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.sign_s3_objects-821"><a href="#Windmill.sign_s3_objects-821"><span class="linenos">821</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/apps/sign_s3_objects&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;s3_objects&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">parse_s3_object</span><span class="p">,</span> <span class="n">s3_objects</span><span class="p">))}</span>
</span><span id="Windmill.sign_s3_objects-822"><a href="#Windmill.sign_s3_objects-822"><span class="linenos">822</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></pre></div>
</div>
<div id="Windmill.sign_s3_object" class="classattr">
<input id="Windmill.sign_s3_object-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">sign_s3_object</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">s3_object</span><span class="p">:</span> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span>:</span></span>
<label class="view-source-button" for="Windmill.sign_s3_object-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.sign_s3_object"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.sign_s3_object-824"><a href="#Windmill.sign_s3_object-824"><span class="linenos">824</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">sign_s3_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="Windmill.sign_s3_object-825"><a href="#Windmill.sign_s3_object-825"><span class="linenos">825</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.sign_s3_object-826"><a href="#Windmill.sign_s3_object-826"><span class="linenos">826</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/apps/sign_s3_objects&quot;</span><span class="p">,</span>
</span><span id="Windmill.sign_s3_object-827"><a href="#Windmill.sign_s3_object-827"><span class="linenos">827</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;s3_objects&quot;</span><span class="p">:</span> <span class="p">[</span><span class="n">s3_object</span><span class="p">]},</span>
</span><span id="Windmill.sign_s3_object-828"><a href="#Windmill.sign_s3_object-828"><span class="linenos">828</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
</span></pre></div>
</div>
<div id="Windmill.get_presigned_s3_public_urls" class="classattr">
<input id="Windmill.get_presigned_s3_public_urls-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">get_presigned_s3_public_urls</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span><span class="p">]</span>,</span><span class="param"> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="Windmill.get_presigned_s3_public_urls-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_presigned_s3_public_urls"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_presigned_s3_public_urls-830"><a href="#Windmill.get_presigned_s3_public_urls-830"><span class="linenos">830</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_presigned_s3_public_urls</span><span class="p">(</span>
</span><span id="Windmill.get_presigned_s3_public_urls-831"><a href="#Windmill.get_presigned_s3_public_urls-831"><span class="linenos">831</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.get_presigned_s3_public_urls-832"><a href="#Windmill.get_presigned_s3_public_urls-832"><span class="linenos">832</span></a> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">],</span>
</span><span id="Windmill.get_presigned_s3_public_urls-833"><a href="#Windmill.get_presigned_s3_public_urls-833"><span class="linenos">833</span></a> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.get_presigned_s3_public_urls-834"><a href="#Windmill.get_presigned_s3_public_urls-834"><span class="linenos">834</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span><span id="Windmill.get_presigned_s3_public_urls-835"><a href="#Windmill.get_presigned_s3_public_urls-835"><span class="linenos">835</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.get_presigned_s3_public_urls-836"><a href="#Windmill.get_presigned_s3_public_urls-836"><span class="linenos">836</span></a><span class="sd"> Generate presigned public URLs for an array of S3 objects.</span>
</span><span id="Windmill.get_presigned_s3_public_urls-837"><a href="#Windmill.get_presigned_s3_public_urls-837"><span class="linenos">837</span></a><span class="sd"> If an S3 object is not signed yet, it will be signed first.</span>
</span><span id="Windmill.get_presigned_s3_public_urls-838"><a href="#Windmill.get_presigned_s3_public_urls-838"><span class="linenos">838</span></a>
</span><span id="Windmill.get_presigned_s3_public_urls-839"><a href="#Windmill.get_presigned_s3_public_urls-839"><span class="linenos">839</span></a><span class="sd"> Args:</span>
</span><span id="Windmill.get_presigned_s3_public_urls-840"><a href="#Windmill.get_presigned_s3_public_urls-840"><span class="linenos">840</span></a><span class="sd"> s3_objects: List of S3 objects to sign</span>
</span><span id="Windmill.get_presigned_s3_public_urls-841"><a href="#Windmill.get_presigned_s3_public_urls-841"><span class="linenos">841</span></a><span class="sd"> base_url: Optional base URL for the presigned URLs (defaults to WM_BASE_URL)</span>
</span><span id="Windmill.get_presigned_s3_public_urls-842"><a href="#Windmill.get_presigned_s3_public_urls-842"><span class="linenos">842</span></a>
</span><span id="Windmill.get_presigned_s3_public_urls-843"><a href="#Windmill.get_presigned_s3_public_urls-843"><span class="linenos">843</span></a><span class="sd"> Returns:</span>
</span><span id="Windmill.get_presigned_s3_public_urls-844"><a href="#Windmill.get_presigned_s3_public_urls-844"><span class="linenos">844</span></a><span class="sd"> List of signed public URLs</span>
</span><span id="Windmill.get_presigned_s3_public_urls-845"><a href="#Windmill.get_presigned_s3_public_urls-845"><span class="linenos">845</span></a>
</span><span id="Windmill.get_presigned_s3_public_urls-846"><a href="#Windmill.get_presigned_s3_public_urls-846"><span class="linenos">846</span></a><span class="sd"> Example:</span>
</span><span id="Windmill.get_presigned_s3_public_urls-847"><a href="#Windmill.get_presigned_s3_public_urls-847"><span class="linenos">847</span></a><span class="sd"> &gt;&gt;&gt; s3_objs = [S3Object(s3=&quot;/path/to/file1.txt&quot;), S3Object(s3=&quot;/path/to/file2.txt&quot;)]</span>
</span><span id="Windmill.get_presigned_s3_public_urls-848"><a href="#Windmill.get_presigned_s3_public_urls-848"><span class="linenos">848</span></a><span class="sd"> &gt;&gt;&gt; urls = client.get_presigned_s3_public_urls(s3_objs)</span>
</span><span id="Windmill.get_presigned_s3_public_urls-849"><a href="#Windmill.get_presigned_s3_public_urls-849"><span class="linenos">849</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.get_presigned_s3_public_urls-850"><a href="#Windmill.get_presigned_s3_public_urls-850"><span class="linenos">850</span></a> <span class="n">base_url</span> <span class="o">=</span> <span class="n">base_url</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_public_base_url</span><span class="p">()</span>
</span><span id="Windmill.get_presigned_s3_public_urls-851"><a href="#Windmill.get_presigned_s3_public_urls-851"><span class="linenos">851</span></a>
</span><span id="Windmill.get_presigned_s3_public_urls-852"><a href="#Windmill.get_presigned_s3_public_urls-852"><span class="linenos">852</span></a> <span class="n">s3_objs</span> <span class="o">=</span> <span class="p">[</span><span class="n">parse_s3_object</span><span class="p">(</span><span class="n">s3_obj</span><span class="p">)</span> <span class="k">for</span> <span class="n">s3_obj</span> <span class="ow">in</span> <span class="n">s3_objects</span><span class="p">]</span>
</span><span id="Windmill.get_presigned_s3_public_urls-853"><a href="#Windmill.get_presigned_s3_public_urls-853"><span class="linenos">853</span></a>
</span><span id="Windmill.get_presigned_s3_public_urls-854"><a href="#Windmill.get_presigned_s3_public_urls-854"><span class="linenos">854</span></a> <span class="c1"># Sign all S3 objects that need to be signed in one go</span>
</span><span id="Windmill.get_presigned_s3_public_urls-855"><a href="#Windmill.get_presigned_s3_public_urls-855"><span class="linenos">855</span></a> <span class="n">s3_objs_to_sign</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">S3Object</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="Windmill.get_presigned_s3_public_urls-856"><a href="#Windmill.get_presigned_s3_public_urls-856"><span class="linenos">856</span></a> <span class="p">(</span><span class="n">s3_obj</span><span class="p">,</span> <span class="n">index</span><span class="p">)</span>
</span><span id="Windmill.get_presigned_s3_public_urls-857"><a href="#Windmill.get_presigned_s3_public_urls-857"><span class="linenos">857</span></a> <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">s3_obj</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">s3_objs</span><span class="p">)</span>
</span><span id="Windmill.get_presigned_s3_public_urls-858"><a href="#Windmill.get_presigned_s3_public_urls-858"><span class="linenos">858</span></a> <span class="k">if</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;presigned&quot;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span>
</span><span id="Windmill.get_presigned_s3_public_urls-859"><a href="#Windmill.get_presigned_s3_public_urls-859"><span class="linenos">859</span></a> <span class="p">]</span>
</span><span id="Windmill.get_presigned_s3_public_urls-860"><a href="#Windmill.get_presigned_s3_public_urls-860"><span class="linenos">860</span></a>
</span><span id="Windmill.get_presigned_s3_public_urls-861"><a href="#Windmill.get_presigned_s3_public_urls-861"><span class="linenos">861</span></a> <span class="k">if</span> <span class="n">s3_objs_to_sign</span><span class="p">:</span>
</span><span id="Windmill.get_presigned_s3_public_urls-862"><a href="#Windmill.get_presigned_s3_public_urls-862"><span class="linenos">862</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Signing </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">s3_objs_to_sign</span><span class="p">)</span><span class="si">}</span><span class="s2"> S3 objects...&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_presigned_s3_public_urls-863"><a href="#Windmill.get_presigned_s3_public_urls-863"><span class="linenos">863</span></a> <span class="n">signed_s3_objs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sign_s3_objects</span><span class="p">(</span>
</span><span id="Windmill.get_presigned_s3_public_urls-864"><a href="#Windmill.get_presigned_s3_public_urls-864"><span class="linenos">864</span></a> <span class="p">[</span><span class="n">s3_obj</span> <span class="k">for</span> <span class="n">s3_obj</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">s3_objs_to_sign</span><span class="p">]</span>
</span><span id="Windmill.get_presigned_s3_public_urls-865"><a href="#Windmill.get_presigned_s3_public_urls-865"><span class="linenos">865</span></a> <span class="p">)</span>
</span><span id="Windmill.get_presigned_s3_public_urls-866"><a href="#Windmill.get_presigned_s3_public_urls-866"><span class="linenos">866</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="n">original_index</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">s3_objs_to_sign</span><span class="p">):</span>
</span><span id="Windmill.get_presigned_s3_public_urls-867"><a href="#Windmill.get_presigned_s3_public_urls-867"><span class="linenos">867</span></a> <span class="n">s3_objs</span><span class="p">[</span><span class="n">original_index</span><span class="p">]</span> <span class="o">=</span> <span class="n">parse_s3_object</span><span class="p">(</span><span class="n">signed_s3_objs</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span><span id="Windmill.get_presigned_s3_public_urls-868"><a href="#Windmill.get_presigned_s3_public_urls-868"><span class="linenos">868</span></a>
</span><span id="Windmill.get_presigned_s3_public_urls-869"><a href="#Windmill.get_presigned_s3_public_urls-869"><span class="linenos">869</span></a> <span class="n">signed_urls</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="Windmill.get_presigned_s3_public_urls-870"><a href="#Windmill.get_presigned_s3_public_urls-870"><span class="linenos">870</span></a> <span class="k">for</span> <span class="n">s3_obj</span> <span class="ow">in</span> <span class="n">s3_objs</span><span class="p">:</span>
</span><span id="Windmill.get_presigned_s3_public_urls-871"><a href="#Windmill.get_presigned_s3_public_urls-871"><span class="linenos">871</span></a> <span class="n">s3</span> <span class="o">=</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;s3&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_presigned_s3_public_urls-872"><a href="#Windmill.get_presigned_s3_public_urls-872"><span class="linenos">872</span></a> <span class="n">presigned</span> <span class="o">=</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;presigned&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_presigned_s3_public_urls-873"><a href="#Windmill.get_presigned_s3_public_urls-873"><span class="linenos">873</span></a> <span class="n">storage</span> <span class="o">=</span> <span class="n">s3_obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;storage&quot;</span><span class="p">,</span> <span class="s2">&quot;_default_&quot;</span><span class="p">)</span>
</span><span id="Windmill.get_presigned_s3_public_urls-874"><a href="#Windmill.get_presigned_s3_public_urls-874"><span class="linenos">874</span></a> <span class="n">signed_url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s2">/api/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/s3_proxy/</span><span class="si">{</span><span class="n">storage</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">s3</span><span class="si">}</span><span class="s2">?</span><span class="si">{</span><span class="n">presigned</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Windmill.get_presigned_s3_public_urls-875"><a href="#Windmill.get_presigned_s3_public_urls-875"><span class="linenos">875</span></a> <span class="n">signed_urls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">signed_url</span><span class="p">)</span>
</span><span id="Windmill.get_presigned_s3_public_urls-876"><a href="#Windmill.get_presigned_s3_public_urls-876"><span class="linenos">876</span></a>
</span><span id="Windmill.get_presigned_s3_public_urls-877"><a href="#Windmill.get_presigned_s3_public_urls-877"><span class="linenos">877</span></a> <span class="k">return</span> <span class="n">signed_urls</span>
</span></pre></div>
<div class="docstring"><p>Generate presigned public URLs for an array of S3 objects.
If an S3 object is not signed yet, it will be signed first.</p>
<p>Args:
s3_objects: List of S3 objects to sign
base_url: Optional base URL for the presigned URLs (defaults to WM_BASE_URL)</p>
<p>Returns:
List of signed public URLs</p>
<p>Example:</p>
<blockquote>
<blockquote>
<blockquote>
<p>s3_objs = [S3Object(s3="/path/to/file1.txt"), S3Object(s3="/path/to/file2.txt")]
urls = client.get_presigned_s3_public_urls(s3_objs)</p>
</blockquote>
</blockquote>
</blockquote>
</div>
</div>
<div id="Windmill.get_presigned_s3_public_url" class="classattr">
<input id="Windmill.get_presigned_s3_public_url-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">get_presigned_s3_public_url</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">s3_object</span><span class="p">:</span> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="Windmill.get_presigned_s3_public_url-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_presigned_s3_public_url"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_presigned_s3_public_url-879"><a href="#Windmill.get_presigned_s3_public_url-879"><span class="linenos">879</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_presigned_s3_public_url</span><span class="p">(</span>
</span><span id="Windmill.get_presigned_s3_public_url-880"><a href="#Windmill.get_presigned_s3_public_url-880"><span class="linenos">880</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.get_presigned_s3_public_url-881"><a href="#Windmill.get_presigned_s3_public_url-881"><span class="linenos">881</span></a> <span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.get_presigned_s3_public_url-882"><a href="#Windmill.get_presigned_s3_public_url-882"><span class="linenos">882</span></a> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.get_presigned_s3_public_url-883"><a href="#Windmill.get_presigned_s3_public_url-883"><span class="linenos">883</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill.get_presigned_s3_public_url-884"><a href="#Windmill.get_presigned_s3_public_url-884"><span class="linenos">884</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.get_presigned_s3_public_url-885"><a href="#Windmill.get_presigned_s3_public_url-885"><span class="linenos">885</span></a><span class="sd"> Generate a presigned public URL for an S3 object.</span>
</span><span id="Windmill.get_presigned_s3_public_url-886"><a href="#Windmill.get_presigned_s3_public_url-886"><span class="linenos">886</span></a><span class="sd"> If the S3 object is not signed yet, it will be signed first.</span>
</span><span id="Windmill.get_presigned_s3_public_url-887"><a href="#Windmill.get_presigned_s3_public_url-887"><span class="linenos">887</span></a>
</span><span id="Windmill.get_presigned_s3_public_url-888"><a href="#Windmill.get_presigned_s3_public_url-888"><span class="linenos">888</span></a><span class="sd"> Args:</span>
</span><span id="Windmill.get_presigned_s3_public_url-889"><a href="#Windmill.get_presigned_s3_public_url-889"><span class="linenos">889</span></a><span class="sd"> s3_object: S3 object to sign</span>
</span><span id="Windmill.get_presigned_s3_public_url-890"><a href="#Windmill.get_presigned_s3_public_url-890"><span class="linenos">890</span></a><span class="sd"> base_url: Optional base URL for the presigned URL (defaults to WM_BASE_URL)</span>
</span><span id="Windmill.get_presigned_s3_public_url-891"><a href="#Windmill.get_presigned_s3_public_url-891"><span class="linenos">891</span></a>
</span><span id="Windmill.get_presigned_s3_public_url-892"><a href="#Windmill.get_presigned_s3_public_url-892"><span class="linenos">892</span></a><span class="sd"> Returns:</span>
</span><span id="Windmill.get_presigned_s3_public_url-893"><a href="#Windmill.get_presigned_s3_public_url-893"><span class="linenos">893</span></a><span class="sd"> Signed public URL</span>
</span><span id="Windmill.get_presigned_s3_public_url-894"><a href="#Windmill.get_presigned_s3_public_url-894"><span class="linenos">894</span></a>
</span><span id="Windmill.get_presigned_s3_public_url-895"><a href="#Windmill.get_presigned_s3_public_url-895"><span class="linenos">895</span></a><span class="sd"> Example:</span>
</span><span id="Windmill.get_presigned_s3_public_url-896"><a href="#Windmill.get_presigned_s3_public_url-896"><span class="linenos">896</span></a><span class="sd"> &gt;&gt;&gt; s3_obj = S3Object(s3=&quot;/path/to/file.txt&quot;)</span>
</span><span id="Windmill.get_presigned_s3_public_url-897"><a href="#Windmill.get_presigned_s3_public_url-897"><span class="linenos">897</span></a><span class="sd"> &gt;&gt;&gt; url = client.get_presigned_s3_public_url(s3_obj)</span>
</span><span id="Windmill.get_presigned_s3_public_url-898"><a href="#Windmill.get_presigned_s3_public_url-898"><span class="linenos">898</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.get_presigned_s3_public_url-899"><a href="#Windmill.get_presigned_s3_public_url-899"><span class="linenos">899</span></a> <span class="n">urls</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_presigned_s3_public_urls</span><span class="p">([</span><span class="n">s3_object</span><span class="p">],</span> <span class="n">base_url</span><span class="p">)</span>
</span><span id="Windmill.get_presigned_s3_public_url-900"><a href="#Windmill.get_presigned_s3_public_url-900"><span class="linenos">900</span></a> <span class="k">return</span> <span class="n">urls</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span></pre></div>
<div class="docstring"><p>Generate a presigned public URL for an S3 object.
If the S3 object is not signed yet, it will be signed first.</p>
<p>Args:
s3_object: S3 object to sign
base_url: Optional base URL for the presigned URL (defaults to WM_BASE_URL)</p>
<p>Returns:
Signed public URL</p>
<p>Example:</p>
<blockquote>
<blockquote>
<blockquote>
<p>s3_obj = S3Object(s3="/path/to/file.txt")
url = client.get_presigned_s3_public_url(s3_obj)</p>
</blockquote>
</blockquote>
</blockquote>
</div>
</div>
<div id="Windmill.whoami" class="classattr">
<input id="Windmill.whoami-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">whoami</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span></span><span class="return-annotation">) -> <span class="nb">dict</span>:</span></span>
<label class="view-source-button" for="Windmill.whoami-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.whoami"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.whoami-921"><a href="#Windmill.whoami-921"><span class="linenos">921</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">whoami</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill.whoami-922"><a href="#Windmill.whoami-922"><span class="linenos">922</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/users/whoami&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></pre></div>
</div>
<div id="Windmill.user" class="classattr">
<input id="Windmill.user-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">user</span><span class="annotation">: dict</span>
<label class="view-source-button" for="Windmill.user-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.user"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.user-924"><a href="#Windmill.user-924"><span class="linenos">924</span></a> <span class="nd">@property</span>
</span><span id="Windmill.user-925"><a href="#Windmill.user-925"><span class="linenos">925</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">user</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill.user-926"><a href="#Windmill.user-926"><span class="linenos">926</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">whoami</span><span class="p">()</span>
</span></pre></div>
</div>
<div id="Windmill.state_path" class="classattr">
<input id="Windmill.state_path-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">state_path</span><span class="annotation">: str</span>
<label class="view-source-button" for="Windmill.state_path-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.state_path"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.state_path-928"><a href="#Windmill.state_path-928"><span class="linenos">928</span></a> <span class="nd">@property</span>
</span><span id="Windmill.state_path-929"><a href="#Windmill.state_path-929"><span class="linenos">929</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">state_path</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Windmill.state_path-930"><a href="#Windmill.state_path-930"><span class="linenos">930</span></a> <span class="n">state_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill.state_path-931"><a href="#Windmill.state_path-931"><span class="linenos">931</span></a> <span class="s2">&quot;WM_STATE_PATH_NEW&quot;</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_STATE_PATH&quot;</span><span class="p">)</span>
</span><span id="Windmill.state_path-932"><a href="#Windmill.state_path-932"><span class="linenos">932</span></a> <span class="p">)</span>
</span><span id="Windmill.state_path-933"><a href="#Windmill.state_path-933"><span class="linenos">933</span></a> <span class="k">if</span> <span class="n">state_path</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.state_path-934"><a href="#Windmill.state_path-934"><span class="linenos">934</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;State path not found&quot;</span><span class="p">)</span>
</span><span id="Windmill.state_path-935"><a href="#Windmill.state_path-935"><span class="linenos">935</span></a> <span class="k">return</span> <span class="n">state_path</span>
</span></pre></div>
</div>
<div id="Windmill.state" class="classattr">
<input id="Windmill.state-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">state</span><span class="annotation">: Any</span>
<label class="view-source-button" for="Windmill.state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.state-937"><a href="#Windmill.state-937"><span class="linenos">937</span></a> <span class="nd">@property</span>
</span><span id="Windmill.state-938"><a href="#Windmill.state-938"><span class="linenos">938</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">state</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill.state-939"><a href="#Windmill.state-939"><span class="linenos">939</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_resource</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">state_path</span><span class="p">,</span> <span class="n">none_if_undefined</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></pre></div>
</div>
<div id="Windmill.set_shared_state_pickle" class="classattr">
<input id="Windmill.set_shared_state_pickle-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-staticmethod">@staticmethod</div>
<span class="def">def</span>
<span class="name">set_shared_state_pickle</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="param"><span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;state.pickle&#39;</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="Windmill.set_shared_state_pickle-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.set_shared_state_pickle"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.set_shared_state_pickle-945"><a href="#Windmill.set_shared_state_pickle-945"><span class="linenos">945</span></a> <span class="nd">@staticmethod</span>
</span><span id="Windmill.set_shared_state_pickle-946"><a href="#Windmill.set_shared_state_pickle-946"><span class="linenos">946</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_shared_state_pickle</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.pickle&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.set_shared_state_pickle-947"><a href="#Windmill.set_shared_state_pickle-947"><span class="linenos">947</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.set_shared_state_pickle-948"><a href="#Windmill.set_shared_state_pickle-948"><span class="linenos">948</span></a><span class="sd"> Set the state in the shared folder using pickle</span>
</span><span id="Windmill.set_shared_state_pickle-949"><a href="#Windmill.set_shared_state_pickle-949"><span class="linenos">949</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.set_shared_state_pickle-950"><a href="#Windmill.set_shared_state_pickle-950"><span class="linenos">950</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">pickle</span>
</span><span id="Windmill.set_shared_state_pickle-951"><a href="#Windmill.set_shared_state_pickle-951"><span class="linenos">951</span></a>
</span><span id="Windmill.set_shared_state_pickle-952"><a href="#Windmill.set_shared_state_pickle-952"><span class="linenos">952</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;wb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">handle</span><span class="p">:</span>
</span><span id="Windmill.set_shared_state_pickle-953"><a href="#Windmill.set_shared_state_pickle-953"><span class="linenos">953</span></a> <span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">handle</span><span class="p">,</span> <span class="n">protocol</span><span class="o">=</span><span class="n">pickle</span><span class="o">.</span><span class="n">HIGHEST_PROTOCOL</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Set the state in the shared folder using pickle</p>
</div>
</div>
<div id="Windmill.get_shared_state_pickle" class="classattr">
<input id="Windmill.get_shared_state_pickle-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-staticmethod">@staticmethod</div>
<span class="def">def</span>
<span class="name">get_shared_state_pickle</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;state.pickle&#39;</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="Windmill.get_shared_state_pickle-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_shared_state_pickle"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_shared_state_pickle-955"><a href="#Windmill.get_shared_state_pickle-955"><span class="linenos">955</span></a> <span class="nd">@staticmethod</span>
</span><span id="Windmill.get_shared_state_pickle-956"><a href="#Windmill.get_shared_state_pickle-956"><span class="linenos">956</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_shared_state_pickle</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.pickle&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="Windmill.get_shared_state_pickle-957"><a href="#Windmill.get_shared_state_pickle-957"><span class="linenos">957</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.get_shared_state_pickle-958"><a href="#Windmill.get_shared_state_pickle-958"><span class="linenos">958</span></a><span class="sd"> Get the state in the shared folder using pickle</span>
</span><span id="Windmill.get_shared_state_pickle-959"><a href="#Windmill.get_shared_state_pickle-959"><span class="linenos">959</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.get_shared_state_pickle-960"><a href="#Windmill.get_shared_state_pickle-960"><span class="linenos">960</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">pickle</span>
</span><span id="Windmill.get_shared_state_pickle-961"><a href="#Windmill.get_shared_state_pickle-961"><span class="linenos">961</span></a>
</span><span id="Windmill.get_shared_state_pickle-962"><a href="#Windmill.get_shared_state_pickle-962"><span class="linenos">962</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">handle</span><span class="p">:</span>
</span><span id="Windmill.get_shared_state_pickle-963"><a href="#Windmill.get_shared_state_pickle-963"><span class="linenos">963</span></a> <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">handle</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Get the state in the shared folder using pickle</p>
</div>
</div>
<div id="Windmill.set_shared_state" class="classattr">
<input id="Windmill.set_shared_state-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-staticmethod">@staticmethod</div>
<span class="def">def</span>
<span class="name">set_shared_state</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="param"><span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;state.json&#39;</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="Windmill.set_shared_state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.set_shared_state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.set_shared_state-965"><a href="#Windmill.set_shared_state-965"><span class="linenos">965</span></a> <span class="nd">@staticmethod</span>
</span><span id="Windmill.set_shared_state-966"><a href="#Windmill.set_shared_state-966"><span class="linenos">966</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">set_shared_state</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.json&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.set_shared_state-967"><a href="#Windmill.set_shared_state-967"><span class="linenos">967</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.set_shared_state-968"><a href="#Windmill.set_shared_state-968"><span class="linenos">968</span></a><span class="sd"> Set the state in the shared folder using pickle</span>
</span><span id="Windmill.set_shared_state-969"><a href="#Windmill.set_shared_state-969"><span class="linenos">969</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.set_shared_state-970"><a href="#Windmill.set_shared_state-970"><span class="linenos">970</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
</span><span id="Windmill.set_shared_state-971"><a href="#Windmill.set_shared_state-971"><span class="linenos">971</span></a>
</span><span id="Windmill.set_shared_state-972"><a href="#Windmill.set_shared_state-972"><span class="linenos">972</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</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="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="Windmill.set_shared_state-973"><a href="#Windmill.set_shared_state-973"><span class="linenos">973</span></a> <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Set the state in the shared folder using pickle</p>
</div>
</div>
<div id="Windmill.get_shared_state" class="classattr">
<input id="Windmill.get_shared_state-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-staticmethod">@staticmethod</div>
<span class="def">def</span>
<span class="name">get_shared_state</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;state.json&#39;</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="Windmill.get_shared_state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_shared_state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_shared_state-975"><a href="#Windmill.get_shared_state-975"><span class="linenos">975</span></a> <span class="nd">@staticmethod</span>
</span><span id="Windmill.get_shared_state-976"><a href="#Windmill.get_shared_state-976"><span class="linenos">976</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_shared_state</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;state.json&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.get_shared_state-977"><a href="#Windmill.get_shared_state-977"><span class="linenos">977</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.get_shared_state-978"><a href="#Windmill.get_shared_state-978"><span class="linenos">978</span></a><span class="sd"> Get the state in the shared folder using pickle</span>
</span><span id="Windmill.get_shared_state-979"><a href="#Windmill.get_shared_state-979"><span class="linenos">979</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.get_shared_state-980"><a href="#Windmill.get_shared_state-980"><span class="linenos">980</span></a> <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
</span><span id="Windmill.get_shared_state-981"><a href="#Windmill.get_shared_state-981"><span class="linenos">981</span></a>
</span><span id="Windmill.get_shared_state-982"><a href="#Windmill.get_shared_state-982"><span class="linenos">982</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/shared/</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;r&quot;</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="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="Windmill.get_shared_state-983"><a href="#Windmill.get_shared_state-983"><span class="linenos">983</span></a> <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Get the state in the shared folder using pickle</p>
</div>
</div>
<div id="Windmill.get_resume_urls" class="classattr">
<input id="Windmill.get_resume_urls-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">get_resume_urls</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">dict</span>:</span></span>
<label class="view-source-button" for="Windmill.get_resume_urls-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.get_resume_urls"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.get_resume_urls-985"><a href="#Windmill.get_resume_urls-985"><span class="linenos">985</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_resume_urls</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="Windmill.get_resume_urls-986"><a href="#Windmill.get_resume_urls-986"><span class="linenos">986</span></a> <span class="n">nonce</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1000000000</span><span class="p">)</span>
</span><span id="Windmill.get_resume_urls-987"><a href="#Windmill.get_resume_urls-987"><span class="linenos">987</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;NO_ID&quot;</span>
</span><span id="Windmill.get_resume_urls-988"><a href="#Windmill.get_resume_urls-988"><span class="linenos">988</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill.get_resume_urls-989"><a href="#Windmill.get_resume_urls-989"><span class="linenos">989</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/resume_urls/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">nonce</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.get_resume_urls-990"><a href="#Windmill.get_resume_urls-990"><span class="linenos">990</span></a> <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;approver&quot;</span><span class="p">:</span> <span class="n">approver</span><span class="p">},</span>
</span><span id="Windmill.get_resume_urls-991"><a href="#Windmill.get_resume_urls-991"><span class="linenos">991</span></a> <span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></pre></div>
</div>
<div id="Windmill.request_interactive_slack_approval" class="classattr">
<input id="Windmill.request_interactive_slack_approval-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">request_interactive_slack_approval</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">slack_resource_path</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">channel_id</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">message</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">default_args_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">dynamic_enums_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="Windmill.request_interactive_slack_approval-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.request_interactive_slack_approval"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.request_interactive_slack_approval-993"><a href="#Windmill.request_interactive_slack_approval-993"><span class="linenos"> 993</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">request_interactive_slack_approval</span><span class="p">(</span>
</span><span id="Windmill.request_interactive_slack_approval-994"><a href="#Windmill.request_interactive_slack_approval-994"><span class="linenos"> 994</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.request_interactive_slack_approval-995"><a href="#Windmill.request_interactive_slack_approval-995"><span class="linenos"> 995</span></a> <span class="n">slack_resource_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.request_interactive_slack_approval-996"><a href="#Windmill.request_interactive_slack_approval-996"><span class="linenos"> 996</span></a> <span class="n">channel_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.request_interactive_slack_approval-997"><a href="#Windmill.request_interactive_slack_approval-997"><span class="linenos"> 997</span></a> <span class="n">message</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.request_interactive_slack_approval-998"><a href="#Windmill.request_interactive_slack_approval-998"><span class="linenos"> 998</span></a> <span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.request_interactive_slack_approval-999"><a href="#Windmill.request_interactive_slack_approval-999"><span class="linenos"> 999</span></a> <span class="n">default_args_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.request_interactive_slack_approval-1000"><a href="#Windmill.request_interactive_slack_approval-1000"><span class="linenos">1000</span></a> <span class="n">dynamic_enums_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.request_interactive_slack_approval-1001"><a href="#Windmill.request_interactive_slack_approval-1001"><span class="linenos">1001</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Windmill.request_interactive_slack_approval-1002"><a href="#Windmill.request_interactive_slack_approval-1002"><span class="linenos">1002</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.request_interactive_slack_approval-1003"><a href="#Windmill.request_interactive_slack_approval-1003"><span class="linenos">1003</span></a><span class="sd"> Sends an interactive approval request via Slack, allowing optional customization of the message, approver, and form fields.</span>
</span><span id="Windmill.request_interactive_slack_approval-1004"><a href="#Windmill.request_interactive_slack_approval-1004"><span class="linenos">1004</span></a>
</span><span id="Windmill.request_interactive_slack_approval-1005"><a href="#Windmill.request_interactive_slack_approval-1005"><span class="linenos">1005</span></a><span class="sd"> **[Enterprise Edition Only]** To include form fields in the Slack approval request, use the &quot;Advanced -&gt; Suspend -&gt; Form&quot; functionality.</span>
</span><span id="Windmill.request_interactive_slack_approval-1006"><a href="#Windmill.request_interactive_slack_approval-1006"><span class="linenos">1006</span></a><span class="sd"> Learn more at: https://www.windmill.dev/docs/flows/flow_approval#form</span>
</span><span id="Windmill.request_interactive_slack_approval-1007"><a href="#Windmill.request_interactive_slack_approval-1007"><span class="linenos">1007</span></a>
</span><span id="Windmill.request_interactive_slack_approval-1008"><a href="#Windmill.request_interactive_slack_approval-1008"><span class="linenos">1008</span></a><span class="sd"> :param slack_resource_path: The path to the Slack resource in Windmill.</span>
</span><span id="Windmill.request_interactive_slack_approval-1009"><a href="#Windmill.request_interactive_slack_approval-1009"><span class="linenos">1009</span></a><span class="sd"> :type slack_resource_path: str</span>
</span><span id="Windmill.request_interactive_slack_approval-1010"><a href="#Windmill.request_interactive_slack_approval-1010"><span class="linenos">1010</span></a><span class="sd"> :param channel_id: The Slack channel ID where the approval request will be sent.</span>
</span><span id="Windmill.request_interactive_slack_approval-1011"><a href="#Windmill.request_interactive_slack_approval-1011"><span class="linenos">1011</span></a><span class="sd"> :type channel_id: str</span>
</span><span id="Windmill.request_interactive_slack_approval-1012"><a href="#Windmill.request_interactive_slack_approval-1012"><span class="linenos">1012</span></a><span class="sd"> :param message: Optional custom message to include in the Slack approval request.</span>
</span><span id="Windmill.request_interactive_slack_approval-1013"><a href="#Windmill.request_interactive_slack_approval-1013"><span class="linenos">1013</span></a><span class="sd"> :type message: str, optional</span>
</span><span id="Windmill.request_interactive_slack_approval-1014"><a href="#Windmill.request_interactive_slack_approval-1014"><span class="linenos">1014</span></a><span class="sd"> :param approver: Optional user ID or name of the approver for the request.</span>
</span><span id="Windmill.request_interactive_slack_approval-1015"><a href="#Windmill.request_interactive_slack_approval-1015"><span class="linenos">1015</span></a><span class="sd"> :type approver: str, optional</span>
</span><span id="Windmill.request_interactive_slack_approval-1016"><a href="#Windmill.request_interactive_slack_approval-1016"><span class="linenos">1016</span></a><span class="sd"> :param default_args_json: Optional dictionary defining or overriding the default arguments for form fields.</span>
</span><span id="Windmill.request_interactive_slack_approval-1017"><a href="#Windmill.request_interactive_slack_approval-1017"><span class="linenos">1017</span></a><span class="sd"> :type default_args_json: dict, optional</span>
</span><span id="Windmill.request_interactive_slack_approval-1018"><a href="#Windmill.request_interactive_slack_approval-1018"><span class="linenos">1018</span></a><span class="sd"> :param dynamic_enums_json: Optional dictionary overriding the enum default values of enum form fields.</span>
</span><span id="Windmill.request_interactive_slack_approval-1019"><a href="#Windmill.request_interactive_slack_approval-1019"><span class="linenos">1019</span></a><span class="sd"> :type dynamic_enums_json: dict, optional</span>
</span><span id="Windmill.request_interactive_slack_approval-1020"><a href="#Windmill.request_interactive_slack_approval-1020"><span class="linenos">1020</span></a>
</span><span id="Windmill.request_interactive_slack_approval-1021"><a href="#Windmill.request_interactive_slack_approval-1021"><span class="linenos">1021</span></a><span class="sd"> :raises Exception: If the function is not called within a flow or flow preview.</span>
</span><span id="Windmill.request_interactive_slack_approval-1022"><a href="#Windmill.request_interactive_slack_approval-1022"><span class="linenos">1022</span></a><span class="sd"> :raises Exception: If the required flow job or flow step environment variables are not set.</span>
</span><span id="Windmill.request_interactive_slack_approval-1023"><a href="#Windmill.request_interactive_slack_approval-1023"><span class="linenos">1023</span></a>
</span><span id="Windmill.request_interactive_slack_approval-1024"><a href="#Windmill.request_interactive_slack_approval-1024"><span class="linenos">1024</span></a><span class="sd"> :return: None</span>
</span><span id="Windmill.request_interactive_slack_approval-1025"><a href="#Windmill.request_interactive_slack_approval-1025"><span class="linenos">1025</span></a>
</span><span id="Windmill.request_interactive_slack_approval-1026"><a href="#Windmill.request_interactive_slack_approval-1026"><span class="linenos">1026</span></a><span class="sd"> **Usage Example:**</span>
</span><span id="Windmill.request_interactive_slack_approval-1027"><a href="#Windmill.request_interactive_slack_approval-1027"><span class="linenos">1027</span></a><span class="sd"> &gt;&gt;&gt; client.request_interactive_slack_approval(</span>
</span><span id="Windmill.request_interactive_slack_approval-1028"><a href="#Windmill.request_interactive_slack_approval-1028"><span class="linenos">1028</span></a><span class="sd"> ... slack_resource_path=&quot;/u/alex/my_slack_resource&quot;,</span>
</span><span id="Windmill.request_interactive_slack_approval-1029"><a href="#Windmill.request_interactive_slack_approval-1029"><span class="linenos">1029</span></a><span class="sd"> ... channel_id=&quot;admins-slack-channel&quot;,</span>
</span><span id="Windmill.request_interactive_slack_approval-1030"><a href="#Windmill.request_interactive_slack_approval-1030"><span class="linenos">1030</span></a><span class="sd"> ... message=&quot;Please approve this request&quot;,</span>
</span><span id="Windmill.request_interactive_slack_approval-1031"><a href="#Windmill.request_interactive_slack_approval-1031"><span class="linenos">1031</span></a><span class="sd"> ... approver=&quot;approver123&quot;,</span>
</span><span id="Windmill.request_interactive_slack_approval-1032"><a href="#Windmill.request_interactive_slack_approval-1032"><span class="linenos">1032</span></a><span class="sd"> ... default_args_json={&quot;key1&quot;: &quot;value1&quot;, &quot;key2&quot;: 42},</span>
</span><span id="Windmill.request_interactive_slack_approval-1033"><a href="#Windmill.request_interactive_slack_approval-1033"><span class="linenos">1033</span></a><span class="sd"> ... dynamic_enums_json={&quot;foo&quot;: [&quot;choice1&quot;, &quot;choice2&quot;], &quot;bar&quot;: [&quot;optionA&quot;, &quot;optionB&quot;]},</span>
</span><span id="Windmill.request_interactive_slack_approval-1034"><a href="#Windmill.request_interactive_slack_approval-1034"><span class="linenos">1034</span></a><span class="sd"> ... )</span>
</span><span id="Windmill.request_interactive_slack_approval-1035"><a href="#Windmill.request_interactive_slack_approval-1035"><span class="linenos">1035</span></a>
</span><span id="Windmill.request_interactive_slack_approval-1036"><a href="#Windmill.request_interactive_slack_approval-1036"><span class="linenos">1036</span></a><span class="sd"> **Notes:**</span>
</span><span id="Windmill.request_interactive_slack_approval-1037"><a href="#Windmill.request_interactive_slack_approval-1037"><span class="linenos">1037</span></a><span class="sd"> - This function must be executed within a Windmill flow or flow preview.</span>
</span><span id="Windmill.request_interactive_slack_approval-1038"><a href="#Windmill.request_interactive_slack_approval-1038"><span class="linenos">1038</span></a><span class="sd"> - The function checks for required environment variables (`WM_FLOW_JOB_ID`, `WM_FLOW_STEP_ID`) to ensure it is run in the appropriate context.</span>
</span><span id="Windmill.request_interactive_slack_approval-1039"><a href="#Windmill.request_interactive_slack_approval-1039"><span class="linenos">1039</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.request_interactive_slack_approval-1040"><a href="#Windmill.request_interactive_slack_approval-1040"><span class="linenos">1040</span></a> <span class="n">workspace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">workspace</span>
</span><span id="Windmill.request_interactive_slack_approval-1041"><a href="#Windmill.request_interactive_slack_approval-1041"><span class="linenos">1041</span></a> <span class="n">flow_job_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill.request_interactive_slack_approval-1042"><a href="#Windmill.request_interactive_slack_approval-1042"><span class="linenos">1042</span></a>
</span><span id="Windmill.request_interactive_slack_approval-1043"><a href="#Windmill.request_interactive_slack_approval-1043"><span class="linenos">1043</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">flow_job_id</span><span class="p">:</span>
</span><span id="Windmill.request_interactive_slack_approval-1044"><a href="#Windmill.request_interactive_slack_approval-1044"><span class="linenos">1044</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="Windmill.request_interactive_slack_approval-1045"><a href="#Windmill.request_interactive_slack_approval-1045"><span class="linenos">1045</span></a> <span class="s2">&quot;You can&#39;t use &#39;request_interactive_slack_approval&#39; function in a standalone script or flow step preview. Please use it in a flow or a flow preview.&quot;</span>
</span><span id="Windmill.request_interactive_slack_approval-1046"><a href="#Windmill.request_interactive_slack_approval-1046"><span class="linenos">1046</span></a> <span class="p">)</span>
</span><span id="Windmill.request_interactive_slack_approval-1047"><a href="#Windmill.request_interactive_slack_approval-1047"><span class="linenos">1047</span></a>
</span><span id="Windmill.request_interactive_slack_approval-1048"><a href="#Windmill.request_interactive_slack_approval-1048"><span class="linenos">1048</span></a> <span class="c1"># Only include non-empty parameters</span>
</span><span id="Windmill.request_interactive_slack_approval-1049"><a href="#Windmill.request_interactive_slack_approval-1049"><span class="linenos">1049</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="Windmill.request_interactive_slack_approval-1050"><a href="#Windmill.request_interactive_slack_approval-1050"><span class="linenos">1050</span></a> <span class="k">if</span> <span class="n">message</span><span class="p">:</span>
</span><span id="Windmill.request_interactive_slack_approval-1051"><a href="#Windmill.request_interactive_slack_approval-1051"><span class="linenos">1051</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;message&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">message</span>
</span><span id="Windmill.request_interactive_slack_approval-1052"><a href="#Windmill.request_interactive_slack_approval-1052"><span class="linenos">1052</span></a> <span class="k">if</span> <span class="n">approver</span><span class="p">:</span>
</span><span id="Windmill.request_interactive_slack_approval-1053"><a href="#Windmill.request_interactive_slack_approval-1053"><span class="linenos">1053</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;approver&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">approver</span>
</span><span id="Windmill.request_interactive_slack_approval-1054"><a href="#Windmill.request_interactive_slack_approval-1054"><span class="linenos">1054</span></a> <span class="k">if</span> <span class="n">slack_resource_path</span><span class="p">:</span>
</span><span id="Windmill.request_interactive_slack_approval-1055"><a href="#Windmill.request_interactive_slack_approval-1055"><span class="linenos">1055</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;slack_resource_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">slack_resource_path</span>
</span><span id="Windmill.request_interactive_slack_approval-1056"><a href="#Windmill.request_interactive_slack_approval-1056"><span class="linenos">1056</span></a> <span class="k">if</span> <span class="n">channel_id</span><span class="p">:</span>
</span><span id="Windmill.request_interactive_slack_approval-1057"><a href="#Windmill.request_interactive_slack_approval-1057"><span class="linenos">1057</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;channel_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel_id</span>
</span><span id="Windmill.request_interactive_slack_approval-1058"><a href="#Windmill.request_interactive_slack_approval-1058"><span class="linenos">1058</span></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_STEP_ID&quot;</span><span class="p">):</span>
</span><span id="Windmill.request_interactive_slack_approval-1059"><a href="#Windmill.request_interactive_slack_approval-1059"><span class="linenos">1059</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;flow_step_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_FLOW_STEP_ID&quot;</span><span class="p">)</span>
</span><span id="Windmill.request_interactive_slack_approval-1060"><a href="#Windmill.request_interactive_slack_approval-1060"><span class="linenos">1060</span></a> <span class="k">if</span> <span class="n">default_args_json</span><span class="p">:</span>
</span><span id="Windmill.request_interactive_slack_approval-1061"><a href="#Windmill.request_interactive_slack_approval-1061"><span class="linenos">1061</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;default_args_json&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">default_args_json</span><span class="p">)</span>
</span><span id="Windmill.request_interactive_slack_approval-1062"><a href="#Windmill.request_interactive_slack_approval-1062"><span class="linenos">1062</span></a> <span class="k">if</span> <span class="n">dynamic_enums_json</span><span class="p">:</span>
</span><span id="Windmill.request_interactive_slack_approval-1063"><a href="#Windmill.request_interactive_slack_approval-1063"><span class="linenos">1063</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;dynamic_enums_json&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">dynamic_enums_json</span><span class="p">)</span>
</span><span id="Windmill.request_interactive_slack_approval-1064"><a href="#Windmill.request_interactive_slack_approval-1064"><span class="linenos">1064</span></a>
</span><span id="Windmill.request_interactive_slack_approval-1065"><a href="#Windmill.request_interactive_slack_approval-1065"><span class="linenos">1065</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="Windmill.request_interactive_slack_approval-1066"><a href="#Windmill.request_interactive_slack_approval-1066"><span class="linenos">1066</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/jobs/slack_approval/</span><span class="si">{</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;WM_JOB_ID&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;NO_JOB_ID&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Windmill.request_interactive_slack_approval-1067"><a href="#Windmill.request_interactive_slack_approval-1067"><span class="linenos">1067</span></a> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span>
</span><span id="Windmill.request_interactive_slack_approval-1068"><a href="#Windmill.request_interactive_slack_approval-1068"><span class="linenos">1068</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Sends an interactive approval request via Slack, allowing optional customization of the message, approver, and form fields.</p>
<p><strong>[Enterprise Edition Only]</strong> To include form fields in the Slack approval request, use the "Advanced -> Suspend -> Form" functionality.
Learn more at: <a href="https://www.windmill.dev/docs/flows/flow_approval#form">https://www.windmill.dev/docs/flows/flow_approval#form</a></p>
<h6 id="parameters">Parameters</h6>
<ul>
<li><strong>slack_resource_path</strong>: The path to the Slack resource in Windmill.</li>
<li><strong>channel_id</strong>: The Slack channel ID where the approval request will be sent.</li>
<li><strong>message</strong>: Optional custom message to include in the Slack approval request.</li>
<li><strong>approver</strong>: Optional user ID or name of the approver for the request.</li>
<li><strong>default_args_json</strong>: Optional dictionary defining or overriding the default arguments for form fields.</li>
<li><strong>dynamic_enums_json</strong>: Optional dictionary overriding the enum default values of enum form fields.</li>
</ul>
<h6 id="raises">Raises</h6>
<ul>
<li><strong>Exception</strong>: If the function is not called within a flow or flow preview.</li>
<li><strong>Exception</strong>: If the required flow job or flow step environment variables are not set.</li>
</ul>
<h6 id="returns">Returns</h6>
<blockquote>
<p>None</p>
</blockquote>
<p><strong>Usage Example:</strong></p>
<blockquote>
<blockquote>
<blockquote>
<p>client.request_interactive_slack_approval(
... slack_resource_path="/u/alex/my_slack_resource",
... channel_id="admins-slack-channel",
... message="Please approve this request",
... approver="approver123",
... default_args_json={"key1": "value1", "key2": 42},
... dynamic_enums_json={"foo": ["choice1", "choice2"], "bar": ["optionA", "optionB"]},
... )</p>
</blockquote>
</blockquote>
</blockquote>
<p><strong>Notes:</strong></p>
<ul>
<li>This function must be executed within a Windmill flow or flow preview.</li>
<li>The function checks for required environment variables (<code>WM_FLOW_JOB_ID</code>, <code>WM_FLOW_STEP_ID</code>) to ensure it is run in the appropriate context.</li>
</ul>
</div>
</div>
<div id="Windmill.username_to_email" class="classattr">
<input id="Windmill.username_to_email-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">username_to_email</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">username</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="Windmill.username_to_email-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.username_to_email"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.username_to_email-1070"><a href="#Windmill.username_to_email-1070"><span class="linenos">1070</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">username_to_email</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</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="Windmill.username_to_email-1071"><a href="#Windmill.username_to_email-1071"><span class="linenos">1071</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.username_to_email-1072"><a href="#Windmill.username_to_email-1072"><span class="linenos">1072</span></a><span class="sd"> Get email from workspace username</span>
</span><span id="Windmill.username_to_email-1073"><a href="#Windmill.username_to_email-1073"><span class="linenos">1073</span></a><span class="sd"> This method is particularly useful for apps that require the email address of the viewer.</span>
</span><span id="Windmill.username_to_email-1074"><a href="#Windmill.username_to_email-1074"><span class="linenos">1074</span></a><span class="sd"> Indeed, in the viewer context WM_USERNAME is set to the username of the viewer but WM_EMAIL is set to the email of the creator of the app.</span>
</span><span id="Windmill.username_to_email-1075"><a href="#Windmill.username_to_email-1075"><span class="linenos">1075</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.username_to_email-1076"><a href="#Windmill.username_to_email-1076"><span class="linenos">1076</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">workspace</span><span class="si">}</span><span class="s2">/users/username_to_email/</span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
</span></pre></div>
<div class="docstring"><p>Get email from workspace username
This method is particularly useful for apps that require the email address of the viewer.
Indeed, in the viewer context WM_USERNAME is set to the username of the viewer but WM_EMAIL is set to the email of the creator of the app.</p>
</div>
</div>
<div id="Windmill.send_teams_message" class="classattr">
<input id="Windmill.send_teams_message-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">send_teams_message</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">conversation_id</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">success</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">card_block</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="Windmill.send_teams_message-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.send_teams_message"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.send_teams_message-1078"><a href="#Windmill.send_teams_message-1078"><span class="linenos">1078</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">send_teams_message</span><span class="p">(</span>
</span><span id="Windmill.send_teams_message-1079"><a href="#Windmill.send_teams_message-1079"><span class="linenos">1079</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="Windmill.send_teams_message-1080"><a href="#Windmill.send_teams_message-1080"><span class="linenos">1080</span></a> <span class="n">conversation_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.send_teams_message-1081"><a href="#Windmill.send_teams_message-1081"><span class="linenos">1081</span></a> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="Windmill.send_teams_message-1082"><a href="#Windmill.send_teams_message-1082"><span class="linenos">1082</span></a> <span class="n">success</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="Windmill.send_teams_message-1083"><a href="#Windmill.send_teams_message-1083"><span class="linenos">1083</span></a> <span class="n">card_block</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="Windmill.send_teams_message-1084"><a href="#Windmill.send_teams_message-1084"><span class="linenos">1084</span></a> <span class="p">):</span>
</span><span id="Windmill.send_teams_message-1085"><a href="#Windmill.send_teams_message-1085"><span class="linenos">1085</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="Windmill.send_teams_message-1086"><a href="#Windmill.send_teams_message-1086"><span class="linenos">1086</span></a><span class="sd"> Send a message to a Microsoft Teams conversation with conversation_id, where success is used to style the message</span>
</span><span id="Windmill.send_teams_message-1087"><a href="#Windmill.send_teams_message-1087"><span class="linenos">1087</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="Windmill.send_teams_message-1088"><a href="#Windmill.send_teams_message-1088"><span class="linenos">1088</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="Windmill.send_teams_message-1089"><a href="#Windmill.send_teams_message-1089"><span class="linenos">1089</span></a> <span class="sa">f</span><span class="s2">&quot;/teams/activities&quot;</span><span class="p">,</span>
</span><span id="Windmill.send_teams_message-1090"><a href="#Windmill.send_teams_message-1090"><span class="linenos">1090</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="Windmill.send_teams_message-1091"><a href="#Windmill.send_teams_message-1091"><span class="linenos">1091</span></a> <span class="s2">&quot;conversation_id&quot;</span><span class="p">:</span> <span class="n">conversation_id</span><span class="p">,</span>
</span><span id="Windmill.send_teams_message-1092"><a href="#Windmill.send_teams_message-1092"><span class="linenos">1092</span></a> <span class="s2">&quot;text&quot;</span><span class="p">:</span> <span class="n">text</span><span class="p">,</span>
</span><span id="Windmill.send_teams_message-1093"><a href="#Windmill.send_teams_message-1093"><span class="linenos">1093</span></a> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="n">success</span><span class="p">,</span>
</span><span id="Windmill.send_teams_message-1094"><a href="#Windmill.send_teams_message-1094"><span class="linenos">1094</span></a> <span class="s2">&quot;card_block&quot;</span><span class="p">:</span> <span class="n">card_block</span><span class="p">,</span>
</span><span id="Windmill.send_teams_message-1095"><a href="#Windmill.send_teams_message-1095"><span class="linenos">1095</span></a> <span class="p">},</span>
</span><span id="Windmill.send_teams_message-1096"><a href="#Windmill.send_teams_message-1096"><span class="linenos">1096</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Send a message to a Microsoft Teams conversation with conversation_id, where success is used to style the message</p>
</div>
</div>
<div id="Windmill.datatable" class="classattr">
<input id="Windmill.datatable-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">datatable</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;main&#39;</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="Windmill.datatable-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.datatable"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.datatable-1098"><a href="#Windmill.datatable-1098"><span class="linenos">1098</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">datatable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;main&quot;</span><span class="p">):</span>
</span><span id="Windmill.datatable-1099"><a href="#Windmill.datatable-1099"><span class="linenos">1099</span></a> <span class="k">return</span> <span class="n">DataTableClient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
</span></pre></div>
</div>
<div id="Windmill.ducklake" class="classattr">
<input id="Windmill.ducklake-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">ducklake</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;main&#39;</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="Windmill.ducklake-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#Windmill.ducklake"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Windmill.ducklake-1101"><a href="#Windmill.ducklake-1101"><span class="linenos">1101</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">ducklake</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;main&quot;</span><span class="p">):</span>
</span><span id="Windmill.ducklake-1102"><a href="#Windmill.ducklake-1102"><span class="linenos">1102</span></a> <span class="k">return</span> <span class="n">DucklakeClient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
</span></pre></div>
</div>
</section>
<section id="init_global_client">
<input id="init_global_client-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">init_global_client</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">f</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="init_global_client-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#init_global_client"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="init_global_client-1106"><a href="#init_global_client-1106"><span class="linenos">1106</span></a><span class="k">def</span><span class="w"> </span><span class="nf">init_global_client</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="init_global_client-1107"><a href="#init_global_client-1107"><span class="linenos">1107</span></a> <span class="nd">@functools</span><span class="o">.</span><span class="n">wraps</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span id="init_global_client-1108"><a href="#init_global_client-1108"><span class="linenos">1108</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="init_global_client-1109"><a href="#init_global_client-1109"><span class="linenos">1109</span></a> <span class="k">global</span> <span class="n">_client</span>
</span><span id="init_global_client-1110"><a href="#init_global_client-1110"><span class="linenos">1110</span></a> <span class="k">if</span> <span class="n">_client</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="init_global_client-1111"><a href="#init_global_client-1111"><span class="linenos">1111</span></a> <span class="n">_client</span> <span class="o">=</span> <span class="n">Windmill</span><span class="p">()</span>
</span><span id="init_global_client-1112"><a href="#init_global_client-1112"><span class="linenos">1112</span></a> <span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="init_global_client-1113"><a href="#init_global_client-1113"><span class="linenos">1113</span></a>
</span><span id="init_global_client-1114"><a href="#init_global_client-1114"><span class="linenos">1114</span></a> <span class="k">return</span> <span class="n">wrapper</span>
</span></pre></div>
</section>
<section id="deprecate">
<input id="deprecate-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">deprecate</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">in_favor_of</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="deprecate-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#deprecate"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="deprecate-1117"><a href="#deprecate-1117"><span class="linenos">1117</span></a><span class="k">def</span><span class="w"> </span><span class="nf">deprecate</span><span class="p">(</span><span class="n">in_favor_of</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="deprecate-1118"><a href="#deprecate-1118"><span class="linenos">1118</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="deprecate-1119"><a href="#deprecate-1119"><span class="linenos">1119</span></a> <span class="nd">@functools</span><span class="o">.</span><span class="n">wraps</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span id="deprecate-1120"><a href="#deprecate-1120"><span class="linenos">1120</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="deprecate-1121"><a href="#deprecate-1121"><span class="linenos">1121</span></a> <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
</span><span id="deprecate-1122"><a href="#deprecate-1122"><span class="linenos">1122</span></a> <span class="p">(</span>
</span><span id="deprecate-1123"><a href="#deprecate-1123"><span class="linenos">1123</span></a> <span class="sa">f</span><span class="s2">&quot;The &#39;</span><span class="si">{</span><span class="n">f</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">&#39; method is deprecated and may be removed in the future. &quot;</span>
</span><span id="deprecate-1124"><a href="#deprecate-1124"><span class="linenos">1124</span></a> <span class="sa">f</span><span class="s2">&quot;Consider </span><span class="si">{</span><span class="n">in_favor_of</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="deprecate-1125"><a href="#deprecate-1125"><span class="linenos">1125</span></a> <span class="p">),</span>
</span><span id="deprecate-1126"><a href="#deprecate-1126"><span class="linenos">1126</span></a> <span class="ne">DeprecationWarning</span><span class="p">,</span>
</span><span id="deprecate-1127"><a href="#deprecate-1127"><span class="linenos">1127</span></a> <span class="p">)</span>
</span><span id="deprecate-1128"><a href="#deprecate-1128"><span class="linenos">1128</span></a> <span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="deprecate-1129"><a href="#deprecate-1129"><span class="linenos">1129</span></a>
</span><span id="deprecate-1130"><a href="#deprecate-1130"><span class="linenos">1130</span></a> <span class="k">return</span> <span class="n">wrapper</span>
</span><span id="deprecate-1131"><a href="#deprecate-1131"><span class="linenos">1131</span></a>
</span><span id="deprecate-1132"><a href="#deprecate-1132"><span class="linenos">1132</span></a> <span class="k">return</span> <span class="n">decorator</span>
</span></pre></div>
</section>
<section id="get_workspace">
<input id="get_workspace-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_workspace</span><span class="signature pdoc-code condensed">(<span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="get_workspace-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_workspace"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_workspace-1135"><a href="#get_workspace-1135"><span class="linenos">1135</span></a><span class="nd">@init_global_client</span>
</span><span id="get_workspace-1136"><a href="#get_workspace-1136"><span class="linenos">1136</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_workspace</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="get_workspace-1137"><a href="#get_workspace-1137"><span class="linenos">1137</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">workspace</span>
</span></pre></div>
</section>
<section id="get_root_job_id">
<input id="get_root_job_id-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_root_job_id</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="get_root_job_id-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_root_job_id"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_root_job_id-1140"><a href="#get_root_job_id-1140"><span class="linenos">1140</span></a><span class="nd">@init_global_client</span>
</span><span id="get_root_job_id-1141"><a href="#get_root_job_id-1141"><span class="linenos">1141</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_root_job_id</span><span class="p">(</span><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="get_root_job_id-1142"><a href="#get_root_job_id-1142"><span class="linenos">1142</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_root_job_id</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span></pre></div>
</section>
<section id="get_version">
<input id="get_version-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<div class="decorator decorator-deprecate">@deprecate(&#39;Windmill().version&#39;)</div>
<span class="def">def</span>
<span class="name">get_version</span><span class="signature pdoc-code condensed">(<span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="get_version-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_version"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_version-1145"><a href="#get_version-1145"><span class="linenos">1145</span></a><span class="nd">@init_global_client</span>
</span><span id="get_version-1146"><a href="#get_version-1146"><span class="linenos">1146</span></a><span class="nd">@deprecate</span><span class="p">(</span><span class="s2">&quot;Windmill().version&quot;</span><span class="p">)</span>
</span><span id="get_version-1147"><a href="#get_version-1147"><span class="linenos">1147</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_version</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="get_version-1148"><a href="#get_version-1148"><span class="linenos">1148</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">version</span>
</span></pre></div>
</section>
<section id="run_script_async">
<input id="run_script_async-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">run_script_async</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">hash_or_path</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="run_script_async-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#run_script_async"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="run_script_async-1151"><a href="#run_script_async-1151"><span class="linenos">1151</span></a><span class="nd">@init_global_client</span>
</span><span id="run_script_async-1152"><a href="#run_script_async-1152"><span class="linenos">1152</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_async</span><span class="p">(</span>
</span><span id="run_script_async-1153"><a href="#run_script_async-1153"><span class="linenos">1153</span></a> <span class="n">hash_or_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="run_script_async-1154"><a href="#run_script_async-1154"><span class="linenos">1154</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_async-1155"><a href="#run_script_async-1155"><span class="linenos">1155</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_async-1156"><a href="#run_script_async-1156"><span class="linenos">1156</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="run_script_async-1157"><a href="#run_script_async-1157"><span class="linenos">1157</span></a> <span class="n">is_path</span> <span class="o">=</span> <span class="s2">&quot;/&quot;</span> <span class="ow">in</span> <span class="n">hash_or_path</span>
</span><span id="run_script_async-1158"><a href="#run_script_async-1158"><span class="linenos">1158</span></a> <span class="n">hash_</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="n">is_path</span> <span class="k">else</span> <span class="n">hash_or_path</span>
</span><span id="run_script_async-1159"><a href="#run_script_async-1159"><span class="linenos">1159</span></a> <span class="n">path</span> <span class="o">=</span> <span class="n">hash_or_path</span> <span class="k">if</span> <span class="n">is_path</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="run_script_async-1160"><a href="#run_script_async-1160"><span class="linenos">1160</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script_async</span><span class="p">(</span>
</span><span id="run_script_async-1161"><a href="#run_script_async-1161"><span class="linenos">1161</span></a> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span>
</span><span id="run_script_async-1162"><a href="#run_script_async-1162"><span class="linenos">1162</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="run_script_async-1163"><a href="#run_script_async-1163"><span class="linenos">1163</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="run_script_async-1164"><a href="#run_script_async-1164"><span class="linenos">1164</span></a> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">,</span>
</span><span id="run_script_async-1165"><a href="#run_script_async-1165"><span class="linenos">1165</span></a> <span class="p">)</span>
</span></pre></div>
</section>
<section id="run_flow_async">
<input id="run_flow_async-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">run_flow_async</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">do_not_track_in_parent</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="nb">str</span>:</span></span>
<label class="view-source-button" for="run_flow_async-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#run_flow_async"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="run_flow_async-1168"><a href="#run_flow_async-1168"><span class="linenos">1168</span></a><span class="nd">@init_global_client</span>
</span><span id="run_flow_async-1169"><a href="#run_flow_async-1169"><span class="linenos">1169</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_flow_async</span><span class="p">(</span>
</span><span id="run_flow_async-1170"><a href="#run_flow_async-1170"><span class="linenos">1170</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="run_flow_async-1171"><a href="#run_flow_async-1171"><span class="linenos">1171</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_flow_async-1172"><a href="#run_flow_async-1172"><span class="linenos">1172</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_flow_async-1173"><a href="#run_flow_async-1173"><span class="linenos">1173</span></a> <span class="c1"># can only be set to false if this the job will be fully await and not concurrent with any other job</span>
</span><span id="run_flow_async-1174"><a href="#run_flow_async-1174"><span class="linenos">1174</span></a> <span class="c1"># as otherwise the child flow and its own child will store their state in the parent job which will</span>
</span><span id="run_flow_async-1175"><a href="#run_flow_async-1175"><span class="linenos">1175</span></a> <span class="c1"># lead to incorrectness and failures</span>
</span><span id="run_flow_async-1176"><a href="#run_flow_async-1176"><span class="linenos">1176</span></a> <span class="n">do_not_track_in_parent</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="run_flow_async-1177"><a href="#run_flow_async-1177"><span class="linenos">1177</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="run_flow_async-1178"><a href="#run_flow_async-1178"><span class="linenos">1178</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_flow_async</span><span class="p">(</span>
</span><span id="run_flow_async-1179"><a href="#run_flow_async-1179"><span class="linenos">1179</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="run_flow_async-1180"><a href="#run_flow_async-1180"><span class="linenos">1180</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="run_flow_async-1181"><a href="#run_flow_async-1181"><span class="linenos">1181</span></a> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">,</span>
</span><span id="run_flow_async-1182"><a href="#run_flow_async-1182"><span class="linenos">1182</span></a> <span class="n">do_not_track_in_parent</span><span class="o">=</span><span class="n">do_not_track_in_parent</span><span class="p">,</span>
</span><span id="run_flow_async-1183"><a href="#run_flow_async-1183"><span class="linenos">1183</span></a> <span class="p">)</span>
</span></pre></div>
</section>
<section id="run_script_sync">
<input id="run_script_sync-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">run_script_sync</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="nb">hash</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">timeout</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="run_script_sync-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#run_script_sync"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="run_script_sync-1186"><a href="#run_script_sync-1186"><span class="linenos">1186</span></a><span class="nd">@init_global_client</span>
</span><span id="run_script_sync-1187"><a href="#run_script_sync-1187"><span class="linenos">1187</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_sync</span><span class="p">(</span>
</span><span id="run_script_sync-1188"><a href="#run_script_sync-1188"><span class="linenos">1188</span></a> <span class="nb">hash</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="run_script_sync-1189"><a href="#run_script_sync-1189"><span class="linenos">1189</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_sync-1190"><a href="#run_script_sync-1190"><span class="linenos">1190</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="run_script_sync-1191"><a href="#run_script_sync-1191"><span class="linenos">1191</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="run_script_sync-1192"><a href="#run_script_sync-1192"><span class="linenos">1192</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="run_script_sync-1193"><a href="#run_script_sync-1193"><span class="linenos">1193</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_sync-1194"><a href="#run_script_sync-1194"><span class="linenos">1194</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="run_script_sync-1195"><a href="#run_script_sync-1195"><span class="linenos">1195</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script</span><span class="p">(</span>
</span><span id="run_script_sync-1196"><a href="#run_script_sync-1196"><span class="linenos">1196</span></a> <span class="n">hash_</span><span class="o">=</span><span class="nb">hash</span><span class="p">,</span>
</span><span id="run_script_sync-1197"><a href="#run_script_sync-1197"><span class="linenos">1197</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="run_script_sync-1198"><a href="#run_script_sync-1198"><span class="linenos">1198</span></a> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="run_script_sync-1199"><a href="#run_script_sync-1199"><span class="linenos">1199</span></a> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span><span class="p">,</span>
</span><span id="run_script_sync-1200"><a href="#run_script_sync-1200"><span class="linenos">1200</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span>
</span><span id="run_script_sync-1201"><a href="#run_script_sync-1201"><span class="linenos">1201</span></a> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span>
</span><span id="run_script_sync-1202"><a href="#run_script_sync-1202"><span class="linenos">1202</span></a> <span class="p">)</span>
</span></pre></div>
</section>
<section id="run_script_by_path_async">
<input id="run_script_by_path_async-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">run_script_by_path_async</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">scheduled_in_secs</span><span class="p">:</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 class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="run_script_by_path_async-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#run_script_by_path_async"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="run_script_by_path_async-1205"><a href="#run_script_by_path_async-1205"><span class="linenos">1205</span></a><span class="nd">@init_global_client</span>
</span><span id="run_script_by_path_async-1206"><a href="#run_script_by_path_async-1206"><span class="linenos">1206</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_path_async</span><span class="p">(</span>
</span><span id="run_script_by_path_async-1207"><a href="#run_script_by_path_async-1207"><span class="linenos">1207</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="run_script_by_path_async-1208"><a href="#run_script_by_path_async-1208"><span class="linenos">1208</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_by_path_async-1209"><a href="#run_script_by_path_async-1209"><span class="linenos">1209</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_by_path_async-1210"><a href="#run_script_by_path_async-1210"><span class="linenos">1210</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="run_script_by_path_async-1211"><a href="#run_script_by_path_async-1211"><span class="linenos">1211</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script_by_path_async</span><span class="p">(</span>
</span><span id="run_script_by_path_async-1212"><a href="#run_script_by_path_async-1212"><span class="linenos">1212</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="run_script_by_path_async-1213"><a href="#run_script_by_path_async-1213"><span class="linenos">1213</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="run_script_by_path_async-1214"><a href="#run_script_by_path_async-1214"><span class="linenos">1214</span></a> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">,</span>
</span><span id="run_script_by_path_async-1215"><a href="#run_script_by_path_async-1215"><span class="linenos">1215</span></a> <span class="p">)</span>
</span></pre></div>
</section>
<section id="run_script_by_hash_async">
<input id="run_script_by_hash_async-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">run_script_by_hash_async</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">scheduled_in_secs</span><span class="p">:</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 class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="run_script_by_hash_async-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#run_script_by_hash_async"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="run_script_by_hash_async-1218"><a href="#run_script_by_hash_async-1218"><span class="linenos">1218</span></a><span class="nd">@init_global_client</span>
</span><span id="run_script_by_hash_async-1219"><a href="#run_script_by_hash_async-1219"><span class="linenos">1219</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_hash_async</span><span class="p">(</span>
</span><span id="run_script_by_hash_async-1220"><a href="#run_script_by_hash_async-1220"><span class="linenos">1220</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="run_script_by_hash_async-1221"><a href="#run_script_by_hash_async-1221"><span class="linenos">1221</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_by_hash_async-1222"><a href="#run_script_by_hash_async-1222"><span class="linenos">1222</span></a> <span class="n">scheduled_in_secs</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_by_hash_async-1223"><a href="#run_script_by_hash_async-1223"><span class="linenos">1223</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="run_script_by_hash_async-1224"><a href="#run_script_by_hash_async-1224"><span class="linenos">1224</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script_by_hash_async</span><span class="p">(</span>
</span><span id="run_script_by_hash_async-1225"><a href="#run_script_by_hash_async-1225"><span class="linenos">1225</span></a> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span>
</span><span id="run_script_by_hash_async-1226"><a href="#run_script_by_hash_async-1226"><span class="linenos">1226</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="run_script_by_hash_async-1227"><a href="#run_script_by_hash_async-1227"><span class="linenos">1227</span></a> <span class="n">scheduled_in_secs</span><span class="o">=</span><span class="n">scheduled_in_secs</span><span class="p">,</span>
</span><span id="run_script_by_hash_async-1228"><a href="#run_script_by_hash_async-1228"><span class="linenos">1228</span></a> <span class="p">)</span>
</span></pre></div>
</section>
<section id="run_script_by_path_sync">
<input id="run_script_by_path_sync-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">run_script_by_path_sync</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">timeout</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="run_script_by_path_sync-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#run_script_by_path_sync"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="run_script_by_path_sync-1231"><a href="#run_script_by_path_sync-1231"><span class="linenos">1231</span></a><span class="nd">@init_global_client</span>
</span><span id="run_script_by_path_sync-1232"><a href="#run_script_by_path_sync-1232"><span class="linenos">1232</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_path_sync</span><span class="p">(</span>
</span><span id="run_script_by_path_sync-1233"><a href="#run_script_by_path_sync-1233"><span class="linenos">1233</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1234"><a href="#run_script_by_path_sync-1234"><span class="linenos">1234</span></a> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1235"><a href="#run_script_by_path_sync-1235"><span class="linenos">1235</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1236"><a href="#run_script_by_path_sync-1236"><span class="linenos">1236</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1237"><a href="#run_script_by_path_sync-1237"><span class="linenos">1237</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1238"><a href="#run_script_by_path_sync-1238"><span class="linenos">1238</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1239"><a href="#run_script_by_path_sync-1239"><span class="linenos">1239</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="run_script_by_path_sync-1240"><a href="#run_script_by_path_sync-1240"><span class="linenos">1240</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script</span><span class="p">(</span>
</span><span id="run_script_by_path_sync-1241"><a href="#run_script_by_path_sync-1241"><span class="linenos">1241</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1242"><a href="#run_script_by_path_sync-1242"><span class="linenos">1242</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1243"><a href="#run_script_by_path_sync-1243"><span class="linenos">1243</span></a> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1244"><a href="#run_script_by_path_sync-1244"><span class="linenos">1244</span></a> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1245"><a href="#run_script_by_path_sync-1245"><span class="linenos">1245</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1246"><a href="#run_script_by_path_sync-1246"><span class="linenos">1246</span></a> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span>
</span><span id="run_script_by_path_sync-1247"><a href="#run_script_by_path_sync-1247"><span class="linenos">1247</span></a> <span class="p">)</span>
</span></pre></div>
</section>
<section id="get_id_token">
<input id="get_id_token-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_id_token</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">audience</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="get_id_token-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_id_token"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_id_token-1250"><a href="#get_id_token-1250"><span class="linenos">1250</span></a><span class="nd">@init_global_client</span>
</span><span id="get_id_token-1251"><a href="#get_id_token-1251"><span class="linenos">1251</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_id_token</span><span class="p">(</span><span class="n">audience</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="get_id_token-1252"><a href="#get_id_token-1252"><span class="linenos">1252</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="get_id_token-1253"><a href="#get_id_token-1253"><span class="linenos">1253</span></a><span class="sd"> Get a JWT token for the given audience for OIDC purposes to login into third parties like AWS, Vault, GCP, etc.</span>
</span><span id="get_id_token-1254"><a href="#get_id_token-1254"><span class="linenos">1254</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="get_id_token-1255"><a href="#get_id_token-1255"><span class="linenos">1255</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_id_token</span><span class="p">(</span><span class="n">audience</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Get a JWT token for the given audience for OIDC purposes to login into third parties like AWS, Vault, GCP, etc.</p>
</div>
</section>
<section id="get_job_status">
<input id="get_job_status-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_job_status</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="n">Literal</span><span class="p">[</span><span class="s1">&#39;RUNNING&#39;</span><span class="p">,</span> <span class="s1">&#39;WAITING&#39;</span><span class="p">,</span> <span class="s1">&#39;COMPLETED&#39;</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="get_job_status-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_job_status"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_job_status-1258"><a href="#get_job_status-1258"><span class="linenos">1258</span></a><span class="nd">@init_global_client</span>
</span><span id="get_job_status-1259"><a href="#get_job_status-1259"><span class="linenos">1259</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_job_status</span><span class="p">(</span><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">JobStatus</span><span class="p">:</span>
</span><span id="get_job_status-1260"><a href="#get_job_status-1260"><span class="linenos">1260</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_job_status</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span></pre></div>
</section>
<section id="get_result">
<input id="get_result-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_result</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="kc">True</span></span><span class="return-annotation">) -> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="get_result-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_result"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_result-1263"><a href="#get_result-1263"><span class="linenos">1263</span></a><span class="nd">@init_global_client</span>
</span><span id="get_result-1264"><a href="#get_result-1264"><span class="linenos">1264</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_result</span><span class="p">(</span><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
</span><span id="get_result-1265"><a href="#get_result-1265"><span class="linenos">1265</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_result</span><span class="p">(</span>
</span><span id="get_result-1266"><a href="#get_result-1266"><span class="linenos">1266</span></a> <span class="n">job_id</span><span class="o">=</span><span class="n">job_id</span><span class="p">,</span> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span>
</span><span id="get_result-1267"><a href="#get_result-1267"><span class="linenos">1267</span></a> <span class="p">)</span>
</span></pre></div>
</section>
<section id="duckdb_connection_settings">
<input id="duckdb_connection_settings-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">duckdb_connection_settings</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">s3_resource_path</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="n"><a href="s3_types.html#DuckDbConnectionSettings">wmill.s3_types.DuckDbConnectionSettings</a></span>:</span></span>
<label class="view-source-button" for="duckdb_connection_settings-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#duckdb_connection_settings"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="duckdb_connection_settings-1270"><a href="#duckdb_connection_settings-1270"><span class="linenos">1270</span></a><span class="nd">@init_global_client</span>
</span><span id="duckdb_connection_settings-1271"><a href="#duckdb_connection_settings-1271"><span class="linenos">1271</span></a><span class="k">def</span><span class="w"> </span><span class="nf">duckdb_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</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="n">DuckDbConnectionSettings</span><span class="p">:</span>
</span><span id="duckdb_connection_settings-1272"><a href="#duckdb_connection_settings-1272"><span class="linenos">1272</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="duckdb_connection_settings-1273"><a href="#duckdb_connection_settings-1273"><span class="linenos">1273</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="duckdb_connection_settings-1274"><a href="#duckdb_connection_settings-1274"><span class="linenos">1274</span></a><span class="sd"> initiate an S3 connection from DuckDB</span>
</span><span id="duckdb_connection_settings-1275"><a href="#duckdb_connection_settings-1275"><span class="linenos">1275</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="duckdb_connection_settings-1276"><a href="#duckdb_connection_settings-1276"><span class="linenos">1276</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_duckdb_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Convenient helpers that takes an S3 resource as input and returns the settings necessary to
initiate an S3 connection from DuckDB</p>
</div>
</section>
<section id="polars_connection_settings">
<input id="polars_connection_settings-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">polars_connection_settings</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">s3_resource_path</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="n"><a href="s3_types.html#PolarsConnectionSettings">wmill.s3_types.PolarsConnectionSettings</a></span>:</span></span>
<label class="view-source-button" for="polars_connection_settings-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#polars_connection_settings"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="polars_connection_settings-1279"><a href="#polars_connection_settings-1279"><span class="linenos">1279</span></a><span class="nd">@init_global_client</span>
</span><span id="polars_connection_settings-1280"><a href="#polars_connection_settings-1280"><span class="linenos">1280</span></a><span class="k">def</span><span class="w"> </span><span class="nf">polars_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</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="n">PolarsConnectionSettings</span><span class="p">:</span>
</span><span id="polars_connection_settings-1281"><a href="#polars_connection_settings-1281"><span class="linenos">1281</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="polars_connection_settings-1282"><a href="#polars_connection_settings-1282"><span class="linenos">1282</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="polars_connection_settings-1283"><a href="#polars_connection_settings-1283"><span class="linenos">1283</span></a><span class="sd"> initiate an S3 connection from Polars</span>
</span><span id="polars_connection_settings-1284"><a href="#polars_connection_settings-1284"><span class="linenos">1284</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="polars_connection_settings-1285"><a href="#polars_connection_settings-1285"><span class="linenos">1285</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_polars_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Convenient helpers that takes an S3 resource as input and returns the settings necessary to
initiate an S3 connection from Polars</p>
</div>
</section>
<section id="boto3_connection_settings">
<input id="boto3_connection_settings-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">boto3_connection_settings</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">s3_resource_path</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="n"><a href="s3_types.html#Boto3ConnectionSettings">wmill.s3_types.Boto3ConnectionSettings</a></span>:</span></span>
<label class="view-source-button" for="boto3_connection_settings-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#boto3_connection_settings"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="boto3_connection_settings-1288"><a href="#boto3_connection_settings-1288"><span class="linenos">1288</span></a><span class="nd">@init_global_client</span>
</span><span id="boto3_connection_settings-1289"><a href="#boto3_connection_settings-1289"><span class="linenos">1289</span></a><span class="k">def</span><span class="w"> </span><span class="nf">boto3_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</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="n">Boto3ConnectionSettings</span><span class="p">:</span>
</span><span id="boto3_connection_settings-1290"><a href="#boto3_connection_settings-1290"><span class="linenos">1290</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="boto3_connection_settings-1291"><a href="#boto3_connection_settings-1291"><span class="linenos">1291</span></a><span class="sd"> Convenient helpers that takes an S3 resource as input and returns the settings necessary to</span>
</span><span id="boto3_connection_settings-1292"><a href="#boto3_connection_settings-1292"><span class="linenos">1292</span></a><span class="sd"> initiate an S3 connection using boto3</span>
</span><span id="boto3_connection_settings-1293"><a href="#boto3_connection_settings-1293"><span class="linenos">1293</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="boto3_connection_settings-1294"><a href="#boto3_connection_settings-1294"><span class="linenos">1294</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_boto3_connection_settings</span><span class="p">(</span><span class="n">s3_resource_path</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Convenient helpers that takes an S3 resource as input and returns the settings necessary to
initiate an S3 connection using boto3</p>
</div>
</section>
<section id="load_s3_file">
<input id="load_s3_file-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">load_s3_file</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">s3object</span><span class="p">:</span> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">bytes</span>:</span></span>
<label class="view-source-button" for="load_s3_file-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#load_s3_file"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="load_s3_file-1297"><a href="#load_s3_file-1297"><span class="linenos">1297</span></a><span class="nd">@init_global_client</span>
</span><span id="load_s3_file-1298"><a href="#load_s3_file-1298"><span class="linenos">1298</span></a><span class="k">def</span><span class="w"> </span><span class="nf">load_s3_file</span><span class="p">(</span><span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bytes</span><span class="p">:</span>
</span><span id="load_s3_file-1299"><a href="#load_s3_file-1299"><span class="linenos">1299</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="load_s3_file-1300"><a href="#load_s3_file-1300"><span class="linenos">1300</span></a><span class="sd"> Load the entire content of a file stored in S3 as bytes</span>
</span><span id="load_s3_file-1301"><a href="#load_s3_file-1301"><span class="linenos">1301</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="load_s3_file-1302"><a href="#load_s3_file-1302"><span class="linenos">1302</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">load_s3_file</span><span class="p">(</span>
</span><span id="load_s3_file-1303"><a href="#load_s3_file-1303"><span class="linenos">1303</span></a> <span class="n">s3object</span><span class="p">,</span> <span class="n">s3_resource_path</span> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="load_s3_file-1304"><a href="#load_s3_file-1304"><span class="linenos">1304</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Load the entire content of a file stored in S3 as bytes</p>
</div>
</section>
<section id="load_s3_file_reader">
<input id="load_s3_file_reader-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">load_s3_file_reader</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">s3object</span><span class="p">:</span> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n">_io</span><span class="o">.</span><span class="n">BufferedReader</span>:</span></span>
<label class="view-source-button" for="load_s3_file_reader-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#load_s3_file_reader"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="load_s3_file_reader-1307"><a href="#load_s3_file_reader-1307"><span class="linenos">1307</span></a><span class="nd">@init_global_client</span>
</span><span id="load_s3_file_reader-1308"><a href="#load_s3_file_reader-1308"><span class="linenos">1308</span></a><span class="k">def</span><span class="w"> </span><span class="nf">load_s3_file_reader</span><span class="p">(</span>
</span><span id="load_s3_file_reader-1309"><a href="#load_s3_file_reader-1309"><span class="linenos">1309</span></a> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="load_s3_file_reader-1310"><a href="#load_s3_file_reader-1310"><span class="linenos">1310</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">BufferedReader</span><span class="p">:</span>
</span><span id="load_s3_file_reader-1311"><a href="#load_s3_file_reader-1311"><span class="linenos">1311</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="load_s3_file_reader-1312"><a href="#load_s3_file_reader-1312"><span class="linenos">1312</span></a><span class="sd"> Load the content of a file stored in S3</span>
</span><span id="load_s3_file_reader-1313"><a href="#load_s3_file_reader-1313"><span class="linenos">1313</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="load_s3_file_reader-1314"><a href="#load_s3_file_reader-1314"><span class="linenos">1314</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">load_s3_file_reader</span><span class="p">(</span>
</span><span id="load_s3_file_reader-1315"><a href="#load_s3_file_reader-1315"><span class="linenos">1315</span></a> <span class="n">s3object</span><span class="p">,</span> <span class="n">s3_resource_path</span> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="load_s3_file_reader-1316"><a href="#load_s3_file_reader-1316"><span class="linenos">1316</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Load the content of a file stored in S3</p>
</div>
</section>
<section id="write_s3_file">
<input id="write_s3_file-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">write_s3_file</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">s3object</span><span class="p">:</span> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">file_content</span><span class="p">:</span> <span class="n">_io</span><span class="o">.</span><span class="n">BufferedReader</span> <span class="o">|</span> <span class="nb">bytes</span>,</span><span class="param"> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">content_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">content_disposition</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span>:</span></span>
<label class="view-source-button" for="write_s3_file-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#write_s3_file"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="write_s3_file-1319"><a href="#write_s3_file-1319"><span class="linenos">1319</span></a><span class="nd">@init_global_client</span>
</span><span id="write_s3_file-1320"><a href="#write_s3_file-1320"><span class="linenos">1320</span></a><span class="k">def</span><span class="w"> </span><span class="nf">write_s3_file</span><span class="p">(</span>
</span><span id="write_s3_file-1321"><a href="#write_s3_file-1321"><span class="linenos">1321</span></a> <span class="n">s3object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="write_s3_file-1322"><a href="#write_s3_file-1322"><span class="linenos">1322</span></a> <span class="n">file_content</span><span class="p">:</span> <span class="n">BufferedReader</span> <span class="o">|</span> <span class="nb">bytes</span><span class="p">,</span>
</span><span id="write_s3_file-1323"><a href="#write_s3_file-1323"><span class="linenos">1323</span></a> <span class="n">s3_resource_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="write_s3_file-1324"><a href="#write_s3_file-1324"><span class="linenos">1324</span></a> <span class="n">content_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="write_s3_file-1325"><a href="#write_s3_file-1325"><span class="linenos">1325</span></a> <span class="n">content_disposition</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="write_s3_file-1326"><a href="#write_s3_file-1326"><span class="linenos">1326</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="write_s3_file-1327"><a href="#write_s3_file-1327"><span class="linenos">1327</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="write_s3_file-1328"><a href="#write_s3_file-1328"><span class="linenos">1328</span></a><span class="sd"> Upload a file to S3</span>
</span><span id="write_s3_file-1329"><a href="#write_s3_file-1329"><span class="linenos">1329</span></a>
</span><span id="write_s3_file-1330"><a href="#write_s3_file-1330"><span class="linenos">1330</span></a><span class="sd"> Content type will be automatically guessed from path extension if left empty</span>
</span><span id="write_s3_file-1331"><a href="#write_s3_file-1331"><span class="linenos">1331</span></a>
</span><span id="write_s3_file-1332"><a href="#write_s3_file-1332"><span class="linenos">1332</span></a><span class="sd"> See MDN for content_disposition: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition</span>
</span><span id="write_s3_file-1333"><a href="#write_s3_file-1333"><span class="linenos">1333</span></a><span class="sd"> and content_type: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type</span>
</span><span id="write_s3_file-1334"><a href="#write_s3_file-1334"><span class="linenos">1334</span></a>
</span><span id="write_s3_file-1335"><a href="#write_s3_file-1335"><span class="linenos">1335</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="write_s3_file-1336"><a href="#write_s3_file-1336"><span class="linenos">1336</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">write_s3_file</span><span class="p">(</span>
</span><span id="write_s3_file-1337"><a href="#write_s3_file-1337"><span class="linenos">1337</span></a> <span class="n">s3object</span><span class="p">,</span>
</span><span id="write_s3_file-1338"><a href="#write_s3_file-1338"><span class="linenos">1338</span></a> <span class="n">file_content</span><span class="p">,</span>
</span><span id="write_s3_file-1339"><a href="#write_s3_file-1339"><span class="linenos">1339</span></a> <span class="n">s3_resource_path</span> <span class="k">if</span> <span class="n">s3_resource_path</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="write_s3_file-1340"><a href="#write_s3_file-1340"><span class="linenos">1340</span></a> <span class="n">content_type</span><span class="p">,</span>
</span><span id="write_s3_file-1341"><a href="#write_s3_file-1341"><span class="linenos">1341</span></a> <span class="n">content_disposition</span><span class="p">,</span>
</span><span id="write_s3_file-1342"><a href="#write_s3_file-1342"><span class="linenos">1342</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Upload a file to S3</p>
<p>Content type will be automatically guessed from path extension if left empty</p>
<p>See MDN for content_disposition: <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition">https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition</a>
and content_type: <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type">https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type</a></p>
</div>
</section>
<section id="sign_s3_objects">
<input id="sign_s3_objects-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">sign_s3_objects</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="nb">list</span><span class="p">[</span><span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="sign_s3_objects-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#sign_s3_objects"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="sign_s3_objects-1345"><a href="#sign_s3_objects-1345"><span class="linenos">1345</span></a><span class="nd">@init_global_client</span>
</span><span id="sign_s3_objects-1346"><a href="#sign_s3_objects-1346"><span class="linenos">1346</span></a><span class="k">def</span><span class="w"> </span><span class="nf">sign_s3_objects</span><span class="p">(</span><span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span><span class="p">]:</span>
</span><span id="sign_s3_objects-1347"><a href="#sign_s3_objects-1347"><span class="linenos">1347</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="sign_s3_objects-1348"><a href="#sign_s3_objects-1348"><span class="linenos">1348</span></a><span class="sd"> Sign S3 objects to be used by anonymous users in public apps</span>
</span><span id="sign_s3_objects-1349"><a href="#sign_s3_objects-1349"><span class="linenos">1349</span></a><span class="sd"> Returns a list of signed s3 tokens</span>
</span><span id="sign_s3_objects-1350"><a href="#sign_s3_objects-1350"><span class="linenos">1350</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="sign_s3_objects-1351"><a href="#sign_s3_objects-1351"><span class="linenos">1351</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">sign_s3_objects</span><span class="p">(</span><span class="n">s3_objects</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Sign S3 objects to be used by anonymous users in public apps
Returns a list of signed s3 tokens</p>
</div>
</section>
<section id="sign_s3_object">
<input id="sign_s3_object-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">sign_s3_object</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">s3_object</span><span class="p">:</span> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span>:</span></span>
<label class="view-source-button" for="sign_s3_object-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#sign_s3_object"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="sign_s3_object-1354"><a href="#sign_s3_object-1354"><span class="linenos">1354</span></a><span class="nd">@init_global_client</span>
</span><span id="sign_s3_object-1355"><a href="#sign_s3_object-1355"><span class="linenos">1355</span></a><span class="k">def</span><span class="w"> </span><span class="nf">sign_s3_object</span><span class="p">(</span><span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span><span class="o">|</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="sign_s3_object-1356"><a href="#sign_s3_object-1356"><span class="linenos">1356</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="sign_s3_object-1357"><a href="#sign_s3_object-1357"><span class="linenos">1357</span></a><span class="sd"> Sign S3 object to be used by anonymous users in public apps</span>
</span><span id="sign_s3_object-1358"><a href="#sign_s3_object-1358"><span class="linenos">1358</span></a><span class="sd"> Returns a signed s3 object</span>
</span><span id="sign_s3_object-1359"><a href="#sign_s3_object-1359"><span class="linenos">1359</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="sign_s3_object-1360"><a href="#sign_s3_object-1360"><span class="linenos">1360</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">sign_s3_object</span><span class="p">(</span><span class="n">s3_object</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Sign S3 object to be used by anonymous users in public apps
Returns a signed s3 object</p>
</div>
</section>
<section id="get_presigned_s3_public_urls">
<input id="get_presigned_s3_public_urls-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_presigned_s3_public_urls</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span><span class="p">]</span>,</span><span class="param"> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="get_presigned_s3_public_urls-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_presigned_s3_public_urls"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_presigned_s3_public_urls-1363"><a href="#get_presigned_s3_public_urls-1363"><span class="linenos">1363</span></a><span class="nd">@init_global_client</span>
</span><span id="get_presigned_s3_public_urls-1364"><a href="#get_presigned_s3_public_urls-1364"><span class="linenos">1364</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_presigned_s3_public_urls</span><span class="p">(</span>
</span><span id="get_presigned_s3_public_urls-1365"><a href="#get_presigned_s3_public_urls-1365"><span class="linenos">1365</span></a> <span class="n">s3_objects</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">],</span>
</span><span id="get_presigned_s3_public_urls-1366"><a href="#get_presigned_s3_public_urls-1366"><span class="linenos">1366</span></a> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="get_presigned_s3_public_urls-1367"><a href="#get_presigned_s3_public_urls-1367"><span class="linenos">1367</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span><span id="get_presigned_s3_public_urls-1368"><a href="#get_presigned_s3_public_urls-1368"><span class="linenos">1368</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="get_presigned_s3_public_urls-1369"><a href="#get_presigned_s3_public_urls-1369"><span class="linenos">1369</span></a><span class="sd"> Generate presigned public URLs for an array of S3 objects.</span>
</span><span id="get_presigned_s3_public_urls-1370"><a href="#get_presigned_s3_public_urls-1370"><span class="linenos">1370</span></a><span class="sd"> If an S3 object is not signed yet, it will be signed first.</span>
</span><span id="get_presigned_s3_public_urls-1371"><a href="#get_presigned_s3_public_urls-1371"><span class="linenos">1371</span></a>
</span><span id="get_presigned_s3_public_urls-1372"><a href="#get_presigned_s3_public_urls-1372"><span class="linenos">1372</span></a><span class="sd"> Args:</span>
</span><span id="get_presigned_s3_public_urls-1373"><a href="#get_presigned_s3_public_urls-1373"><span class="linenos">1373</span></a><span class="sd"> s3_objects: List of S3 objects to sign</span>
</span><span id="get_presigned_s3_public_urls-1374"><a href="#get_presigned_s3_public_urls-1374"><span class="linenos">1374</span></a><span class="sd"> base_url: Optional base URL for the presigned URLs (defaults to WM_BASE_URL)</span>
</span><span id="get_presigned_s3_public_urls-1375"><a href="#get_presigned_s3_public_urls-1375"><span class="linenos">1375</span></a>
</span><span id="get_presigned_s3_public_urls-1376"><a href="#get_presigned_s3_public_urls-1376"><span class="linenos">1376</span></a><span class="sd"> Returns:</span>
</span><span id="get_presigned_s3_public_urls-1377"><a href="#get_presigned_s3_public_urls-1377"><span class="linenos">1377</span></a><span class="sd"> List of signed public URLs</span>
</span><span id="get_presigned_s3_public_urls-1378"><a href="#get_presigned_s3_public_urls-1378"><span class="linenos">1378</span></a>
</span><span id="get_presigned_s3_public_urls-1379"><a href="#get_presigned_s3_public_urls-1379"><span class="linenos">1379</span></a><span class="sd"> Example:</span>
</span><span id="get_presigned_s3_public_urls-1380"><a href="#get_presigned_s3_public_urls-1380"><span class="linenos">1380</span></a><span class="sd"> &gt;&gt;&gt; import wmill</span>
</span><span id="get_presigned_s3_public_urls-1381"><a href="#get_presigned_s3_public_urls-1381"><span class="linenos">1381</span></a><span class="sd"> &gt;&gt;&gt; from wmill import S3Object</span>
</span><span id="get_presigned_s3_public_urls-1382"><a href="#get_presigned_s3_public_urls-1382"><span class="linenos">1382</span></a><span class="sd"> &gt;&gt;&gt; s3_objs = [S3Object(s3=&quot;/path/to/file1.txt&quot;), S3Object(s3=&quot;/path/to/file2.txt&quot;)]</span>
</span><span id="get_presigned_s3_public_urls-1383"><a href="#get_presigned_s3_public_urls-1383"><span class="linenos">1383</span></a><span class="sd"> &gt;&gt;&gt; urls = wmill.get_presigned_s3_public_urls(s3_objs)</span>
</span><span id="get_presigned_s3_public_urls-1384"><a href="#get_presigned_s3_public_urls-1384"><span class="linenos">1384</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="get_presigned_s3_public_urls-1385"><a href="#get_presigned_s3_public_urls-1385"><span class="linenos">1385</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_presigned_s3_public_urls</span><span class="p">(</span><span class="n">s3_objects</span><span class="p">,</span> <span class="n">base_url</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Generate presigned public URLs for an array of S3 objects.
If an S3 object is not signed yet, it will be signed first.</p>
<p>Args:
s3_objects: List of S3 objects to sign
base_url: Optional base URL for the presigned URLs (defaults to WM_BASE_URL)</p>
<p>Returns:
List of signed public URLs</p>
<p>Example:</p>
<blockquote>
<blockquote>
<blockquote>
<p>import wmill
from wmill import S3Object
s3_objs = [S3Object(s3="/path/to/file1.txt"), S3Object(s3="/path/to/file2.txt")]
urls = <a href="#get_presigned_s3_public_urls">wmill.get_presigned_s3_public_urls</a>(s3_objs)</p>
</blockquote>
</blockquote>
</blockquote>
</div>
</section>
<section id="get_presigned_s3_public_url">
<input id="get_presigned_s3_public_url-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_presigned_s3_public_url</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">s3_object</span><span class="p">:</span> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="get_presigned_s3_public_url-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_presigned_s3_public_url"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_presigned_s3_public_url-1388"><a href="#get_presigned_s3_public_url-1388"><span class="linenos">1388</span></a><span class="nd">@init_global_client</span>
</span><span id="get_presigned_s3_public_url-1389"><a href="#get_presigned_s3_public_url-1389"><span class="linenos">1389</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_presigned_s3_public_url</span><span class="p">(</span>
</span><span id="get_presigned_s3_public_url-1390"><a href="#get_presigned_s3_public_url-1390"><span class="linenos">1390</span></a> <span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="get_presigned_s3_public_url-1391"><a href="#get_presigned_s3_public_url-1391"><span class="linenos">1391</span></a> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="get_presigned_s3_public_url-1392"><a href="#get_presigned_s3_public_url-1392"><span class="linenos">1392</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="get_presigned_s3_public_url-1393"><a href="#get_presigned_s3_public_url-1393"><span class="linenos">1393</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="get_presigned_s3_public_url-1394"><a href="#get_presigned_s3_public_url-1394"><span class="linenos">1394</span></a><span class="sd"> Generate a presigned public URL for an S3 object.</span>
</span><span id="get_presigned_s3_public_url-1395"><a href="#get_presigned_s3_public_url-1395"><span class="linenos">1395</span></a><span class="sd"> If the S3 object is not signed yet, it will be signed first.</span>
</span><span id="get_presigned_s3_public_url-1396"><a href="#get_presigned_s3_public_url-1396"><span class="linenos">1396</span></a>
</span><span id="get_presigned_s3_public_url-1397"><a href="#get_presigned_s3_public_url-1397"><span class="linenos">1397</span></a><span class="sd"> Args:</span>
</span><span id="get_presigned_s3_public_url-1398"><a href="#get_presigned_s3_public_url-1398"><span class="linenos">1398</span></a><span class="sd"> s3_object: S3 object to sign</span>
</span><span id="get_presigned_s3_public_url-1399"><a href="#get_presigned_s3_public_url-1399"><span class="linenos">1399</span></a><span class="sd"> base_url: Optional base URL for the presigned URL (defaults to WM_BASE_URL)</span>
</span><span id="get_presigned_s3_public_url-1400"><a href="#get_presigned_s3_public_url-1400"><span class="linenos">1400</span></a>
</span><span id="get_presigned_s3_public_url-1401"><a href="#get_presigned_s3_public_url-1401"><span class="linenos">1401</span></a><span class="sd"> Returns:</span>
</span><span id="get_presigned_s3_public_url-1402"><a href="#get_presigned_s3_public_url-1402"><span class="linenos">1402</span></a><span class="sd"> Signed public URL</span>
</span><span id="get_presigned_s3_public_url-1403"><a href="#get_presigned_s3_public_url-1403"><span class="linenos">1403</span></a>
</span><span id="get_presigned_s3_public_url-1404"><a href="#get_presigned_s3_public_url-1404"><span class="linenos">1404</span></a><span class="sd"> Example:</span>
</span><span id="get_presigned_s3_public_url-1405"><a href="#get_presigned_s3_public_url-1405"><span class="linenos">1405</span></a><span class="sd"> &gt;&gt;&gt; import wmill</span>
</span><span id="get_presigned_s3_public_url-1406"><a href="#get_presigned_s3_public_url-1406"><span class="linenos">1406</span></a><span class="sd"> &gt;&gt;&gt; from wmill import S3Object</span>
</span><span id="get_presigned_s3_public_url-1407"><a href="#get_presigned_s3_public_url-1407"><span class="linenos">1407</span></a><span class="sd"> &gt;&gt;&gt; s3_obj = S3Object(s3=&quot;/path/to/file.txt&quot;)</span>
</span><span id="get_presigned_s3_public_url-1408"><a href="#get_presigned_s3_public_url-1408"><span class="linenos">1408</span></a><span class="sd"> &gt;&gt;&gt; url = wmill.get_presigned_s3_public_url(s3_obj)</span>
</span><span id="get_presigned_s3_public_url-1409"><a href="#get_presigned_s3_public_url-1409"><span class="linenos">1409</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="get_presigned_s3_public_url-1410"><a href="#get_presigned_s3_public_url-1410"><span class="linenos">1410</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_presigned_s3_public_url</span><span class="p">(</span><span class="n">s3_object</span><span class="p">,</span> <span class="n">base_url</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Generate a presigned public URL for an S3 object.
If the S3 object is not signed yet, it will be signed first.</p>
<p>Args:
s3_object: S3 object to sign
base_url: Optional base URL for the presigned URL (defaults to WM_BASE_URL)</p>
<p>Returns:
Signed public URL</p>
<p>Example:</p>
<blockquote>
<blockquote>
<blockquote>
<p>import wmill
from wmill import S3Object
s3_obj = S3Object(s3="/path/to/file.txt")
url = <a href="#get_presigned_s3_public_url">wmill.get_presigned_s3_public_url</a>(s3_obj)</p>
</blockquote>
</blockquote>
</blockquote>
</div>
</section>
<section id="whoami">
<input id="whoami-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">whoami</span><span class="signature pdoc-code condensed">(<span class="return-annotation">) -> <span class="nb">dict</span>:</span></span>
<label class="view-source-button" for="whoami-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#whoami"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="whoami-1413"><a href="#whoami-1413"><span class="linenos">1413</span></a><span class="nd">@init_global_client</span>
</span><span id="whoami-1414"><a href="#whoami-1414"><span class="linenos">1414</span></a><span class="k">def</span><span class="w"> </span><span class="nf">whoami</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="whoami-1415"><a href="#whoami-1415"><span class="linenos">1415</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="whoami-1416"><a href="#whoami-1416"><span class="linenos">1416</span></a><span class="sd"> Returns the current user</span>
</span><span id="whoami-1417"><a href="#whoami-1417"><span class="linenos">1417</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="whoami-1418"><a href="#whoami-1418"><span class="linenos">1418</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">user</span>
</span></pre></div>
<div class="docstring"><p>Returns the current user</p>
</div>
</section>
<section id="get_state">
<input id="get_state-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<div class="decorator decorator-deprecate">@deprecate(&#39;Windmill().state&#39;)</div>
<span class="def">def</span>
<span class="name">get_state</span><span class="signature pdoc-code condensed">(<span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="get_state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_state-1421"><a href="#get_state-1421"><span class="linenos">1421</span></a><span class="nd">@init_global_client</span>
</span><span id="get_state-1422"><a href="#get_state-1422"><span class="linenos">1422</span></a><span class="nd">@deprecate</span><span class="p">(</span><span class="s2">&quot;Windmill().state&quot;</span><span class="p">)</span>
</span><span id="get_state-1423"><a href="#get_state-1423"><span class="linenos">1423</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_state</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="get_state-1424"><a href="#get_state-1424"><span class="linenos">1424</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="get_state-1425"><a href="#get_state-1425"><span class="linenos">1425</span></a><span class="sd"> Get the state</span>
</span><span id="get_state-1426"><a href="#get_state-1426"><span class="linenos">1426</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="get_state-1427"><a href="#get_state-1427"><span class="linenos">1427</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">state</span>
</span></pre></div>
<div class="docstring"><p>Get the state</p>
</div>
</section>
<section id="get_resource">
<input id="get_resource-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_resource</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">path</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">none_if_undefined</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="nb">dict</span> <span class="o">|</span> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="get_resource-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_resource"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_resource-1430"><a href="#get_resource-1430"><span class="linenos">1430</span></a><span class="nd">@init_global_client</span>
</span><span id="get_resource-1431"><a href="#get_resource-1431"><span class="linenos">1431</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_resource</span><span class="p">(</span>
</span><span id="get_resource-1432"><a href="#get_resource-1432"><span class="linenos">1432</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="get_resource-1433"><a href="#get_resource-1433"><span class="linenos">1433</span></a> <span class="n">none_if_undefined</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="get_resource-1434"><a href="#get_resource-1434"><span class="linenos">1434</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="get_resource-1435"><a href="#get_resource-1435"><span class="linenos">1435</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get resource from Windmill&quot;&quot;&quot;</span>
</span><span id="get_resource-1436"><a href="#get_resource-1436"><span class="linenos">1436</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_resource</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">none_if_undefined</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Get resource from Windmill</p>
</div>
</section>
<section id="set_resource">
<input id="set_resource-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">set_resource</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">path</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">value</span><span class="p">:</span> <span class="n">Any</span>, </span><span class="param"><span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;any&#39;</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="set_resource-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#set_resource"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="set_resource-1439"><a href="#set_resource-1439"><span class="linenos">1439</span></a><span class="nd">@init_global_client</span>
</span><span id="set_resource-1440"><a href="#set_resource-1440"><span class="linenos">1440</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_resource</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;any&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="set_resource-1441"><a href="#set_resource-1441"><span class="linenos">1441</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="set_resource-1442"><a href="#set_resource-1442"><span class="linenos">1442</span></a><span class="sd"> Set the resource at a given path as a string, creating it if it does not exist</span>
</span><span id="set_resource-1443"><a href="#set_resource-1443"><span class="linenos">1443</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="set_resource-1444"><a href="#set_resource-1444"><span class="linenos">1444</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">set_resource</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">resource_type</span><span class="o">=</span><span class="n">resource_type</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Set the resource at a given path as a string, creating it if it does not exist</p>
</div>
</section>
<section id="list_resources">
<input id="list_resources-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">list_resources</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">per_page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">list</span><span class="p">[</span><span class="nb">dict</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="list_resources-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#list_resources"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="list_resources-1447"><a href="#list_resources-1447"><span class="linenos">1447</span></a><span class="nd">@init_global_client</span>
</span><span id="list_resources-1448"><a href="#list_resources-1448"><span class="linenos">1448</span></a><span class="k">def</span><span class="w"> </span><span class="nf">list_resources</span><span class="p">(</span>
</span><span id="list_resources-1449"><a href="#list_resources-1449"><span class="linenos">1449</span></a> <span class="n">resource_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="list_resources-1450"><a href="#list_resources-1450"><span class="linenos">1450</span></a> <span class="n">page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="list_resources-1451"><a href="#list_resources-1451"><span class="linenos">1451</span></a> <span class="n">per_page</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="list_resources-1452"><a href="#list_resources-1452"><span class="linenos">1452</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">dict</span><span class="p">]:</span>
</span><span id="list_resources-1453"><a href="#list_resources-1453"><span class="linenos">1453</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;List resources from Windmill workspace.</span>
</span><span id="list_resources-1454"><a href="#list_resources-1454"><span class="linenos">1454</span></a><span class="sd"> </span>
</span><span id="list_resources-1455"><a href="#list_resources-1455"><span class="linenos">1455</span></a><span class="sd"> Args:</span>
</span><span id="list_resources-1456"><a href="#list_resources-1456"><span class="linenos">1456</span></a><span class="sd"> resource_type: Optional resource type to filter by (e.g., &quot;postgresql&quot;, &quot;mysql&quot;, &quot;s3&quot;)</span>
</span><span id="list_resources-1457"><a href="#list_resources-1457"><span class="linenos">1457</span></a><span class="sd"> page: Optional page number for pagination</span>
</span><span id="list_resources-1458"><a href="#list_resources-1458"><span class="linenos">1458</span></a><span class="sd"> per_page: Optional number of results per page</span>
</span><span id="list_resources-1459"><a href="#list_resources-1459"><span class="linenos">1459</span></a><span class="sd"> </span>
</span><span id="list_resources-1460"><a href="#list_resources-1460"><span class="linenos">1460</span></a><span class="sd"> Returns:</span>
</span><span id="list_resources-1461"><a href="#list_resources-1461"><span class="linenos">1461</span></a><span class="sd"> List of resource dictionaries</span>
</span><span id="list_resources-1462"><a href="#list_resources-1462"><span class="linenos">1462</span></a><span class="sd"> </span>
</span><span id="list_resources-1463"><a href="#list_resources-1463"><span class="linenos">1463</span></a><span class="sd"> Example:</span>
</span><span id="list_resources-1464"><a href="#list_resources-1464"><span class="linenos">1464</span></a><span class="sd"> &gt;&gt;&gt; # Get all resources</span>
</span><span id="list_resources-1465"><a href="#list_resources-1465"><span class="linenos">1465</span></a><span class="sd"> &gt;&gt;&gt; all_resources = wmill.list_resources()</span>
</span><span id="list_resources-1466"><a href="#list_resources-1466"><span class="linenos">1466</span></a><span class="sd"> </span>
</span><span id="list_resources-1467"><a href="#list_resources-1467"><span class="linenos">1467</span></a><span class="sd"> &gt;&gt;&gt; # Get only PostgreSQL resources</span>
</span><span id="list_resources-1468"><a href="#list_resources-1468"><span class="linenos">1468</span></a><span class="sd"> &gt;&gt;&gt; pg_resources = wmill.list_resources(resource_type=&quot;postgresql&quot;)</span>
</span><span id="list_resources-1469"><a href="#list_resources-1469"><span class="linenos">1469</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="list_resources-1470"><a href="#list_resources-1470"><span class="linenos">1470</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">list_resources</span><span class="p">(</span>
</span><span id="list_resources-1471"><a href="#list_resources-1471"><span class="linenos">1471</span></a> <span class="n">resource_type</span><span class="o">=</span><span class="n">resource_type</span><span class="p">,</span>
</span><span id="list_resources-1472"><a href="#list_resources-1472"><span class="linenos">1472</span></a> <span class="n">page</span><span class="o">=</span><span class="n">page</span><span class="p">,</span>
</span><span id="list_resources-1473"><a href="#list_resources-1473"><span class="linenos">1473</span></a> <span class="n">per_page</span><span class="o">=</span><span class="n">per_page</span><span class="p">,</span>
</span><span id="list_resources-1474"><a href="#list_resources-1474"><span class="linenos">1474</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>List resources from Windmill workspace.</p>
<p>Args:
resource_type: Optional resource type to filter by (e.g., "postgresql", "mysql", "s3")
page: Optional page number for pagination
per_page: Optional number of results per page</p>
<p>Returns:
List of resource dictionaries</p>
<p>Example:</p>
<blockquote>
<blockquote>
<blockquote>
<h1 id="get-all-resources">Get all resources</h1>
<p>all_resources = <a href="#list_resources">wmill.list_resources()</a></p>
<pre><code>&gt;&gt;&gt; # Get only PostgreSQL resources
&gt;&gt;&gt; pg_resources = <a href="#list_resources">wmill.list_resources</a>(resource_type="postgresql")
</code></pre>
</blockquote>
</blockquote>
</blockquote>
</div>
</section>
<section id="set_state">
<input id="set_state-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">set_state</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="kc">None</span>:</span></span>
<label class="view-source-button" for="set_state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#set_state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="set_state-1477"><a href="#set_state-1477"><span class="linenos">1477</span></a><span class="nd">@init_global_client</span>
</span><span id="set_state-1478"><a href="#set_state-1478"><span class="linenos">1478</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_state</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="set_state-1479"><a href="#set_state-1479"><span class="linenos">1479</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="set_state-1480"><a href="#set_state-1480"><span class="linenos">1480</span></a><span class="sd"> Set the state</span>
</span><span id="set_state-1481"><a href="#set_state-1481"><span class="linenos">1481</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="set_state-1482"><a href="#set_state-1482"><span class="linenos">1482</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Set the state</p>
</div>
</section>
<section id="set_progress">
<input id="set_progress-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">set_progress</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">value</span><span class="p">:</span> <span class="nb">int</span>, </span><span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="set_progress-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#set_progress"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="set_progress-1485"><a href="#set_progress-1485"><span class="linenos">1485</span></a><span class="nd">@init_global_client</span>
</span><span id="set_progress-1486"><a href="#set_progress-1486"><span class="linenos">1486</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_progress</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="set_progress-1487"><a href="#set_progress-1487"><span class="linenos">1487</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="set_progress-1488"><a href="#set_progress-1488"><span class="linenos">1488</span></a><span class="sd"> Set the progress</span>
</span><span id="set_progress-1489"><a href="#set_progress-1489"><span class="linenos">1489</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="set_progress-1490"><a href="#set_progress-1490"><span class="linenos">1490</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">set_progress</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">job_id</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Set the progress</p>
</div>
</section>
<section id="get_progress">
<input id="get_progress-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_progress</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="get_progress-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_progress"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_progress-1493"><a href="#get_progress-1493"><span class="linenos">1493</span></a><span class="nd">@init_global_client</span>
</span><span id="get_progress-1494"><a href="#get_progress-1494"><span class="linenos">1494</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_progress</span><span class="p">(</span><span class="n">job_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="get_progress-1495"><a href="#get_progress-1495"><span class="linenos">1495</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="get_progress-1496"><a href="#get_progress-1496"><span class="linenos">1496</span></a><span class="sd"> Get the progress</span>
</span><span id="get_progress-1497"><a href="#get_progress-1497"><span class="linenos">1497</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="get_progress-1498"><a href="#get_progress-1498"><span class="linenos">1498</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_progress</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Get the progress</p>
</div>
</section>
<section id="set_shared_state_pickle">
<input id="set_shared_state_pickle-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">set_shared_state_pickle</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="param"><span class="n">path</span><span class="o">=</span><span class="s1">&#39;state.pickle&#39;</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="set_shared_state_pickle-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#set_shared_state_pickle"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="set_shared_state_pickle-1501"><a href="#set_shared_state_pickle-1501"><span class="linenos">1501</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_shared_state_pickle</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s2">&quot;state.pickle&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="set_shared_state_pickle-1502"><a href="#set_shared_state_pickle-1502"><span class="linenos">1502</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="set_shared_state_pickle-1503"><a href="#set_shared_state_pickle-1503"><span class="linenos">1503</span></a><span class="sd"> Set the state in the shared folder using pickle</span>
</span><span id="set_shared_state_pickle-1504"><a href="#set_shared_state_pickle-1504"><span class="linenos">1504</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="set_shared_state_pickle-1505"><a href="#set_shared_state_pickle-1505"><span class="linenos">1505</span></a> <span class="k">return</span> <span class="n">Windmill</span><span class="o">.</span><span class="n">set_shared_state_pickle</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Set the state in the shared folder using pickle</p>
</div>
</section>
<section id="get_shared_state_pickle">
<input id="get_shared_state_pickle-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-deprecate">@deprecate(&#39;Windmill.get_shared_state_pickle(...)&#39;)</div>
<span class="def">def</span>
<span class="name">get_shared_state_pickle</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">path</span><span class="o">=</span><span class="s1">&#39;state.pickle&#39;</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="get_shared_state_pickle-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_shared_state_pickle"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_shared_state_pickle-1508"><a href="#get_shared_state_pickle-1508"><span class="linenos">1508</span></a><span class="nd">@deprecate</span><span class="p">(</span><span class="s2">&quot;Windmill.get_shared_state_pickle(...)&quot;</span><span class="p">)</span>
</span><span id="get_shared_state_pickle-1509"><a href="#get_shared_state_pickle-1509"><span class="linenos">1509</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_shared_state_pickle</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s2">&quot;state.pickle&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="get_shared_state_pickle-1510"><a href="#get_shared_state_pickle-1510"><span class="linenos">1510</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="get_shared_state_pickle-1511"><a href="#get_shared_state_pickle-1511"><span class="linenos">1511</span></a><span class="sd"> Get the state in the shared folder using pickle</span>
</span><span id="get_shared_state_pickle-1512"><a href="#get_shared_state_pickle-1512"><span class="linenos">1512</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="get_shared_state_pickle-1513"><a href="#get_shared_state_pickle-1513"><span class="linenos">1513</span></a> <span class="k">return</span> <span class="n">Windmill</span><span class="o">.</span><span class="n">get_shared_state_pickle</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Get the state in the shared folder using pickle</p>
</div>
</section>
<section id="set_shared_state">
<input id="set_shared_state-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">set_shared_state</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="param"><span class="n">path</span><span class="o">=</span><span class="s1">&#39;state.json&#39;</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="set_shared_state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#set_shared_state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="set_shared_state-1516"><a href="#set_shared_state-1516"><span class="linenos">1516</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_shared_state</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s2">&quot;state.json&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="set_shared_state-1517"><a href="#set_shared_state-1517"><span class="linenos">1517</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="set_shared_state-1518"><a href="#set_shared_state-1518"><span class="linenos">1518</span></a><span class="sd"> Set the state in the shared folder using pickle</span>
</span><span id="set_shared_state-1519"><a href="#set_shared_state-1519"><span class="linenos">1519</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="set_shared_state-1520"><a href="#set_shared_state-1520"><span class="linenos">1520</span></a> <span class="k">return</span> <span class="n">Windmill</span><span class="o">.</span><span class="n">set_shared_state</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Set the state in the shared folder using pickle</p>
</div>
</section>
<section id="get_shared_state">
<input id="get_shared_state-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">get_shared_state</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">path</span><span class="o">=</span><span class="s1">&#39;state.json&#39;</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="get_shared_state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_shared_state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_shared_state-1523"><a href="#get_shared_state-1523"><span class="linenos">1523</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_shared_state</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s2">&quot;state.json&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="get_shared_state-1524"><a href="#get_shared_state-1524"><span class="linenos">1524</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="get_shared_state-1525"><a href="#get_shared_state-1525"><span class="linenos">1525</span></a><span class="sd"> Get the state in the shared folder using pickle</span>
</span><span id="get_shared_state-1526"><a href="#get_shared_state-1526"><span class="linenos">1526</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="get_shared_state-1527"><a href="#get_shared_state-1527"><span class="linenos">1527</span></a> <span class="k">return</span> <span class="n">Windmill</span><span class="o">.</span><span class="n">get_shared_state</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Get the state in the shared folder using pickle</p>
</div>
</section>
<section id="get_variable">
<input id="get_variable-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_variable</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">path</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="get_variable-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_variable"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_variable-1530"><a href="#get_variable-1530"><span class="linenos">1530</span></a><span class="nd">@init_global_client</span>
</span><span id="get_variable-1531"><a href="#get_variable-1531"><span class="linenos">1531</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_variable</span><span class="p">(</span><span class="n">path</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="get_variable-1532"><a href="#get_variable-1532"><span class="linenos">1532</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="get_variable-1533"><a href="#get_variable-1533"><span class="linenos">1533</span></a><span class="sd"> Returns the variable at a given path as a string</span>
</span><span id="get_variable-1534"><a href="#get_variable-1534"><span class="linenos">1534</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="get_variable-1535"><a href="#get_variable-1535"><span class="linenos">1535</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_variable</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Returns the variable at a given path as a string</p>
</div>
</section>
<section id="set_variable">
<input id="set_variable-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">set_variable</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">path</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">value</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">is_secret</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="set_variable-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#set_variable"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="set_variable-1538"><a href="#set_variable-1538"><span class="linenos">1538</span></a><span class="nd">@init_global_client</span>
</span><span id="set_variable-1539"><a href="#set_variable-1539"><span class="linenos">1539</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_variable</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">is_secret</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="set_variable-1540"><a href="#set_variable-1540"><span class="linenos">1540</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="set_variable-1541"><a href="#set_variable-1541"><span class="linenos">1541</span></a><span class="sd"> Set the variable at a given path as a string, creating it if it does not exist</span>
</span><span id="set_variable-1542"><a href="#set_variable-1542"><span class="linenos">1542</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="set_variable-1543"><a href="#set_variable-1543"><span class="linenos">1543</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">set_variable</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">is_secret</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Set the variable at a given path as a string, creating it if it does not exist</p>
</div>
</section>
<section id="get_flow_user_state">
<input id="get_flow_user_state-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_flow_user_state</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">key</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="get_flow_user_state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_flow_user_state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_flow_user_state-1546"><a href="#get_flow_user_state-1546"><span class="linenos">1546</span></a><span class="nd">@init_global_client</span>
</span><span id="get_flow_user_state-1547"><a href="#get_flow_user_state-1547"><span class="linenos">1547</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_flow_user_state</span><span class="p">(</span><span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="get_flow_user_state-1548"><a href="#get_flow_user_state-1548"><span class="linenos">1548</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="get_flow_user_state-1549"><a href="#get_flow_user_state-1549"><span class="linenos">1549</span></a><span class="sd"> Get the user state of a flow at a given key</span>
</span><span id="get_flow_user_state-1550"><a href="#get_flow_user_state-1550"><span class="linenos">1550</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="get_flow_user_state-1551"><a href="#get_flow_user_state-1551"><span class="linenos">1551</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_flow_user_state</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Get the user state of a flow at a given key</p>
</div>
</section>
<section id="set_flow_user_state">
<input id="set_flow_user_state-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">set_flow_user_state</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">key</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">value</span><span class="p">:</span> <span class="n">Any</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="set_flow_user_state-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#set_flow_user_state"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="set_flow_user_state-1554"><a href="#set_flow_user_state-1554"><span class="linenos">1554</span></a><span class="nd">@init_global_client</span>
</span><span id="set_flow_user_state-1555"><a href="#set_flow_user_state-1555"><span class="linenos">1555</span></a><span class="k">def</span><span class="w"> </span><span class="nf">set_flow_user_state</span><span class="p">(</span><span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="set_flow_user_state-1556"><a href="#set_flow_user_state-1556"><span class="linenos">1556</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="set_flow_user_state-1557"><a href="#set_flow_user_state-1557"><span class="linenos">1557</span></a><span class="sd"> Set the user state of a flow at a given key</span>
</span><span id="set_flow_user_state-1558"><a href="#set_flow_user_state-1558"><span class="linenos">1558</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="set_flow_user_state-1559"><a href="#set_flow_user_state-1559"><span class="linenos">1559</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">set_flow_user_state</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Set the user state of a flow at a given key</p>
</div>
</section>
<section id="get_state_path">
<input id="get_state_path-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_state_path</span><span class="signature pdoc-code condensed">(<span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="get_state_path-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_state_path"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_state_path-1562"><a href="#get_state_path-1562"><span class="linenos">1562</span></a><span class="nd">@init_global_client</span>
</span><span id="get_state_path-1563"><a href="#get_state_path-1563"><span class="linenos">1563</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_state_path</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="get_state_path-1564"><a href="#get_state_path-1564"><span class="linenos">1564</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">state_path</span>
</span></pre></div>
</section>
<section id="get_resume_urls">
<input id="get_resume_urls-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">get_resume_urls</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">dict</span>:</span></span>
<label class="view-source-button" for="get_resume_urls-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_resume_urls"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_resume_urls-1567"><a href="#get_resume_urls-1567"><span class="linenos">1567</span></a><span class="nd">@init_global_client</span>
</span><span id="get_resume_urls-1568"><a href="#get_resume_urls-1568"><span class="linenos">1568</span></a><span class="k">def</span><span class="w"> </span><span class="nf">get_resume_urls</span><span class="p">(</span><span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="get_resume_urls-1569"><a href="#get_resume_urls-1569"><span class="linenos">1569</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">get_resume_urls</span><span class="p">(</span><span class="n">approver</span><span class="p">)</span>
</span></pre></div>
</section>
<section id="request_interactive_slack_approval">
<input id="request_interactive_slack_approval-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">request_interactive_slack_approval</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">slack_resource_path</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">channel_id</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">message</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">default_args_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">dynamic_enums_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="request_interactive_slack_approval-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#request_interactive_slack_approval"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="request_interactive_slack_approval-1572"><a href="#request_interactive_slack_approval-1572"><span class="linenos">1572</span></a><span class="nd">@init_global_client</span>
</span><span id="request_interactive_slack_approval-1573"><a href="#request_interactive_slack_approval-1573"><span class="linenos">1573</span></a><span class="k">def</span><span class="w"> </span><span class="nf">request_interactive_slack_approval</span><span class="p">(</span>
</span><span id="request_interactive_slack_approval-1574"><a href="#request_interactive_slack_approval-1574"><span class="linenos">1574</span></a> <span class="n">slack_resource_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1575"><a href="#request_interactive_slack_approval-1575"><span class="linenos">1575</span></a> <span class="n">channel_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1576"><a href="#request_interactive_slack_approval-1576"><span class="linenos">1576</span></a> <span class="n">message</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1577"><a href="#request_interactive_slack_approval-1577"><span class="linenos">1577</span></a> <span class="n">approver</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1578"><a href="#request_interactive_slack_approval-1578"><span class="linenos">1578</span></a> <span class="n">default_args_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1579"><a href="#request_interactive_slack_approval-1579"><span class="linenos">1579</span></a> <span class="n">dynamic_enums_json</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1580"><a href="#request_interactive_slack_approval-1580"><span class="linenos">1580</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="request_interactive_slack_approval-1581"><a href="#request_interactive_slack_approval-1581"><span class="linenos">1581</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">request_interactive_slack_approval</span><span class="p">(</span>
</span><span id="request_interactive_slack_approval-1582"><a href="#request_interactive_slack_approval-1582"><span class="linenos">1582</span></a> <span class="n">slack_resource_path</span><span class="o">=</span><span class="n">slack_resource_path</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1583"><a href="#request_interactive_slack_approval-1583"><span class="linenos">1583</span></a> <span class="n">channel_id</span><span class="o">=</span><span class="n">channel_id</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1584"><a href="#request_interactive_slack_approval-1584"><span class="linenos">1584</span></a> <span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1585"><a href="#request_interactive_slack_approval-1585"><span class="linenos">1585</span></a> <span class="n">approver</span><span class="o">=</span><span class="n">approver</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1586"><a href="#request_interactive_slack_approval-1586"><span class="linenos">1586</span></a> <span class="n">default_args_json</span><span class="o">=</span><span class="n">default_args_json</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1587"><a href="#request_interactive_slack_approval-1587"><span class="linenos">1587</span></a> <span class="n">dynamic_enums_json</span><span class="o">=</span><span class="n">dynamic_enums_json</span><span class="p">,</span>
</span><span id="request_interactive_slack_approval-1588"><a href="#request_interactive_slack_approval-1588"><span class="linenos">1588</span></a> <span class="p">)</span>
</span></pre></div>
</section>
<section id="send_teams_message">
<input id="send_teams_message-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">send_teams_message</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">conversation_id</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">success</span><span class="p">:</span> <span class="nb">bool</span>,</span><span class="param"> <span class="n">card_block</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="send_teams_message-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#send_teams_message"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="send_teams_message-1591"><a href="#send_teams_message-1591"><span class="linenos">1591</span></a><span class="nd">@init_global_client</span>
</span><span id="send_teams_message-1592"><a href="#send_teams_message-1592"><span class="linenos">1592</span></a><span class="k">def</span><span class="w"> </span><span class="nf">send_teams_message</span><span class="p">(</span>
</span><span id="send_teams_message-1593"><a href="#send_teams_message-1593"><span class="linenos">1593</span></a> <span class="n">conversation_id</span><span class="p">:</span> <span class="nb">str</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">success</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span> <span class="n">card_block</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="send_teams_message-1594"><a href="#send_teams_message-1594"><span class="linenos">1594</span></a><span class="p">):</span>
</span><span id="send_teams_message-1595"><a href="#send_teams_message-1595"><span class="linenos">1595</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">send_teams_message</span><span class="p">(</span><span class="n">conversation_id</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">success</span><span class="p">,</span> <span class="n">card_block</span><span class="p">)</span>
</span></pre></div>
</section>
<section id="cancel_job">
<input id="cancel_job-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">cancel_job</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">reason</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="cancel_job-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#cancel_job"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="cancel_job-1598"><a href="#cancel_job-1598"><span class="linenos">1598</span></a><span class="nd">@init_global_client</span>
</span><span id="cancel_job-1599"><a href="#cancel_job-1599"><span class="linenos">1599</span></a><span class="k">def</span><span class="w"> </span><span class="nf">cancel_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="cancel_job-1600"><a href="#cancel_job-1600"><span class="linenos">1600</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cancel a specific job by ID.</span>
</span><span id="cancel_job-1601"><a href="#cancel_job-1601"><span class="linenos">1601</span></a>
</span><span id="cancel_job-1602"><a href="#cancel_job-1602"><span class="linenos">1602</span></a><span class="sd"> Args:</span>
</span><span id="cancel_job-1603"><a href="#cancel_job-1603"><span class="linenos">1603</span></a><span class="sd"> job_id: UUID of the job to cancel</span>
</span><span id="cancel_job-1604"><a href="#cancel_job-1604"><span class="linenos">1604</span></a><span class="sd"> reason: Optional reason for cancellation</span>
</span><span id="cancel_job-1605"><a href="#cancel_job-1605"><span class="linenos">1605</span></a>
</span><span id="cancel_job-1606"><a href="#cancel_job-1606"><span class="linenos">1606</span></a><span class="sd"> Returns:</span>
</span><span id="cancel_job-1607"><a href="#cancel_job-1607"><span class="linenos">1607</span></a><span class="sd"> Response message from the cancel endpoint</span>
</span><span id="cancel_job-1608"><a href="#cancel_job-1608"><span class="linenos">1608</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="cancel_job-1609"><a href="#cancel_job-1609"><span class="linenos">1609</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">cancel_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">,</span> <span class="n">reason</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Cancel a specific job by ID.</p>
<p>Args:
job_id: UUID of the job to cancel
reason: Optional reason for cancellation</p>
<p>Returns:
Response message from the cancel endpoint</p>
</div>
</section>
<section id="cancel_running">
<input id="cancel_running-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">cancel_running</span><span class="signature pdoc-code condensed">(<span class="return-annotation">) -> <span class="nb">dict</span>:</span></span>
<label class="view-source-button" for="cancel_running-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#cancel_running"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="cancel_running-1612"><a href="#cancel_running-1612"><span class="linenos">1612</span></a><span class="nd">@init_global_client</span>
</span><span id="cancel_running-1613"><a href="#cancel_running-1613"><span class="linenos">1613</span></a><span class="k">def</span><span class="w"> </span><span class="nf">cancel_running</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="cancel_running-1614"><a href="#cancel_running-1614"><span class="linenos">1614</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cancel currently running executions of the same script.&quot;&quot;&quot;</span>
</span><span id="cancel_running-1615"><a href="#cancel_running-1615"><span class="linenos">1615</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">cancel_running</span><span class="p">()</span>
</span></pre></div>
<div class="docstring"><p>Cancel currently running executions of the same script.</p>
</div>
</section>
<section id="run_script">
<input id="run_script-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">run_script</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">timeout</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">assert_result_is_not_none</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">Any</span>:</span></span>
<label class="view-source-button" for="run_script-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#run_script"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="run_script-1618"><a href="#run_script-1618"><span class="linenos">1618</span></a><span class="nd">@init_global_client</span>
</span><span id="run_script-1619"><a href="#run_script-1619"><span class="linenos">1619</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script</span><span class="p">(</span>
</span><span id="run_script-1620"><a href="#run_script-1620"><span class="linenos">1620</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script-1621"><a href="#run_script-1621"><span class="linenos">1621</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script-1622"><a href="#run_script-1622"><span class="linenos">1622</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script-1623"><a href="#run_script-1623"><span class="linenos">1623</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script-1624"><a href="#run_script-1624"><span class="linenos">1624</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="run_script-1625"><a href="#run_script-1625"><span class="linenos">1625</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="run_script-1626"><a href="#run_script-1626"><span class="linenos">1626</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="run_script-1627"><a href="#run_script-1627"><span class="linenos">1627</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="run_script-1628"><a href="#run_script-1628"><span class="linenos">1628</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script synchronously and return its result.</span>
</span><span id="run_script-1629"><a href="#run_script-1629"><span class="linenos">1629</span></a><span class="sd"> </span>
</span><span id="run_script-1630"><a href="#run_script-1630"><span class="linenos">1630</span></a><span class="sd"> .. deprecated:: Use run_script_by_path or run_script_by_hash instead.</span>
</span><span id="run_script-1631"><a href="#run_script-1631"><span class="linenos">1631</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="run_script-1632"><a href="#run_script-1632"><span class="linenos">1632</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script</span><span class="p">(</span>
</span><span id="run_script-1633"><a href="#run_script-1633"><span class="linenos">1633</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="run_script-1634"><a href="#run_script-1634"><span class="linenos">1634</span></a> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span>
</span><span id="run_script-1635"><a href="#run_script-1635"><span class="linenos">1635</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="run_script-1636"><a href="#run_script-1636"><span class="linenos">1636</span></a> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="run_script-1637"><a href="#run_script-1637"><span class="linenos">1637</span></a> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span><span class="p">,</span>
</span><span id="run_script-1638"><a href="#run_script-1638"><span class="linenos">1638</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span>
</span><span id="run_script-1639"><a href="#run_script-1639"><span class="linenos">1639</span></a> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span>
</span><span id="run_script-1640"><a href="#run_script-1640"><span class="linenos">1640</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Run script synchronously and return its result.</p>
<p><em>Deprecated since version Use run_script_by_path or run_script_by_hash instead..</em></p>
</div>
</section>
<section id="run_script_by_path">
<input id="run_script_by_path-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">run_script_by_path</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">timeout</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">assert_result_is_not_none</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">Any</span>:</span></span>
<label class="view-source-button" for="run_script_by_path-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#run_script_by_path"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="run_script_by_path-1643"><a href="#run_script_by_path-1643"><span class="linenos">1643</span></a><span class="nd">@init_global_client</span>
</span><span id="run_script_by_path-1644"><a href="#run_script_by_path-1644"><span class="linenos">1644</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_path</span><span class="p">(</span>
</span><span id="run_script_by_path-1645"><a href="#run_script_by_path-1645"><span class="linenos">1645</span></a> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="run_script_by_path-1646"><a href="#run_script_by_path-1646"><span class="linenos">1646</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_by_path-1647"><a href="#run_script_by_path-1647"><span class="linenos">1647</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_by_path-1648"><a href="#run_script_by_path-1648"><span class="linenos">1648</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="run_script_by_path-1649"><a href="#run_script_by_path-1649"><span class="linenos">1649</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="run_script_by_path-1650"><a href="#run_script_by_path-1650"><span class="linenos">1650</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="run_script_by_path-1651"><a href="#run_script_by_path-1651"><span class="linenos">1651</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="run_script_by_path-1652"><a href="#run_script_by_path-1652"><span class="linenos">1652</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script by path synchronously and return its result.&quot;&quot;&quot;</span>
</span><span id="run_script_by_path-1653"><a href="#run_script_by_path-1653"><span class="linenos">1653</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script_by_path</span><span class="p">(</span>
</span><span id="run_script_by_path-1654"><a href="#run_script_by_path-1654"><span class="linenos">1654</span></a> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span>
</span><span id="run_script_by_path-1655"><a href="#run_script_by_path-1655"><span class="linenos">1655</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="run_script_by_path-1656"><a href="#run_script_by_path-1656"><span class="linenos">1656</span></a> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="run_script_by_path-1657"><a href="#run_script_by_path-1657"><span class="linenos">1657</span></a> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span><span class="p">,</span>
</span><span id="run_script_by_path-1658"><a href="#run_script_by_path-1658"><span class="linenos">1658</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span>
</span><span id="run_script_by_path-1659"><a href="#run_script_by_path-1659"><span class="linenos">1659</span></a> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span>
</span><span id="run_script_by_path-1660"><a href="#run_script_by_path-1660"><span class="linenos">1660</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Run script by path synchronously and return its result.</p>
</div>
</section>
<section id="run_script_by_hash">
<input id="run_script_by_hash-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">run_script_by_hash</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">timeout</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">assert_result_is_not_none</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">Any</span>:</span></span>
<label class="view-source-button" for="run_script_by_hash-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#run_script_by_hash"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="run_script_by_hash-1663"><a href="#run_script_by_hash-1663"><span class="linenos">1663</span></a><span class="nd">@init_global_client</span>
</span><span id="run_script_by_hash-1664"><a href="#run_script_by_hash-1664"><span class="linenos">1664</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_script_by_hash</span><span class="p">(</span>
</span><span id="run_script_by_hash-1665"><a href="#run_script_by_hash-1665"><span class="linenos">1665</span></a> <span class="n">hash_</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="run_script_by_hash-1666"><a href="#run_script_by_hash-1666"><span class="linenos">1666</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_by_hash-1667"><a href="#run_script_by_hash-1667"><span class="linenos">1667</span></a> <span class="n">timeout</span><span class="p">:</span> <span class="n">dt</span><span class="o">.</span><span class="n">timedelta</span> <span class="o">|</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_script_by_hash-1668"><a href="#run_script_by_hash-1668"><span class="linenos">1668</span></a> <span class="n">verbose</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="run_script_by_hash-1669"><a href="#run_script_by_hash-1669"><span class="linenos">1669</span></a> <span class="n">cleanup</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="run_script_by_hash-1670"><a href="#run_script_by_hash-1670"><span class="linenos">1670</span></a> <span class="n">assert_result_is_not_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="run_script_by_hash-1671"><a href="#run_script_by_hash-1671"><span class="linenos">1671</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="run_script_by_hash-1672"><a href="#run_script_by_hash-1672"><span class="linenos">1672</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run script by hash synchronously and return its result.&quot;&quot;&quot;</span>
</span><span id="run_script_by_hash-1673"><a href="#run_script_by_hash-1673"><span class="linenos">1673</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_script_by_hash</span><span class="p">(</span>
</span><span id="run_script_by_hash-1674"><a href="#run_script_by_hash-1674"><span class="linenos">1674</span></a> <span class="n">hash_</span><span class="o">=</span><span class="n">hash_</span><span class="p">,</span>
</span><span id="run_script_by_hash-1675"><a href="#run_script_by_hash-1675"><span class="linenos">1675</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="run_script_by_hash-1676"><a href="#run_script_by_hash-1676"><span class="linenos">1676</span></a> <span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">,</span>
</span><span id="run_script_by_hash-1677"><a href="#run_script_by_hash-1677"><span class="linenos">1677</span></a> <span class="n">assert_result_is_not_none</span><span class="o">=</span><span class="n">assert_result_is_not_none</span><span class="p">,</span>
</span><span id="run_script_by_hash-1678"><a href="#run_script_by_hash-1678"><span class="linenos">1678</span></a> <span class="n">cleanup</span><span class="o">=</span><span class="n">cleanup</span><span class="p">,</span>
</span><span id="run_script_by_hash-1679"><a href="#run_script_by_hash-1679"><span class="linenos">1679</span></a> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span>
</span><span id="run_script_by_hash-1680"><a href="#run_script_by_hash-1680"><span class="linenos">1680</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Run script by hash synchronously and return its result.</p>
</div>
</section>
<section id="run_inline_script_preview">
<input id="run_inline_script_preview-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">run_inline_script_preview</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">content</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">language</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n">Any</span>:</span></span>
<label class="view-source-button" for="run_inline_script_preview-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#run_inline_script_preview"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="run_inline_script_preview-1682"><a href="#run_inline_script_preview-1682"><span class="linenos">1682</span></a><span class="nd">@init_global_client</span>
</span><span id="run_inline_script_preview-1683"><a href="#run_inline_script_preview-1683"><span class="linenos">1683</span></a><span class="k">def</span><span class="w"> </span><span class="nf">run_inline_script_preview</span><span class="p">(</span>
</span><span id="run_inline_script_preview-1684"><a href="#run_inline_script_preview-1684"><span class="linenos">1684</span></a> <span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="run_inline_script_preview-1685"><a href="#run_inline_script_preview-1685"><span class="linenos">1685</span></a> <span class="n">language</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="run_inline_script_preview-1686"><a href="#run_inline_script_preview-1686"><span class="linenos">1686</span></a> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="run_inline_script_preview-1687"><a href="#run_inline_script_preview-1687"><span class="linenos">1687</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="run_inline_script_preview-1688"><a href="#run_inline_script_preview-1688"><span class="linenos">1688</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run a script on the current worker without creating a job&quot;&quot;&quot;</span>
</span><span id="run_inline_script_preview-1689"><a href="#run_inline_script_preview-1689"><span class="linenos">1689</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">run_inline_script_preview</span><span class="p">(</span>
</span><span id="run_inline_script_preview-1690"><a href="#run_inline_script_preview-1690"><span class="linenos">1690</span></a> <span class="n">content</span><span class="o">=</span><span class="n">content</span><span class="p">,</span>
</span><span id="run_inline_script_preview-1691"><a href="#run_inline_script_preview-1691"><span class="linenos">1691</span></a> <span class="n">language</span><span class="o">=</span><span class="n">language</span><span class="p">,</span>
</span><span id="run_inline_script_preview-1692"><a href="#run_inline_script_preview-1692"><span class="linenos">1692</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span><span id="run_inline_script_preview-1693"><a href="#run_inline_script_preview-1693"><span class="linenos">1693</span></a> <span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Run a script on the current worker without creating a job</p>
</div>
</section>
<section id="username_to_email">
<input id="username_to_email-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">username_to_email</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">username</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="username_to_email-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#username_to_email"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="username_to_email-1695"><a href="#username_to_email-1695"><span class="linenos">1695</span></a><span class="nd">@init_global_client</span>
</span><span id="username_to_email-1696"><a href="#username_to_email-1696"><span class="linenos">1696</span></a><span class="k">def</span><span class="w"> </span><span class="nf">username_to_email</span><span class="p">(</span><span class="n">username</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="username_to_email-1697"><a href="#username_to_email-1697"><span class="linenos">1697</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="username_to_email-1698"><a href="#username_to_email-1698"><span class="linenos">1698</span></a><span class="sd"> Get email from workspace username</span>
</span><span id="username_to_email-1699"><a href="#username_to_email-1699"><span class="linenos">1699</span></a><span class="sd"> This method is particularly useful for apps that require the email address of the viewer.</span>
</span><span id="username_to_email-1700"><a href="#username_to_email-1700"><span class="linenos">1700</span></a><span class="sd"> Indeed, in the viewer context WM_USERNAME is set to the username of the viewer but WM_EMAIL is set to the email of the creator of the app.</span>
</span><span id="username_to_email-1701"><a href="#username_to_email-1701"><span class="linenos">1701</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="username_to_email-1702"><a href="#username_to_email-1702"><span class="linenos">1702</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">username_to_email</span><span class="p">(</span><span class="n">username</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Get email from workspace username
This method is particularly useful for apps that require the email address of the viewer.
Indeed, in the viewer context WM_USERNAME is set to the username of the viewer but WM_EMAIL is set to the email of the creator of the app.</p>
</div>
</section>
<section id="datatable">
<input id="datatable-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">datatable</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 class="o">=</span> <span class="s1">&#39;main&#39;</span></span><span class="return-annotation">) -> <span class="n"><a href="#DataTableClient">DataTableClient</a></span>:</span></span>
<label class="view-source-button" for="datatable-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#datatable"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="datatable-1705"><a href="#datatable-1705"><span class="linenos">1705</span></a><span class="nd">@init_global_client</span>
</span><span id="datatable-1706"><a href="#datatable-1706"><span class="linenos">1706</span></a><span class="k">def</span><span class="w"> </span><span class="nf">datatable</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;main&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DataTableClient</span><span class="p">:</span>
</span><span id="datatable-1707"><a href="#datatable-1707"><span class="linenos">1707</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">datatable</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span></pre></div>
</section>
<section id="ducklake">
<input id="ducklake-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator decorator-init_global_client">@init_global_client</div>
<span class="def">def</span>
<span class="name">ducklake</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 class="o">=</span> <span class="s1">&#39;main&#39;</span></span><span class="return-annotation">) -> <span class="n"><a href="#DucklakeClient">DucklakeClient</a></span>:</span></span>
<label class="view-source-button" for="ducklake-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#ducklake"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ducklake-1709"><a href="#ducklake-1709"><span class="linenos">1709</span></a><span class="nd">@init_global_client</span>
</span><span id="ducklake-1710"><a href="#ducklake-1710"><span class="linenos">1710</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ducklake</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;main&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DucklakeClient</span><span class="p">:</span>
</span><span id="ducklake-1711"><a href="#ducklake-1711"><span class="linenos">1711</span></a> <span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="n">ducklake</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span></pre></div>
</section>
<section id="task">
<input id="task-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">task</span><span class="signature pdoc-code condensed">(<span class="param"><span class="o">*</span><span class="n">args</span>, </span><span class="param"><span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="task-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#task"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="task-1713"><a href="#task-1713"><span class="linenos">1713</span></a><span class="k">def</span><span class="w"> </span><span class="nf">task</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="task-1714"><a href="#task-1714"><span class="linenos">1714</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">inspect</span><span class="w"> </span><span class="kn">import</span> <span class="n">signature</span>
</span><span id="task-1715"><a href="#task-1715"><span class="linenos">1715</span></a>
</span><span id="task-1716"><a href="#task-1716"><span class="linenos">1716</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">f</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">tag</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
</span><span id="task-1717"><a href="#task-1717"><span class="linenos">1717</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="task-1718"><a href="#task-1718"><span class="linenos">1718</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span>
</span><span id="task-1719"><a href="#task-1719"><span class="linenos">1719</span></a> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;MAIN_OVERRIDE&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="n">func</span><span class="o">.</span><span class="vm">__name__</span>
</span><span id="task-1720"><a href="#task-1720"><span class="linenos">1720</span></a> <span class="p">):</span>
</span><span id="task-1721"><a href="#task-1721"><span class="linenos">1721</span></a>
</span><span id="task-1722"><a href="#task-1722"><span class="linenos">1722</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">inner</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="task-1723"><a href="#task-1723"><span class="linenos">1723</span></a> <span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="task-1724"><a href="#task-1724"><span class="linenos">1724</span></a>
</span><span id="task-1725"><a href="#task-1725"><span class="linenos">1725</span></a> <span class="k">return</span> <span class="n">inner</span>
</span><span id="task-1726"><a href="#task-1726"><span class="linenos">1726</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="task-1727"><a href="#task-1727"><span class="linenos">1727</span></a>
</span><span id="task-1728"><a href="#task-1728"><span class="linenos">1728</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">inner</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="task-1729"><a href="#task-1729"><span class="linenos">1729</span></a> <span class="k">global</span> <span class="n">_client</span>
</span><span id="task-1730"><a href="#task-1730"><span class="linenos">1730</span></a> <span class="k">if</span> <span class="n">_client</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="task-1731"><a href="#task-1731"><span class="linenos">1731</span></a> <span class="n">_client</span> <span class="o">=</span> <span class="n">Windmill</span><span class="p">()</span>
</span><span id="task-1732"><a href="#task-1732"><span class="linenos">1732</span></a> <span class="n">w_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_WORKSPACE&quot;</span><span class="p">)</span>
</span><span id="task-1733"><a href="#task-1733"><span class="linenos">1733</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;WM_JOB_ID&quot;</span><span class="p">)</span>
</span><span id="task-1734"><a href="#task-1734"><span class="linenos">1734</span></a> <span class="n">f_name</span> <span class="o">=</span> <span class="n">func</span><span class="o">.</span><span class="vm">__name__</span>
</span><span id="task-1735"><a href="#task-1735"><span class="linenos">1735</span></a> <span class="n">json</span> <span class="o">=</span> <span class="n">kwargs</span>
</span><span id="task-1736"><a href="#task-1736"><span class="linenos">1736</span></a> <span class="n">params</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">signature</span><span class="p">(</span><span class="n">func</span><span class="p">)</span><span class="o">.</span><span class="n">parameters</span><span class="p">)</span>
</span><span id="task-1737"><a href="#task-1737"><span class="linenos">1737</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">arg</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
</span><span id="task-1738"><a href="#task-1738"><span class="linenos">1738</span></a> <span class="k">if</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">params</span><span class="p">):</span>
</span><span id="task-1739"><a href="#task-1739"><span class="linenos">1739</span></a> <span class="n">p</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span><span id="task-1740"><a href="#task-1740"><span class="linenos">1740</span></a> <span class="n">key</span> <span class="o">=</span> <span class="n">p</span>
</span><span id="task-1741"><a href="#task-1741"><span class="linenos">1741</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="task-1742"><a href="#task-1742"><span class="linenos">1742</span></a> <span class="n">json</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">arg</span>
</span><span id="task-1743"><a href="#task-1743"><span class="linenos">1743</span></a>
</span><span id="task-1744"><a href="#task-1744"><span class="linenos">1744</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="task-1745"><a href="#task-1745"><span class="linenos">1745</span></a> <span class="k">if</span> <span class="n">tag</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="task-1746"><a href="#task-1746"><span class="linenos">1746</span></a> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;tag&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tag</span>
</span><span id="task-1747"><a href="#task-1747"><span class="linenos">1747</span></a> <span class="n">w_as_code_response</span> <span class="o">=</span> <span class="n">_client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="task-1748"><a href="#task-1748"><span class="linenos">1748</span></a> <span class="sa">f</span><span class="s2">&quot;/w/</span><span class="si">{</span><span class="n">w_id</span><span class="si">}</span><span class="s2">/jobs/run/workflow_as_code/</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">f_name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="task-1749"><a href="#task-1749"><span class="linenos">1749</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;args&quot;</span><span class="p">:</span> <span class="n">json</span><span class="p">},</span>
</span><span id="task-1750"><a href="#task-1750"><span class="linenos">1750</span></a> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span>
</span><span id="task-1751"><a href="#task-1751"><span class="linenos">1751</span></a> <span class="p">)</span>
</span><span id="task-1752"><a href="#task-1752"><span class="linenos">1752</span></a> <span class="n">job_id</span> <span class="o">=</span> <span class="n">w_as_code_response</span><span class="o">.</span><span class="n">text</span>
</span><span id="task-1753"><a href="#task-1753"><span class="linenos">1753</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Executing task </span><span class="si">{</span><span class="n">func</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> on job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="task-1754"><a href="#task-1754"><span class="linenos">1754</span></a> <span class="n">job_result</span> <span class="o">=</span> <span class="n">_client</span><span class="o">.</span><span class="n">wait_job</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span>
</span><span id="task-1755"><a href="#task-1755"><span class="linenos">1755</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Task </span><span class="si">{</span><span class="n">func</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">) completed&quot;</span><span class="p">)</span>
</span><span id="task-1756"><a href="#task-1756"><span class="linenos">1756</span></a> <span class="k">return</span> <span class="n">job_result</span>
</span><span id="task-1757"><a href="#task-1757"><span class="linenos">1757</span></a>
</span><span id="task-1758"><a href="#task-1758"><span class="linenos">1758</span></a> <span class="k">return</span> <span class="n">inner</span>
</span><span id="task-1759"><a href="#task-1759"><span class="linenos">1759</span></a>
</span><span id="task-1760"><a href="#task-1760"><span class="linenos">1760</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="nb">callable</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
</span><span id="task-1761"><a href="#task-1761"><span class="linenos">1761</span></a> <span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="task-1762"><a href="#task-1762"><span class="linenos">1762</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="task-1763"><a href="#task-1763"><span class="linenos">1763</span></a> <span class="k">return</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;tag&quot;</span><span class="p">))</span>
</span></pre></div>
</section>
<section id="parse_resource_syntax">
<input id="parse_resource_syntax-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">parse_resource_syntax</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">s</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <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="parse_resource_syntax-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#parse_resource_syntax"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="parse_resource_syntax-1765"><a href="#parse_resource_syntax-1765"><span class="linenos">1765</span></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_resource_syntax</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span><span id="parse_resource_syntax-1766"><a href="#parse_resource_syntax-1766"><span class="linenos">1766</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse resource syntax from string.&quot;&quot;&quot;</span>
</span><span id="parse_resource_syntax-1767"><a href="#parse_resource_syntax-1767"><span class="linenos">1767</span></a> <span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="parse_resource_syntax-1768"><a href="#parse_resource_syntax-1768"><span class="linenos">1768</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="parse_resource_syntax-1769"><a href="#parse_resource_syntax-1769"><span class="linenos">1769</span></a> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;$res:&quot;</span><span class="p">):</span>
</span><span id="parse_resource_syntax-1770"><a href="#parse_resource_syntax-1770"><span class="linenos">1770</span></a> <span class="k">return</span> <span class="n">s</span><span class="p">[</span><span class="mi">5</span><span class="p">:]</span>
</span><span id="parse_resource_syntax-1771"><a href="#parse_resource_syntax-1771"><span class="linenos">1771</span></a> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;res://&quot;</span><span class="p">):</span>
</span><span id="parse_resource_syntax-1772"><a href="#parse_resource_syntax-1772"><span class="linenos">1772</span></a> <span class="k">return</span> <span class="n">s</span><span class="p">[</span><span class="mi">6</span><span class="p">:]</span>
</span><span id="parse_resource_syntax-1773"><a href="#parse_resource_syntax-1773"><span class="linenos">1773</span></a> <span class="k">return</span> <span class="kc">None</span>
</span></pre></div>
<div class="docstring"><p>Parse resource syntax from string.</p>
</div>
</section>
<section id="parse_s3_object">
<input id="parse_s3_object-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">parse_s3_object</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">s3_object</span><span class="p">:</span> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span> <span class="o">|</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="n"><a href="s3_types.html#S3Object">wmill.s3_types.S3Object</a></span>:</span></span>
<label class="view-source-button" for="parse_s3_object-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#parse_s3_object"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="parse_s3_object-1775"><a href="#parse_s3_object-1775"><span class="linenos">1775</span></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_s3_object</span><span class="p">(</span><span class="n">s3_object</span><span class="p">:</span> <span class="n">S3Object</span> <span class="o">|</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S3Object</span><span class="p">:</span>
</span><span id="parse_s3_object-1776"><a href="#parse_s3_object-1776"><span class="linenos">1776</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse S3 object from string or S3Object format.&quot;&quot;&quot;</span>
</span><span id="parse_s3_object-1777"><a href="#parse_s3_object-1777"><span class="linenos">1777</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s3_object</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="parse_s3_object-1778"><a href="#parse_s3_object-1778"><span class="linenos">1778</span></a> <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;^s3://([^/]*)/(.*)$&#39;</span><span class="p">,</span> <span class="n">s3_object</span><span class="p">)</span>
</span><span id="parse_s3_object-1779"><a href="#parse_s3_object-1779"><span class="linenos">1779</span></a> <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
</span><span id="parse_s3_object-1780"><a href="#parse_s3_object-1780"><span class="linenos">1780</span></a> <span class="k">return</span> <span class="n">S3Object</span><span class="p">(</span><span class="n">s3</span><span class="o">=</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">storage</span><span class="o">=</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="parse_s3_object-1781"><a href="#parse_s3_object-1781"><span class="linenos">1781</span></a> <span class="k">return</span> <span class="n">S3Object</span><span class="p">(</span><span class="n">s3</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="parse_s3_object-1782"><a href="#parse_s3_object-1782"><span class="linenos">1782</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="parse_s3_object-1783"><a href="#parse_s3_object-1783"><span class="linenos">1783</span></a> <span class="k">return</span> <span class="n">s3_object</span>
</span></pre></div>
<div class="docstring"><p>Parse S3 object from string or S3Object format.</p>
</div>
</section>
<section id="parse_variable_syntax">
<input id="parse_variable_syntax-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">parse_variable_syntax</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">s</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <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="parse_variable_syntax-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#parse_variable_syntax"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="parse_variable_syntax-1787"><a href="#parse_variable_syntax-1787"><span class="linenos">1787</span></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_variable_syntax</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span><span id="parse_variable_syntax-1788"><a href="#parse_variable_syntax-1788"><span class="linenos">1788</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse variable syntax from string.&quot;&quot;&quot;</span>
</span><span id="parse_variable_syntax-1789"><a href="#parse_variable_syntax-1789"><span class="linenos">1789</span></a> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;var://&quot;</span><span class="p">):</span>
</span><span id="parse_variable_syntax-1790"><a href="#parse_variable_syntax-1790"><span class="linenos">1790</span></a> <span class="k">return</span> <span class="n">s</span><span class="p">[</span><span class="mi">6</span><span class="p">:]</span>
</span><span id="parse_variable_syntax-1791"><a href="#parse_variable_syntax-1791"><span class="linenos">1791</span></a> <span class="k">return</span> <span class="kc">None</span>
</span></pre></div>
<div class="docstring"><p>Parse variable syntax from string.</p>
</div>
</section>
<section id="append_to_result_stream">
<input id="append_to_result_stream-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">append_to_result_stream</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="kc">None</span>:</span></span>
<label class="view-source-button" for="append_to_result_stream-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#append_to_result_stream"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="append_to_result_stream-1794"><a href="#append_to_result_stream-1794"><span class="linenos">1794</span></a><span class="k">def</span><span class="w"> </span><span class="nf">append_to_result_stream</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="kc">None</span><span class="p">:</span>
</span><span id="append_to_result_stream-1795"><a href="#append_to_result_stream-1795"><span class="linenos">1795</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Append a text to the result stream.</span>
</span><span id="append_to_result_stream-1796"><a href="#append_to_result_stream-1796"><span class="linenos">1796</span></a><span class="sd"> </span>
</span><span id="append_to_result_stream-1797"><a href="#append_to_result_stream-1797"><span class="linenos">1797</span></a><span class="sd"> Args:</span>
</span><span id="append_to_result_stream-1798"><a href="#append_to_result_stream-1798"><span class="linenos">1798</span></a><span class="sd"> text: text to append to the result stream</span>
</span><span id="append_to_result_stream-1799"><a href="#append_to_result_stream-1799"><span class="linenos">1799</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="append_to_result_stream-1800"><a href="#append_to_result_stream-1800"><span class="linenos">1800</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;WM_STREAM: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">text</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">n&#39;</span><span class="p">)))</span>
</span></pre></div>
<div class="docstring"><p>Append a text to the result stream.</p>
<p>Args:
text: text to append to the result stream</p>
</div>
</section>
<section id="stream_result">
<input id="stream_result-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">stream_result</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">stream</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
<label class="view-source-button" for="stream_result-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#stream_result"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="stream_result-1802"><a href="#stream_result-1802"><span class="linenos">1802</span></a><span class="k">def</span><span class="w"> </span><span class="nf">stream_result</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="stream_result-1803"><a href="#stream_result-1803"><span class="linenos">1803</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Stream to the result stream.</span>
</span><span id="stream_result-1804"><a href="#stream_result-1804"><span class="linenos">1804</span></a><span class="sd"> </span>
</span><span id="stream_result-1805"><a href="#stream_result-1805"><span class="linenos">1805</span></a><span class="sd"> Args:</span>
</span><span id="stream_result-1806"><a href="#stream_result-1806"><span class="linenos">1806</span></a><span class="sd"> stream: stream to stream to the result stream</span>
</span><span id="stream_result-1807"><a href="#stream_result-1807"><span class="linenos">1807</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="stream_result-1808"><a href="#stream_result-1808"><span class="linenos">1808</span></a> <span class="k">for</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">stream</span><span class="p">:</span>
</span><span id="stream_result-1809"><a href="#stream_result-1809"><span class="linenos">1809</span></a> <span class="n">append_to_result_stream</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Stream to the result stream.</p>
<p>Args:
stream: stream to stream to the result stream</p>
</div>
</section>
<section id="DataTableClient">
<input id="DataTableClient-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">DataTableClient</span>:
<label class="view-source-button" for="DataTableClient-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#DataTableClient"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DataTableClient-1811"><a href="#DataTableClient-1811"><span class="linenos">1811</span></a><span class="k">class</span><span class="w"> </span><span class="nc">DataTableClient</span><span class="p">:</span>
</span><span id="DataTableClient-1812"><a href="#DataTableClient-1812"><span class="linenos">1812</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">client</span><span class="p">:</span> <span class="n">Windmill</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="DataTableClient-1813"><a href="#DataTableClient-1813"><span class="linenos">1813</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">client</span>
</span><span id="DataTableClient-1814"><a href="#DataTableClient-1814"><span class="linenos">1814</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
</span><span id="DataTableClient-1815"><a href="#DataTableClient-1815"><span class="linenos">1815</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">query</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
</span><span id="DataTableClient-1816"><a href="#DataTableClient-1816"><span class="linenos">1816</span></a> <span class="n">args_dict</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="DataTableClient-1817"><a href="#DataTableClient-1817"><span class="linenos">1817</span></a> <span class="n">args_def</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="DataTableClient-1818"><a href="#DataTableClient-1818"><span class="linenos">1818</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">arg</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
</span><span id="DataTableClient-1819"><a href="#DataTableClient-1819"><span class="linenos">1819</span></a> <span class="n">args_dict</span><span class="p">[</span><span class="sa">f</span><span class="s2">&quot;arg</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">arg</span>
</span><span id="DataTableClient-1820"><a href="#DataTableClient-1820"><span class="linenos">1820</span></a> <span class="n">args_def</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot;-- $</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2"> arg</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span id="DataTableClient-1821"><a href="#DataTableClient-1821"><span class="linenos">1821</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="n">args_def</span> <span class="o">+</span> <span class="n">sql</span>
</span><span id="DataTableClient-1822"><a href="#DataTableClient-1822"><span class="linenos">1822</span></a> <span class="k">return</span> <span class="n">SqlQuery</span><span class="p">(</span>
</span><span id="DataTableClient-1823"><a href="#DataTableClient-1823"><span class="linenos">1823</span></a> <span class="n">sql</span><span class="p">,</span>
</span><span id="DataTableClient-1824"><a href="#DataTableClient-1824"><span class="linenos">1824</span></a> <span class="k">lambda</span> <span class="n">sql</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">run_inline_script_preview</span><span class="p">(</span>
</span><span id="DataTableClient-1825"><a href="#DataTableClient-1825"><span class="linenos">1825</span></a> <span class="n">content</span><span class="o">=</span><span class="n">sql</span><span class="p">,</span>
</span><span id="DataTableClient-1826"><a href="#DataTableClient-1826"><span class="linenos">1826</span></a> <span class="n">language</span><span class="o">=</span><span class="s2">&quot;postgresql&quot;</span><span class="p">,</span>
</span><span id="DataTableClient-1827"><a href="#DataTableClient-1827"><span class="linenos">1827</span></a> <span class="n">args</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;database&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;datatable://</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">args_dict</span><span class="p">},</span>
</span><span id="DataTableClient-1828"><a href="#DataTableClient-1828"><span class="linenos">1828</span></a> <span class="p">)</span>
</span><span id="DataTableClient-1829"><a href="#DataTableClient-1829"><span class="linenos">1829</span></a> <span class="p">)</span>
</span></pre></div>
<div id="DataTableClient.__init__" class="classattr">
<input id="DataTableClient.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="name">DataTableClient</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">client</span><span class="p">:</span> <span class="n"><a href="#Windmill">Windmill</a></span>, </span><span class="param"><span class="n">name</span><span class="p">:</span> <span class="nb">str</span></span>)</span>
<label class="view-source-button" for="DataTableClient.__init__-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#DataTableClient.__init__"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DataTableClient.__init__-1812"><a href="#DataTableClient.__init__-1812"><span class="linenos">1812</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">client</span><span class="p">:</span> <span class="n">Windmill</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="DataTableClient.__init__-1813"><a href="#DataTableClient.__init__-1813"><span class="linenos">1813</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">client</span>
</span><span id="DataTableClient.__init__-1814"><a href="#DataTableClient.__init__-1814"><span class="linenos">1814</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
</span></pre></div>
</div>
<div id="DataTableClient.client" class="classattr">
<div class="attr variable">
<span class="name">client</span>
</div>
<a class="headerlink" href="#DataTableClient.client"></a>
</div>
<div id="DataTableClient.name" class="classattr">
<div class="attr variable">
<span class="name">name</span>
</div>
<a class="headerlink" href="#DataTableClient.name"></a>
</div>
<div id="DataTableClient.query" class="classattr">
<input id="DataTableClient.query-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">query</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">sql</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="o">*</span><span class="n">args</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="DataTableClient.query-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#DataTableClient.query"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DataTableClient.query-1815"><a href="#DataTableClient.query-1815"><span class="linenos">1815</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">query</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
</span><span id="DataTableClient.query-1816"><a href="#DataTableClient.query-1816"><span class="linenos">1816</span></a> <span class="n">args_dict</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="DataTableClient.query-1817"><a href="#DataTableClient.query-1817"><span class="linenos">1817</span></a> <span class="n">args_def</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="DataTableClient.query-1818"><a href="#DataTableClient.query-1818"><span class="linenos">1818</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">arg</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
</span><span id="DataTableClient.query-1819"><a href="#DataTableClient.query-1819"><span class="linenos">1819</span></a> <span class="n">args_dict</span><span class="p">[</span><span class="sa">f</span><span class="s2">&quot;arg</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">arg</span>
</span><span id="DataTableClient.query-1820"><a href="#DataTableClient.query-1820"><span class="linenos">1820</span></a> <span class="n">args_def</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot;-- $</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2"> arg</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span id="DataTableClient.query-1821"><a href="#DataTableClient.query-1821"><span class="linenos">1821</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="n">args_def</span> <span class="o">+</span> <span class="n">sql</span>
</span><span id="DataTableClient.query-1822"><a href="#DataTableClient.query-1822"><span class="linenos">1822</span></a> <span class="k">return</span> <span class="n">SqlQuery</span><span class="p">(</span>
</span><span id="DataTableClient.query-1823"><a href="#DataTableClient.query-1823"><span class="linenos">1823</span></a> <span class="n">sql</span><span class="p">,</span>
</span><span id="DataTableClient.query-1824"><a href="#DataTableClient.query-1824"><span class="linenos">1824</span></a> <span class="k">lambda</span> <span class="n">sql</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">run_inline_script_preview</span><span class="p">(</span>
</span><span id="DataTableClient.query-1825"><a href="#DataTableClient.query-1825"><span class="linenos">1825</span></a> <span class="n">content</span><span class="o">=</span><span class="n">sql</span><span class="p">,</span>
</span><span id="DataTableClient.query-1826"><a href="#DataTableClient.query-1826"><span class="linenos">1826</span></a> <span class="n">language</span><span class="o">=</span><span class="s2">&quot;postgresql&quot;</span><span class="p">,</span>
</span><span id="DataTableClient.query-1827"><a href="#DataTableClient.query-1827"><span class="linenos">1827</span></a> <span class="n">args</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;database&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;datatable://</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">args_dict</span><span class="p">},</span>
</span><span id="DataTableClient.query-1828"><a href="#DataTableClient.query-1828"><span class="linenos">1828</span></a> <span class="p">)</span>
</span><span id="DataTableClient.query-1829"><a href="#DataTableClient.query-1829"><span class="linenos">1829</span></a> <span class="p">)</span>
</span></pre></div>
</div>
</section>
<section id="DucklakeClient">
<input id="DucklakeClient-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">DucklakeClient</span>:
<label class="view-source-button" for="DucklakeClient-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#DucklakeClient"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DucklakeClient-1831"><a href="#DucklakeClient-1831"><span class="linenos">1831</span></a><span class="k">class</span><span class="w"> </span><span class="nc">DucklakeClient</span><span class="p">:</span>
</span><span id="DucklakeClient-1832"><a href="#DucklakeClient-1832"><span class="linenos">1832</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">client</span><span class="p">:</span> <span class="n">Windmill</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="DucklakeClient-1833"><a href="#DucklakeClient-1833"><span class="linenos">1833</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">client</span>
</span><span id="DucklakeClient-1834"><a href="#DucklakeClient-1834"><span class="linenos">1834</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
</span><span id="DucklakeClient-1835"><a href="#DucklakeClient-1835"><span class="linenos">1835</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">query</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="DucklakeClient-1836"><a href="#DucklakeClient-1836"><span class="linenos">1836</span></a> <span class="n">args_dict</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="DucklakeClient-1837"><a href="#DucklakeClient-1837"><span class="linenos">1837</span></a> <span class="n">args_def</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="DucklakeClient-1838"><a href="#DucklakeClient-1838"><span class="linenos">1838</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="DucklakeClient-1839"><a href="#DucklakeClient-1839"><span class="linenos">1839</span></a> <span class="n">args_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
</span><span id="DucklakeClient-1840"><a href="#DucklakeClient-1840"><span class="linenos">1840</span></a> <span class="n">args_def</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot;-- $</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">infer_sql_type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span id="DucklakeClient-1841"><a href="#DucklakeClient-1841"><span class="linenos">1841</span></a> <span class="n">attach</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;ATTACH &#39;ducklake://</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39; AS dl;USE dl;</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span id="DucklakeClient-1842"><a href="#DucklakeClient-1842"><span class="linenos">1842</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="n">args_def</span> <span class="o">+</span> <span class="n">attach</span> <span class="o">+</span> <span class="n">sql</span>
</span><span id="DucklakeClient-1843"><a href="#DucklakeClient-1843"><span class="linenos">1843</span></a> <span class="k">return</span> <span class="n">SqlQuery</span><span class="p">(</span>
</span><span id="DucklakeClient-1844"><a href="#DucklakeClient-1844"><span class="linenos">1844</span></a> <span class="n">sql</span><span class="p">,</span>
</span><span id="DucklakeClient-1845"><a href="#DucklakeClient-1845"><span class="linenos">1845</span></a> <span class="k">lambda</span> <span class="n">sql</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">run_inline_script_preview</span><span class="p">(</span>
</span><span id="DucklakeClient-1846"><a href="#DucklakeClient-1846"><span class="linenos">1846</span></a> <span class="n">content</span><span class="o">=</span><span class="n">sql</span><span class="p">,</span>
</span><span id="DucklakeClient-1847"><a href="#DucklakeClient-1847"><span class="linenos">1847</span></a> <span class="n">language</span><span class="o">=</span><span class="s2">&quot;duckdb&quot;</span><span class="p">,</span>
</span><span id="DucklakeClient-1848"><a href="#DucklakeClient-1848"><span class="linenos">1848</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args_dict</span><span class="p">,</span>
</span><span id="DucklakeClient-1849"><a href="#DucklakeClient-1849"><span class="linenos">1849</span></a> <span class="p">)</span>
</span><span id="DucklakeClient-1850"><a href="#DucklakeClient-1850"><span class="linenos">1850</span></a> <span class="p">)</span>
</span></pre></div>
<div id="DucklakeClient.__init__" class="classattr">
<input id="DucklakeClient.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="name">DucklakeClient</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">client</span><span class="p">:</span> <span class="n"><a href="#Windmill">Windmill</a></span>, </span><span class="param"><span class="n">name</span><span class="p">:</span> <span class="nb">str</span></span>)</span>
<label class="view-source-button" for="DucklakeClient.__init__-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#DucklakeClient.__init__"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DucklakeClient.__init__-1832"><a href="#DucklakeClient.__init__-1832"><span class="linenos">1832</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">client</span><span class="p">:</span> <span class="n">Windmill</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="DucklakeClient.__init__-1833"><a href="#DucklakeClient.__init__-1833"><span class="linenos">1833</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">client</span>
</span><span id="DucklakeClient.__init__-1834"><a href="#DucklakeClient.__init__-1834"><span class="linenos">1834</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
</span></pre></div>
</div>
<div id="DucklakeClient.client" class="classattr">
<div class="attr variable">
<span class="name">client</span>
</div>
<a class="headerlink" href="#DucklakeClient.client"></a>
</div>
<div id="DucklakeClient.name" class="classattr">
<div class="attr variable">
<span class="name">name</span>
</div>
<a class="headerlink" href="#DucklakeClient.name"></a>
</div>
<div id="DucklakeClient.query" class="classattr">
<input id="DucklakeClient.query-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">query</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">sql</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="DucklakeClient.query-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#DucklakeClient.query"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DucklakeClient.query-1835"><a href="#DucklakeClient.query-1835"><span class="linenos">1835</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">query</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="DucklakeClient.query-1836"><a href="#DucklakeClient.query-1836"><span class="linenos">1836</span></a> <span class="n">args_dict</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="DucklakeClient.query-1837"><a href="#DucklakeClient.query-1837"><span class="linenos">1837</span></a> <span class="n">args_def</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="DucklakeClient.query-1838"><a href="#DucklakeClient.query-1838"><span class="linenos">1838</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="DucklakeClient.query-1839"><a href="#DucklakeClient.query-1839"><span class="linenos">1839</span></a> <span class="n">args_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
</span><span id="DucklakeClient.query-1840"><a href="#DucklakeClient.query-1840"><span class="linenos">1840</span></a> <span class="n">args_def</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot;-- $</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">infer_sql_type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span id="DucklakeClient.query-1841"><a href="#DucklakeClient.query-1841"><span class="linenos">1841</span></a> <span class="n">attach</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;ATTACH &#39;ducklake://</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39; AS dl;USE dl;</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span id="DucklakeClient.query-1842"><a href="#DucklakeClient.query-1842"><span class="linenos">1842</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="n">args_def</span> <span class="o">+</span> <span class="n">attach</span> <span class="o">+</span> <span class="n">sql</span>
</span><span id="DucklakeClient.query-1843"><a href="#DucklakeClient.query-1843"><span class="linenos">1843</span></a> <span class="k">return</span> <span class="n">SqlQuery</span><span class="p">(</span>
</span><span id="DucklakeClient.query-1844"><a href="#DucklakeClient.query-1844"><span class="linenos">1844</span></a> <span class="n">sql</span><span class="p">,</span>
</span><span id="DucklakeClient.query-1845"><a href="#DucklakeClient.query-1845"><span class="linenos">1845</span></a> <span class="k">lambda</span> <span class="n">sql</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">run_inline_script_preview</span><span class="p">(</span>
</span><span id="DucklakeClient.query-1846"><a href="#DucklakeClient.query-1846"><span class="linenos">1846</span></a> <span class="n">content</span><span class="o">=</span><span class="n">sql</span><span class="p">,</span>
</span><span id="DucklakeClient.query-1847"><a href="#DucklakeClient.query-1847"><span class="linenos">1847</span></a> <span class="n">language</span><span class="o">=</span><span class="s2">&quot;duckdb&quot;</span><span class="p">,</span>
</span><span id="DucklakeClient.query-1848"><a href="#DucklakeClient.query-1848"><span class="linenos">1848</span></a> <span class="n">args</span><span class="o">=</span><span class="n">args_dict</span><span class="p">,</span>
</span><span id="DucklakeClient.query-1849"><a href="#DucklakeClient.query-1849"><span class="linenos">1849</span></a> <span class="p">)</span>
</span><span id="DucklakeClient.query-1850"><a href="#DucklakeClient.query-1850"><span class="linenos">1850</span></a> <span class="p">)</span>
</span></pre></div>
</div>
</section>
<section id="SqlQuery">
<input id="SqlQuery-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">SqlQuery</span>:
<label class="view-source-button" for="SqlQuery-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#SqlQuery"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="SqlQuery-1852"><a href="#SqlQuery-1852"><span class="linenos">1852</span></a><span class="k">class</span><span class="w"> </span><span class="nc">SqlQuery</span><span class="p">:</span>
</span><span id="SqlQuery-1853"><a href="#SqlQuery-1853"><span class="linenos">1853</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">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">fetch_fn</span><span class="p">):</span>
</span><span id="SqlQuery-1854"><a href="#SqlQuery-1854"><span class="linenos">1854</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span> <span class="o">=</span> <span class="n">sql</span>
</span><span id="SqlQuery-1855"><a href="#SqlQuery-1855"><span class="linenos">1855</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">fetch_fn</span> <span class="o">=</span> <span class="n">fetch_fn</span>
</span><span id="SqlQuery-1856"><a href="#SqlQuery-1856"><span class="linenos">1856</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">fetch</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result_collection</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
</span><span id="SqlQuery-1857"><a href="#SqlQuery-1857"><span class="linenos">1857</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span>
</span><span id="SqlQuery-1858"><a href="#SqlQuery-1858"><span class="linenos">1858</span></a> <span class="k">if</span> <span class="n">result_collection</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="SqlQuery-1859"><a href="#SqlQuery-1859"><span class="linenos">1859</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;-- result_collection=</span><span class="si">{</span><span class="n">result_collection</span><span class="si">}</span><span class="se">\n</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s1">&#39;</span>
</span><span id="SqlQuery-1860"><a href="#SqlQuery-1860"><span class="linenos">1860</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fetch_fn</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
</span><span id="SqlQuery-1861"><a href="#SqlQuery-1861"><span class="linenos">1861</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">fetch_one</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="SqlQuery-1862"><a href="#SqlQuery-1862"><span class="linenos">1862</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="n">result_collection</span><span class="o">=</span><span class="s2">&quot;last_statement_first_row&quot;</span><span class="p">)</span>
</span></pre></div>
<div id="SqlQuery.__init__" class="classattr">
<input id="SqlQuery.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="name">SqlQuery</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">sql</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">fetch_fn</span></span>)</span>
<label class="view-source-button" for="SqlQuery.__init__-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#SqlQuery.__init__"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="SqlQuery.__init__-1853"><a href="#SqlQuery.__init__-1853"><span class="linenos">1853</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">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">fetch_fn</span><span class="p">):</span>
</span><span id="SqlQuery.__init__-1854"><a href="#SqlQuery.__init__-1854"><span class="linenos">1854</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span> <span class="o">=</span> <span class="n">sql</span>
</span><span id="SqlQuery.__init__-1855"><a href="#SqlQuery.__init__-1855"><span class="linenos">1855</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">fetch_fn</span> <span class="o">=</span> <span class="n">fetch_fn</span>
</span></pre></div>
</div>
<div id="SqlQuery.sql" class="classattr">
<div class="attr variable">
<span class="name">sql</span>
</div>
<a class="headerlink" href="#SqlQuery.sql"></a>
</div>
<div id="SqlQuery.fetch_fn" class="classattr">
<div class="attr variable">
<span class="name">fetch_fn</span>
</div>
<a class="headerlink" href="#SqlQuery.fetch_fn"></a>
</div>
<div id="SqlQuery.fetch" class="classattr">
<input id="SqlQuery.fetch-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">fetch</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">result_collection</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="SqlQuery.fetch-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#SqlQuery.fetch"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="SqlQuery.fetch-1856"><a href="#SqlQuery.fetch-1856"><span class="linenos">1856</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">fetch</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result_collection</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
</span><span id="SqlQuery.fetch-1857"><a href="#SqlQuery.fetch-1857"><span class="linenos">1857</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span>
</span><span id="SqlQuery.fetch-1858"><a href="#SqlQuery.fetch-1858"><span class="linenos">1858</span></a> <span class="k">if</span> <span class="n">result_collection</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="SqlQuery.fetch-1859"><a href="#SqlQuery.fetch-1859"><span class="linenos">1859</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;-- result_collection=</span><span class="si">{</span><span class="n">result_collection</span><span class="si">}</span><span class="se">\n</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s1">&#39;</span>
</span><span id="SqlQuery.fetch-1860"><a href="#SqlQuery.fetch-1860"><span class="linenos">1860</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fetch_fn</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
</span></pre></div>
</div>
<div id="SqlQuery.fetch_one" class="classattr">
<input id="SqlQuery.fetch_one-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">fetch_one</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="SqlQuery.fetch_one-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#SqlQuery.fetch_one"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="SqlQuery.fetch_one-1861"><a href="#SqlQuery.fetch_one-1861"><span class="linenos">1861</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">fetch_one</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="SqlQuery.fetch_one-1862"><a href="#SqlQuery.fetch_one-1862"><span class="linenos">1862</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="n">result_collection</span><span class="o">=</span><span class="s2">&quot;last_statement_first_row&quot;</span><span class="p">)</span>
</span></pre></div>
</div>
</section>
<section id="infer_sql_type">
<input id="infer_sql_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">infer_sql_type</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">value</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="infer_sql_type-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#infer_sql_type"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="infer_sql_type-1864"><a href="#infer_sql_type-1864"><span class="linenos">1864</span></a><span class="k">def</span><span class="w"> </span><span class="nf">infer_sql_type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="infer_sql_type-1865"><a href="#infer_sql_type-1865"><span class="linenos">1865</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="infer_sql_type-1866"><a href="#infer_sql_type-1866"><span class="linenos">1866</span></a><span class="sd"> DuckDB executor requires explicit argument types at declaration</span>
</span><span id="infer_sql_type-1867"><a href="#infer_sql_type-1867"><span class="linenos">1867</span></a><span class="sd"> These types exist in both DuckDB and Postgres</span>
</span><span id="infer_sql_type-1868"><a href="#infer_sql_type-1868"><span class="linenos">1868</span></a><span class="sd"> Check that the types exist if you plan to extend this function for other SQL engines.</span>
</span><span id="infer_sql_type-1869"><a href="#infer_sql_type-1869"><span class="linenos">1869</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="infer_sql_type-1870"><a href="#infer_sql_type-1870"><span class="linenos">1870</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><span id="infer_sql_type-1871"><a href="#infer_sql_type-1871"><span class="linenos">1871</span></a> <span class="c1"># Check bool before int since bool is a subclass of int in Python</span>
</span><span id="infer_sql_type-1872"><a href="#infer_sql_type-1872"><span class="linenos">1872</span></a> <span class="k">return</span> <span class="s2">&quot;BOOLEAN&quot;</span>
</span><span id="infer_sql_type-1873"><a href="#infer_sql_type-1873"><span class="linenos">1873</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
</span><span id="infer_sql_type-1874"><a href="#infer_sql_type-1874"><span class="linenos">1874</span></a> <span class="k">return</span> <span class="s2">&quot;BIGINT&quot;</span>
</span><span id="infer_sql_type-1875"><a href="#infer_sql_type-1875"><span class="linenos">1875</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span>
</span><span id="infer_sql_type-1876"><a href="#infer_sql_type-1876"><span class="linenos">1876</span></a> <span class="k">return</span> <span class="s2">&quot;DOUBLE PRECISION&quot;</span>
</span><span id="infer_sql_type-1877"><a href="#infer_sql_type-1877"><span class="linenos">1877</span></a> <span class="k">elif</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="infer_sql_type-1878"><a href="#infer_sql_type-1878"><span class="linenos">1878</span></a> <span class="k">return</span> <span class="s2">&quot;TEXT&quot;</span>
</span><span id="infer_sql_type-1879"><a href="#infer_sql_type-1879"><span class="linenos">1879</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="infer_sql_type-1880"><a href="#infer_sql_type-1880"><span class="linenos">1880</span></a> <span class="k">return</span> <span class="s2">&quot;TEXT&quot;</span>
</span><span id="infer_sql_type-1881"><a href="#infer_sql_type-1881"><span class="linenos">1881</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
</span><span id="infer_sql_type-1882"><a href="#infer_sql_type-1882"><span class="linenos">1882</span></a> <span class="k">return</span> <span class="s2">&quot;JSON&quot;</span>
</span><span id="infer_sql_type-1883"><a href="#infer_sql_type-1883"><span class="linenos">1883</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="infer_sql_type-1884"><a href="#infer_sql_type-1884"><span class="linenos">1884</span></a> <span class="k">return</span> <span class="s2">&quot;TEXT&quot;</span>
</span></pre></div>
<div class="docstring"><p>DuckDB executor requires explicit argument types at declaration
These types exist in both DuckDB and Postgres
Check that the types exist if you plan to extend this function for other SQL engines.</p>
</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>