blob: a406cc4a7920786246c030a373c7d85c0284a155 [file] [log] [blame]
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>airflow.models.baseoperator &mdash; Airflow Documentation</title>
<link rel="stylesheet" href="../../../_static/_gen/css/main.min.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../../../_static/_gen/css/main-custom.min.css" />
<link rel="stylesheet" type="text/css" href="../../../_static/graphviz.css" />
<link rel="shortcut icon" href="../../../_static/pin_32.png"/>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<script type="application/javascript">
var doNotTrack = false;
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-140539454-1', 'auto');
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
</head><body class="td-section">
<header>
<nav class="js-navbar-scroll navbar">
<div class="navbar__icon-container">
<a href="/">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
<path id="Rectangle_1" d="M0 0h155.314v60H0z" fill="none" data-name="Rectangle 1"></path>
</clipPath>
</defs>
<g id="logo" transform="translate(-1305 -780.355)">
<g id="Group_2" clip-path="url(#clip-path)" data-name="Group 2" transform="translate(1305 780.355)">
<g id="Group_1" data-name="Group 1" transform="translate(.486 .486)">
<path id="Path_1" d="M1307.562 880.867l28.187-28.893a.521.521 0 0 0 .063-.666c-1.714-2.393-4.877-2.808-6.049-4.416-3.472-4.763-4.353-7.459-5.845-7.292a.456.456 0 0 0-.271.143l-10.182 10.438c-5.858 6-6.7 19.225-6.852 30.3a.552.552 0 0 0 .949.386z" fill="#017cee" data-name="Path 1" transform="translate(-1306.613 -822.232)"></path>
<path id="Path_2" d="M1405.512 908.489l-28.893-28.189a.521.521 0 0 0-.667-.063c-2.393 1.715-2.808 4.877-4.416 6.049-4.763 3.472-7.459 4.353-7.292 5.845a.456.456 0 0 0 .143.27l10.438 10.182c6 5.858 19.225 6.7 30.3 6.852a.552.552 0 0 0 .387-.946z" fill="#00ad46" data-name="Path 2" transform="translate(-1346.876 -850.567)"></path>
<path id="Path_3" d="M1373.909 902.252c-3.28-3.2-4.8-9.53 1.486-22.583-10.219 4.567-13.8 10.57-12.039 12.289z" fill="#04d659" data-name="Path 3" transform="translate(-1345.96 -850.233)"></path>
<path id="Path_4" d="M1433.132 782.359l-28.186 28.893a.52.52 0 0 0-.063.666c1.715 2.393 4.876 2.808 6.049 4.416 3.472 4.763 4.354 7.459 5.845 7.292a.454.454 0 0 0 .271-.143l10.182-10.438c5.858-6 6.7-19.225 6.852-30.3a.553.553 0 0 0-.95-.386z" fill="#00c7d4" data-name="Path 4" transform="translate(-1375.21 -782.123)"></path>
<path id="Path_5" d="M1426.9 881.155c-3.2 3.28-9.53 4.8-22.584-1.486 4.567 10.219 10.57 13.8 12.289 12.039z" fill="#11e1ee" data-name="Path 5" transform="translate(-1374.875 -850.233)"></path>
<path id="Path_6" d="M1307 782.919l28.893 28.186a.521.521 0 0 0 .666.063c2.393-1.715 2.808-4.877 4.416-6.049 4.763-3.472 7.459-4.353 7.292-5.845a.459.459 0 0 0-.143-.271l-10.438-10.182c-6-5.858-19.225-6.7-30.3-6.852a.552.552 0 0 0-.386.95z" fill="#e43921" data-name="Path 6" transform="translate(-1306.766 -781.97)"></path>
<path id="Path_7" d="M1405.8 804.711c3.28 3.2 4.8 9.53-1.486 22.584 10.219-4.567 13.8-10.571 12.039-12.289z" fill-rule="evenodd" fill="#ff7557" data-name="Path 7" transform="translate(-1374.875 -797.859)"></path>
<path id="Path_8" d="M1329.355 849.266c3.2-3.28 9.53-4.8 22.584 1.486-4.567-10.219-10.57-13.8-12.289-12.039z" fill="#0cb6ff" data-name="Path 8" transform="translate(-1322.503 -821.316)"></path>
<circle id="Ellipse_1" cx="1.26" cy="1.26" r="1.26" fill="#4a4848" data-name="Ellipse 1" transform="translate(28.18 28.171)"></circle>
<path id="Path_9" d="M1527.558 827.347a.229.229 0 0 1-.223-.223.458.458 0 0 1 .011-.123l2.766-7.214a.346.346 0 0 1 .357-.245h.758a.348.348 0 0 1 .357.245l2.754 7.214.022.123a.228.228 0 0 1-.223.223h-.568a.288.288 0 0 1-.19-.056.352.352 0 0 1-.089-.134l-.613-1.583h-3.657l-.613 1.583a.317.317 0 0 1-.1.134.269.269 0 0 1-.178.056zm4.795-2.732l-1.505-3.958-1.505 3.958zm3.322 4.85a.258.258 0 0 1-.189-.078.241.241 0 0 1-.067-.178v-7.4a.241.241 0 0 1 .067-.178.258.258 0 0 1 .189-.078h.513a.268.268 0 0 1 .256.256v.49a2.118 2.118 0 0 1 1.828-.858 2.092 2.092 0 0 1 1.751.736 3.135 3.135 0 0 1 .636 1.9q.011.122.011.379t-.011.379a3.168 3.168 0 0 1-.636 1.9 2.111 2.111 0 0 1-1.751.736 2.154 2.154 0 0 1-1.806-.836v2.587a.241.241 0 0 1-.067.178.223.223 0 0 1-.179.078zm2.364-2.91a1.324 1.324 0 0 0 1.149-.491 2.266 2.266 0 0 0 .4-1.293q.011-.111.011-.323 0-2.107-1.562-2.107a1.365 1.365 0 0 0-1.159.513 2.111 2.111 0 0 0-.412 1.2l-.012.424.012.435a1.862 1.862 0 0 0 .424 1.149 1.4 1.4 0 0 0 1.148.493zm5.628.9a2.329 2.329 0 0 1-1.015-.223 1.94 1.94 0 0 1-.747-.6 1.487 1.487 0 0 1-.268-.859 1.459 1.459 0 0 1 .6-1.2 3.4 3.4 0 0 1 1.65-.624l1.661-.234v-.323q0-1.137-1.3-1.137a1.4 1.4 0 0 0-.8.212 1.376 1.376 0 0 0-.468.48.305.305 0 0 1-.089.145.18.18 0 0 1-.134.045h-.48a.23.23 0 0 1-.245-.245 1.17 1.17 0 0 1 .245-.6 1.931 1.931 0 0 1 .747-.591 2.7 2.7 0 0 1 1.238-.256 2.351 2.351 0 0 1 1.8.591 2.032 2.032 0 0 1 .547 1.45v3.613a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.513a.233.233 0 0 1-.257-.256v-.479a1.923 1.923 0 0 1-.714.6 2.557 2.557 0 0 1-1.203.237zm.234-.836a1.579 1.579 0 0 0 1.182-.469 1.881 1.881 0 0 0 .468-1.371v-.312l-1.293.19a2.918 2.918 0 0 0-1.193.379.761.761 0 0 0-.4.658.784.784 0 0 0 .368.691 1.585 1.585 0 0 0 .867.237zm6.643.836a2.556 2.556 0 0 1-1.873-.669 2.738 2.738 0 0 1-.714-1.9l-.011-.446.011-.446a2.7 2.7 0 0 1 .714-1.885 2.531 2.531 0 0 1 1.873-.68 2.917 2.917 0 0 1 1.36.29 2.077 2.077 0 0 1 .825.714 1.7 1.7 0 0 1 .3.848.2.2 0 0 1-.067.178.281.281 0 0 1-.19.067h-.535a.265.265 0 0 1-.168-.045.458.458 0 0 1-.111-.178 1.428 1.428 0 0 0-.535-.758 1.516 1.516 0 0 0-.87-.234 1.45 1.45 0 0 0-1.1.435 1.952 1.952 0 0 0-.435 1.3l-.011.4.011.379a1.969 1.969 0 0 0 .435 1.316 1.446 1.446 0 0 0 1.1.424 1.577 1.577 0 0 0 .87-.223 1.493 1.493 0 0 0 .535-.769.458.458 0 0 1 .111-.178.228.228 0 0 1 .168-.056h.535a.258.258 0 0 1 .19.078.2.2 0 0 1 .067.178 1.75 1.75 0 0 1-.3.847 2.078 2.078 0 0 1-.825.714 2.876 2.876 0 0 1-1.361.302zm4.078-.112a.233.233 0 0 1-.257-.256v-7.4a.241.241 0 0 1 .067-.178.259.259 0 0 1 .19-.078h.557a.267.267 0 0 1 .257.256v2.6a2.167 2.167 0 0 1 .758-.624 2.353 2.353 0 0 1 1.082-.223 2.067 2.067 0 0 1 1.661.691 2.642 2.642 0 0 1 .6 1.818v3.144a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.557a.233.233 0 0 1-.256-.256V824a1.775 1.775 0 0 0-.39-1.227 1.387 1.387 0 0 0-1.1-.435 1.481 1.481 0 0 0-1.126.446 1.7 1.7 0 0 0-.412 1.215v3.088a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067zm8.846.112a2.466 2.466 0 0 1-1.84-.7 2.938 2.938 0 0 1-.747-1.94l-.011-.379.011-.368a2.953 2.953 0 0 1 .758-1.918 2.7 2.7 0 0 1 3.735.078 3.114 3.114 0 0 1 .68 2.119v.19a.257.257 0 0 1-.078.189.241.241 0 0 1-.178.067h-3.858v.1a2.11 2.11 0 0 0 .435 1.238 1.332 1.332 0 0 0 1.081.5 1.563 1.563 0 0 0 .836-.2 1.7 1.7 0 0 0 .491-.435.6.6 0 0 1 .145-.156.391.391 0 0 1 .19-.033h.547a.252.252 0 0 1 .167.056.192.192 0 0 1 .067.156.975.975 0 0 1-.312.591 2.51 2.51 0 0 1-.859.6 3.049 3.049 0 0 1-1.26.248zm1.527-3.434v-.033a1.817 1.817 0 0 0-.424-1.249 1.512 1.512 0 0 0-2.23 0 1.883 1.883 0 0 0-.4 1.249v.033z" fill="#51504f" data-name="Path 9" transform="translate(-1460.834 -808.144)"></path>
<path id="Path_10" d="M1527.2 827.081l-.061.061zm-.056-.279l-.08-.031zm2.766-7.214l.08.031zm1.472 0l-.081.029zm2.754 7.214l.084-.015a.064.064 0 0 0 0-.015zm.022.123h.086v-.015zm-.067.156l.06.061zm-.914.011l-.061.061.006.005zm-.089-.134l.081-.027zm-.613-1.583l.08-.031a.086.086 0 0 0-.08-.055zm-3.657 0v-.086a.086.086 0 0 0-.08.055zm-.613 1.583l-.08-.031zm-.1.134l.055.066zm4.047-2.676v.086a.086.086 0 0 0 .08-.116zm-1.505-3.958l.08-.03a.086.086 0 0 0-.16 0zm-1.505 3.958l-.08-.03a.086.086 0 0 0 .08.116zm-1.784 2.646a.128.128 0 0 1-.1-.042l-.122.121a.3.3 0 0 0 .217.092zm-.1-.042a.129.129 0 0 1-.042-.1h-.171a.3.3 0 0 0 .092.217zm-.042-.1a.38.38 0 0 1 .007-.1l-.163-.054a.514.514 0 0 0-.016.15zm.005-.092l2.765-7.214-.16-.061-2.765 7.214zm2.766-7.216a.283.283 0 0 1 .1-.143.3.3 0 0 1 .174-.046v-.172a.47.47 0 0 0-.271.076.453.453 0 0 0-.166.226zm.276-.189h.758v-.172h-.758zm.758 0a.3.3 0 0 1 .175.046.283.283 0 0 1 .1.143l.161-.059a.451.451 0 0 0-.166-.226.47.47 0 0 0-.272-.076zm.277.19l2.754 7.214.16-.061-2.754-7.214zm2.75 7.2l.022.123.169-.031-.022-.123zm.021.107a.13.13 0 0 1-.042.1l.121.121a.3.3 0 0 0 .092-.217zm-.042.1a.13.13 0 0 1-.1.042v.171a.3.3 0 0 0 .217-.092zm-.1.042h-.568v.171h.568zm-.568 0a.206.206 0 0 1-.135-.036l-.11.132a.373.373 0 0 0 .245.076zm-.129-.031a.262.262 0 0 1-.069-.1l-.162.054a.431.431 0 0 0 .11.167zm-.07-.1l-.613-1.584-.16.062.613 1.583zm-.693-1.638h-3.657v.171h3.657zm-3.737.055l-.614 1.584.16.062.613-1.583zm-.615 1.587a.235.235 0 0 1-.075.1l.111.13a.4.4 0 0 0 .126-.172zm-.074.1a.185.185 0 0 1-.124.036v.171a.354.354 0 0 0 .233-.076zm-.124.036h-.569v.171h.569zm4.306-2.677l-1.505-3.958-.16.061 1.505 3.958zm-1.666-3.958l-1.505 3.958.16.061 1.505-3.958zm-1.425 4.075h3.01v-.171h-3.01zm6.143 4.687l-.06.061zm0-7.761l.061.061zm.881 0l-.065.056.01.009zm.078.669h-.086a.086.086 0 0 0 .155.051zm3.579-.123l-.067.053zm.636 1.9h-.086zm0 .758l-.085-.007zm-.636 1.9l.067.054zm-3.557-.1l.068-.052a.086.086 0 0 0-.154.052zm-.067 2.765l-.061-.06zm2.787-3.323l-.069-.051zm.4-1.293l-.085-.008v.005zm-2.709-1.918l-.068-.052zm-.413 1.2h-.086zm-.011.423h-.085zm.011.435h-.086zm.424 1.149l.066-.054zm-1.216 3.315a.173.173 0 0 1-.129-.053l-.121.121a.342.342 0 0 0 .25.1zm-.129-.053a.157.157 0 0 1-.042-.118h-.172a.325.325 0 0 0 .092.239zm-.042-.118v-7.4h-.172v7.4zm0-7.4a.157.157 0 0 1 .042-.118l-.121-.121a.324.324 0 0 0-.092.239zm.042-.118a.173.173 0 0 1 .129-.053v-.172a.342.342 0 0 0-.25.1zm.129-.053h.513v-.172h-.513zm.513 0a.137.137 0 0 1 .113.048l.13-.111a.309.309 0 0 0-.244-.108zm.123.058a.137.137 0 0 1 .048.113h.171a.309.309 0 0 0-.108-.243zm.048.113v.49h.171v-.49zm.155.541a2.033 2.033 0 0 1 1.759-.823v-.171a2.2 2.2 0 0 0-1.9.894zm1.759-.823a2.007 2.007 0 0 1 1.683.7l.135-.106a2.177 2.177 0 0 0-1.818-.768zm1.683.7a3.045 3.045 0 0 1 .617 1.845l.171-.007a3.218 3.218 0 0 0-.654-1.946zm.617 1.85c.007.078.011.2.011.372h.171c0-.171 0-.3-.012-.387zm.011.372c0 .171 0 .294-.011.372l.17.015c.008-.086.012-.216.012-.387zm-.011.376a3.08 3.08 0 0 1-.617 1.846l.134.106a3.25 3.25 0 0 0 .654-1.945zm-.617 1.845a2.025 2.025 0 0 1-1.683.7v.171a2.2 2.2 0 0 0 1.817-.768zm-1.683.7a2.068 2.068 0 0 1-1.739-.8l-.136.1a2.239 2.239 0 0 0 1.874.87zm-1.892-.75v2.587h.172v-2.587zm0 2.587a.156.156 0 0 1-.042.118l.121.121a.325.325 0 0 0 .092-.239zm-.046.123a.138.138 0 0 1-.114.048v.172a.308.308 0 0 0 .244-.108zm-.114.048h-.546v.172h.546zm1.817-2.739a1.408 1.408 0 0 0 1.218-.526l-.138-.1a1.24 1.24 0 0 1-1.079.455zm1.217-.525a2.355 2.355 0 0 0 .419-1.341l-.171-.007a2.182 2.182 0 0 1-.385 1.246zm.418-1.336c.008-.079.012-.19.012-.332h-.172c0 .14 0 .245-.011.315zm.012-.332a2.726 2.726 0 0 0-.407-1.632 1.448 1.448 0 0 0-1.24-.562v.171a1.278 1.278 0 0 1 1.1.492 2.565 2.565 0 0 1 .374 1.53zm-1.647-2.193a1.452 1.452 0 0 0-1.228.547l.136.1a1.282 1.282 0 0 1 1.091-.479zm-1.228.547a2.2 2.2 0 0 0-.43 1.252l.172.008a2.028 2.028 0 0 1 .4-1.157zm-.43 1.254l-.011.424h.171l.011-.424zm-.011.428l.011.435h.172l-.011-.435zm.011.436a1.95 1.95 0 0 0 .443 1.2l.133-.109a1.776 1.776 0 0 1-.4-1.1zm.443 1.2a1.484 1.484 0 0 0 1.214.522v-.171a1.314 1.314 0 0 1-1.082-.459zm5.828 1.117l.037-.077zm-.747-.6l-.07.049zm.335-2.063l.052.068zm1.65-.624l.012.085zm1.661-.234l.012.085a.086.086 0 0 0 .074-.085zm-2.107-1.249l.046.072zm-.468.48l-.075-.042a.083.083 0 0 0-.006.015zm-.089.145l-.054-.067-.007.006zm-.792-.022l-.065.056.009.009zm-.067-.178h-.086zm.245-.6l-.07-.049zm.747-.591l.038.077zm3.033.334l-.063.058zm.468 5.252l.06.061zm-.881 0l-.065.056a.043.043 0 0 0 .009.009zm-.067-.669h.086a.086.086 0 0 0-.156-.048zm-.714.6l-.04-.076zm.223-1.059l-.062-.06zm.468-1.684h.086a.086.086 0 0 0-.1-.085zm-1.293.189l.012.085zm-1.193.379l.046.072zm-.033 1.349l-.047.071zm.635.985a2.241 2.241 0 0 1-.978-.215l-.074.155a2.412 2.412 0 0 0 1.051.231zm-.978-.215a1.859 1.859 0 0 1-.715-.576l-.138.1a2.024 2.024 0 0 0 .779.629zm-.713-.573a1.4 1.4 0 0 1-.253-.81h-.172a1.571 1.571 0 0 0 .283.907zm-.253-.81a1.374 1.374 0 0 1 .569-1.136l-.105-.135a1.544 1.544 0 0 0-.635 1.272zm.569-1.137a3.316 3.316 0 0 1 1.609-.607l-.024-.17a3.481 3.481 0 0 0-1.691.642zm1.609-.607l1.661-.234-.024-.17-1.662.234zm1.735-.319v-.323h-.171v.323zm0-.323a1.156 1.156 0 0 0-.355-.917 1.536 1.536 0 0 0-1.035-.306v.172a1.37 1.37 0 0 1 .922.263.986.986 0 0 1 .3.788zm-1.39-1.223a1.486 1.486 0 0 0-.851.227l.1.142a1.316 1.316 0 0 1 .755-.2zm-.849.226a1.452 1.452 0 0 0-.5.51l.15.084a1.286 1.286 0 0 1 .44-.449zm-.5.524a.226.226 0 0 1-.062.105l.107.134a.391.391 0 0 0 .117-.185zm-.068.112a.1.1 0 0 1-.073.019v.171a.266.266 0 0 0 .194-.07zm-.073.019h-.48v.171h.48zm-.48 0a.18.18 0 0 1-.122-.046l-.112.13a.352.352 0 0 0 .234.087zm-.113-.037a.18.18 0 0 1-.047-.123h-.171a.352.352 0 0 0 .087.234zm-.047-.119a1.1 1.1 0 0 1 .23-.557l-.14-.1a1.253 1.253 0 0 0-.261.648zm.23-.556a1.843 1.843 0 0 1 .715-.564l-.075-.154a2.018 2.018 0 0 0-.78.618zm.716-.564a2.611 2.611 0 0 1 1.2-.247v-.171a2.781 2.781 0 0 0-1.277.266zm1.2-.247a2.268 2.268 0 0 1 1.732.563l.126-.116a2.435 2.435 0 0 0-1.858-.618zm1.733.564a1.945 1.945 0 0 1 .523 1.391h.171a2.117 2.117 0 0 0-.57-1.508zm.523 1.391v3.613h.171v-3.613zm0 3.613a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.157.157 0 0 1-.118.042v.171a.326.326 0 0 0 .239-.092zm-.118.042h-.513v.171h.513zm-.513 0a.2.2 0 0 1-.134-.046l-.111.13a.367.367 0 0 0 .245.088zm-.124-.037a.194.194 0 0 1-.047-.134h-.171a.366.366 0 0 0 .087.245zm-.047-.134v-.479h-.171v.479zm-.156-.528a1.846 1.846 0 0 1-.683.575l.079.152a2.012 2.012 0 0 0 .745-.629zm-.683.575a2.476 2.476 0 0 1-1.153.236v.171a2.644 2.644 0 0 0 1.233-.255zm-.919-.429a1.666 1.666 0 0 0 1.244-.494l-.123-.12a1.493 1.493 0 0 1-1.121.442zm1.244-.494a1.969 1.969 0 0 0 .492-1.431h-.171a1.8 1.8 0 0 1-.444 1.312zm.492-1.431v-.312h-.171v.312zm-.1-.4l-1.293.189.025.17 1.293-.189zm-1.293.189a3 3 0 0 0-1.228.393l.095.143a2.837 2.837 0 0 1 1.158-.365zm-1.227.392a.845.845 0 0 0-.441.73h.172a.676.676 0 0 1 .362-.586zm-.441.73a.869.869 0 0 0 .406.762l.095-.142a.7.7 0 0 1-.33-.62zm.408.764a1.673 1.673 0 0 0 .916.247v-.171a1.5 1.5 0 0 1-.823-.221zm5.686.329l-.061.06zm-.714-1.9h-.085zm-.011-.446h-.085zm.011-.446h-.085zm.714-1.885l.061.061zm3.234-.39l-.04.076zm.825.713l-.073.046zm.3.848h-.086zm-.067.178l.056.065zm-.892.022l.054-.067zm-.112-.178l-.081.029zm-.535-.758l-.048.071zm-1.974.2l-.062-.059zm-.435 1.3h-.086zm-.011.4h-.086zm.011.379h-.086zm.435 1.316l-.062.059zm1.974.2l.046.072zm.535-.769l-.079-.033zm.112-.178l.054.067.007-.006zm.892.022l-.061.06zm.067.178l-.085-.009zm-.3.847l-.072-.046zm-.825.714l-.04-.076zm-1.36.2a2.471 2.471 0 0 1-1.814-.644l-.12.122a2.64 2.64 0 0 0 1.933.694zm-1.813-.643a2.653 2.653 0 0 1-.689-1.839l-.171.006a2.822 2.822 0 0 0 .738 1.952zm-.689-1.838l-.011-.446h-.171l.011.446zm-.011-.442l.011-.446h-.171l-.011.446zm.011-.445a2.611 2.611 0 0 1 .689-1.827l-.122-.121a2.78 2.78 0 0 0-.738 1.942zm.689-1.827a2.447 2.447 0 0 1 1.813-.655v-.171a2.617 2.617 0 0 0-1.934.705zm1.813-.655a2.836 2.836 0 0 1 1.32.28l.079-.152a3 3 0 0 0-1.4-.3zm1.32.28a1.99 1.99 0 0 1 .792.683l.145-.091a2.158 2.158 0 0 0-.858-.744zm.793.685a1.617 1.617 0 0 1 .287.8l.171-.009a1.789 1.789 0 0 0-.315-.89zm.287.809a.11.11 0 0 1-.037.1l.112.13a.281.281 0 0 0 .1-.252zm-.037.1a.2.2 0 0 1-.134.046v.171a.369.369 0 0 0 .246-.088zm-.134.046h-.535v.171h.535zm-.535 0a.184.184 0 0 1-.114-.026l-.107.134a.345.345 0 0 0 .221.064zm-.114-.026a.389.389 0 0 1-.086-.144l-.158.066a.533.533 0 0 0 .137.212zm-.084-.14a1.514 1.514 0 0 0-.57-.8l-.093.144a1.343 1.343 0 0 1 .5.715zm-.568-.8a1.6 1.6 0 0 0-.918-.249v.171a1.435 1.435 0 0 1 .822.219zm-.918-.249a1.535 1.535 0 0 0-1.166.462l.124.118a1.364 1.364 0 0 1 1.042-.408zm-1.166.462a2.036 2.036 0 0 0-.458 1.36l.171.006a1.872 1.872 0 0 1 .411-1.249zm-.458 1.361l-.011.4h.171l.011-.4zm-.011.406l.011.379.171-.005-.011-.379zm.011.38a2.052 2.052 0 0 0 .458 1.371l.124-.118a1.889 1.889 0 0 1-.411-1.26zm.458 1.371a1.533 1.533 0 0 0 1.166.451v-.172a1.363 1.363 0 0 1-1.042-.4zm1.166.451a1.661 1.661 0 0 0 .916-.237l-.093-.144a1.491 1.491 0 0 1-.823.209zm.918-.238a1.576 1.576 0 0 0 .568-.812l-.162-.057a1.409 1.409 0 0 1-.5.727zm.566-.807a.39.39 0 0 1 .086-.144l-.107-.134a.533.533 0 0 0-.137.213zm.093-.151a.144.144 0 0 1 .107-.031v-.171a.31.31 0 0 0-.228.081zm.107-.031h.535v-.171h-.535zm.535 0a.173.173 0 0 1 .129.053l.121-.121a.344.344 0 0 0-.25-.1zm.134.057a.11.11 0 0 1 .037.1l.17.017a.281.281 0 0 0-.1-.252zm.037.109a1.664 1.664 0 0 1-.288.806l.144.092a1.839 1.839 0 0 0 .315-.889zm-.288.806a1.989 1.989 0 0 1-.792.683l.079.152a2.162 2.162 0 0 0 .858-.744zm-.793.684a2.8 2.8 0 0 1-1.32.28v.171a2.96 2.96 0 0 0 1.4-.3zm2.568.187l-.065.056.01.009zm0-7.772l.061.06zm.926 0l-.065.056.009.009zm.078 2.776h-.085a.086.086 0 0 0 .153.053zm.758-.624l.038.077zm2.743.468l-.065.056zm.524 5.151l-.061-.06zm-.925 0l-.065.056.009.009zm-.457-4.5l-.065.056zm-2.23.011l-.062-.059zm-.49 4.493l-.061-.06zm-.736-.019a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.367.367 0 0 0 .087.245zm-.046-.134v-7.4h-.172v7.4zm0-7.4a.156.156 0 0 1 .042-.118l-.121-.121a.326.326 0 0 0-.092.239zm.042-.118a.172.172 0 0 1 .129-.053v-.171a.343.343 0 0 0-.25.1zm.129-.053h.557v-.171h-.557zm.557 0a.137.137 0 0 1 .113.048l.13-.112a.308.308 0 0 0-.244-.108zm.122.057a.137.137 0 0 1 .048.113h.172a.309.309 0 0 0-.108-.243zm.048.113v2.6h.172v-2.6zm.153 2.651a2.076 2.076 0 0 1 .728-.6l-.075-.154a2.248 2.248 0 0 0-.788.649zm.73-.6a2.272 2.272 0 0 1 1.043-.214v-.171a2.438 2.438 0 0 0-1.121.232zm1.043-.214a1.982 1.982 0 0 1 1.6.661l.13-.112a2.152 2.152 0 0 0-1.727-.721zm1.6.663a2.557 2.557 0 0 1 .581 1.761h.171a2.727 2.727 0 0 0-.624-1.874zm.581 1.761v3.144h.171v-3.144zm0 3.144a.173.173 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm-.557 0a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.368.368 0 0 0 .087.245zm-.046-.134V823.8h-.172v3.088zm0-3.088a1.859 1.859 0 0 0-.412-1.284l-.128.114a1.69 1.69 0 0 1 .368 1.169zm-.411-1.283a1.471 1.471 0 0 0-1.169-.464v.171a1.3 1.3 0 0 1 1.039.406zm-1.169-.464a1.566 1.566 0 0 0-1.188.473l.124.118a1.4 1.4 0 0 1 1.064-.419zm-1.188.473a1.779 1.779 0 0 0-.436 1.275h.172a1.609 1.609 0 0 1 .389-1.156zm-.436 1.275v3.088h.172V823.8zm0 3.088a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm6.449-.505l-.062.059zm-.747-1.94h-.086zm-.012-.379h-.085v.005zm.012-.368l-.086-.006zm.758-1.918l-.061-.06zm3.735.078l-.065.056zm.6 2.5l.061.061zm-4.036.067v-.086a.086.086 0 0 0-.086.086zm0 .1h-.086zm.435 1.238l-.068.053zm1.918.3l.045.073zm.491-.435l-.069-.051zm.145-.156l.039.077h.006zm.9.022l-.055.066zm-.245.747l-.064-.057zm-.858.6l.035.078zm.267-3.189v.086a.086.086 0 0 0 .086-.086zm-.424-1.282l-.066.055zm-2.23 0l-.065-.055zm-.4 1.282h-.086a.086.086 0 0 0 .086.086zm1.528 3.349a2.38 2.38 0 0 1-1.779-.677l-.122.12a2.55 2.55 0 0 0 1.9.728zm-1.778-.676a2.86 2.86 0 0 1-.724-1.886l-.171.009a3.027 3.027 0 0 0 .771 1.995zm-.723-1.884l-.011-.379h-.171l.011.379zm-.011-.374l.011-.368-.172-.005-.011.368zm.011-.365a2.871 2.871 0 0 1 .735-1.864l-.124-.118a3.042 3.042 0 0 0-.782 1.971zm.734-1.864a2.331 2.331 0 0 1 1.756-.687v-.171a2.5 2.5 0 0 0-1.879.74zm1.756-.687a2.307 2.307 0 0 1 1.853.762l.13-.112a2.477 2.477 0 0 0-1.983-.821zm1.854.762a3.03 3.03 0 0 1 .659 2.062h.172a3.2 3.2 0 0 0-.7-2.175zm.659 2.062v.19h.172v-.19zm0 .19a.172.172 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-3.858v.171h3.858zm-3.944.086v.1h.172v-.1zm0 .1a2.2 2.2 0 0 0 .453 1.287l.135-.106a2.027 2.027 0 0 1-.417-1.189zm.454 1.288a1.418 1.418 0 0 0 1.148.533v-.171a1.247 1.247 0 0 1-1.015-.47zm1.148.533a1.647 1.647 0 0 0 .882-.214l-.09-.146a1.481 1.481 0 0 1-.791.188zm.882-.214a1.777 1.777 0 0 0 .515-.458l-.14-.1a1.613 1.613 0 0 1-.466.412zm.513-.456a1.251 1.251 0 0 1 .081-.1.28.28 0 0 1 .026-.025l.008-.006-.077-.153a.326.326 0 0 0-.083.068 1.55 1.55 0 0 0-.092.113zm.12-.134a.328.328 0 0 1 .146-.021v-.171a.468.468 0 0 0-.234.046zm.146-.021h.547v-.171h-.547zm.547 0a.166.166 0 0 1 .112.036l.11-.132a.337.337 0 0 0-.222-.076zm.112.036a.107.107 0 0 1 .036.09h.171a.277.277 0 0 0-.1-.222zm.036.09a.9.9 0 0 1-.291.534l.128.115a1.055 1.055 0 0 0 .334-.649zm-.291.535a2.42 2.42 0 0 1-.83.581l.072.156a2.6 2.6 0 0 0 .888-.624zm-.829.58a2.964 2.964 0 0 1-1.224.238v.171a3.133 3.133 0 0 0 1.295-.253zm.389-3.111v-.033h-.171v.033zm0-.033a1.9 1.9 0 0 0-.445-1.306l-.129.114a1.731 1.731 0 0 1 .4 1.192zm-.444-1.3a1.466 1.466 0 0 0-1.181-.521v.172a1.3 1.3 0 0 1 1.049.46zm-1.181-.521a1.466 1.466 0 0 0-1.18.521l.131.11a1.3 1.3 0 0 1 1.049-.46zm-1.181.521a1.965 1.965 0 0 0-.422 1.3h.172a1.794 1.794 0 0 1 .382-1.194zm-.422 1.3v.033h.172v-.033zm.086.119h3.055v-.171h-3.055z" fill="#51504f" data-name="Path 10" transform="translate(-1460.636 -807.945)"></path>
<path id="Path_11" d="M1519.066 884.011a.581.581 0 0 1-.567-.567 1.151 1.151 0 0 1 .028-.312l7.026-18.328a.881.881 0 0 1 .906-.623h1.926a.882.882 0 0 1 .907.623l7 18.328.057.312a.583.583 0 0 1-.567.567h-1.445a.735.735 0 0 1-.482-.142.9.9 0 0 1-.226-.34l-1.558-4.023h-9.292l-1.558 4.023a.8.8 0 0 1-.255.34.688.688 0 0 1-.453.142zm12.181-6.94l-3.824-10.056-3.823 10.055zm8.184-10.538a.592.592 0 0 1-.652-.651v-1.53a.714.714 0 0 1 .17-.482.656.656 0 0 1 .482-.2h1.785a.677.677 0 0 1 .68.68v1.53a.655.655 0 0 1-.2.481.713.713 0 0 1-.481.17zm.227 17.479a.593.593 0 0 1-.652-.652v-13.428a.611.611 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.359a.679.679 0 0 1 .652.651v13.427a.655.655 0 0 1-.2.482.613.613 0 0 1-.453.17zm6.861 0a.592.592 0 0 1-.651-.652v-13.4a.715.715 0 0 1 .17-.481.656.656 0 0 1 .482-.2h1.3a.677.677 0 0 1 .68.68v1.246a4.255 4.255 0 0 1 3.966-1.926h1.1a.679.679 0 0 1 .651.651v1.161a.566.566 0 0 1-.2.453.612.612 0 0 1-.453.17h-1.7a3.2 3.2 0 0 0-2.408.907 3.253 3.253 0 0 0-.879 2.408v8.328a.656.656 0 0 1-.2.482.716.716 0 0 1-.482.17zm12.234 0a.593.593 0 0 1-.651-.652v-11.814h-2.408a.592.592 0 0 1-.651-.651v-.963a.611.611 0 0 1 .17-.453.654.654 0 0 1 .481-.2h2.408v-1.417q0-4.816 4.872-4.815h1.586a.679.679 0 0 1 .652.651v.963a.656.656 0 0 1-.2.481.613.613 0 0 1-.453.17h-1.529a2.1 2.1 0 0 0-1.785.68 3.248 3.248 0 0 0-.51 2.011v1.275h6.062V863.7a.613.613 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.3a.679.679 0 0 1 .652.651v19.659a.655.655 0 0 1-.2.482.613.613 0 0 1-.454.17h-1.3a.592.592 0 0 1-.652-.652v-11.811h-6.062v11.813a.657.657 0 0 1-.2.482.614.614 0 0 1-.454.17zm20.9.283a6.487 6.487 0 0 1-4.844-1.757 6.837 6.837 0 0 1-1.813-4.674l-.029-1.218.029-1.218a6.732 6.732 0 0 1 1.841-4.646 7.389 7.389 0 0 1 9.631 0 6.736 6.736 0 0 1 1.841 4.646q.028.311.028 1.218t-.028 1.218a6.772 6.772 0 0 1-1.841 4.674 6.391 6.391 0 0 1-4.82 1.756zm0-2.181a3.582 3.582 0 0 0 2.8-1.133 4.931 4.931 0 0 0 1.133-3.258q.028-.283.028-1.076t-.028-1.076a4.931 4.931 0 0 0-1.133-3.258 3.582 3.582 0 0 0-2.8-1.133 3.671 3.671 0 0 0-2.833 1.133 4.83 4.83 0 0 0-1.1 3.258l-.028 1.076.028 1.076a4.83 4.83 0 0 0 1.1 3.258 3.671 3.671 0 0 0 2.828 1.132zm13.755 1.9a.846.846 0 0 1-.566-.17 1.321 1.321 0 0 1-.34-.538l-4.023-13.144-.056-.283a.575.575 0 0 1 .17-.425.641.641 0 0 1 .425-.17h1.246a.612.612 0 0 1 .453.17.646.646 0 0 1 .255.312l3.145 10.679 3.371-10.566a.761.761 0 0 1 .255-.4.726.726 0 0 1 .538-.2h.963a.728.728 0 0 1 .539.2.76.76 0 0 1 .255.4l3.371 10.566 3.144-10.679a.655.655 0 0 1 .2-.312.714.714 0 0 1 .482-.17h1.275a.542.542 0 0 1 .4.17.576.576 0 0 1 .17.425l-.057.283-3.994 13.144a1.323 1.323 0 0 1-.34.538.9.9 0 0 1-.6.17h-1.1a.86.86 0 0 1-.935-.708l-3.286-10.141-3.286 10.141a.928.928 0 0 1-.963.708z" fill="#51504f" data-name="Path 11" transform="translate(-1454.66 -838.62)"></path>
</g>
</g>
</g>
</svg>
</a>
</div>
<div class="desktop-only navbar__menu-container">
<div class="navbar__menu-content" id="main_navbar">
<div class="navbar__links-container">
<a class="navbar__text-link" href="/community/">
Community
</a>
<a class="navbar__text-link" href="/meetups/">
Meetups
</a>
<a class="navbar__text-link" href="/docs/">
Documentation
</a>
<a class="navbar__text-link" href="/use-cases/">
Use-cases
</a>
<a class="navbar__text-link" href="/announcements/">
Announcements
</a>
<a class="navbar__text-link" href="/blog/">
Blog
</a>
<a class="navbar__text-link" href="/ecosystem/">
Ecosystem
</a>
</div>
</div>
</div>
<div class="mobile-only navbar__drawer-container">
<button class="navbar__toggle-button" id="navbar-toggle-button">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
<g id="Group_1294" data-name="Group 1294" transform="translate(-38.791 291)">
<g id="Group_1291" data-name="Group 1291" transform="translate(39 -291)">
<rect id="Rectangle_461" width="26" height="2" fill="#51504f" data-name="Rectangle 461" rx="1" transform="translate(-.209)"></rect>
</g>
<g id="Group_1292" data-name="Group 1292" transform="translate(39 -281.822)">
<rect id="Rectangle_462" width="26" height="2" fill="#51504f" data-name="Rectangle 462" rx="1" transform="translate(-.209 -.178)"></rect>
</g>
<g id="Group_1293" data-name="Group 1293" transform="translate(39 -272.644)">
<rect id="Rectangle_463" width="26" height="2" fill="#51504f" data-name="Rectangle 463" rx="1" transform="translate(-.209 -.356)"></rect>
</g>
</g>
</svg>
</div>
<div id="close-icon" class="navbar__toggle-button--icon">
<svg xmlns="http://www.w3.org/2000/svg" width="19.799" height="19.799" viewBox="0 0 19.799 19.799">
<g id="Group_1574" data-name="Group 1574" transform="translate(-41.892 290.899)">
<g id="Group_1291" data-name="Group 1291" transform="rotate(-45 -308.114 -187.077)">
<rect id="Rectangle_461" width="26" height="2" fill="#51504f" data-name="Rectangle 461" rx="1" transform="translate(-.209)"></rect>
</g>
<g id="Group_1292" data-name="Group 1292" transform="rotate(45 372.48 -93.011)">
<rect id="Rectangle_462" width="26" height="2" fill="#51504f" data-name="Rectangle 462" rx="1" transform="translate(-.209 -.178)"></rect>
</g>
</g>
</svg>
</div>
</button>
<div class="navbar__drawer" id="navbar-drawer">
<div class="navbar__menu-content" id="main_navbar">
<div class="navbar__links-container">
<a class="navbar__text-link" href="/community/">
Community
</a>
<a class="navbar__text-link" href="/meetups/">
Meetups
</a>
<a class="navbar__text-link" href="/docs/">
Documentation
</a>
<a class="navbar__text-link" href="/use-cases/">
Use-cases
</a>
<a class="navbar__text-link" href="/announcements/">
Announcements
</a>
<a class="navbar__text-link" href="/blog/">
Blog
</a>
<a class="navbar__text-link" href="/ecosystem/">
Ecosystem
</a>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="roadmap container-fluid td-default base-layout">
<div class="content-drawer-wrapper">
<button class="content-drawer__toggle-button" id="content-open-button">
<div id="hamburger-icon" class="content-drawer__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="20.005" height="13.879" viewBox="0 0 20.005 13.879">
<g id="Group_1619" data-name="Group 1619" transform="translate(271.132 -418.872)">
<g id="Group_1613" data-name="Group 1613" transform="translate(-266.229 431.045)">
<path id="Path_1337" d="M-218.5 513.215h-14.583a.259.259 0 0 1-.259-.26.259.259 0 0 1 .259-.259h14.583a.26.26 0 0 1 .259.259.259.259 0 0 1-.259.26z" fill="#51504f" data-name="Path 1337" transform="translate(233.345 -512.696)"></path>
</g>
<g id="Group_1614" data-name="Group 1614" transform="translate(-266.229 425.684)">
<path id="Path_1338" d="M-218.5 471.9h-14.583a.259.259 0 0 1-.259-.26.26.26 0 0 1 .259-.259h14.583a.26.26 0 0 1 .259.259.26.26 0 0 1-.259.26z" fill="#51504f" data-name="Path 1338" transform="translate(233.345 -471.376)"></path>
</g>
<g id="Group_1615" data-name="Group 1615" transform="translate(-266.229 420.323)">
<path id="Path_1339" d="M-218.5 430.574h-14.583a.259.259 0 0 1-.259-.259.259.259 0 0 1 .259-.259h14.583a.26.26 0 0 1 .259.259.259.259 0 0 1-.259.259z" fill="#51504f" data-name="Path 1339" transform="translate(233.345 -430.055)"></path>
</g>
<g id="Group_1616" data-name="Group 1616" transform="translate(-271.132 429.814)">
<path id="Path_1340" d="M-269.663 506.145a1.47 1.47 0 0 1-1.469-1.469 1.47 1.47 0 0 1 1.469-1.469 1.47 1.47 0 0 1 1.469 1.469 1.47 1.47 0 0 1-1.469 1.469zm0-2.418a.951.951 0 0 0-.95.95.951.951 0 0 0 .95.95.951.951 0 0 0 .95-.95.951.951 0 0 0-.95-.95z" fill="#51504f" data-name="Path 1340" transform="translate(271.132 -503.208)"></path>
</g>
<g id="Group_1617" data-name="Group 1617" transform="translate(-271.132 424.556)">
<path id="Path_1341" d="M-269.663 465.62a1.47 1.47 0 0 1-1.469-1.469 1.47 1.47 0 0 1 1.469-1.469 1.47 1.47 0 0 1 1.469 1.469 1.47 1.47 0 0 1-1.469 1.469zm0-2.418a.951.951 0 0 0-.95.95.951.951 0 0 0 .95.95.951.951 0 0 0 .95-.95.951.951 0 0 0-.95-.952z" fill="#51504f" data-name="Path 1341" transform="translate(271.132 -462.683)"></path>
</g>
<g id="Group_1618" data-name="Group 1618" transform="translate(-271.132 418.872)">
<path id="Path_1342" d="M-269.663 421.809a1.47 1.47 0 0 1-1.469-1.469 1.47 1.47 0 0 1 1.469-1.469 1.47 1.47 0 0 1 1.469 1.469 1.47 1.47 0 0 1-1.469 1.469zm0-2.418a.951.951 0 0 0-.95.95.951.951 0 0 0 .95.95.951.951 0 0 0 .95-.95.951.951 0 0 0-.95-.95z" fill="#51504f" data-name="Path 1342" transform="translate(271.132 -418.872)"></path>
</g>
</g>
</svg>
<span class="bodytext__mobile--brownish-grey">Content</span>
</div>
</button>
<nav id="content-navbar" class="navbar navbar--hidden">
<div class="navbar__icon-container">
<a href="/">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
<path id="Rectangle_1" d="M0 0h155.314v60H0z" fill="none" data-name="Rectangle 1"></path>
</clipPath>
</defs>
<g id="logo" transform="translate(-1305 -780.355)">
<g id="Group_2" clip-path="url(#clip-path)" data-name="Group 2" transform="translate(1305 780.355)">
<g id="Group_1" data-name="Group 1" transform="translate(.486 .486)">
<path id="Path_1" d="M1307.562 880.867l28.187-28.893a.521.521 0 0 0 .063-.666c-1.714-2.393-4.877-2.808-6.049-4.416-3.472-4.763-4.353-7.459-5.845-7.292a.456.456 0 0 0-.271.143l-10.182 10.438c-5.858 6-6.7 19.225-6.852 30.3a.552.552 0 0 0 .949.386z" fill="#017cee" data-name="Path 1" transform="translate(-1306.613 -822.232)"></path>
<path id="Path_2" d="M1405.512 908.489l-28.893-28.189a.521.521 0 0 0-.667-.063c-2.393 1.715-2.808 4.877-4.416 6.049-4.763 3.472-7.459 4.353-7.292 5.845a.456.456 0 0 0 .143.27l10.438 10.182c6 5.858 19.225 6.7 30.3 6.852a.552.552 0 0 0 .387-.946z" fill="#00ad46" data-name="Path 2" transform="translate(-1346.876 -850.567)"></path>
<path id="Path_3" d="M1373.909 902.252c-3.28-3.2-4.8-9.53 1.486-22.583-10.219 4.567-13.8 10.57-12.039 12.289z" fill="#04d659" data-name="Path 3" transform="translate(-1345.96 -850.233)"></path>
<path id="Path_4" d="M1433.132 782.359l-28.186 28.893a.52.52 0 0 0-.063.666c1.715 2.393 4.876 2.808 6.049 4.416 3.472 4.763 4.354 7.459 5.845 7.292a.454.454 0 0 0 .271-.143l10.182-10.438c5.858-6 6.7-19.225 6.852-30.3a.553.553 0 0 0-.95-.386z" fill="#00c7d4" data-name="Path 4" transform="translate(-1375.21 -782.123)"></path>
<path id="Path_5" d="M1426.9 881.155c-3.2 3.28-9.53 4.8-22.584-1.486 4.567 10.219 10.57 13.8 12.289 12.039z" fill="#11e1ee" data-name="Path 5" transform="translate(-1374.875 -850.233)"></path>
<path id="Path_6" d="M1307 782.919l28.893 28.186a.521.521 0 0 0 .666.063c2.393-1.715 2.808-4.877 4.416-6.049 4.763-3.472 7.459-4.353 7.292-5.845a.459.459 0 0 0-.143-.271l-10.438-10.182c-6-5.858-19.225-6.7-30.3-6.852a.552.552 0 0 0-.386.95z" fill="#e43921" data-name="Path 6" transform="translate(-1306.766 -781.97)"></path>
<path id="Path_7" d="M1405.8 804.711c3.28 3.2 4.8 9.53-1.486 22.584 10.219-4.567 13.8-10.571 12.039-12.289z" fill-rule="evenodd" fill="#ff7557" data-name="Path 7" transform="translate(-1374.875 -797.859)"></path>
<path id="Path_8" d="M1329.355 849.266c3.2-3.28 9.53-4.8 22.584 1.486-4.567-10.219-10.57-13.8-12.289-12.039z" fill="#0cb6ff" data-name="Path 8" transform="translate(-1322.503 -821.316)"></path>
<circle id="Ellipse_1" cx="1.26" cy="1.26" r="1.26" fill="#4a4848" data-name="Ellipse 1" transform="translate(28.18 28.171)"></circle>
<path id="Path_9" d="M1527.558 827.347a.229.229 0 0 1-.223-.223.458.458 0 0 1 .011-.123l2.766-7.214a.346.346 0 0 1 .357-.245h.758a.348.348 0 0 1 .357.245l2.754 7.214.022.123a.228.228 0 0 1-.223.223h-.568a.288.288 0 0 1-.19-.056.352.352 0 0 1-.089-.134l-.613-1.583h-3.657l-.613 1.583a.317.317 0 0 1-.1.134.269.269 0 0 1-.178.056zm4.795-2.732l-1.505-3.958-1.505 3.958zm3.322 4.85a.258.258 0 0 1-.189-.078.241.241 0 0 1-.067-.178v-7.4a.241.241 0 0 1 .067-.178.258.258 0 0 1 .189-.078h.513a.268.268 0 0 1 .256.256v.49a2.118 2.118 0 0 1 1.828-.858 2.092 2.092 0 0 1 1.751.736 3.135 3.135 0 0 1 .636 1.9q.011.122.011.379t-.011.379a3.168 3.168 0 0 1-.636 1.9 2.111 2.111 0 0 1-1.751.736 2.154 2.154 0 0 1-1.806-.836v2.587a.241.241 0 0 1-.067.178.223.223 0 0 1-.179.078zm2.364-2.91a1.324 1.324 0 0 0 1.149-.491 2.266 2.266 0 0 0 .4-1.293q.011-.111.011-.323 0-2.107-1.562-2.107a1.365 1.365 0 0 0-1.159.513 2.111 2.111 0 0 0-.412 1.2l-.012.424.012.435a1.862 1.862 0 0 0 .424 1.149 1.4 1.4 0 0 0 1.148.493zm5.628.9a2.329 2.329 0 0 1-1.015-.223 1.94 1.94 0 0 1-.747-.6 1.487 1.487 0 0 1-.268-.859 1.459 1.459 0 0 1 .6-1.2 3.4 3.4 0 0 1 1.65-.624l1.661-.234v-.323q0-1.137-1.3-1.137a1.4 1.4 0 0 0-.8.212 1.376 1.376 0 0 0-.468.48.305.305 0 0 1-.089.145.18.18 0 0 1-.134.045h-.48a.23.23 0 0 1-.245-.245 1.17 1.17 0 0 1 .245-.6 1.931 1.931 0 0 1 .747-.591 2.7 2.7 0 0 1 1.238-.256 2.351 2.351 0 0 1 1.8.591 2.032 2.032 0 0 1 .547 1.45v3.613a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.513a.233.233 0 0 1-.257-.256v-.479a1.923 1.923 0 0 1-.714.6 2.557 2.557 0 0 1-1.203.237zm.234-.836a1.579 1.579 0 0 0 1.182-.469 1.881 1.881 0 0 0 .468-1.371v-.312l-1.293.19a2.918 2.918 0 0 0-1.193.379.761.761 0 0 0-.4.658.784.784 0 0 0 .368.691 1.585 1.585 0 0 0 .867.237zm6.643.836a2.556 2.556 0 0 1-1.873-.669 2.738 2.738 0 0 1-.714-1.9l-.011-.446.011-.446a2.7 2.7 0 0 1 .714-1.885 2.531 2.531 0 0 1 1.873-.68 2.917 2.917 0 0 1 1.36.29 2.077 2.077 0 0 1 .825.714 1.7 1.7 0 0 1 .3.848.2.2 0 0 1-.067.178.281.281 0 0 1-.19.067h-.535a.265.265 0 0 1-.168-.045.458.458 0 0 1-.111-.178 1.428 1.428 0 0 0-.535-.758 1.516 1.516 0 0 0-.87-.234 1.45 1.45 0 0 0-1.1.435 1.952 1.952 0 0 0-.435 1.3l-.011.4.011.379a1.969 1.969 0 0 0 .435 1.316 1.446 1.446 0 0 0 1.1.424 1.577 1.577 0 0 0 .87-.223 1.493 1.493 0 0 0 .535-.769.458.458 0 0 1 .111-.178.228.228 0 0 1 .168-.056h.535a.258.258 0 0 1 .19.078.2.2 0 0 1 .067.178 1.75 1.75 0 0 1-.3.847 2.078 2.078 0 0 1-.825.714 2.876 2.876 0 0 1-1.361.302zm4.078-.112a.233.233 0 0 1-.257-.256v-7.4a.241.241 0 0 1 .067-.178.259.259 0 0 1 .19-.078h.557a.267.267 0 0 1 .257.256v2.6a2.167 2.167 0 0 1 .758-.624 2.353 2.353 0 0 1 1.082-.223 2.067 2.067 0 0 1 1.661.691 2.642 2.642 0 0 1 .6 1.818v3.144a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.557a.233.233 0 0 1-.256-.256V824a1.775 1.775 0 0 0-.39-1.227 1.387 1.387 0 0 0-1.1-.435 1.481 1.481 0 0 0-1.126.446 1.7 1.7 0 0 0-.412 1.215v3.088a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067zm8.846.112a2.466 2.466 0 0 1-1.84-.7 2.938 2.938 0 0 1-.747-1.94l-.011-.379.011-.368a2.953 2.953 0 0 1 .758-1.918 2.7 2.7 0 0 1 3.735.078 3.114 3.114 0 0 1 .68 2.119v.19a.257.257 0 0 1-.078.189.241.241 0 0 1-.178.067h-3.858v.1a2.11 2.11 0 0 0 .435 1.238 1.332 1.332 0 0 0 1.081.5 1.563 1.563 0 0 0 .836-.2 1.7 1.7 0 0 0 .491-.435.6.6 0 0 1 .145-.156.391.391 0 0 1 .19-.033h.547a.252.252 0 0 1 .167.056.192.192 0 0 1 .067.156.975.975 0 0 1-.312.591 2.51 2.51 0 0 1-.859.6 3.049 3.049 0 0 1-1.26.248zm1.527-3.434v-.033a1.817 1.817 0 0 0-.424-1.249 1.512 1.512 0 0 0-2.23 0 1.883 1.883 0 0 0-.4 1.249v.033z" fill="#51504f" data-name="Path 9" transform="translate(-1460.834 -808.144)"></path>
<path id="Path_10" d="M1527.2 827.081l-.061.061zm-.056-.279l-.08-.031zm2.766-7.214l.08.031zm1.472 0l-.081.029zm2.754 7.214l.084-.015a.064.064 0 0 0 0-.015zm.022.123h.086v-.015zm-.067.156l.06.061zm-.914.011l-.061.061.006.005zm-.089-.134l.081-.027zm-.613-1.583l.08-.031a.086.086 0 0 0-.08-.055zm-3.657 0v-.086a.086.086 0 0 0-.08.055zm-.613 1.583l-.08-.031zm-.1.134l.055.066zm4.047-2.676v.086a.086.086 0 0 0 .08-.116zm-1.505-3.958l.08-.03a.086.086 0 0 0-.16 0zm-1.505 3.958l-.08-.03a.086.086 0 0 0 .08.116zm-1.784 2.646a.128.128 0 0 1-.1-.042l-.122.121a.3.3 0 0 0 .217.092zm-.1-.042a.129.129 0 0 1-.042-.1h-.171a.3.3 0 0 0 .092.217zm-.042-.1a.38.38 0 0 1 .007-.1l-.163-.054a.514.514 0 0 0-.016.15zm.005-.092l2.765-7.214-.16-.061-2.765 7.214zm2.766-7.216a.283.283 0 0 1 .1-.143.3.3 0 0 1 .174-.046v-.172a.47.47 0 0 0-.271.076.453.453 0 0 0-.166.226zm.276-.189h.758v-.172h-.758zm.758 0a.3.3 0 0 1 .175.046.283.283 0 0 1 .1.143l.161-.059a.451.451 0 0 0-.166-.226.47.47 0 0 0-.272-.076zm.277.19l2.754 7.214.16-.061-2.754-7.214zm2.75 7.2l.022.123.169-.031-.022-.123zm.021.107a.13.13 0 0 1-.042.1l.121.121a.3.3 0 0 0 .092-.217zm-.042.1a.13.13 0 0 1-.1.042v.171a.3.3 0 0 0 .217-.092zm-.1.042h-.568v.171h.568zm-.568 0a.206.206 0 0 1-.135-.036l-.11.132a.373.373 0 0 0 .245.076zm-.129-.031a.262.262 0 0 1-.069-.1l-.162.054a.431.431 0 0 0 .11.167zm-.07-.1l-.613-1.584-.16.062.613 1.583zm-.693-1.638h-3.657v.171h3.657zm-3.737.055l-.614 1.584.16.062.613-1.583zm-.615 1.587a.235.235 0 0 1-.075.1l.111.13a.4.4 0 0 0 .126-.172zm-.074.1a.185.185 0 0 1-.124.036v.171a.354.354 0 0 0 .233-.076zm-.124.036h-.569v.171h.569zm4.306-2.677l-1.505-3.958-.16.061 1.505 3.958zm-1.666-3.958l-1.505 3.958.16.061 1.505-3.958zm-1.425 4.075h3.01v-.171h-3.01zm6.143 4.687l-.06.061zm0-7.761l.061.061zm.881 0l-.065.056.01.009zm.078.669h-.086a.086.086 0 0 0 .155.051zm3.579-.123l-.067.053zm.636 1.9h-.086zm0 .758l-.085-.007zm-.636 1.9l.067.054zm-3.557-.1l.068-.052a.086.086 0 0 0-.154.052zm-.067 2.765l-.061-.06zm2.787-3.323l-.069-.051zm.4-1.293l-.085-.008v.005zm-2.709-1.918l-.068-.052zm-.413 1.2h-.086zm-.011.423h-.085zm.011.435h-.086zm.424 1.149l.066-.054zm-1.216 3.315a.173.173 0 0 1-.129-.053l-.121.121a.342.342 0 0 0 .25.1zm-.129-.053a.157.157 0 0 1-.042-.118h-.172a.325.325 0 0 0 .092.239zm-.042-.118v-7.4h-.172v7.4zm0-7.4a.157.157 0 0 1 .042-.118l-.121-.121a.324.324 0 0 0-.092.239zm.042-.118a.173.173 0 0 1 .129-.053v-.172a.342.342 0 0 0-.25.1zm.129-.053h.513v-.172h-.513zm.513 0a.137.137 0 0 1 .113.048l.13-.111a.309.309 0 0 0-.244-.108zm.123.058a.137.137 0 0 1 .048.113h.171a.309.309 0 0 0-.108-.243zm.048.113v.49h.171v-.49zm.155.541a2.033 2.033 0 0 1 1.759-.823v-.171a2.2 2.2 0 0 0-1.9.894zm1.759-.823a2.007 2.007 0 0 1 1.683.7l.135-.106a2.177 2.177 0 0 0-1.818-.768zm1.683.7a3.045 3.045 0 0 1 .617 1.845l.171-.007a3.218 3.218 0 0 0-.654-1.946zm.617 1.85c.007.078.011.2.011.372h.171c0-.171 0-.3-.012-.387zm.011.372c0 .171 0 .294-.011.372l.17.015c.008-.086.012-.216.012-.387zm-.011.376a3.08 3.08 0 0 1-.617 1.846l.134.106a3.25 3.25 0 0 0 .654-1.945zm-.617 1.845a2.025 2.025 0 0 1-1.683.7v.171a2.2 2.2 0 0 0 1.817-.768zm-1.683.7a2.068 2.068 0 0 1-1.739-.8l-.136.1a2.239 2.239 0 0 0 1.874.87zm-1.892-.75v2.587h.172v-2.587zm0 2.587a.156.156 0 0 1-.042.118l.121.121a.325.325 0 0 0 .092-.239zm-.046.123a.138.138 0 0 1-.114.048v.172a.308.308 0 0 0 .244-.108zm-.114.048h-.546v.172h.546zm1.817-2.739a1.408 1.408 0 0 0 1.218-.526l-.138-.1a1.24 1.24 0 0 1-1.079.455zm1.217-.525a2.355 2.355 0 0 0 .419-1.341l-.171-.007a2.182 2.182 0 0 1-.385 1.246zm.418-1.336c.008-.079.012-.19.012-.332h-.172c0 .14 0 .245-.011.315zm.012-.332a2.726 2.726 0 0 0-.407-1.632 1.448 1.448 0 0 0-1.24-.562v.171a1.278 1.278 0 0 1 1.1.492 2.565 2.565 0 0 1 .374 1.53zm-1.647-2.193a1.452 1.452 0 0 0-1.228.547l.136.1a1.282 1.282 0 0 1 1.091-.479zm-1.228.547a2.2 2.2 0 0 0-.43 1.252l.172.008a2.028 2.028 0 0 1 .4-1.157zm-.43 1.254l-.011.424h.171l.011-.424zm-.011.428l.011.435h.172l-.011-.435zm.011.436a1.95 1.95 0 0 0 .443 1.2l.133-.109a1.776 1.776 0 0 1-.4-1.1zm.443 1.2a1.484 1.484 0 0 0 1.214.522v-.171a1.314 1.314 0 0 1-1.082-.459zm5.828 1.117l.037-.077zm-.747-.6l-.07.049zm.335-2.063l.052.068zm1.65-.624l.012.085zm1.661-.234l.012.085a.086.086 0 0 0 .074-.085zm-2.107-1.249l.046.072zm-.468.48l-.075-.042a.083.083 0 0 0-.006.015zm-.089.145l-.054-.067-.007.006zm-.792-.022l-.065.056.009.009zm-.067-.178h-.086zm.245-.6l-.07-.049zm.747-.591l.038.077zm3.033.334l-.063.058zm.468 5.252l.06.061zm-.881 0l-.065.056a.043.043 0 0 0 .009.009zm-.067-.669h.086a.086.086 0 0 0-.156-.048zm-.714.6l-.04-.076zm.223-1.059l-.062-.06zm.468-1.684h.086a.086.086 0 0 0-.1-.085zm-1.293.189l.012.085zm-1.193.379l.046.072zm-.033 1.349l-.047.071zm.635.985a2.241 2.241 0 0 1-.978-.215l-.074.155a2.412 2.412 0 0 0 1.051.231zm-.978-.215a1.859 1.859 0 0 1-.715-.576l-.138.1a2.024 2.024 0 0 0 .779.629zm-.713-.573a1.4 1.4 0 0 1-.253-.81h-.172a1.571 1.571 0 0 0 .283.907zm-.253-.81a1.374 1.374 0 0 1 .569-1.136l-.105-.135a1.544 1.544 0 0 0-.635 1.272zm.569-1.137a3.316 3.316 0 0 1 1.609-.607l-.024-.17a3.481 3.481 0 0 0-1.691.642zm1.609-.607l1.661-.234-.024-.17-1.662.234zm1.735-.319v-.323h-.171v.323zm0-.323a1.156 1.156 0 0 0-.355-.917 1.536 1.536 0 0 0-1.035-.306v.172a1.37 1.37 0 0 1 .922.263.986.986 0 0 1 .3.788zm-1.39-1.223a1.486 1.486 0 0 0-.851.227l.1.142a1.316 1.316 0 0 1 .755-.2zm-.849.226a1.452 1.452 0 0 0-.5.51l.15.084a1.286 1.286 0 0 1 .44-.449zm-.5.524a.226.226 0 0 1-.062.105l.107.134a.391.391 0 0 0 .117-.185zm-.068.112a.1.1 0 0 1-.073.019v.171a.266.266 0 0 0 .194-.07zm-.073.019h-.48v.171h.48zm-.48 0a.18.18 0 0 1-.122-.046l-.112.13a.352.352 0 0 0 .234.087zm-.113-.037a.18.18 0 0 1-.047-.123h-.171a.352.352 0 0 0 .087.234zm-.047-.119a1.1 1.1 0 0 1 .23-.557l-.14-.1a1.253 1.253 0 0 0-.261.648zm.23-.556a1.843 1.843 0 0 1 .715-.564l-.075-.154a2.018 2.018 0 0 0-.78.618zm.716-.564a2.611 2.611 0 0 1 1.2-.247v-.171a2.781 2.781 0 0 0-1.277.266zm1.2-.247a2.268 2.268 0 0 1 1.732.563l.126-.116a2.435 2.435 0 0 0-1.858-.618zm1.733.564a1.945 1.945 0 0 1 .523 1.391h.171a2.117 2.117 0 0 0-.57-1.508zm.523 1.391v3.613h.171v-3.613zm0 3.613a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.157.157 0 0 1-.118.042v.171a.326.326 0 0 0 .239-.092zm-.118.042h-.513v.171h.513zm-.513 0a.2.2 0 0 1-.134-.046l-.111.13a.367.367 0 0 0 .245.088zm-.124-.037a.194.194 0 0 1-.047-.134h-.171a.366.366 0 0 0 .087.245zm-.047-.134v-.479h-.171v.479zm-.156-.528a1.846 1.846 0 0 1-.683.575l.079.152a2.012 2.012 0 0 0 .745-.629zm-.683.575a2.476 2.476 0 0 1-1.153.236v.171a2.644 2.644 0 0 0 1.233-.255zm-.919-.429a1.666 1.666 0 0 0 1.244-.494l-.123-.12a1.493 1.493 0 0 1-1.121.442zm1.244-.494a1.969 1.969 0 0 0 .492-1.431h-.171a1.8 1.8 0 0 1-.444 1.312zm.492-1.431v-.312h-.171v.312zm-.1-.4l-1.293.189.025.17 1.293-.189zm-1.293.189a3 3 0 0 0-1.228.393l.095.143a2.837 2.837 0 0 1 1.158-.365zm-1.227.392a.845.845 0 0 0-.441.73h.172a.676.676 0 0 1 .362-.586zm-.441.73a.869.869 0 0 0 .406.762l.095-.142a.7.7 0 0 1-.33-.62zm.408.764a1.673 1.673 0 0 0 .916.247v-.171a1.5 1.5 0 0 1-.823-.221zm5.686.329l-.061.06zm-.714-1.9h-.085zm-.011-.446h-.085zm.011-.446h-.085zm.714-1.885l.061.061zm3.234-.39l-.04.076zm.825.713l-.073.046zm.3.848h-.086zm-.067.178l.056.065zm-.892.022l.054-.067zm-.112-.178l-.081.029zm-.535-.758l-.048.071zm-1.974.2l-.062-.059zm-.435 1.3h-.086zm-.011.4h-.086zm.011.379h-.086zm.435 1.316l-.062.059zm1.974.2l.046.072zm.535-.769l-.079-.033zm.112-.178l.054.067.007-.006zm.892.022l-.061.06zm.067.178l-.085-.009zm-.3.847l-.072-.046zm-.825.714l-.04-.076zm-1.36.2a2.471 2.471 0 0 1-1.814-.644l-.12.122a2.64 2.64 0 0 0 1.933.694zm-1.813-.643a2.653 2.653 0 0 1-.689-1.839l-.171.006a2.822 2.822 0 0 0 .738 1.952zm-.689-1.838l-.011-.446h-.171l.011.446zm-.011-.442l.011-.446h-.171l-.011.446zm.011-.445a2.611 2.611 0 0 1 .689-1.827l-.122-.121a2.78 2.78 0 0 0-.738 1.942zm.689-1.827a2.447 2.447 0 0 1 1.813-.655v-.171a2.617 2.617 0 0 0-1.934.705zm1.813-.655a2.836 2.836 0 0 1 1.32.28l.079-.152a3 3 0 0 0-1.4-.3zm1.32.28a1.99 1.99 0 0 1 .792.683l.145-.091a2.158 2.158 0 0 0-.858-.744zm.793.685a1.617 1.617 0 0 1 .287.8l.171-.009a1.789 1.789 0 0 0-.315-.89zm.287.809a.11.11 0 0 1-.037.1l.112.13a.281.281 0 0 0 .1-.252zm-.037.1a.2.2 0 0 1-.134.046v.171a.369.369 0 0 0 .246-.088zm-.134.046h-.535v.171h.535zm-.535 0a.184.184 0 0 1-.114-.026l-.107.134a.345.345 0 0 0 .221.064zm-.114-.026a.389.389 0 0 1-.086-.144l-.158.066a.533.533 0 0 0 .137.212zm-.084-.14a1.514 1.514 0 0 0-.57-.8l-.093.144a1.343 1.343 0 0 1 .5.715zm-.568-.8a1.6 1.6 0 0 0-.918-.249v.171a1.435 1.435 0 0 1 .822.219zm-.918-.249a1.535 1.535 0 0 0-1.166.462l.124.118a1.364 1.364 0 0 1 1.042-.408zm-1.166.462a2.036 2.036 0 0 0-.458 1.36l.171.006a1.872 1.872 0 0 1 .411-1.249zm-.458 1.361l-.011.4h.171l.011-.4zm-.011.406l.011.379.171-.005-.011-.379zm.011.38a2.052 2.052 0 0 0 .458 1.371l.124-.118a1.889 1.889 0 0 1-.411-1.26zm.458 1.371a1.533 1.533 0 0 0 1.166.451v-.172a1.363 1.363 0 0 1-1.042-.4zm1.166.451a1.661 1.661 0 0 0 .916-.237l-.093-.144a1.491 1.491 0 0 1-.823.209zm.918-.238a1.576 1.576 0 0 0 .568-.812l-.162-.057a1.409 1.409 0 0 1-.5.727zm.566-.807a.39.39 0 0 1 .086-.144l-.107-.134a.533.533 0 0 0-.137.213zm.093-.151a.144.144 0 0 1 .107-.031v-.171a.31.31 0 0 0-.228.081zm.107-.031h.535v-.171h-.535zm.535 0a.173.173 0 0 1 .129.053l.121-.121a.344.344 0 0 0-.25-.1zm.134.057a.11.11 0 0 1 .037.1l.17.017a.281.281 0 0 0-.1-.252zm.037.109a1.664 1.664 0 0 1-.288.806l.144.092a1.839 1.839 0 0 0 .315-.889zm-.288.806a1.989 1.989 0 0 1-.792.683l.079.152a2.162 2.162 0 0 0 .858-.744zm-.793.684a2.8 2.8 0 0 1-1.32.28v.171a2.96 2.96 0 0 0 1.4-.3zm2.568.187l-.065.056.01.009zm0-7.772l.061.06zm.926 0l-.065.056.009.009zm.078 2.776h-.085a.086.086 0 0 0 .153.053zm.758-.624l.038.077zm2.743.468l-.065.056zm.524 5.151l-.061-.06zm-.925 0l-.065.056.009.009zm-.457-4.5l-.065.056zm-2.23.011l-.062-.059zm-.49 4.493l-.061-.06zm-.736-.019a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.367.367 0 0 0 .087.245zm-.046-.134v-7.4h-.172v7.4zm0-7.4a.156.156 0 0 1 .042-.118l-.121-.121a.326.326 0 0 0-.092.239zm.042-.118a.172.172 0 0 1 .129-.053v-.171a.343.343 0 0 0-.25.1zm.129-.053h.557v-.171h-.557zm.557 0a.137.137 0 0 1 .113.048l.13-.112a.308.308 0 0 0-.244-.108zm.122.057a.137.137 0 0 1 .048.113h.172a.309.309 0 0 0-.108-.243zm.048.113v2.6h.172v-2.6zm.153 2.651a2.076 2.076 0 0 1 .728-.6l-.075-.154a2.248 2.248 0 0 0-.788.649zm.73-.6a2.272 2.272 0 0 1 1.043-.214v-.171a2.438 2.438 0 0 0-1.121.232zm1.043-.214a1.982 1.982 0 0 1 1.6.661l.13-.112a2.152 2.152 0 0 0-1.727-.721zm1.6.663a2.557 2.557 0 0 1 .581 1.761h.171a2.727 2.727 0 0 0-.624-1.874zm.581 1.761v3.144h.171v-3.144zm0 3.144a.173.173 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm-.557 0a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.368.368 0 0 0 .087.245zm-.046-.134V823.8h-.172v3.088zm0-3.088a1.859 1.859 0 0 0-.412-1.284l-.128.114a1.69 1.69 0 0 1 .368 1.169zm-.411-1.283a1.471 1.471 0 0 0-1.169-.464v.171a1.3 1.3 0 0 1 1.039.406zm-1.169-.464a1.566 1.566 0 0 0-1.188.473l.124.118a1.4 1.4 0 0 1 1.064-.419zm-1.188.473a1.779 1.779 0 0 0-.436 1.275h.172a1.609 1.609 0 0 1 .389-1.156zm-.436 1.275v3.088h.172V823.8zm0 3.088a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm6.449-.505l-.062.059zm-.747-1.94h-.086zm-.012-.379h-.085v.005zm.012-.368l-.086-.006zm.758-1.918l-.061-.06zm3.735.078l-.065.056zm.6 2.5l.061.061zm-4.036.067v-.086a.086.086 0 0 0-.086.086zm0 .1h-.086zm.435 1.238l-.068.053zm1.918.3l.045.073zm.491-.435l-.069-.051zm.145-.156l.039.077h.006zm.9.022l-.055.066zm-.245.747l-.064-.057zm-.858.6l.035.078zm.267-3.189v.086a.086.086 0 0 0 .086-.086zm-.424-1.282l-.066.055zm-2.23 0l-.065-.055zm-.4 1.282h-.086a.086.086 0 0 0 .086.086zm1.528 3.349a2.38 2.38 0 0 1-1.779-.677l-.122.12a2.55 2.55 0 0 0 1.9.728zm-1.778-.676a2.86 2.86 0 0 1-.724-1.886l-.171.009a3.027 3.027 0 0 0 .771 1.995zm-.723-1.884l-.011-.379h-.171l.011.379zm-.011-.374l.011-.368-.172-.005-.011.368zm.011-.365a2.871 2.871 0 0 1 .735-1.864l-.124-.118a3.042 3.042 0 0 0-.782 1.971zm.734-1.864a2.331 2.331 0 0 1 1.756-.687v-.171a2.5 2.5 0 0 0-1.879.74zm1.756-.687a2.307 2.307 0 0 1 1.853.762l.13-.112a2.477 2.477 0 0 0-1.983-.821zm1.854.762a3.03 3.03 0 0 1 .659 2.062h.172a3.2 3.2 0 0 0-.7-2.175zm.659 2.062v.19h.172v-.19zm0 .19a.172.172 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-3.858v.171h3.858zm-3.944.086v.1h.172v-.1zm0 .1a2.2 2.2 0 0 0 .453 1.287l.135-.106a2.027 2.027 0 0 1-.417-1.189zm.454 1.288a1.418 1.418 0 0 0 1.148.533v-.171a1.247 1.247 0 0 1-1.015-.47zm1.148.533a1.647 1.647 0 0 0 .882-.214l-.09-.146a1.481 1.481 0 0 1-.791.188zm.882-.214a1.777 1.777 0 0 0 .515-.458l-.14-.1a1.613 1.613 0 0 1-.466.412zm.513-.456a1.251 1.251 0 0 1 .081-.1.28.28 0 0 1 .026-.025l.008-.006-.077-.153a.326.326 0 0 0-.083.068 1.55 1.55 0 0 0-.092.113zm.12-.134a.328.328 0 0 1 .146-.021v-.171a.468.468 0 0 0-.234.046zm.146-.021h.547v-.171h-.547zm.547 0a.166.166 0 0 1 .112.036l.11-.132a.337.337 0 0 0-.222-.076zm.112.036a.107.107 0 0 1 .036.09h.171a.277.277 0 0 0-.1-.222zm.036.09a.9.9 0 0 1-.291.534l.128.115a1.055 1.055 0 0 0 .334-.649zm-.291.535a2.42 2.42 0 0 1-.83.581l.072.156a2.6 2.6 0 0 0 .888-.624zm-.829.58a2.964 2.964 0 0 1-1.224.238v.171a3.133 3.133 0 0 0 1.295-.253zm.389-3.111v-.033h-.171v.033zm0-.033a1.9 1.9 0 0 0-.445-1.306l-.129.114a1.731 1.731 0 0 1 .4 1.192zm-.444-1.3a1.466 1.466 0 0 0-1.181-.521v.172a1.3 1.3 0 0 1 1.049.46zm-1.181-.521a1.466 1.466 0 0 0-1.18.521l.131.11a1.3 1.3 0 0 1 1.049-.46zm-1.181.521a1.965 1.965 0 0 0-.422 1.3h.172a1.794 1.794 0 0 1 .382-1.194zm-.422 1.3v.033h.172v-.033zm.086.119h3.055v-.171h-3.055z" fill="#51504f" data-name="Path 10" transform="translate(-1460.636 -807.945)"></path>
<path id="Path_11" d="M1519.066 884.011a.581.581 0 0 1-.567-.567 1.151 1.151 0 0 1 .028-.312l7.026-18.328a.881.881 0 0 1 .906-.623h1.926a.882.882 0 0 1 .907.623l7 18.328.057.312a.583.583 0 0 1-.567.567h-1.445a.735.735 0 0 1-.482-.142.9.9 0 0 1-.226-.34l-1.558-4.023h-9.292l-1.558 4.023a.8.8 0 0 1-.255.34.688.688 0 0 1-.453.142zm12.181-6.94l-3.824-10.056-3.823 10.055zm8.184-10.538a.592.592 0 0 1-.652-.651v-1.53a.714.714 0 0 1 .17-.482.656.656 0 0 1 .482-.2h1.785a.677.677 0 0 1 .68.68v1.53a.655.655 0 0 1-.2.481.713.713 0 0 1-.481.17zm.227 17.479a.593.593 0 0 1-.652-.652v-13.428a.611.611 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.359a.679.679 0 0 1 .652.651v13.427a.655.655 0 0 1-.2.482.613.613 0 0 1-.453.17zm6.861 0a.592.592 0 0 1-.651-.652v-13.4a.715.715 0 0 1 .17-.481.656.656 0 0 1 .482-.2h1.3a.677.677 0 0 1 .68.68v1.246a4.255 4.255 0 0 1 3.966-1.926h1.1a.679.679 0 0 1 .651.651v1.161a.566.566 0 0 1-.2.453.612.612 0 0 1-.453.17h-1.7a3.2 3.2 0 0 0-2.408.907 3.253 3.253 0 0 0-.879 2.408v8.328a.656.656 0 0 1-.2.482.716.716 0 0 1-.482.17zm12.234 0a.593.593 0 0 1-.651-.652v-11.814h-2.408a.592.592 0 0 1-.651-.651v-.963a.611.611 0 0 1 .17-.453.654.654 0 0 1 .481-.2h2.408v-1.417q0-4.816 4.872-4.815h1.586a.679.679 0 0 1 .652.651v.963a.656.656 0 0 1-.2.481.613.613 0 0 1-.453.17h-1.529a2.1 2.1 0 0 0-1.785.68 3.248 3.248 0 0 0-.51 2.011v1.275h6.062V863.7a.613.613 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.3a.679.679 0 0 1 .652.651v19.659a.655.655 0 0 1-.2.482.613.613 0 0 1-.454.17h-1.3a.592.592 0 0 1-.652-.652v-11.811h-6.062v11.813a.657.657 0 0 1-.2.482.614.614 0 0 1-.454.17zm20.9.283a6.487 6.487 0 0 1-4.844-1.757 6.837 6.837 0 0 1-1.813-4.674l-.029-1.218.029-1.218a6.732 6.732 0 0 1 1.841-4.646 7.389 7.389 0 0 1 9.631 0 6.736 6.736 0 0 1 1.841 4.646q.028.311.028 1.218t-.028 1.218a6.772 6.772 0 0 1-1.841 4.674 6.391 6.391 0 0 1-4.82 1.756zm0-2.181a3.582 3.582 0 0 0 2.8-1.133 4.931 4.931 0 0 0 1.133-3.258q.028-.283.028-1.076t-.028-1.076a4.931 4.931 0 0 0-1.133-3.258 3.582 3.582 0 0 0-2.8-1.133 3.671 3.671 0 0 0-2.833 1.133 4.83 4.83 0 0 0-1.1 3.258l-.028 1.076.028 1.076a4.83 4.83 0 0 0 1.1 3.258 3.671 3.671 0 0 0 2.828 1.132zm13.755 1.9a.846.846 0 0 1-.566-.17 1.321 1.321 0 0 1-.34-.538l-4.023-13.144-.056-.283a.575.575 0 0 1 .17-.425.641.641 0 0 1 .425-.17h1.246a.612.612 0 0 1 .453.17.646.646 0 0 1 .255.312l3.145 10.679 3.371-10.566a.761.761 0 0 1 .255-.4.726.726 0 0 1 .538-.2h.963a.728.728 0 0 1 .539.2.76.76 0 0 1 .255.4l3.371 10.566 3.144-10.679a.655.655 0 0 1 .2-.312.714.714 0 0 1 .482-.17h1.275a.542.542 0 0 1 .4.17.576.576 0 0 1 .17.425l-.057.283-3.994 13.144a1.323 1.323 0 0 1-.34.538.9.9 0 0 1-.6.17h-1.1a.86.86 0 0 1-.935-.708l-3.286-10.141-3.286 10.141a.928.928 0 0 1-.963.708z" fill="#51504f" data-name="Path 11" transform="translate(-1454.66 -838.62)"></path>
</g>
</g>
</g>
</svg>
</a>
</div>
<div id="content-close-button">
<svg xmlns="http://www.w3.org/2000/svg" width="19.799" height="19.799" viewBox="0 0 19.799 19.799">
<g id="Group_1574" data-name="Group 1574" transform="translate(-41.892 290.899)">
<g id="Group_1291" data-name="Group 1291" transform="rotate(-45 -308.114 -187.077)">
<rect id="Rectangle_461" width="26" height="2" fill="#51504f" data-name="Rectangle 461" rx="1" transform="translate(-.209)"></rect>
</g>
<g id="Group_1292" data-name="Group 1292" transform="rotate(45 372.48 -93.011)">
<rect id="Rectangle_462" width="26" height="2" fill="#51504f" data-name="Rectangle 462" rx="1" transform="translate(-.209 -.178)"></rect>
</g>
</g>
</svg>
</div>
</nav>
<div class="content-drawer-container" id="content-drawer">
<div class="content-drawer">
<div class="td-sidebar">
<div id="docs-version-selector" class="docs-version-selector sidebar__version-selector">
<a class="dropdown-toggle" href="#" id="versionDropdown" role="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
<span class="bodytext__medium--greyish-brown">Version: </span><span class="version">2.1.4</span>
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
</div>
<script type="application/x-template" id="version-item-template">
<a class="dropdown-item"></a>
</script>
</div>
<div class="searchb-box">
<form class="search-form" action="../../../search.html" method="get">
<input class="search-form__input" type="text" name="q" placeholder="Search docs" size="16">
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
<button class="search-form__button" type="submit">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
<g id="Group_1579" data-name="Group 1579" transform="translate(-41.001 -41)">
<path id="Path_169" d="M71.415 64.687a7.215 7.215 0 1 0-6.729 6.728 7.222 7.222 0 0 0 6.729-6.728z" fill="none" data-name="Path 169" transform="translate(-14.277 -14.276)"></path>
<path id="Path_170" d="M60.863 59.8l-6.093-6.09a7.78 7.78 0 1 0-1.06 1.06l6.09 6.093a.468.468 0 0 0 .662 0l.4-.4a.468.468 0 0 0 .001-.663zM42.512 49.183a6.274 6.274 0 1 1 5.851 5.85 6.28 6.28 0 0 1-5.851-5.85z" fill="#51504f" data-name="Path 170"></path>
</g>
</svg>
</button>
</form>
</div>
<style>
.searchb-box {
margin-bottom: 26px;
}
.searchb-box .search-form {
width: 100%;
margin-top: 20px;
}
</style>
<div class="toctree" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Content</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../project.html">Project</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../license.html">License</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../start/index.html">Quick Start</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../installation/index.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../upgrading-from-1-10/index.html">Upgrading from 1.10 to 2</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../tutorial.html">Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../tutorial_taskflow_api.html">Tutorial on the Taskflow API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../howto/index.html">How-to Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../ui.html">UI / Screenshots</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../concepts/index.html">Concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../executor/index.html">Executor</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../dag-run.html">DAG Runs</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../plugins.html">Plugins</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../security/index.html">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../logging-monitoring/index.html">Logging &amp; Monitoring</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../timezone.html">Time Zones</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../usage-cli.html">Using the CLI</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../integration.html">Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../kubernetes.html">Kubernetes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../lineage.html">Lineage</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../dag-serialization.html">DAG Serialization</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../modules_management.html">Modules Management</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../release-process.html">Release Policies</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../changelog.html">Changelog</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../best-practices.html">Best Practices</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../production-deployment.html">Production Deployment</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../faq.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../privacy_notice.html">Privacy Notice</a></li>
</ul>
<p class="caption"><span class="caption-text">References</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../operators-and-hooks-ref.html">Operators and hooks</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../cli-and-env-variables-ref.html">CLI</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../macros-ref.html">Macros</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../python-api-ref.html">Python API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../stable-rest-api-ref.html">Stable REST API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../deprecated-rest-api-ref.html">Deprecated REST API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../configurations-ref.html">Configurations</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../extra-packages-ref.html">Extra packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../migrations-ref.html">Database Migrations</a></li>
</ul>
</div>
<style type="text/css">
.toctree {
}
.toctree li {
list-style: none;
}
.toctree .caption {
font-family: Roboto;
font-size: 18px;
font-weight: bold;
font-stretch: normal;
font-style: normal;
line-height: 1.33;
letter-spacing: normal;
color: #51504f;
padding-bottom: 13px;
text-transform: uppercase;
margin-bottom: 0;
}
.toctree .current > a:not([href="#"]) {
color: #017cee;
}
.toctree > ul {
padding-left: 0;
}
.toctree ul {
padding-left: 15px;
display: none;
}
.toctree > ul,
.toctree li.current > ul {
display: block;
}
.toctree a .toctree-expand {
display: inline-block;
position: relative;
height: 1em;
}
.toctree a .toctree-expand:before {
position: absolute;
top: 6px;
left: -12px;
content: '►';
font-size: 7px;
}
.toctree .current > a > .toctree-expand:before {
content: '▼';
}
.toctree .current {
color: #017cee;
}
.toctree li {
font-family: Roboto;
font-size: 16px;
font-weight: normal;
font-stretch: normal;
font-style: normal;
line-height: 1.63;
letter-spacing: normal;
color: #707070;
}
</style>
</div>
</div>
</div>
</div>
<div class="d-flex">
<div class="td-sidebar desktop-only d-print-none">
<div id="docs-version-selector" class="docs-version-selector sidebar__version-selector">
<a class="dropdown-toggle" href="#" id="versionDropdown" role="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
<span class="bodytext__medium--greyish-brown">Version: </span><span class="version">2.1.4</span>
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
</div>
<script type="application/x-template" id="version-item-template">
<a class="dropdown-item"></a>
</script>
</div>
<div class="searchb-box">
<form class="search-form" action="../../../search.html" method="get">
<input class="search-form__input" type="text" name="q" placeholder="Search docs" size="16">
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
<button class="search-form__button" type="submit">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
<g id="Group_1579" data-name="Group 1579" transform="translate(-41.001 -41)">
<path id="Path_169" d="M71.415 64.687a7.215 7.215 0 1 0-6.729 6.728 7.222 7.222 0 0 0 6.729-6.728z" fill="none" data-name="Path 169" transform="translate(-14.277 -14.276)"></path>
<path id="Path_170" d="M60.863 59.8l-6.093-6.09a7.78 7.78 0 1 0-1.06 1.06l6.09 6.093a.468.468 0 0 0 .662 0l.4-.4a.468.468 0 0 0 .001-.663zM42.512 49.183a6.274 6.274 0 1 1 5.851 5.85 6.28 6.28 0 0 1-5.851-5.85z" fill="#51504f" data-name="Path 170"></path>
</g>
</svg>
</button>
</form>
</div>
<style>
.searchb-box {
margin-bottom: 26px;
}
.searchb-box .search-form {
width: 100%;
margin-top: 20px;
}
</style>
<div class="toctree" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Content</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../project.html">Project</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../license.html">License</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../start/index.html">Quick Start</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../installation/index.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../upgrading-from-1-10/index.html">Upgrading from 1.10 to 2</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../tutorial.html">Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../tutorial_taskflow_api.html">Tutorial on the Taskflow API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../howto/index.html">How-to Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../ui.html">UI / Screenshots</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../concepts/index.html">Concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../executor/index.html">Executor</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../dag-run.html">DAG Runs</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../plugins.html">Plugins</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../security/index.html">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../logging-monitoring/index.html">Logging &amp; Monitoring</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../timezone.html">Time Zones</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../usage-cli.html">Using the CLI</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../integration.html">Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../kubernetes.html">Kubernetes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../lineage.html">Lineage</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../dag-serialization.html">DAG Serialization</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../modules_management.html">Modules Management</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../release-process.html">Release Policies</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../changelog.html">Changelog</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../best-practices.html">Best Practices</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../production-deployment.html">Production Deployment</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../faq.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../privacy_notice.html">Privacy Notice</a></li>
</ul>
<p class="caption"><span class="caption-text">References</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../operators-and-hooks-ref.html">Operators and hooks</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../cli-and-env-variables-ref.html">CLI</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../macros-ref.html">Macros</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../python-api-ref.html">Python API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../stable-rest-api-ref.html">Stable REST API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../deprecated-rest-api-ref.html">Deprecated REST API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../configurations-ref.html">Configurations</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../extra-packages-ref.html">Extra packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../migrations-ref.html">Database Migrations</a></li>
</ul>
</div>
<style type="text/css">
.toctree {
}
.toctree li {
list-style: none;
}
.toctree .caption {
font-family: Roboto;
font-size: 18px;
font-weight: bold;
font-stretch: normal;
font-style: normal;
line-height: 1.33;
letter-spacing: normal;
color: #51504f;
padding-bottom: 13px;
text-transform: uppercase;
margin-bottom: 0;
}
.toctree .current > a:not([href="#"]) {
color: #017cee;
}
.toctree > ul {
padding-left: 0;
}
.toctree ul {
padding-left: 15px;
display: none;
}
.toctree > ul,
.toctree li.current > ul {
display: block;
}
.toctree a .toctree-expand {
display: inline-block;
position: relative;
height: 1em;
}
.toctree a .toctree-expand:before {
position: absolute;
top: 6px;
left: -12px;
content: '►';
font-size: 7px;
}
.toctree .current > a > .toctree-expand:before {
content: '▼';
}
.toctree .current {
color: #017cee;
}
.toctree li {
font-family: Roboto;
font-size: 16px;
font-weight: normal;
font-stretch: normal;
font-style: normal;
line-height: 1.63;
letter-spacing: normal;
color: #707070;
}
</style>
</div>
<main class="col-12 col-md-9 col-xl-8" role="main">
<div role="navigation" aria-label="breadcrumbs navigation" class="d-none d-md-block d-print-none">
<ul class="breadcrumb">
<li class="breadcrumb-item"><a href="../../../index.html" class="icon icon-home"> Home</a></li>
<li class="breadcrumb-item"><a href="../../index.html">Module code</a></li>
<li class="breadcrumb-item"><a href="../models.html">airflow.models</a></li>
<li class="breadcrumb-item"><a href="baseoperator.html"> airflow.models.baseoperator</a></li>
</ul>
</div>
<div class="rst-content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for airflow.models.baseoperator</h1><div class="highlight"><pre>
<span></span><span class="c1">#</span>
<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
<span class="c1"># distributed with this work for additional information</span>
<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
<span class="c1"># with the License. You may obtain a copy of the License at</span>
<span class="c1">#</span>
<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="c1">#</span>
<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
<span class="c1"># software distributed under the License is distributed on an</span>
<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
<span class="c1"># KIND, either express or implied. See the License for the</span>
<span class="c1"># specific language governing permissions and limitations</span>
<span class="c1"># under the License.</span>
<span class="sd">&quot;&quot;&quot;Base operator for all operators.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">abc</span>
<span class="kn">import</span> <span class="nn">copy</span>
<span class="kn">import</span> <span class="nn">functools</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">warnings</span>
<span class="kn">from</span> <span class="nn">abc</span> <span class="kn">import</span> <span class="n">ABCMeta</span><span class="p">,</span> <span class="n">abstractmethod</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span> <span class="nn">inspect</span> <span class="kn">import</span> <span class="n">signature</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">TYPE_CHECKING</span><span class="p">,</span>
<span class="n">Any</span><span class="p">,</span>
<span class="n">Callable</span><span class="p">,</span>
<span class="n">ClassVar</span><span class="p">,</span>
<span class="n">Dict</span><span class="p">,</span>
<span class="n">FrozenSet</span><span class="p">,</span>
<span class="n">Iterable</span><span class="p">,</span>
<span class="n">List</span><span class="p">,</span>
<span class="n">Optional</span><span class="p">,</span>
<span class="n">Sequence</span><span class="p">,</span>
<span class="n">Set</span><span class="p">,</span>
<span class="n">Tuple</span><span class="p">,</span>
<span class="n">Type</span><span class="p">,</span>
<span class="n">TypeVar</span><span class="p">,</span>
<span class="n">Union</span><span class="p">,</span>
<span class="n">cast</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">import</span> <span class="nn">attr</span>
<span class="kn">import</span> <span class="nn">jinja2</span>
<span class="kn">from</span> <span class="nn">dateutil.relativedelta</span> <span class="kn">import</span> <span class="n">relativedelta</span>
<span class="kn">from</span> <span class="nn">sqlalchemy.orm</span> <span class="kn">import</span> <span class="n">Session</span>
<span class="kn">import</span> <span class="nn">airflow.templates</span>
<span class="kn">from</span> <span class="nn">airflow.compat.functools</span> <span class="kn">import</span> <span class="n">cached_property</span>
<span class="kn">from</span> <span class="nn">airflow.configuration</span> <span class="kn">import</span> <span class="n">conf</span>
<span class="kn">from</span> <span class="nn">airflow.exceptions</span> <span class="kn">import</span> <span class="n">AirflowException</span>
<span class="kn">from</span> <span class="nn">airflow.lineage</span> <span class="kn">import</span> <span class="n">apply_lineage</span><span class="p">,</span> <span class="n">prepare_lineage</span>
<span class="kn">from</span> <span class="nn">airflow.models.base</span> <span class="kn">import</span> <span class="n">Operator</span>
<span class="kn">from</span> <span class="nn">airflow.models.pool</span> <span class="kn">import</span> <span class="n">Pool</span>
<span class="kn">from</span> <span class="nn">airflow.models.taskinstance</span> <span class="kn">import</span> <span class="n">Context</span><span class="p">,</span> <span class="n">TaskInstance</span><span class="p">,</span> <span class="n">clear_task_instances</span>
<span class="kn">from</span> <span class="nn">airflow.models.taskmixin</span> <span class="kn">import</span> <span class="n">TaskMixin</span>
<span class="kn">from</span> <span class="nn">airflow.models.xcom</span> <span class="kn">import</span> <span class="n">XCOM_RETURN_KEY</span>
<span class="kn">from</span> <span class="nn">airflow.ti_deps.deps.base_ti_dep</span> <span class="kn">import</span> <span class="n">BaseTIDep</span>
<span class="kn">from</span> <span class="nn">airflow.ti_deps.deps.not_in_retry_period_dep</span> <span class="kn">import</span> <span class="n">NotInRetryPeriodDep</span>
<span class="kn">from</span> <span class="nn">airflow.ti_deps.deps.not_previously_skipped_dep</span> <span class="kn">import</span> <span class="n">NotPreviouslySkippedDep</span>
<span class="kn">from</span> <span class="nn">airflow.ti_deps.deps.prev_dagrun_dep</span> <span class="kn">import</span> <span class="n">PrevDagrunDep</span>
<span class="kn">from</span> <span class="nn">airflow.ti_deps.deps.trigger_rule_dep</span> <span class="kn">import</span> <span class="n">TriggerRuleDep</span>
<span class="kn">from</span> <span class="nn">airflow.utils</span> <span class="kn">import</span> <span class="n">timezone</span>
<span class="kn">from</span> <span class="nn">airflow.utils.edgemodifier</span> <span class="kn">import</span> <span class="n">EdgeModifier</span>
<span class="kn">from</span> <span class="nn">airflow.utils.helpers</span> <span class="kn">import</span> <span class="n">validate_key</span>
<span class="kn">from</span> <span class="nn">airflow.utils.log.logging_mixin</span> <span class="kn">import</span> <span class="n">LoggingMixin</span>
<span class="kn">from</span> <span class="nn">airflow.utils.operator_resources</span> <span class="kn">import</span> <span class="n">Resources</span>
<span class="kn">from</span> <span class="nn">airflow.utils.session</span> <span class="kn">import</span> <span class="n">provide_session</span>
<span class="kn">from</span> <span class="nn">airflow.utils.trigger_rule</span> <span class="kn">import</span> <span class="n">TriggerRule</span>
<span class="kn">from</span> <span class="nn">airflow.utils.weight_rule</span> <span class="kn">import</span> <span class="n">WeightRule</span>
<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">airflow.utils.task_group</span> <span class="kn">import</span> <span class="n">TaskGroup</span>
<div class="viewcode-block" id="ScheduleInterval"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.ScheduleInterval">[docs]</a><span class="n">ScheduleInterval</span> <span class="o">=</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">timedelta</span><span class="p">,</span> <span class="n">relativedelta</span><span class="p">]</span></div>
<div class="viewcode-block" id="TaskStateChangeCallback"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.TaskStateChangeCallback">[docs]</a><span class="n">TaskStateChangeCallback</span> <span class="o">=</span> <span class="n">Callable</span><span class="p">[[</span><span class="n">Context</span><span class="p">],</span> <span class="kc">None</span><span class="p">]</span></div>
<div class="viewcode-block" id="T"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.T">[docs]</a><span class="n">T</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">,</span> <span class="n">bound</span><span class="o">=</span><span class="n">Callable</span><span class="p">)</span></div>
<div class="viewcode-block" id="BaseOperatorMeta"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperatorMeta">[docs]</a><span class="k">class</span> <span class="nc">BaseOperatorMeta</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABCMeta</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Metaclass of BaseOperator.&quot;&quot;&quot;</span>
<span class="nd">@classmethod</span>
<div class="viewcode-block" id="BaseOperatorMeta._apply_defaults"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperatorMeta._apply_defaults">[docs]</a> <span class="k">def</span> <span class="nf">_apply_defaults</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">func</span><span class="p">:</span> <span class="n">T</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">T</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Function decorator that Looks for an argument named &quot;default_args&quot;, and</span>
<span class="sd"> fills the unspecified arguments from it.</span>
<span class="sd"> Since python2.* isn&#39;t clear about which arguments are missing when</span>
<span class="sd"> calling a function, and that this can be quite confusing with multi-level</span>
<span class="sd"> inheritance and argument defaults, this decorator also alerts with</span>
<span class="sd"> specific information about the missing arguments.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Cache inspect.signature for the wrapper closure to avoid calling it</span>
<span class="c1"># at every decorated invocation. This is separate sig_cache created</span>
<span class="c1"># per decoration, i.e. each function decorated using apply_defaults will</span>
<span class="c1"># have a different sig_cache.</span>
<span class="n">sig_cache</span> <span class="o">=</span> <span class="n">signature</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
<span class="n">non_optional_args</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">name</span>
<span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> <span class="ow">in</span> <span class="n">sig_cache</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">if</span> <span class="n">param</span><span class="o">.</span><span class="n">default</span> <span class="o">==</span> <span class="n">param</span><span class="o">.</span><span class="n">empty</span>
<span class="ow">and</span> <span class="n">param</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="s1">&#39;self&#39;</span>
<span class="ow">and</span> <span class="n">param</span><span class="o">.</span><span class="n">kind</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="n">param</span><span class="o">.</span><span class="n">VAR_POSITIONAL</span><span class="p">,</span> <span class="n">param</span><span class="o">.</span><span class="n">VAR_KEYWORD</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">class</span> <span class="nc">autostacklevel_warn</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">=</span> <span class="nb">__import__</span><span class="p">(</span><span class="s1">&#39;warnings&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__getattr__</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="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">warnings</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__dir__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">dir</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">warnings</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">warn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">source</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">category</span><span class="p">,</span> <span class="n">stacklevel</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="n">source</span><span class="p">)</span>
<span class="k">if</span> <span class="n">func</span><span class="o">.</span><span class="vm">__globals__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;warnings&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="s1">&#39;warnings&#39;</span><span class="p">]:</span>
<span class="c1"># Yes, this is slightly hacky, but it _automatically_ sets the right</span>
<span class="c1"># stacklevel parameter to `warnings.warn` to ignore the decorator. Now</span>
<span class="c1"># that the decorator is applied automatically, this makes the needed</span>
<span class="c1"># stacklevel parameter less confusing.</span>
<span class="n">func</span><span class="o">.</span><span class="vm">__globals__</span><span class="p">[</span><span class="s1">&#39;warnings&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">autostacklevel_warn</span><span class="p">()</span>
<span class="nd">@functools</span><span class="o">.</span><span class="n">wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">apply_defaults</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">airflow.models.dag</span> <span class="kn">import</span> <span class="n">DagContext</span>
<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">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span><span class="s2">&quot;Use keyword arguments when initializing operators&quot;</span><span class="p">)</span>
<span class="n">dag_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="p">{}</span>
<span class="n">dag_params</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="p">{}</span>
<span class="n">dag</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;dag&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">DagContext</span><span class="o">.</span><span class="n">get_current_dag</span><span class="p">()</span>
<span class="k">if</span> <span class="n">dag</span><span class="p">:</span>
<span class="n">dag_args</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">dag</span><span class="o">.</span><span class="n">default_args</span><span class="p">)</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">dag_params</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">dag</span><span class="o">.</span><span class="n">params</span><span class="p">)</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">params</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;params&#39;</span><span class="p">,</span> <span class="p">{})</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">dag_params</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
<span class="n">default_args</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="s1">&#39;default_args&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">default_args</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;default_args&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="s1">&#39;params&#39;</span> <span class="ow">in</span> <span class="n">default_args</span><span class="p">:</span>
<span class="n">dag_params</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">default_args</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">])</span>
<span class="k">del</span> <span class="n">default_args</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">]</span>
<span class="n">dag_args</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">default_args</span><span class="p">)</span>
<span class="n">default_args</span> <span class="o">=</span> <span class="n">dag_args</span>
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">sig_cache</span><span class="o">.</span><span class="n">parameters</span><span class="p">:</span>
<span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span> <span class="ow">and</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">default_args</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">default_args</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span>
<span class="n">missing_args</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">non_optional_args</span> <span class="o">-</span> <span class="nb">set</span><span class="p">(</span><span class="n">kwargs</span><span class="p">))</span>
<span class="k">if</span> <span class="n">missing_args</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Argument </span><span class="si">{</span><span class="n">missing_args</span><span class="si">}</span><span class="s2"> is required&quot;</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="k">if</span> <span class="n">dag_params</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">dag_params</span>
<span class="k">if</span> <span class="n">default_args</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;default_args&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">default_args</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_hook_apply_defaults&#39;</span><span class="p">):</span>
<span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hook_apply_defaults</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 class="n">result</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="bp">self</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 class="c1"># Here we set upstream task defined by XComArgs passed to template fields of the operator</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_xcomargs_dependencies</span><span class="p">()</span>
<span class="c1"># Mark instance as instantiated https://docs.python.org/3/tutorial/classes.html#private-variables</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_BaseOperator__instantiated</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">return</span> <span class="n">cast</span><span class="p">(</span><span class="n">T</span><span class="p">,</span> <span class="n">apply_defaults</span><span class="p">)</span></div>
<div class="viewcode-block" id="BaseOperatorMeta.__new__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperatorMeta.__new__">[docs]</a> <span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">new_cls</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">new_cls</span><span class="o">.</span><span class="fm">__init__</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_apply_defaults</span><span class="p">(</span><span class="n">new_cls</span><span class="o">.</span><span class="fm">__init__</span><span class="p">)</span>
<span class="k">return</span> <span class="n">new_cls</span></div></div>
<div class="viewcode-block" id="BaseOperator"><a class="viewcode-back" href="../../../_api/airflow/models/index.html#airflow.models.baseoperator.BaseOperator">[docs]</a><span class="nd">@functools</span><span class="o">.</span><span class="n">total_ordering</span>
<span class="k">class</span> <span class="nc">BaseOperator</span><span class="p">(</span><span class="n">Operator</span><span class="p">,</span> <span class="n">LoggingMixin</span><span class="p">,</span> <span class="n">TaskMixin</span><span class="p">,</span> <span class="n">metaclass</span><span class="o">=</span><span class="n">BaseOperatorMeta</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Abstract base class for all operators. Since operators create objects that</span>
<span class="sd"> become nodes in the dag, BaseOperator contains many recursive methods for</span>
<span class="sd"> dag crawling behavior. To derive this class, you are expected to override</span>
<span class="sd"> the constructor as well as the &#39;execute&#39; method.</span>
<span class="sd"> Operators derived from this class should perform or trigger certain tasks</span>
<span class="sd"> synchronously (wait for completion). Example of operators could be an</span>
<span class="sd"> operator that runs a Pig job (PigOperator), a sensor operator that</span>
<span class="sd"> waits for a partition to land in Hive (HiveSensorOperator), or one that</span>
<span class="sd"> moves data from Hive to MySQL (Hive2MySqlOperator). Instances of these</span>
<span class="sd"> operators (tasks) target specific operations, running specific scripts,</span>
<span class="sd"> functions or data transfers.</span>
<span class="sd"> This class is abstract and shouldn&#39;t be instantiated. Instantiating a</span>
<span class="sd"> class derived from this one results in the creation of a task object,</span>
<span class="sd"> which ultimately becomes a node in DAG objects. Task dependencies should</span>
<span class="sd"> be set by using the set_upstream and/or set_downstream methods.</span>
<span class="sd"> :param task_id: a unique, meaningful id for the task</span>
<span class="sd"> :type task_id: str</span>
<span class="sd"> :param owner: the owner of the task, using the unix username is recommended</span>
<span class="sd"> :type owner: str</span>
<span class="sd"> :param email: the &#39;to&#39; email address(es) used in email alerts. This can be a</span>
<span class="sd"> single email or multiple ones. Multiple addresses can be specified as a</span>
<span class="sd"> comma or semi-colon separated string or by passing a list of strings.</span>
<span class="sd"> :type email: str or list[str]</span>
<span class="sd"> :param email_on_retry: Indicates whether email alerts should be sent when a</span>
<span class="sd"> task is retried</span>
<span class="sd"> :type email_on_retry: bool</span>
<span class="sd"> :param email_on_failure: Indicates whether email alerts should be sent when</span>
<span class="sd"> a task failed</span>
<span class="sd"> :type email_on_failure: bool</span>
<span class="sd"> :param retries: the number of retries that should be performed before</span>
<span class="sd"> failing the task</span>
<span class="sd"> :type retries: int</span>
<span class="sd"> :param retry_delay: delay between retries</span>
<span class="sd"> :type retry_delay: datetime.timedelta</span>
<span class="sd"> :param retry_exponential_backoff: allow progressive longer waits between</span>
<span class="sd"> retries by using exponential backoff algorithm on retry delay (delay</span>
<span class="sd"> will be converted into seconds)</span>
<span class="sd"> :type retry_exponential_backoff: bool</span>
<span class="sd"> :param max_retry_delay: maximum delay interval between retries</span>
<span class="sd"> :type max_retry_delay: datetime.timedelta</span>
<span class="sd"> :param start_date: The ``start_date`` for the task, determines</span>
<span class="sd"> the ``execution_date`` for the first task instance. The best practice</span>
<span class="sd"> is to have the start_date rounded</span>
<span class="sd"> to your DAG&#39;s ``schedule_interval``. Daily jobs have their start_date</span>
<span class="sd"> some day at 00:00:00, hourly jobs have their start_date at 00:00</span>
<span class="sd"> of a specific hour. Note that Airflow simply looks at the latest</span>
<span class="sd"> ``execution_date`` and adds the ``schedule_interval`` to determine</span>
<span class="sd"> the next ``execution_date``. It is also very important</span>
<span class="sd"> to note that different tasks&#39; dependencies</span>
<span class="sd"> need to line up in time. If task A depends on task B and their</span>
<span class="sd"> start_date are offset in a way that their execution_date don&#39;t line</span>
<span class="sd"> up, A&#39;s dependencies will never be met. If you are looking to delay</span>
<span class="sd"> a task, for example running a daily task at 2AM, look into the</span>
<span class="sd"> ``TimeSensor`` and ``TimeDeltaSensor``. We advise against using</span>
<span class="sd"> dynamic ``start_date`` and recommend using fixed ones. Read the</span>
<span class="sd"> FAQ entry about start_date for more information.</span>
<span class="sd"> :type start_date: datetime.datetime</span>
<span class="sd"> :param end_date: if specified, the scheduler won&#39;t go beyond this date</span>
<span class="sd"> :type end_date: datetime.datetime</span>
<span class="sd"> :param depends_on_past: when set to true, task instances will run</span>
<span class="sd"> sequentially and only if the previous instance has succeeded or has been skipped.</span>
<span class="sd"> The task instance for the start_date is allowed to run.</span>
<span class="sd"> :type depends_on_past: bool</span>
<span class="sd"> :param wait_for_downstream: when set to true, an instance of task</span>
<span class="sd"> X will wait for tasks immediately downstream of the previous instance</span>
<span class="sd"> of task X to finish successfully or be skipped before it runs. This is useful if the</span>
<span class="sd"> different instances of a task X alter the same asset, and this asset</span>
<span class="sd"> is used by tasks downstream of task X. Note that depends_on_past</span>
<span class="sd"> is forced to True wherever wait_for_downstream is used. Also note that</span>
<span class="sd"> only tasks *immediately* downstream of the previous task instance are waited</span>
<span class="sd"> for; the statuses of any tasks further downstream are ignored.</span>
<span class="sd"> :type wait_for_downstream: bool</span>
<span class="sd"> :param dag: a reference to the dag the task is attached to (if any)</span>
<span class="sd"> :type dag: airflow.models.DAG</span>
<span class="sd"> :param priority_weight: priority weight of this task against other task.</span>
<span class="sd"> This allows the executor to trigger higher priority tasks before</span>
<span class="sd"> others when things get backed up. Set priority_weight as a higher</span>
<span class="sd"> number for more important tasks.</span>
<span class="sd"> :type priority_weight: int</span>
<span class="sd"> :param weight_rule: weighting method used for the effective total</span>
<span class="sd"> priority weight of the task. Options are:</span>
<span class="sd"> ``{ downstream | upstream | absolute }`` default is ``downstream``</span>
<span class="sd"> When set to ``downstream`` the effective weight of the task is the</span>
<span class="sd"> aggregate sum of all downstream descendants. As a result, upstream</span>
<span class="sd"> tasks will have higher weight and will be scheduled more aggressively</span>
<span class="sd"> when using positive weight values. This is useful when you have</span>
<span class="sd"> multiple dag run instances and desire to have all upstream tasks to</span>
<span class="sd"> complete for all runs before each dag can continue processing</span>
<span class="sd"> downstream tasks. When set to ``upstream`` the effective weight is the</span>
<span class="sd"> aggregate sum of all upstream ancestors. This is the opposite where</span>
<span class="sd"> downstream tasks have higher weight and will be scheduled more</span>
<span class="sd"> aggressively when using positive weight values. This is useful when you</span>
<span class="sd"> have multiple dag run instances and prefer to have each dag complete</span>
<span class="sd"> before starting upstream tasks of other dags. When set to</span>
<span class="sd"> ``absolute``, the effective weight is the exact ``priority_weight``</span>
<span class="sd"> specified without additional weighting. You may want to do this when</span>
<span class="sd"> you know exactly what priority weight each task should have.</span>
<span class="sd"> Additionally, when set to ``absolute``, there is bonus effect of</span>
<span class="sd"> significantly speeding up the task creation process as for very large</span>
<span class="sd"> DAGS. Options can be set as string or using the constants defined in</span>
<span class="sd"> the static class ``airflow.utils.WeightRule``</span>
<span class="sd"> :type weight_rule: str</span>
<span class="sd"> :param queue: which queue to target when running this job. Not</span>
<span class="sd"> all executors implement queue management, the CeleryExecutor</span>
<span class="sd"> does support targeting specific queues.</span>
<span class="sd"> :type queue: str</span>
<span class="sd"> :param pool: the slot pool this task should run in, slot pools are a</span>
<span class="sd"> way to limit concurrency for certain tasks</span>
<span class="sd"> :type pool: str</span>
<span class="sd"> :param pool_slots: the number of pool slots this task should use (&gt;= 1)</span>
<span class="sd"> Values less than 1 are not allowed.</span>
<span class="sd"> :type pool_slots: int</span>
<span class="sd"> :param sla: time by which the job is expected to succeed. Note that</span>
<span class="sd"> this represents the ``timedelta`` after the period is closed. For</span>
<span class="sd"> example if you set an SLA of 1 hour, the scheduler would send an email</span>
<span class="sd"> soon after 1:00AM on the ``2016-01-02`` if the ``2016-01-01`` instance</span>
<span class="sd"> has not succeeded yet.</span>
<span class="sd"> The scheduler pays special attention for jobs with an SLA and</span>
<span class="sd"> sends alert</span>
<span class="sd"> emails for sla misses. SLA misses are also recorded in the database</span>
<span class="sd"> for future reference. All tasks that share the same SLA time</span>
<span class="sd"> get bundled in a single email, sent soon after that time. SLA</span>
<span class="sd"> notification are sent once and only once for each task instance.</span>
<span class="sd"> :type sla: datetime.timedelta</span>
<span class="sd"> :param execution_timeout: max time allowed for the execution of</span>
<span class="sd"> this task instance, if it goes beyond it will raise and fail.</span>
<span class="sd"> :type execution_timeout: datetime.timedelta</span>
<span class="sd"> :param on_failure_callback: a function to be called when a task instance</span>
<span class="sd"> of this task fails. a context dictionary is passed as a single</span>
<span class="sd"> parameter to this function. Context contains references to related</span>
<span class="sd"> objects to the task instance and is documented under the macros</span>
<span class="sd"> section of the API.</span>
<span class="sd"> :type on_failure_callback: TaskStateChangeCallback</span>
<span class="sd"> :param on_execute_callback: much like the ``on_failure_callback`` except</span>
<span class="sd"> that it is executed right before the task is executed.</span>
<span class="sd"> :type on_execute_callback: TaskStateChangeCallback</span>
<span class="sd"> :param on_retry_callback: much like the ``on_failure_callback`` except</span>
<span class="sd"> that it is executed when retries occur.</span>
<span class="sd"> :type on_retry_callback: TaskStateChangeCallback</span>
<span class="sd"> :param on_success_callback: much like the ``on_failure_callback`` except</span>
<span class="sd"> that it is executed when the task succeeds.</span>
<span class="sd"> :type on_success_callback: TaskStateChangeCallback</span>
<span class="sd"> :param trigger_rule: defines the rule by which dependencies are applied</span>
<span class="sd"> for the task to get triggered. Options are:</span>
<span class="sd"> ``{ all_success | all_failed | all_done | one_success |</span>
<span class="sd"> one_failed | none_failed | none_failed_or_skipped | none_skipped | dummy}``</span>
<span class="sd"> default is ``all_success``. Options can be set as string or</span>
<span class="sd"> using the constants defined in the static class</span>
<span class="sd"> ``airflow.utils.TriggerRule``</span>
<span class="sd"> :type trigger_rule: str</span>
<span class="sd"> :param resources: A map of resource parameter names (the argument names of the</span>
<span class="sd"> Resources constructor) to their values.</span>
<span class="sd"> :type resources: dict</span>
<span class="sd"> :param run_as_user: unix username to impersonate while running the task</span>
<span class="sd"> :type run_as_user: str</span>
<span class="sd"> :param task_concurrency: When set, a task will be able to limit the concurrent</span>
<span class="sd"> runs across execution_dates</span>
<span class="sd"> :type task_concurrency: int</span>
<span class="sd"> :param executor_config: Additional task-level configuration parameters that are</span>
<span class="sd"> interpreted by a specific executor. Parameters are namespaced by the name of</span>
<span class="sd"> executor.</span>
<span class="sd"> **Example**: to run this task in a specific docker container through</span>
<span class="sd"> the KubernetesExecutor ::</span>
<span class="sd"> MyOperator(...,</span>
<span class="sd"> executor_config={</span>
<span class="sd"> &quot;KubernetesExecutor&quot;:</span>
<span class="sd"> {&quot;image&quot;: &quot;myCustomDockerImage&quot;}</span>
<span class="sd"> }</span>
<span class="sd"> )</span>
<span class="sd"> :type executor_config: dict</span>
<span class="sd"> :param do_xcom_push: if True, an XCom is pushed containing the Operator&#39;s</span>
<span class="sd"> result</span>
<span class="sd"> :type do_xcom_push: bool</span>
<span class="sd"> :param doc: Add documentation or notes to your Task objects that is visible in</span>
<span class="sd"> Task Instance details View in the Webserver</span>
<span class="sd"> :type doc: str</span>
<span class="sd"> :param doc_md: Add documentation (in Markdown format) or notes to your Task objects</span>
<span class="sd"> that is visible in Task Instance details View in the Webserver</span>
<span class="sd"> :type doc_md: str</span>
<span class="sd"> :param doc_rst: Add documentation (in RST format) or notes to your Task objects</span>
<span class="sd"> that is visible in Task Instance details View in the Webserver</span>
<span class="sd"> :type doc_rst: str</span>
<span class="sd"> :param doc_json: Add documentation (in JSON format) or notes to your Task objects</span>
<span class="sd"> that is visible in Task Instance details View in the Webserver</span>
<span class="sd"> :type doc_json: str</span>
<span class="sd"> :param doc_yaml: Add documentation (in YAML format) or notes to your Task objects</span>
<span class="sd"> that is visible in Task Instance details View in the Webserver</span>
<span class="sd"> :type doc_yaml: str</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># For derived classes to define which fields will get jinjaified</span>
<div class="viewcode-block" id="BaseOperator.template_fields"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.template_fields">[docs]</a> <span class="n">template_fields</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">()</span></div>
<span class="c1"># Defines which files extensions to look for in the templated fields</span>
<div class="viewcode-block" id="BaseOperator.template_ext"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.template_ext">[docs]</a> <span class="n">template_ext</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">()</span></div>
<span class="c1"># Template field renderers indicating type of the field, for example sql, json, bash</span>
<div class="viewcode-block" id="BaseOperator.template_fields_renderers"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.template_fields_renderers">[docs]</a> <span class="n">template_fields_renderers</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="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span></div>
<span class="c1"># Defines the color in the UI</span>
<div class="viewcode-block" id="BaseOperator.ui_color"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.ui_color">[docs]</a> <span class="n">ui_color</span> <span class="o">=</span> <span class="s1">&#39;#fff&#39;</span> <span class="c1"># type: str</span></div>
<div class="viewcode-block" id="BaseOperator.ui_fgcolor"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.ui_fgcolor">[docs]</a> <span class="n">ui_fgcolor</span> <span class="o">=</span> <span class="s1">&#39;#000&#39;</span> <span class="c1"># type: str</span></div>
<div class="viewcode-block" id="BaseOperator.pool"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.pool">[docs]</a> <span class="n">pool</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="c1"># type: str</span></div>
<span class="c1"># base list which includes all the attrs that don&#39;t need deep copy.</span>
<div class="viewcode-block" id="BaseOperator._base_operator_shallow_copy_attrs"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator._base_operator_shallow_copy_attrs">[docs]</a> <span class="n">_base_operator_shallow_copy_attrs</span><span class="p">:</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="o">...</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
<span class="s1">&#39;user_defined_macros&#39;</span><span class="p">,</span>
<span class="s1">&#39;user_defined_filters&#39;</span><span class="p">,</span>
<span class="s1">&#39;params&#39;</span><span class="p">,</span>
<span class="s1">&#39;_log&#39;</span><span class="p">,</span></div>
<span class="p">)</span>
<span class="c1"># each operator should override this class attr for shallow copy attrs.</span>
<div class="viewcode-block" id="BaseOperator.shallow_copy_attrs"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.shallow_copy_attrs">[docs]</a> <span class="n">shallow_copy_attrs</span><span class="p">:</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="o">...</span><span class="p">]</span> <span class="o">=</span> <span class="p">()</span></div>
<span class="c1"># Defines the operator level extra links</span>
<div class="viewcode-block" id="BaseOperator.operator_extra_links"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.operator_extra_links">[docs]</a> <span class="n">operator_extra_links</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="s1">&#39;BaseOperatorLink&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">()</span></div>
<span class="c1"># The _serialized_fields are lazily loaded when get_serialized_fields() method is called</span>
<div class="viewcode-block" id="BaseOperator.__serialized_fields"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__serialized_fields">[docs]</a> <span class="n">__serialized_fields</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">FrozenSet</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="BaseOperator._comps"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator._comps">[docs]</a> <span class="n">_comps</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">&#39;task_id&#39;</span><span class="p">,</span>
<span class="s1">&#39;dag_id&#39;</span><span class="p">,</span>
<span class="s1">&#39;owner&#39;</span><span class="p">,</span>
<span class="s1">&#39;email&#39;</span><span class="p">,</span>
<span class="s1">&#39;email_on_retry&#39;</span><span class="p">,</span>
<span class="s1">&#39;retry_delay&#39;</span><span class="p">,</span>
<span class="s1">&#39;retry_exponential_backoff&#39;</span><span class="p">,</span>
<span class="s1">&#39;max_retry_delay&#39;</span><span class="p">,</span>
<span class="s1">&#39;start_date&#39;</span><span class="p">,</span>
<span class="s1">&#39;depends_on_past&#39;</span><span class="p">,</span>
<span class="s1">&#39;wait_for_downstream&#39;</span><span class="p">,</span>
<span class="s1">&#39;priority_weight&#39;</span><span class="p">,</span>
<span class="s1">&#39;sla&#39;</span><span class="p">,</span>
<span class="s1">&#39;execution_timeout&#39;</span><span class="p">,</span>
<span class="s1">&#39;on_execute_callback&#39;</span><span class="p">,</span>
<span class="s1">&#39;on_failure_callback&#39;</span><span class="p">,</span>
<span class="s1">&#39;on_success_callback&#39;</span><span class="p">,</span>
<span class="s1">&#39;on_retry_callback&#39;</span><span class="p">,</span>
<span class="s1">&#39;do_xcom_push&#39;</span><span class="p">,</span></div>
<span class="p">}</span>
<span class="c1"># Defines if the operator supports lineage without manual definitions</span>
<div class="viewcode-block" id="BaseOperator.supports_lineage"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.supports_lineage">[docs]</a> <span class="n">supports_lineage</span> <span class="o">=</span> <span class="kc">False</span></div>
<span class="c1"># If True then the class constructor was called</span>
<div class="viewcode-block" id="BaseOperator.__instantiated"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__instantiated">[docs]</a> <span class="n">__instantiated</span> <span class="o">=</span> <span class="kc">False</span></div>
<span class="c1"># Set to True before calling execute method</span>
<div class="viewcode-block" id="BaseOperator._lock_for_execution"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator._lock_for_execution">[docs]</a> <span class="n">_lock_for_execution</span> <span class="o">=</span> <span class="kc">False</span></div>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">task_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="n">owner</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;operators&#39;</span><span class="p">,</span> <span class="s1">&#39;DEFAULT_OWNER&#39;</span><span class="p">),</span>
<span class="n">email</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Iterable</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="n">email_on_retry</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">&#39;email&#39;</span><span class="p">,</span> <span class="s1">&#39;default_email_on_retry&#39;</span><span class="p">,</span> <span class="n">fallback</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span>
<span class="n">email_on_failure</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">&#39;email&#39;</span><span class="p">,</span> <span class="s1">&#39;default_email_on_failure&#39;</span><span class="p">,</span> <span class="n">fallback</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span>
<span class="n">retries</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="n">conf</span><span class="o">.</span><span class="n">getint</span><span class="p">(</span><span class="s1">&#39;core&#39;</span><span class="p">,</span> <span class="s1">&#39;default_task_retries&#39;</span><span class="p">,</span> <span class="n">fallback</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span>
<span class="n">retry_delay</span><span class="p">:</span> <span class="n">timedelta</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="mi">300</span><span class="p">),</span>
<span class="n">retry_exponential_backoff</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="n">max_retry_delay</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">timedelta</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">start_date</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">datetime</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">end_date</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">datetime</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">depends_on_past</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="n">wait_for_downstream</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="n">dag</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">params</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Dict</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">default_args</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Dict</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">priority_weight</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">weight_rule</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">WeightRule</span><span class="o">.</span><span class="n">DOWNSTREAM</span><span class="p">,</span>
<span class="n">queue</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;operators&#39;</span><span class="p">,</span> <span class="s1">&#39;default_queue&#39;</span><span class="p">),</span>
<span class="n">pool</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="n">pool_slots</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">sla</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">timedelta</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">execution_timeout</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">timedelta</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">on_execute_callback</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">TaskStateChangeCallback</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">on_failure_callback</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">TaskStateChangeCallback</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">on_success_callback</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">TaskStateChangeCallback</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">on_retry_callback</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">TaskStateChangeCallback</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">trigger_rule</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">TriggerRule</span><span class="o">.</span><span class="n">ALL_SUCCESS</span><span class="p">,</span>
<span class="n">resources</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Dict</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">run_as_user</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="n">task_concurrency</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 class="p">,</span>
<span class="n">executor_config</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Dict</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">do_xcom_push</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<span class="n">inlets</span><span class="p">:</span> <span class="n">Optional</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 class="n">outlets</span><span class="p">:</span> <span class="n">Optional</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 class="n">task_group</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="s2">&quot;TaskGroup&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">doc</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="n">doc_md</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="n">doc_json</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="n">doc_yaml</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="n">doc_rst</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">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">):</span>
<span class="kn">from</span> <span class="nn">airflow.models.dag</span> <span class="kn">import</span> <span class="n">DagContext</span>
<span class="kn">from</span> <span class="nn">airflow.utils.task_group</span> <span class="kn">import</span> <span class="n">TaskGroupContext</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">conf</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">&#39;operators&#39;</span><span class="p">,</span> <span class="s1">&#39;ALLOW_ILLEGAL_ARGUMENTS&#39;</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span>
<span class="s2">&quot;Invalid arguments were passed to </span><span class="si">{c}</span><span class="s2"> (task_id: </span><span class="si">{t}</span><span class="s2">). Invalid &quot;</span>
<span class="s2">&quot;arguments were:</span><span class="se">\n</span><span class="s2">**kwargs: </span><span class="si">{k}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="n">kwargs</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="n">task_id</span><span class="p">),</span>
<span class="p">)</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s1">&#39;Invalid arguments were passed to </span><span class="si">{c}</span><span class="s1"> (task_id: </span><span class="si">{t}</span><span class="s1">). &#39;</span>
<span class="s1">&#39;Support for passing such arguments will be dropped in &#39;</span>
<span class="s1">&#39;future. Invalid arguments were:&#39;</span>
<span class="s1">&#39;</span><span class="se">\n</span><span class="s1">**kwargs: </span><span class="si">{k}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="n">kwargs</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="n">task_id</span><span class="p">),</span>
<span class="n">category</span><span class="o">=</span><span class="ne">PendingDeprecationWarning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">validate_key</span><span class="p">(</span><span class="n">task_id</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">task_id</span> <span class="o">=</span> <span class="n">task_id</span>
<span class="bp">self</span><span class="o">.</span><span class="n">label</span> <span class="o">=</span> <span class="n">task_id</span>
<span class="n">task_group</span> <span class="o">=</span> <span class="n">task_group</span> <span class="ow">or</span> <span class="n">TaskGroupContext</span><span class="o">.</span><span class="n">get_current_task_group</span><span class="p">(</span><span class="n">dag</span><span class="p">)</span>
<span class="k">if</span> <span class="n">task_group</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">task_id</span> <span class="o">=</span> <span class="n">task_group</span><span class="o">.</span><span class="n">child_id</span><span class="p">(</span><span class="n">task_id</span><span class="p">)</span>
<span class="n">task_group</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">owner</span> <span class="o">=</span> <span class="n">owner</span>
<span class="bp">self</span><span class="o">.</span><span class="n">email</span> <span class="o">=</span> <span class="n">email</span>
<span class="bp">self</span><span class="o">.</span><span class="n">email_on_retry</span> <span class="o">=</span> <span class="n">email_on_retry</span>
<span class="bp">self</span><span class="o">.</span><span class="n">email_on_failure</span> <span class="o">=</span> <span class="n">email_on_failure</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start_date</span> <span class="o">=</span> <span class="n">start_date</span>
<span class="k">if</span> <span class="n">start_date</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">datetime</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;start_date for </span><span class="si">%s</span><span class="s2"> isn&#39;t datetime.datetime&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">start_date</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start_date</span> <span class="o">=</span> <span class="n">timezone</span><span class="o">.</span><span class="n">convert_to_utc</span><span class="p">(</span><span class="n">start_date</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">end_date</span> <span class="o">=</span> <span class="n">end_date</span>
<span class="k">if</span> <span class="n">end_date</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">end_date</span> <span class="o">=</span> <span class="n">timezone</span><span class="o">.</span><span class="n">convert_to_utc</span><span class="p">(</span><span class="n">end_date</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">TriggerRule</span><span class="o">.</span><span class="n">is_valid</span><span class="p">(</span><span class="n">trigger_rule</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span>
<span class="s2">&quot;The trigger_rule must be one of </span><span class="si">{all_triggers}</span><span class="s2">,&quot;</span>
<span class="s2">&quot;&#39;</span><span class="si">{d}</span><span class="s2">.</span><span class="si">{t}</span><span class="s2">&#39;; received &#39;</span><span class="si">{tr}</span><span class="s2">&#39;.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">all_triggers</span><span class="o">=</span><span class="n">TriggerRule</span><span class="o">.</span><span class="n">all_triggers</span><span class="p">(),</span>
<span class="n">d</span><span class="o">=</span><span class="n">dag</span><span class="o">.</span><span class="n">dag_id</span> <span class="k">if</span> <span class="n">dag</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">t</span><span class="o">=</span><span class="n">task_id</span><span class="p">,</span>
<span class="n">tr</span><span class="o">=</span><span class="n">trigger_rule</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">trigger_rule</span> <span class="o">=</span> <span class="n">trigger_rule</span>
<span class="bp">self</span><span class="o">.</span><span class="n">depends_on_past</span> <span class="o">=</span> <span class="n">depends_on_past</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait_for_downstream</span> <span class="o">=</span> <span class="n">wait_for_downstream</span>
<span class="k">if</span> <span class="n">wait_for_downstream</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">depends_on_past</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">retries</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">retries</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">parsed_retries</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">retries</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;&#39;retries&#39; type must be int, not </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">retries</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;Implicitly converting &#39;retries&#39; for </span><span class="si">%s</span><span class="s2"> from </span><span class="si">%r</span><span class="s2"> to int&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">retries</span><span class="p">)</span>
<span class="n">retries</span> <span class="o">=</span> <span class="n">parsed_retries</span>
<span class="bp">self</span><span class="o">.</span><span class="n">retries</span> <span class="o">=</span> <span class="n">retries</span>
<span class="bp">self</span><span class="o">.</span><span class="n">queue</span> <span class="o">=</span> <span class="n">queue</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pool</span> <span class="o">=</span> <span class="n">Pool</span><span class="o">.</span><span class="n">DEFAULT_POOL_NAME</span> <span class="k">if</span> <span class="n">pool</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">pool</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pool_slots</span> <span class="o">=</span> <span class="n">pool_slots</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool_slots</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;pool slots for </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">task_id</span><span class="si">}</span><span class="s2"> in dag </span><span class="si">{</span><span class="n">dag</span><span class="o">.</span><span class="n">dag_id</span><span class="si">}</span><span class="s2"> cannot be less than 1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sla</span> <span class="o">=</span> <span class="n">sla</span>
<span class="bp">self</span><span class="o">.</span><span class="n">execution_timeout</span> <span class="o">=</span> <span class="n">execution_timeout</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_execute_callback</span> <span class="o">=</span> <span class="n">on_execute_callback</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_failure_callback</span> <span class="o">=</span> <span class="n">on_failure_callback</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_success_callback</span> <span class="o">=</span> <span class="n">on_success_callback</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_retry_callback</span> <span class="o">=</span> <span class="n">on_retry_callback</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">retry_delay</span><span class="p">,</span> <span class="n">timedelta</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">retry_delay</span> <span class="o">=</span> <span class="n">retry_delay</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Retry_delay isn&#39;t timedelta object, assuming secs&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">retry_delay</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="n">retry_delay</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">retry_exponential_backoff</span> <span class="o">=</span> <span class="n">retry_exponential_backoff</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_retry_delay</span> <span class="o">=</span> <span class="n">max_retry_delay</span>
<span class="k">if</span> <span class="n">max_retry_delay</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">max_retry_delay</span><span class="p">,</span> <span class="n">timedelta</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_retry_delay</span> <span class="o">=</span> <span class="n">max_retry_delay</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;max_retry_delay isn&#39;t a timedelta object, assuming secs&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_retry_delay</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="n">max_retry_delay</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="n">params</span> <span class="ow">or</span> <span class="p">{}</span> <span class="c1"># Available in templates!</span>
<span class="k">if</span> <span class="n">priority_weight</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">priority_weight</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;`priority_weight` for task &#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">task_id</span><span class="si">}</span><span class="s2">&#39; only accepts integers, &quot;</span>
<span class="sa">f</span><span class="s2">&quot;received &#39;</span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">priority_weight</span><span class="p">)</span><span class="si">}</span><span class="s2">&#39;.&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">priority_weight</span> <span class="o">=</span> <span class="n">priority_weight</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">WeightRule</span><span class="o">.</span><span class="n">is_valid</span><span class="p">(</span><span class="n">weight_rule</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span>
<span class="s2">&quot;The weight_rule must be one of </span><span class="si">{all_weight_rules}</span><span class="s2">,&quot;</span>
<span class="s2">&quot;&#39;</span><span class="si">{d}</span><span class="s2">.</span><span class="si">{t}</span><span class="s2">&#39;; received &#39;</span><span class="si">{tr}</span><span class="s2">&#39;.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">all_weight_rules</span><span class="o">=</span><span class="n">WeightRule</span><span class="o">.</span><span class="n">all_weight_rules</span><span class="p">,</span>
<span class="n">d</span><span class="o">=</span><span class="n">dag</span><span class="o">.</span><span class="n">dag_id</span> <span class="k">if</span> <span class="n">dag</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">t</span><span class="o">=</span><span class="n">task_id</span><span class="p">,</span>
<span class="n">tr</span><span class="o">=</span><span class="n">weight_rule</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">weight_rule</span> <span class="o">=</span> <span class="n">weight_rule</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resources</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Resources</span><span class="p">]</span> <span class="o">=</span> <span class="n">Resources</span><span class="p">(</span><span class="o">**</span><span class="n">resources</span><span class="p">)</span> <span class="k">if</span> <span class="n">resources</span> <span class="k">else</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">run_as_user</span> <span class="o">=</span> <span class="n">run_as_user</span>
<span class="bp">self</span><span class="o">.</span><span class="n">task_concurrency</span> <span class="o">=</span> <span class="n">task_concurrency</span>
<span class="bp">self</span><span class="o">.</span><span class="n">executor_config</span> <span class="o">=</span> <span class="n">executor_config</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">do_xcom_push</span> <span class="o">=</span> <span class="n">do_xcom_push</span>
<span class="bp">self</span><span class="o">.</span><span class="n">doc_md</span> <span class="o">=</span> <span class="n">doc_md</span>
<span class="bp">self</span><span class="o">.</span><span class="n">doc_json</span> <span class="o">=</span> <span class="n">doc_json</span>
<span class="bp">self</span><span class="o">.</span><span class="n">doc_yaml</span> <span class="o">=</span> <span class="n">doc_yaml</span>
<span class="bp">self</span><span class="o">.</span><span class="n">doc_rst</span> <span class="o">=</span> <span class="n">doc_rst</span>
<span class="bp">self</span><span class="o">.</span><span class="n">doc</span> <span class="o">=</span> <span class="n">doc</span>
<span class="c1"># Private attributes</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_upstream_task_ids</span><span class="p">:</span> <span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_downstream_task_ids</span><span class="p">:</span> <span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_dag</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dag</span> <span class="o">=</span> <span class="n">dag</span> <span class="ow">or</span> <span class="n">DagContext</span><span class="o">.</span><span class="n">get_current_dag</span><span class="p">()</span>
<span class="c1"># subdag parameter is only set for SubDagOperator.</span>
<span class="c1"># Setting it to None by default as other Operators do not have that field</span>
<span class="kn">from</span> <span class="nn">airflow.models.dag</span> <span class="kn">import</span> <span class="n">DAG</span>
<span class="bp">self</span><span class="o">.</span><span class="n">subdag</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">DAG</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_log</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;airflow.task.operators&quot;</span><span class="p">)</span>
<span class="c1"># Lineage</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inlets</span><span class="p">:</span> <span class="n">List</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">outlets</span><span class="p">:</span> <span class="n">List</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_inlets</span><span class="p">:</span> <span class="n">List</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_outlets</span><span class="p">:</span> <span class="n">List</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">inlets</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_inlets</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">inlets</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inlets</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span>
<span class="k">else</span> <span class="p">[</span>
<span class="n">inlets</span><span class="p">,</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">outlets</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_outlets</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">outlets</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">outlets</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span>
<span class="k">else</span> <span class="p">[</span>
<span class="n">outlets</span><span class="p">,</span>
<span class="p">]</span>
<span class="p">)</span>
<div class="viewcode-block" id="BaseOperator.__eq__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__eq__">[docs]</a> <span class="k">def</span> <span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">other</span><span class="p">):</span>
<span class="c1"># Use getattr() instead of __dict__ as __dict__ doesn&#39;t return</span>
<span class="c1"># correct values for properties.</span>
<span class="k">return</span> <span class="nb">all</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="o">==</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_comps</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="BaseOperator.__ne__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__ne__">[docs]</a> <span class="k">def</span> <span class="fm">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span> <span class="o">==</span> <span class="n">other</span></div>
<div class="viewcode-block" id="BaseOperator.__hash__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__hash__">[docs]</a> <span class="k">def</span> <span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">hash_components</span> <span class="o">=</span> <span class="p">[</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">component</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_comps</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">component</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">hash</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="n">hash_components</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="n">hash_components</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">val</span><span class="p">))</span>
<span class="k">return</span> <span class="nb">hash</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">hash_components</span><span class="p">))</span></div>
<span class="c1"># including lineage information</span>
<div class="viewcode-block" id="BaseOperator.__or__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__or__">[docs]</a> <span class="k">def</span> <span class="fm">__or__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called for [This Operator] | [Operator], The inlets of other</span>
<span class="sd"> will be set to pickup the outlets from this operator. Other will</span>
<span class="sd"> be set as a downstream task of this operator.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">BaseOperator</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_outlets</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">supports_lineage</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;No outlets defined for this operator&quot;</span><span class="p">)</span>
<span class="n">other</span><span class="o">.</span><span class="n">add_inlets</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">task_id</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_downstream</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Right hand side (</span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2">) is not an Operator&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
<span class="c1"># /Composing Operators ---------------------------------------------</span>
<div class="viewcode-block" id="BaseOperator.__gt__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__gt__">[docs]</a> <span class="k">def</span> <span class="fm">__gt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called for [Operator] &gt; [Outlet], so that if other is an attr annotated object</span>
<span class="sd"> it is set as an outlet of this Operator.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="p">[</span><span class="n">other</span><span class="p">]</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">other</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">attr</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Left hand side (</span><span class="si">{</span><span class="n">obj</span><span class="si">}</span><span class="s2">) is not an outlet&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_outlets</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="BaseOperator.__lt__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__lt__">[docs]</a> <span class="k">def</span> <span class="fm">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called for [Inlet] &gt; [Operator] or [Operator] &lt; [Inlet], so that if other is</span>
<span class="sd"> an attr annotated object it is set as an inlet to this operator</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="p">[</span><span class="n">other</span><span class="p">]</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">other</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">attr</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">obj</span><span class="si">}</span><span class="s2"> cannot be an inlet&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_inlets</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="BaseOperator.__setattr__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__setattr__">[docs]</a> <span class="k">def</span> <span class="fm">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lock_for_execution</span><span class="p">:</span>
<span class="c1"># Skip any custom behaviour during execute</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__instantiated</span> <span class="ow">and</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_fields</span><span class="p">:</span>
<span class="c1"># Resolve upstreams set by assigning an XComArg after initializing</span>
<span class="c1"># an operator, example:</span>
<span class="c1"># op = BashOperator()</span>
<span class="c1"># op.bash_command = &quot;sleep 1&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_xcomargs_dependencies</span><span class="p">()</span></div>
<div class="viewcode-block" id="BaseOperator.add_inlets"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.add_inlets">[docs]</a> <span class="k">def</span> <span class="nf">add_inlets</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inlets</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="n">Any</span><span class="p">]):</span>
<span class="sd">&quot;&quot;&quot;Sets inlets to this operator&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_inlets</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">inlets</span><span class="p">)</span></div>
<div class="viewcode-block" id="BaseOperator.add_outlets"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.add_outlets">[docs]</a> <span class="k">def</span> <span class="nf">add_outlets</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">outlets</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="n">Any</span><span class="p">]):</span>
<span class="sd">&quot;&quot;&quot;Defines the outlets of this operator&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_outlets</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">outlets</span><span class="p">)</span></div>
<div class="viewcode-block" id="BaseOperator.get_inlet_defs"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.get_inlet_defs">[docs]</a> <span class="k">def</span> <span class="nf">get_inlet_defs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;:return: list of inlets defined for this operator&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_inlets</span></div>
<div class="viewcode-block" id="BaseOperator.get_outlet_defs"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.get_outlet_defs">[docs]</a> <span class="k">def</span> <span class="nf">get_outlet_defs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;:return: list of outlets defined for this operator&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_outlets</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.dag"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.dag">[docs]</a> <span class="k">def</span> <span class="nf">dag</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 class="sd">&quot;&quot;&quot;Returns the Operator&#39;s DAG if set, otherwise raises an error&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_dag</span><span class="p">():</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dag</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Operator </span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s1"> has not been assigned to a DAG yet&#39;</span><span class="p">)</span></div>
<span class="nd">@dag</span><span class="o">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">dag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dag</span><span class="p">:</span> <span class="n">Any</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Operators can be assigned to one DAG, one time. Repeat assignments to</span>
<span class="sd"> that same DAG are ok.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">airflow.models.dag</span> <span class="kn">import</span> <span class="n">DAG</span>
<span class="k">if</span> <span class="n">dag</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_dag</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dag</span><span class="p">,</span> <span class="n">DAG</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Expected DAG; received </span><span class="si">{</span><span class="n">dag</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_dag</span><span class="p">()</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">dag</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">dag</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;The DAG assigned to </span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s2"> can not be changed.&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">task_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">dag</span><span class="o">.</span><span class="n">task_dict</span><span class="p">:</span>
<span class="n">dag</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">task_id</span> <span class="ow">in</span> <span class="n">dag</span><span class="o">.</span><span class="n">task_dict</span> <span class="ow">and</span> <span class="n">dag</span><span class="o">.</span><span class="n">task_dict</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">task_id</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="p">:</span>
<span class="n">dag</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_dag</span> <span class="o">=</span> <span class="n">dag</span>
<div class="viewcode-block" id="BaseOperator.has_dag"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.has_dag">[docs]</a> <span class="k">def</span> <span class="nf">has_dag</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns True if the Operator has been assigned to a DAG.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_dag&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.dag_id"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.dag_id">[docs]</a> <span class="k">def</span> <span class="nf">dag_id</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 class="sd">&quot;&quot;&quot;Returns dag id if it has one or an adhoc + owner&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_dag</span><span class="p">():</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">dag_id</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;adhoc_&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">owner</span></div>
<div class="viewcode-block" id="BaseOperator.deps"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.deps">[docs]</a> <span class="n">deps</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="n">BaseTIDep</span><span class="p">]</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">(</span>
<span class="p">{</span>
<span class="n">NotInRetryPeriodDep</span><span class="p">(),</span>
<span class="n">PrevDagrunDep</span><span class="p">(),</span>
<span class="n">TriggerRuleDep</span><span class="p">(),</span>
<span class="n">NotPreviouslySkippedDep</span><span class="p">(),</span></div>
<span class="p">}</span>
<span class="p">)</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the set of dependencies for the operator. These differ from execution</span>
<span class="sd"> context dependencies in that they are specific to tasks and can be</span>
<span class="sd"> extended/overridden by subclasses.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="BaseOperator.prepare_for_execution"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.prepare_for_execution">[docs]</a> <span class="k">def</span> <span class="nf">prepare_for_execution</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;BaseOperator&quot;</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Lock task for execution to disable custom action in __setattr__ and</span>
<span class="sd"> returns a copy of the task</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">other</span><span class="o">.</span><span class="n">_lock_for_execution</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">return</span> <span class="n">other</span></div>
<div class="viewcode-block" id="BaseOperator.set_xcomargs_dependencies"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.set_xcomargs_dependencies">[docs]</a> <span class="k">def</span> <span class="nf">set_xcomargs_dependencies</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Resolves upstream dependencies of a task. In this way passing an ``XComArg``</span>
<span class="sd"> as value for a template field will result in creating upstream relation between</span>
<span class="sd"> two tasks.</span>
<span class="sd"> **Example**: ::</span>
<span class="sd"> with DAG(...):</span>
<span class="sd"> generate_content = GenerateContentOperator(task_id=&quot;generate_content&quot;)</span>
<span class="sd"> send_email = EmailOperator(..., html_content=generate_content.output)</span>
<span class="sd"> # This is equivalent to</span>
<span class="sd"> with DAG(...):</span>
<span class="sd"> generate_content = GenerateContentOperator(task_id=&quot;generate_content&quot;)</span>
<span class="sd"> send_email = EmailOperator(</span>
<span class="sd"> ..., html_content=&quot;{{ task_instance.xcom_pull(&#39;generate_content&#39;) }}&quot;</span>
<span class="sd"> )</span>
<span class="sd"> generate_content &gt;&gt; send_email</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">airflow.models.xcom_arg</span> <span class="kn">import</span> <span class="n">XComArg</span>
<span class="k">def</span> <span class="nf">apply_set_upstream</span><span class="p">(</span><span class="n">arg</span><span class="p">:</span> <span class="n">Any</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">XComArg</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_upstream</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">operator</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">set</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
<span class="k">for</span> <span class="n">elem</span> <span class="ow">in</span> <span class="n">arg</span><span class="p">:</span>
<span class="n">apply_set_upstream</span><span class="p">(</span><span class="n">elem</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="k">for</span> <span class="n">elem</span> <span class="ow">in</span> <span class="n">arg</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="n">apply_set_upstream</span><span class="p">(</span><span class="n">elem</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="s2">&quot;template_fields&quot;</span><span class="p">):</span>
<span class="k">for</span> <span class="n">elem</span> <span class="ow">in</span> <span class="n">arg</span><span class="o">.</span><span class="n">template_fields</span><span class="p">:</span>
<span class="n">apply_set_upstream</span><span class="p">(</span><span class="n">elem</span><span class="p">)</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_fields</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="n">arg</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span>
<span class="n">apply_set_upstream</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.priority_weight_total"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.priority_weight_total">[docs]</a> <span class="k">def</span> <span class="nf">priority_weight_total</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Total priority weight for the task. It might include all upstream or downstream tasks.</span>
<span class="sd"> depending on the weight rule.</span>
<span class="sd"> - WeightRule.ABSOLUTE - only own weight</span>
<span class="sd"> - WeightRule.DOWNSTREAM - adds priority weight of all downstream tasks</span>
<span class="sd"> - WeightRule.UPSTREAM - adds priority weight of all upstream tasks</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">weight_rule</span> <span class="o">==</span> <span class="n">WeightRule</span><span class="o">.</span><span class="n">ABSOLUTE</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">priority_weight</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">weight_rule</span> <span class="o">==</span> <span class="n">WeightRule</span><span class="o">.</span><span class="n">DOWNSTREAM</span><span class="p">:</span>
<span class="n">upstream</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">weight_rule</span> <span class="o">==</span> <span class="n">WeightRule</span><span class="o">.</span><span class="n">UPSTREAM</span><span class="p">:</span>
<span class="n">upstream</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">upstream</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dag</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">priority_weight</span>
<span class="kn">from</span> <span class="nn">airflow.models.dag</span> <span class="kn">import</span> <span class="n">DAG</span>
<span class="n">dag</span><span class="p">:</span> <span class="n">DAG</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dag</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">priority_weight</span> <span class="o">+</span> <span class="nb">sum</span><span class="p">(</span>
<span class="nb">map</span><span class="p">(</span>
<span class="k">lambda</span> <span class="n">task_id</span><span class="p">:</span> <span class="n">dag</span><span class="o">.</span><span class="n">task_dict</span><span class="p">[</span><span class="n">task_id</span><span class="p">]</span><span class="o">.</span><span class="n">priority_weight</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">get_flat_relative_ids</span><span class="p">(</span><span class="n">upstream</span><span class="o">=</span><span class="n">upstream</span><span class="p">),</span></div>
<span class="p">)</span>
<span class="p">)</span>
<span class="nd">@cached_property</span>
<div class="viewcode-block" id="BaseOperator.operator_extra_link_dict"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.operator_extra_link_dict">[docs]</a> <span class="k">def</span> <span class="nf">operator_extra_link_dict</span><span class="p">(</span><span class="bp">self</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 class="sd">&quot;&quot;&quot;Returns dictionary of all extra links for the operator&quot;&quot;&quot;</span>
<span class="n">op_extra_links_from_plugin</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="p">{}</span>
<span class="kn">from</span> <span class="nn">airflow</span> <span class="kn">import</span> <span class="n">plugins_manager</span>
<span class="n">plugins_manager</span><span class="o">.</span><span class="n">initialize_extra_operators_links_plugins</span><span class="p">()</span>
<span class="k">if</span> <span class="n">plugins_manager</span><span class="o">.</span><span class="n">operator_extra_links</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span><span class="s2">&quot;Can&#39;t load operators&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">ope</span> <span class="ow">in</span> <span class="n">plugins_manager</span><span class="o">.</span><span class="n">operator_extra_links</span><span class="p">:</span>
<span class="k">if</span> <span class="n">ope</span><span class="o">.</span><span class="n">operators</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span> <span class="ow">in</span> <span class="n">ope</span><span class="o">.</span><span class="n">operators</span><span class="p">:</span>
<span class="n">op_extra_links_from_plugin</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="n">ope</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="n">ope</span><span class="p">})</span>
<span class="n">operator_extra_links_all</span> <span class="o">=</span> <span class="p">{</span><span class="n">link</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="n">link</span> <span class="k">for</span> <span class="n">link</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">operator_extra_links</span><span class="p">}</span>
<span class="c1"># Extra links defined in Plugins overrides operator links defined in operator</span>
<span class="n">operator_extra_links_all</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">op_extra_links_from_plugin</span><span class="p">)</span>
<span class="k">return</span> <span class="n">operator_extra_links_all</span></div>
<span class="nd">@cached_property</span>
<div class="viewcode-block" id="BaseOperator.global_operator_extra_link_dict"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.global_operator_extra_link_dict">[docs]</a> <span class="k">def</span> <span class="nf">global_operator_extra_link_dict</span><span class="p">(</span><span class="bp">self</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 class="sd">&quot;&quot;&quot;Returns dictionary of all global extra links&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">airflow</span> <span class="kn">import</span> <span class="n">plugins_manager</span>
<span class="n">plugins_manager</span><span class="o">.</span><span class="n">initialize_extra_operators_links_plugins</span><span class="p">()</span>
<span class="k">if</span> <span class="n">plugins_manager</span><span class="o">.</span><span class="n">global_operator_extra_links</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span><span class="s2">&quot;Can&#39;t load operators&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{</span><span class="n">link</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="n">link</span> <span class="k">for</span> <span class="n">link</span> <span class="ow">in</span> <span class="n">plugins_manager</span><span class="o">.</span><span class="n">global_operator_extra_links</span><span class="p">}</span></div>
<span class="nd">@prepare_lineage</span>
<div class="viewcode-block" id="BaseOperator.pre_execute"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.pre_execute">[docs]</a> <span class="k">def</span> <span class="nf">pre_execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="n">Any</span><span class="p">):</span></div>
<span class="sd">&quot;&quot;&quot;This hook is triggered right before self.execute() is called.&quot;&quot;&quot;</span>
<div class="viewcode-block" id="BaseOperator.execute"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.execute">[docs]</a> <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="n">Any</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is the main method to derive when creating an operator.</span>
<span class="sd"> Context is the same dictionary used as when rendering jinja templates.</span>
<span class="sd"> Refer to get_template_context for more context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
<span class="nd">@apply_lineage</span>
<div class="viewcode-block" id="BaseOperator.post_execute"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.post_execute">[docs]</a> <span class="k">def</span> <span class="nf">post_execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">result</span><span class="p">:</span> <span class="n">Any</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span></div>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This hook is triggered right after self.execute() is called.</span>
<span class="sd"> It is passed the execution context and any results returned by the</span>
<span class="sd"> operator.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="BaseOperator.on_kill"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.on_kill">[docs]</a> <span class="k">def</span> <span class="nf">on_kill</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span></div>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Override this method to cleanup subprocesses when a task instance</span>
<span class="sd"> gets killed. Any use of the threading, subprocess or multiprocessing</span>
<span class="sd"> module within an operator needs to be cleaned up or it will leave</span>
<span class="sd"> ghost processes behind.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="BaseOperator.__deepcopy__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__deepcopy__">[docs]</a> <span class="k">def</span> <span class="nf">__deepcopy__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">memo</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hack sorting double chained task lists by task_id to avoid hitting</span>
<span class="sd"> max_depth on deepcopy operations.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">sys</span><span class="o">.</span><span class="n">setrecursionlimit</span><span class="p">(</span><span class="mi">5000</span><span class="p">)</span> <span class="c1"># TODO fix this in a better way</span>
<span class="bp">cls</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
<span class="n">memo</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)]</span> <span class="o">=</span> <span class="n">result</span>
<span class="n">shallow_copy</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">shallow_copy_attrs</span> <span class="o">+</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_base_operator_shallow_copy_attrs</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">shallow_copy</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">memo</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">v</span><span class="p">))</span>
<span class="k">return</span> <span class="n">result</span></div>
<div class="viewcode-block" id="BaseOperator.__getstate__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__getstate__">[docs]</a> <span class="k">def</span> <span class="nf">__getstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">state</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
<span class="k">del</span> <span class="n">state</span><span class="p">[</span><span class="s1">&#39;_log&#39;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">state</span></div>
<div class="viewcode-block" id="BaseOperator.__setstate__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__setstate__">[docs]</a> <span class="k">def</span> <span class="nf">__setstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span> <span class="o">=</span> <span class="n">state</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_log</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;airflow.task.operators&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="BaseOperator.render_template_fields"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.render_template_fields">[docs]</a> <span class="k">def</span> <span class="nf">render_template_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">jinja_env</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">jinja2</span><span class="o">.</span><span class="n">Environment</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 class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Template all attributes listed in template_fields. Note this operation is irreversible.</span>
<span class="sd"> :param context: Dict with values to apply on content</span>
<span class="sd"> :type context: dict</span>
<span class="sd"> :param jinja_env: Jinja environment</span>
<span class="sd"> :type jinja_env: jinja2.Environment</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">jinja_env</span><span class="p">:</span>
<span class="n">jinja_env</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_template_env</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_do_render_template_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_fields</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">jinja_env</span><span class="p">,</span> <span class="nb">set</span><span class="p">())</span></div>
<div class="viewcode-block" id="BaseOperator._do_render_template_fields"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator._do_render_template_fields">[docs]</a> <span class="k">def</span> <span class="nf">_do_render_template_fields</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">parent</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span>
<span class="n">template_fields</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
<span class="n">context</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span>
<span class="n">jinja_env</span><span class="p">:</span> <span class="n">jinja2</span><span class="o">.</span><span class="n">Environment</span><span class="p">,</span>
<span class="n">seen_oids</span><span class="p">:</span> <span class="n">Set</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">for</span> <span class="n">attr_name</span> <span class="ow">in</span> <span class="n">template_fields</span><span class="p">:</span>
<span class="n">content</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">content</span><span class="p">:</span>
<span class="n">rendered_content</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">render_template</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">jinja_env</span><span class="p">,</span> <span class="n">seen_oids</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">,</span> <span class="n">rendered_content</span><span class="p">)</span></div>
<div class="viewcode-block" id="BaseOperator.render_template"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.render_template">[docs]</a> <span class="k">def</span> <span class="nf">render_template</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">content</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span>
<span class="n">context</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span>
<span class="n">jinja_env</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">jinja2</span><span class="o">.</span><span class="n">Environment</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">seen_oids</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Set</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Render a templated string. The content can be a collection holding multiple templated strings and will</span>
<span class="sd"> be templated recursively.</span>
<span class="sd"> :param content: Content to template. Only strings can be templated (may be inside collection).</span>
<span class="sd"> :type content: Any</span>
<span class="sd"> :param context: Dict with values to apply on templated content</span>
<span class="sd"> :type context: dict</span>
<span class="sd"> :param jinja_env: Jinja environment. Can be provided to avoid re-creating Jinja environments during</span>
<span class="sd"> recursion.</span>
<span class="sd"> :type jinja_env: jinja2.Environment</span>
<span class="sd"> :param seen_oids: template fields already rendered (to avoid RecursionError on circular dependencies)</span>
<span class="sd"> :type seen_oids: set</span>
<span class="sd"> :return: Templated content</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">jinja_env</span><span class="p">:</span>
<span class="n">jinja_env</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_template_env</span><span class="p">()</span>
<span class="c1"># Imported here to avoid circular dependency</span>
<span class="kn">from</span> <span class="nn">airflow.models.dagparam</span> <span class="kn">import</span> <span class="n">DagParam</span>
<span class="kn">from</span> <span class="nn">airflow.models.xcom_arg</span> <span class="kn">import</span> <span class="n">XComArg</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">content</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">ext</span><span class="p">)</span> <span class="k">for</span> <span class="n">ext</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_ext</span><span class="p">):</span>
<span class="c1"># Content contains a filepath</span>
<span class="k">return</span> <span class="n">jinja_env</span><span class="o">.</span><span class="n">get_template</span><span class="p">(</span><span class="n">content</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">context</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">jinja_env</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="n">content</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">context</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="p">(</span><span class="n">XComArg</span><span class="p">,</span> <span class="n">DagParam</span><span class="p">)):</span>
<span class="k">return</span> <span class="n">content</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">tuple</span><span class="p">:</span>
<span class="c1"># Special case for named tuples</span>
<span class="k">return</span> <span class="n">content</span><span class="o">.</span><span class="vm">__class__</span><span class="p">(</span>
<span class="o">*</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">render_template</span><span class="p">(</span><span class="n">element</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">jinja_env</span><span class="p">)</span> <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">content</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">render_template</span><span class="p">(</span><span class="n">element</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">jinja_env</span><span class="p">)</span> <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">content</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">render_template</span><span class="p">(</span><span class="n">element</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">jinja_env</span><span class="p">)</span> <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">content</span><span class="p">]</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="k">return</span> <span class="p">{</span><span class="n">key</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">render_template</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">jinja_env</span><span class="p">)</span> <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">content</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">set</span><span class="p">):</span>
<span class="k">return</span> <span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">render_template</span><span class="p">(</span><span class="n">element</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">jinja_env</span><span class="p">)</span> <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">content</span><span class="p">}</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">seen_oids</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">seen_oids</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_render_nested_template_fields</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">jinja_env</span><span class="p">,</span> <span class="n">seen_oids</span><span class="p">)</span>
<span class="k">return</span> <span class="n">content</span></div>
<div class="viewcode-block" id="BaseOperator._render_nested_template_fields"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator._render_nested_template_fields">[docs]</a> <span class="k">def</span> <span class="nf">_render_nested_template_fields</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">jinja_env</span><span class="p">:</span> <span class="n">jinja2</span><span class="o">.</span><span class="n">Environment</span><span class="p">,</span> <span class="n">seen_oids</span><span class="p">:</span> <span class="n">Set</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">id</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">seen_oids</span><span class="p">:</span>
<span class="n">seen_oids</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="nb">id</span><span class="p">(</span><span class="n">content</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">nested_template_fields</span> <span class="o">=</span> <span class="n">content</span><span class="o">.</span><span class="n">template_fields</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="c1"># content has no inner template fields</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_do_render_template_fields</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">nested_template_fields</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">jinja_env</span><span class="p">,</span> <span class="n">seen_oids</span><span class="p">)</span></div>
<div class="viewcode-block" id="BaseOperator.get_template_env"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.get_template_env">[docs]</a> <span class="k">def</span> <span class="nf">get_template_env</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">jinja2</span><span class="o">.</span><span class="n">Environment</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Fetch a Jinja template environment from the DAG or instantiate empty environment if no DAG.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">get_template_env</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_dag</span><span class="p">()</span>
<span class="k">else</span> <span class="n">airflow</span><span class="o">.</span><span class="n">templates</span><span class="o">.</span><span class="n">SandboxedEnvironment</span><span class="p">(</span><span class="n">cache_size</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span></div>
<span class="p">)</span>
<div class="viewcode-block" id="BaseOperator.prepare_template"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.prepare_template">[docs]</a> <span class="k">def</span> <span class="nf">prepare_template</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span></div>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hook that is triggered after the templated fields get replaced</span>
<span class="sd"> by their content. If you need your operator to alter the</span>
<span class="sd"> content of the file before the template is rendered,</span>
<span class="sd"> it should override this method to do so.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="BaseOperator.resolve_template_files"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.resolve_template_files">[docs]</a> <span class="k">def</span> <span class="nf">resolve_template_files</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Getting the content of files for template_field / template_ext&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_ext</span><span class="p">:</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_fields</span><span class="p">:</span>
<span class="n">content</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">content</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">any</span><span class="p">(</span><span class="n">content</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">ext</span><span class="p">)</span> <span class="k">for</span> <span class="n">ext</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_ext</span><span class="p">):</span>
<span class="n">env</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_template_env</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">env</span><span class="o">.</span><span class="n">loader</span><span class="o">.</span><span class="n">get_source</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">content</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
<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 class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="n">env</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">get_template_env</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">content</span><span class="p">)):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">any</span><span class="p">(</span>
<span class="n">content</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">ext</span><span class="p">)</span> <span class="k">for</span> <span class="n">ext</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_ext</span>
<span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">content</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">env</span><span class="o">.</span><span class="n">loader</span><span class="o">.</span><span class="n">get_source</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">content</span><span class="p">[</span><span class="n">i</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
<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 class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prepare_template</span><span class="p">()</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.upstream_list"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.upstream_list">[docs]</a> <span class="k">def</span> <span class="nf">upstream_list</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="s2">&quot;BaseOperator&quot;</span><span class="p">]:</span>
<span class="sd">&quot;&quot;&quot;@property: list of tasks directly upstream&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">get_task</span><span class="p">(</span><span class="n">tid</span><span class="p">)</span> <span class="k">for</span> <span class="n">tid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_upstream_task_ids</span><span class="p">]</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.upstream_task_ids"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.upstream_task_ids">[docs]</a> <span class="k">def</span> <span class="nf">upstream_task_ids</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<span class="sd">&quot;&quot;&quot;@property: set of ids of tasks directly upstream&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_upstream_task_ids</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.downstream_list"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.downstream_list">[docs]</a> <span class="k">def</span> <span class="nf">downstream_list</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="s2">&quot;BaseOperator&quot;</span><span class="p">]:</span>
<span class="sd">&quot;&quot;&quot;@property: list of tasks directly downstream&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">get_task</span><span class="p">(</span><span class="n">tid</span><span class="p">)</span> <span class="k">for</span> <span class="n">tid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_downstream_task_ids</span><span class="p">]</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.downstream_task_ids"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.downstream_task_ids">[docs]</a> <span class="k">def</span> <span class="nf">downstream_task_ids</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<span class="sd">&quot;&quot;&quot;@property: set of ids of tasks directly downstream&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_downstream_task_ids</span></div>
<span class="nd">@provide_session</span>
<div class="viewcode-block" id="BaseOperator.clear"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.clear">[docs]</a> <span class="k">def</span> <span class="nf">clear</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">start_date</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">datetime</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">end_date</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">datetime</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">upstream</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="n">downstream</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="n">session</span><span class="p">:</span> <span class="n">Session</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Clears the state of task instances associated with the task, following</span>
<span class="sd"> the parameters specified.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">qry</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">TaskInstance</span><span class="p">)</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">TaskInstance</span><span class="o">.</span><span class="n">dag_id</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">dag_id</span><span class="p">)</span>
<span class="k">if</span> <span class="n">start_date</span><span class="p">:</span>
<span class="n">qry</span> <span class="o">=</span> <span class="n">qry</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">TaskInstance</span><span class="o">.</span><span class="n">execution_date</span> <span class="o">&gt;=</span> <span class="n">start_date</span><span class="p">)</span>
<span class="k">if</span> <span class="n">end_date</span><span class="p">:</span>
<span class="n">qry</span> <span class="o">=</span> <span class="n">qry</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">TaskInstance</span><span class="o">.</span><span class="n">execution_date</span> <span class="o">&lt;=</span> <span class="n">end_date</span><span class="p">)</span>
<span class="n">tasks</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">task_id</span><span class="p">]</span>
<span class="k">if</span> <span class="n">upstream</span><span class="p">:</span>
<span class="n">tasks</span> <span class="o">+=</span> <span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">task_id</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_flat_relatives</span><span class="p">(</span><span class="n">upstream</span><span class="o">=</span><span class="kc">True</span><span class="p">)]</span>
<span class="k">if</span> <span class="n">downstream</span><span class="p">:</span>
<span class="n">tasks</span> <span class="o">+=</span> <span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">task_id</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_flat_relatives</span><span class="p">(</span><span class="n">upstream</span><span class="o">=</span><span class="kc">False</span><span class="p">)]</span>
<span class="n">qry</span> <span class="o">=</span> <span class="n">qry</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">TaskInstance</span><span class="o">.</span><span class="n">task_id</span><span class="o">.</span><span class="n">in_</span><span class="p">(</span><span class="n">tasks</span><span class="p">))</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">qry</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="n">count</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
<span class="n">clear_task_instances</span><span class="p">(</span><span class="n">results</span><span class="p">,</span> <span class="n">session</span><span class="p">,</span> <span class="n">dag</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="p">)</span>
<span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
<span class="k">return</span> <span class="n">count</span></div>
<span class="nd">@provide_session</span>
<div class="viewcode-block" id="BaseOperator.get_task_instances"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.get_task_instances">[docs]</a> <span class="k">def</span> <span class="nf">get_task_instances</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">start_date</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">datetime</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">end_date</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">datetime</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">session</span><span class="p">:</span> <span class="n">Session</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">TaskInstance</span><span class="p">]:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get a set of task instance related to this task for a specific date</span>
<span class="sd"> range.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">end_date</span> <span class="o">=</span> <span class="n">end_date</span> <span class="ow">or</span> <span class="n">timezone</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span>
<span class="k">return</span> <span class="p">(</span>
<span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">TaskInstance</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">TaskInstance</span><span class="o">.</span><span class="n">dag_id</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">dag_id</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">TaskInstance</span><span class="o">.</span><span class="n">task_id</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">task_id</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">TaskInstance</span><span class="o">.</span><span class="n">execution_date</span> <span class="o">&gt;=</span> <span class="n">start_date</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">TaskInstance</span><span class="o">.</span><span class="n">execution_date</span> <span class="o">&lt;=</span> <span class="n">end_date</span><span class="p">)</span>
<span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="n">TaskInstance</span><span class="o">.</span><span class="n">execution_date</span><span class="p">)</span></div>
<span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="p">)</span>
<div class="viewcode-block" id="BaseOperator.get_flat_relative_ids"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.get_flat_relative_ids">[docs]</a> <span class="k">def</span> <span class="nf">get_flat_relative_ids</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">upstream</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="n">found_descendants</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Set</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="p">)</span> <span class="o">-&gt;</span> <span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<span class="sd">&quot;&quot;&quot;Get a flat set of relatives&#39; ids, either upstream or downstream.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dag</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">found_descendants</span><span class="p">:</span>
<span class="n">found_descendants</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="n">relative_ids</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_direct_relative_ids</span><span class="p">(</span><span class="n">upstream</span><span class="p">)</span>
<span class="k">for</span> <span class="n">relative_id</span> <span class="ow">in</span> <span class="n">relative_ids</span><span class="p">:</span>
<span class="k">if</span> <span class="n">relative_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">found_descendants</span><span class="p">:</span>
<span class="n">found_descendants</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">relative_id</span><span class="p">)</span>
<span class="n">relative_task</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dag</span><span class="o">.</span><span class="n">task_dict</span><span class="p">[</span><span class="n">relative_id</span><span class="p">]</span>
<span class="n">relative_task</span><span class="o">.</span><span class="n">get_flat_relative_ids</span><span class="p">(</span><span class="n">upstream</span><span class="p">,</span> <span class="n">found_descendants</span><span class="p">)</span>
<span class="k">return</span> <span class="n">found_descendants</span></div>
<div class="viewcode-block" id="BaseOperator.get_flat_relatives"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.get_flat_relatives">[docs]</a> <span class="k">def</span> <span class="nf">get_flat_relatives</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">upstream</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="sd">&quot;&quot;&quot;Get a flat list of relatives, either upstream or downstream.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dag</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">set</span><span class="p">()</span>
<span class="kn">from</span> <span class="nn">airflow.models.dag</span> <span class="kn">import</span> <span class="n">DAG</span>
<span class="n">dag</span><span class="p">:</span> <span class="n">DAG</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dag</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">task_id</span><span class="p">:</span> <span class="n">dag</span><span class="o">.</span><span class="n">task_dict</span><span class="p">[</span><span class="n">task_id</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_flat_relative_ids</span><span class="p">(</span><span class="n">upstream</span><span class="p">)))</span></div>
<div class="viewcode-block" id="BaseOperator.run"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.run">[docs]</a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">start_date</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">datetime</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">end_date</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">datetime</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">ignore_first_depends_on_past</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<span class="n">ignore_ti_state</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="n">mark_success</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="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Run a set of task instances for a date range.&quot;&quot;&quot;</span>
<span class="n">start_date</span> <span class="o">=</span> <span class="n">start_date</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">start_date</span>
<span class="n">end_date</span> <span class="o">=</span> <span class="n">end_date</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">end_date</span> <span class="ow">or</span> <span class="n">timezone</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span>
<span class="k">for</span> <span class="n">execution_date</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">date_range</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="o">=</span><span class="n">end_date</span><span class="p">):</span>
<span class="n">TaskInstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">execution_date</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">(</span>
<span class="n">mark_success</span><span class="o">=</span><span class="n">mark_success</span><span class="p">,</span>
<span class="n">ignore_depends_on_past</span><span class="o">=</span><span class="p">(</span><span class="n">execution_date</span> <span class="o">==</span> <span class="n">start_date</span> <span class="ow">and</span> <span class="n">ignore_first_depends_on_past</span><span class="p">),</span>
<span class="n">ignore_ti_state</span><span class="o">=</span><span class="n">ignore_ti_state</span><span class="p">,</span></div>
<span class="p">)</span>
<div class="viewcode-block" id="BaseOperator.dry_run"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.dry_run">[docs]</a> <span class="k">def</span> <span class="nf">dry_run</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Performs dry run for the operator - just render template fields.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Dry run&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_fields</span><span class="p">:</span>
<span class="n">content</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span>
<span class="k">if</span> <span class="n">content</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Rendering template for </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="n">content</span><span class="p">)</span></div>
<div class="viewcode-block" id="BaseOperator.get_direct_relative_ids"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.get_direct_relative_ids">[docs]</a> <span class="k">def</span> <span class="nf">get_direct_relative_ids</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">upstream</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="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get set of the direct relative ids to the current task, upstream or</span>
<span class="sd"> downstream.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">upstream</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_upstream_task_ids</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_downstream_task_ids</span></div>
<div class="viewcode-block" id="BaseOperator.get_direct_relatives"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.get_direct_relatives">[docs]</a> <span class="k">def</span> <span class="nf">get_direct_relatives</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">upstream</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="n">List</span><span class="p">[</span><span class="s2">&quot;BaseOperator&quot;</span><span class="p">]:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get list of the direct relatives to the current task, upstream or</span>
<span class="sd"> downstream.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">upstream</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">upstream_list</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">downstream_list</span></div>
<div class="viewcode-block" id="BaseOperator.__repr__"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.__repr__">[docs]</a> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&lt;Task(</span><span class="si">{self.task_type}</span><span class="s2">): </span><span class="si">{self.task_id}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.task_type"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.task_type">[docs]</a> <span class="k">def</span> <span class="nf">task_type</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 class="sd">&quot;&quot;&quot;@property: type of the task&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span></div>
<div class="viewcode-block" id="BaseOperator.add_only_new"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.add_only_new">[docs]</a> <span class="k">def</span> <span class="nf">add_only_new</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item_set</span><span class="p">:</span> <span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">item</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">dag_id</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 class="sd">&quot;&quot;&quot;Adds only new items to item set&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">item_set</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s1">&#39;Dependency </span><span class="si">%s</span><span class="s1">, </span><span class="si">%s</span><span class="s1"> already registered for DAG: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">dag_id</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">item_set</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">item</span><span class="p">)</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.roots"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.roots">[docs]</a> <span class="k">def</span> <span class="nf">roots</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="s2">&quot;BaseOperator&quot;</span><span class="p">]:</span>
<span class="sd">&quot;&quot;&quot;Required by TaskMixin&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="p">]</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.leaves"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.leaves">[docs]</a> <span class="k">def</span> <span class="nf">leaves</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="s2">&quot;BaseOperator&quot;</span><span class="p">]:</span>
<span class="sd">&quot;&quot;&quot;Required by TaskMixin&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="p">]</span></div>
<div class="viewcode-block" id="BaseOperator._set_relatives"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator._set_relatives">[docs]</a> <span class="k">def</span> <span class="nf">_set_relatives</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">task_or_task_list</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">TaskMixin</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">TaskMixin</span><span class="p">]],</span>
<span class="n">upstream</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="n">edge_modifier</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">EdgeModifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Sets relatives for the task or task list.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">task_or_task_list</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">):</span>
<span class="n">task_or_task_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">task_or_task_list</span><span class="p">]</span>
<span class="n">task_list</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="s2">&quot;BaseOperator&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">task_object</span> <span class="ow">in</span> <span class="n">task_or_task_list</span><span class="p">:</span>
<span class="n">task_object</span><span class="o">.</span><span class="n">update_relative</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="ow">not</span> <span class="n">upstream</span><span class="p">)</span>
<span class="n">relatives</span> <span class="o">=</span> <span class="n">task_object</span><span class="o">.</span><span class="n">leaves</span> <span class="k">if</span> <span class="n">upstream</span> <span class="k">else</span> <span class="n">task_object</span><span class="o">.</span><span class="n">roots</span>
<span class="n">task_list</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">relatives</span><span class="p">)</span>
<span class="k">for</span> <span class="n">task</span> <span class="ow">in</span> <span class="n">task_list</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">task</span><span class="p">,</span> <span class="n">BaseOperator</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span>
<span class="s2">&quot;Relationships can only be set between &quot;</span>
<span class="s2">&quot;Operators; received </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">task</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># relationships can only be set if the tasks share a single DAG. Tasks</span>
<span class="c1"># without a DAG are assigned to that DAG.</span>
<span class="n">dags</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">task</span><span class="o">.</span><span class="n">_dag</span><span class="o">.</span><span class="n">dag_id</span><span class="p">:</span> <span class="n">task</span><span class="o">.</span><span class="n">_dag</span> <span class="k">for</span> <span class="n">task</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">roots</span> <span class="o">+</span> <span class="n">task_list</span> <span class="k">if</span> <span class="n">task</span><span class="o">.</span><span class="n">has_dag</span><span class="p">()</span> <span class="c1"># type: ignore</span>
<span class="p">}</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">dags</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span>
<span class="sa">f</span><span class="s1">&#39;Tried to set relationships between tasks in more than one DAG: </span><span class="si">{</span><span class="n">dags</span><span class="o">.</span><span class="n">values</span><span class="p">()</span><span class="si">}</span><span class="s1">&#39;</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">dags</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">dag</span> <span class="o">=</span> <span class="n">dags</span><span class="o">.</span><span class="n">popitem</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span>
<span class="s2">&quot;Tried to create relationships between tasks that don&#39;t have &quot;</span>
<span class="s2">&quot;DAGs yet. Set the DAG for at least one &quot;</span>
<span class="s2">&quot;task and try again: </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="bp">self</span><span class="p">]</span> <span class="o">+</span> <span class="n">task_list</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">dag</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_dag</span><span class="p">():</span>
<span class="c1"># If this task does not yet have a dag, add it to the same dag as the other task and</span>
<span class="c1"># put it in the dag&#39;s root TaskGroup.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dag</span> <span class="o">=</span> <span class="n">dag</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">task_group</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">for</span> <span class="n">task</span> <span class="ow">in</span> <span class="n">task_list</span><span class="p">:</span>
<span class="k">if</span> <span class="n">dag</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">task</span><span class="o">.</span><span class="n">has_dag</span><span class="p">():</span>
<span class="c1"># If the other task does not yet have a dag, add it to the same dag as this task and</span>
<span class="c1"># put it in the dag&#39;s root TaskGroup.</span>
<span class="n">task</span><span class="o">.</span><span class="n">dag</span> <span class="o">=</span> <span class="n">dag</span>
<span class="n">task</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">task_group</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">task</span><span class="p">)</span>
<span class="k">if</span> <span class="n">upstream</span><span class="p">:</span>
<span class="n">task</span><span class="o">.</span><span class="n">add_only_new</span><span class="p">(</span><span class="n">task</span><span class="o">.</span><span class="n">get_direct_relative_ids</span><span class="p">(</span><span class="n">upstream</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">task_id</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">dag_id</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_only_new</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_upstream_task_ids</span><span class="p">,</span> <span class="n">task</span><span class="o">.</span><span class="n">task_id</span><span class="p">,</span> <span class="n">task</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">dag_id</span><span class="p">)</span>
<span class="k">if</span> <span class="n">edge_modifier</span><span class="p">:</span>
<span class="n">edge_modifier</span><span class="o">.</span><span class="n">add_edge_info</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="p">,</span> <span class="n">task</span><span class="o">.</span><span class="n">task_id</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">task_id</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_only_new</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_downstream_task_ids</span><span class="p">,</span> <span class="n">task</span><span class="o">.</span><span class="n">task_id</span><span class="p">,</span> <span class="n">task</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">dag_id</span><span class="p">)</span>
<span class="n">task</span><span class="o">.</span><span class="n">add_only_new</span><span class="p">(</span><span class="n">task</span><span class="o">.</span><span class="n">get_direct_relative_ids</span><span class="p">(</span><span class="n">upstream</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">task_id</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="o">.</span><span class="n">dag_id</span><span class="p">)</span>
<span class="k">if</span> <span class="n">edge_modifier</span><span class="p">:</span>
<span class="n">edge_modifier</span><span class="o">.</span><span class="n">add_edge_info</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dag</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">task_id</span><span class="p">,</span> <span class="n">task</span><span class="o">.</span><span class="n">task_id</span><span class="p">)</span></div>
<div class="viewcode-block" id="BaseOperator.set_downstream"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.set_downstream">[docs]</a> <span class="k">def</span> <span class="nf">set_downstream</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">task_or_task_list</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">TaskMixin</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">TaskMixin</span><span class="p">]],</span>
<span class="n">edge_modifier</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">EdgeModifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set a task or a task list to be directly downstream from the current</span>
<span class="sd"> task. Required by TaskMixin.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_set_relatives</span><span class="p">(</span><span class="n">task_or_task_list</span><span class="p">,</span> <span class="n">upstream</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">edge_modifier</span><span class="o">=</span><span class="n">edge_modifier</span><span class="p">)</span></div>
<div class="viewcode-block" id="BaseOperator.set_upstream"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.set_upstream">[docs]</a> <span class="k">def</span> <span class="nf">set_upstream</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">task_or_task_list</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">TaskMixin</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">TaskMixin</span><span class="p">]],</span>
<span class="n">edge_modifier</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">EdgeModifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set a task or a task list to be directly upstream from the current</span>
<span class="sd"> task. Required by TaskMixin.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_set_relatives</span><span class="p">(</span><span class="n">task_or_task_list</span><span class="p">,</span> <span class="n">upstream</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">edge_modifier</span><span class="o">=</span><span class="n">edge_modifier</span><span class="p">)</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.output"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.output">[docs]</a> <span class="k">def</span> <span class="nf">output</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns reference to XCom pushed by current operator&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">airflow.models.xcom_arg</span> <span class="kn">import</span> <span class="n">XComArg</span>
<span class="k">return</span> <span class="n">XComArg</span><span class="p">(</span><span class="n">operator</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span></div>
<span class="nd">@staticmethod</span>
<div class="viewcode-block" id="BaseOperator.xcom_push"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.xcom_push">[docs]</a> <span class="k">def</span> <span class="nf">xcom_push</span><span class="p">(</span>
<span class="n">context</span><span class="p">:</span> <span class="n">Any</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="n">execution_date</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">datetime</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Make an XCom available for tasks to pull.</span>
<span class="sd"> :param context: Execution Context Dictionary</span>
<span class="sd"> :type: Any</span>
<span class="sd"> :param key: A key for the XCom</span>
<span class="sd"> :type key: str</span>
<span class="sd"> :param value: A value for the XCom. The value is pickled and stored</span>
<span class="sd"> in the database.</span>
<span class="sd"> :type value: any pickleable object</span>
<span class="sd"> :param execution_date: if provided, the XCom will not be visible until</span>
<span class="sd"> this date. This can be used, for example, to send a message to a</span>
<span class="sd"> task on a future date without it being immediately visible.</span>
<span class="sd"> :type execution_date: datetime</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">context</span><span class="p">[</span><span class="s1">&#39;ti&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">xcom_push</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</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">execution_date</span><span class="o">=</span><span class="n">execution_date</span><span class="p">)</span></div>
<span class="nd">@staticmethod</span>
<div class="viewcode-block" id="BaseOperator.xcom_pull"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.xcom_pull">[docs]</a> <span class="k">def</span> <span class="nf">xcom_pull</span><span class="p">(</span>
<span class="n">context</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span>
<span class="n">task_ids</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</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="n">dag_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="n">key</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">XCOM_RETURN_KEY</span><span class="p">,</span>
<span class="n">include_prior_dates</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Pull XComs that optionally meet certain criteria.</span>
<span class="sd"> The default value for `key` limits the search to XComs</span>
<span class="sd"> that were returned by other tasks (as opposed to those that were pushed</span>
<span class="sd"> manually). To remove this filter, pass key=None (or any desired value).</span>
<span class="sd"> If a single task_id string is provided, the result is the value of the</span>
<span class="sd"> most recent matching XCom from that task_id. If multiple task_ids are</span>
<span class="sd"> provided, a tuple of matching values is returned. None is returned</span>
<span class="sd"> whenever no matches are found.</span>
<span class="sd"> :param context: Execution Context Dictionary</span>
<span class="sd"> :type: Any</span>
<span class="sd"> :param key: A key for the XCom. If provided, only XComs with matching</span>
<span class="sd"> keys will be returned. The default key is &#39;return_value&#39;, also</span>
<span class="sd"> available as a constant XCOM_RETURN_KEY. This key is automatically</span>
<span class="sd"> given to XComs returned by tasks (as opposed to being pushed</span>
<span class="sd"> manually). To remove the filter, pass key=None.</span>
<span class="sd"> :type key: str</span>
<span class="sd"> :param task_ids: Only XComs from tasks with matching ids will be</span>
<span class="sd"> pulled. Can pass None to remove the filter.</span>
<span class="sd"> :type task_ids: str or iterable of strings (representing task_ids)</span>
<span class="sd"> :param dag_id: If provided, only pulls XComs from this DAG.</span>
<span class="sd"> If None (default), the DAG of the calling task is used.</span>
<span class="sd"> :type dag_id: str</span>
<span class="sd"> :param include_prior_dates: If False, only XComs from the current</span>
<span class="sd"> execution_date are returned. If True, XComs from previous dates</span>
<span class="sd"> are returned as well.</span>
<span class="sd"> :type include_prior_dates: bool</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">context</span><span class="p">[</span><span class="s1">&#39;ti&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">xcom_pull</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">task_ids</span><span class="o">=</span><span class="n">task_ids</span><span class="p">,</span> <span class="n">dag_id</span><span class="o">=</span><span class="n">dag_id</span><span class="p">,</span> <span class="n">include_prior_dates</span><span class="o">=</span><span class="n">include_prior_dates</span></div>
<span class="p">)</span>
<span class="nd">@cached_property</span>
<div class="viewcode-block" id="BaseOperator.extra_links"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.extra_links">[docs]</a> <span class="k">def</span> <span class="nf">extra_links</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<span class="sd">&quot;&quot;&quot;@property: extra links for the task&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span>
<span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">operator_extra_link_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">global_operator_extra_link_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span></div>
<span class="p">)</span>
<div class="viewcode-block" id="BaseOperator.get_extra_links"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.get_extra_links">[docs]</a> <span class="k">def</span> <span class="nf">get_extra_links</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dttm</span><span class="p">:</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">link_name</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="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="sd">&quot;&quot;&quot;</span>
<span class="sd"> For an operator, gets the URL that the external links specified in</span>
<span class="sd"> `extra_links` should point to.</span>
<span class="sd"> :raise ValueError: The error message of a ValueError will be passed on through to</span>
<span class="sd"> the fronted to show up as a tooltip on the disabled link</span>
<span class="sd"> :param dttm: The datetime parsed execution date for the URL being searched for</span>
<span class="sd"> :param link_name: The name of the link we&#39;re looking for the URL for. Should be</span>
<span class="sd"> one of the options specified in `extra_links`</span>
<span class="sd"> :return: A URL</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">link_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">operator_extra_link_dict</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">operator_extra_link_dict</span><span class="p">[</span><span class="n">link_name</span><span class="p">]</span><span class="o">.</span><span class="n">get_link</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dttm</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">link_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">global_operator_extra_link_dict</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">global_operator_extra_link_dict</span><span class="p">[</span><span class="n">link_name</span><span class="p">]</span><span class="o">.</span><span class="n">get_link</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dttm</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span></div>
<span class="nd">@classmethod</span>
<div class="viewcode-block" id="BaseOperator.get_serialized_fields"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.get_serialized_fields">[docs]</a> <span class="k">def</span> <span class="nf">get_serialized_fields</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Stringified DAGs and operators contain exactly these fields.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">__serialized_fields</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">airflow.models.dag</span> <span class="kn">import</span> <span class="n">DagContext</span>
<span class="c1"># make sure the following dummy task is not added to current active</span>
<span class="c1"># dag in context, otherwise, it will result in</span>
<span class="c1"># `RuntimeError: dictionary changed size during iteration`</span>
<span class="c1"># Exception in SerializedDAG.serialize_dag() call.</span>
<span class="n">DagContext</span><span class="o">.</span><span class="n">push_context_managed_dag</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">__serialized_fields</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">(</span>
<span class="nb">vars</span><span class="p">(</span><span class="n">BaseOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;test&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
<span class="o">-</span> <span class="p">{</span>
<span class="s1">&#39;inlets&#39;</span><span class="p">,</span>
<span class="s1">&#39;outlets&#39;</span><span class="p">,</span>
<span class="s1">&#39;_upstream_task_ids&#39;</span><span class="p">,</span>
<span class="s1">&#39;default_args&#39;</span><span class="p">,</span>
<span class="s1">&#39;dag&#39;</span><span class="p">,</span>
<span class="s1">&#39;_dag&#39;</span><span class="p">,</span>
<span class="s1">&#39;_BaseOperator__instantiated&#39;</span><span class="p">,</span>
<span class="p">}</span>
<span class="o">|</span> <span class="p">{</span>
<span class="s1">&#39;_task_type&#39;</span><span class="p">,</span>
<span class="s1">&#39;subdag&#39;</span><span class="p">,</span>
<span class="s1">&#39;ui_color&#39;</span><span class="p">,</span>
<span class="s1">&#39;ui_fgcolor&#39;</span><span class="p">,</span>
<span class="s1">&#39;template_fields&#39;</span><span class="p">,</span>
<span class="s1">&#39;template_fields_renderers&#39;</span><span class="p">,</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="n">DagContext</span><span class="o">.</span><span class="n">pop_context_managed_dag</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">__serialized_fields</span></div>
<div class="viewcode-block" id="BaseOperator.is_smart_sensor_compatible"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.is_smart_sensor_compatible">[docs]</a> <span class="k">def</span> <span class="nf">is_smart_sensor_compatible</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return if this operator can use smart service. Default False.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">False</span></div>
<span class="nd">@property</span>
<div class="viewcode-block" id="BaseOperator.inherits_from_dummy_operator"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator.inherits_from_dummy_operator">[docs]</a> <span class="k">def</span> <span class="nf">inherits_from_dummy_operator</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Used to determine if an Operator is inherited from DummyOperator&quot;&quot;&quot;</span>
<span class="c1"># This looks like `isinstance(self, DummyOperator) would work, but this also</span>
<span class="c1"># needs to cope when `self` is a Serialized instance of a DummyOperator or one</span>
<span class="c1"># of its sub-classes (which don&#39;t inherit from anything but BaseOperator).</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_is_dummy&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="chain"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.chain">[docs]</a><span class="k">def</span> <span class="nf">chain</span><span class="p">(</span><span class="o">*</span><span class="n">tasks</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">BaseOperator</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">BaseOperator</span><span class="p">]]):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Given a number of tasks, builds a dependency chain.</span>
<span class="sd"> Support mix airflow.models.BaseOperator and List[airflow.models.BaseOperator].</span>
<span class="sd"> If you want to chain between two List[airflow.models.BaseOperator], have to</span>
<span class="sd"> make sure they have same length.</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> chain(t1, [t2, t3], [t4, t5], t6)</span>
<span class="sd"> is equivalent to::</span>
<span class="sd"> / -&gt; t2 -&gt; t4 \</span>
<span class="sd"> t1 -&gt; t6</span>
<span class="sd"> \ -&gt; t3 -&gt; t5 /</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> t1.set_downstream(t2)</span>
<span class="sd"> t1.set_downstream(t3)</span>
<span class="sd"> t2.set_downstream(t4)</span>
<span class="sd"> t3.set_downstream(t5)</span>
<span class="sd"> t4.set_downstream(t6)</span>
<span class="sd"> t5.set_downstream(t6)</span>
<span class="sd"> :param tasks: List of tasks or List[airflow.models.BaseOperator] to set dependencies</span>
<span class="sd"> :type tasks: List[airflow.models.BaseOperator] or airflow.models.BaseOperator</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">up_task</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">tasks</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]):</span>
<span class="n">down_task</span> <span class="o">=</span> <span class="n">tasks</span><span class="p">[</span><span class="n">index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">up_task</span><span class="p">,</span> <span class="n">BaseOperator</span><span class="p">):</span>
<span class="n">up_task</span><span class="o">.</span><span class="n">set_downstream</span><span class="p">(</span><span class="n">down_task</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">down_task</span><span class="p">,</span> <span class="n">BaseOperator</span><span class="p">):</span>
<span class="n">down_task</span><span class="o">.</span><span class="n">set_upstream</span><span class="p">(</span><span class="n">up_task</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">up_task</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">down_task</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
<span class="s1">&#39;Chain not supported between instances of </span><span class="si">{up_type}</span><span class="s1"> and </span><span class="si">{down_type}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">up_type</span><span class="o">=</span><span class="nb">type</span><span class="p">(</span><span class="n">up_task</span><span class="p">),</span> <span class="n">down_type</span><span class="o">=</span><span class="nb">type</span><span class="p">(</span><span class="n">down_task</span><span class="p">)</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">up_task_list</span> <span class="o">=</span> <span class="n">up_task</span>
<span class="n">down_task_list</span> <span class="o">=</span> <span class="n">down_task</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">up_task_list</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">down_task_list</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">AirflowException</span><span class="p">(</span>
<span class="sa">f</span><span class="s1">&#39;Chain not supported different length Iterable &#39;</span>
<span class="sa">f</span><span class="s1">&#39;but get </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">up_task_list</span><span class="p">)</span><span class="si">}</span><span class="s1"> and </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">down_task_list</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">up_t</span><span class="p">,</span> <span class="n">down_t</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">up_task_list</span><span class="p">,</span> <span class="n">down_task_list</span><span class="p">):</span>
<span class="n">up_t</span><span class="o">.</span><span class="n">set_downstream</span><span class="p">(</span><span class="n">down_t</span><span class="p">)</span></div>
<div class="viewcode-block" id="cross_downstream"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.cross_downstream">[docs]</a><span class="k">def</span> <span class="nf">cross_downstream</span><span class="p">(</span>
<span class="n">from_tasks</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">BaseOperator</span><span class="p">],</span> <span class="n">to_tasks</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">BaseOperator</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">BaseOperator</span><span class="p">]]</span>
<span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set downstream dependencies for all tasks in from_tasks to all tasks in to_tasks.</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> cross_downstream(from_tasks=[t1, t2, t3], to_tasks=[t4, t5, t6])</span>
<span class="sd"> is equivalent to::</span>
<span class="sd"> t1 ---&gt; t4</span>
<span class="sd"> \ /</span>
<span class="sd"> t2 -X -&gt; t5</span>
<span class="sd"> / \</span>
<span class="sd"> t3 ---&gt; t6</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> t1.set_downstream(t4)</span>
<span class="sd"> t1.set_downstream(t5)</span>
<span class="sd"> t1.set_downstream(t6)</span>
<span class="sd"> t2.set_downstream(t4)</span>
<span class="sd"> t2.set_downstream(t5)</span>
<span class="sd"> t2.set_downstream(t6)</span>
<span class="sd"> t3.set_downstream(t4)</span>
<span class="sd"> t3.set_downstream(t5)</span>
<span class="sd"> t3.set_downstream(t6)</span>
<span class="sd"> :param from_tasks: List of tasks to start from.</span>
<span class="sd"> :type from_tasks: List[airflow.models.BaseOperator]</span>
<span class="sd"> :param to_tasks: List of tasks to set as downstream dependencies.</span>
<span class="sd"> :type to_tasks: List[airflow.models.BaseOperator]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">task</span> <span class="ow">in</span> <span class="n">from_tasks</span><span class="p">:</span>
<span class="n">task</span><span class="o">.</span><span class="n">set_downstream</span><span class="p">(</span><span class="n">to_tasks</span><span class="p">)</span></div>
<div class="viewcode-block" id="BaseOperatorLink"><a class="viewcode-back" href="../../../_api/airflow/models/index.html#airflow.models.baseoperator.BaseOperatorLink">[docs]</a><span class="nd">@attr</span><span class="o">.</span><span class="n">s</span><span class="p">(</span><span class="n">auto_attribs</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">BaseOperatorLink</span><span class="p">(</span><span class="n">metaclass</span><span class="o">=</span><span class="n">ABCMeta</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Abstract base class that defines how we get an operator link.&quot;&quot;&quot;</span>
<div class="viewcode-block" id="BaseOperatorLink.operators"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperatorLink.operators">[docs]</a> <span class="n">operators</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="n">Type</span><span class="p">[</span><span class="n">BaseOperator</span><span class="p">]]]</span> <span class="o">=</span> <span class="p">[]</span></div>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This property will be used by Airflow Plugins to find the Operators to which you want</span>
<span class="sd"> to assign this Operator Link</span>
<span class="sd"> :return: List of Operator classes used by task for which you want to create extra link</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@property</span>
<span class="nd">@abstractmethod</span>
<div class="viewcode-block" id="BaseOperatorLink.name"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperatorLink.name">[docs]</a> <span class="k">def</span> <span class="nf">name</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></div>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Name of the link. This will be the button name on the task UI.</span>
<span class="sd"> :return: link name</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@abstractmethod</span>
<div class="viewcode-block" id="BaseOperatorLink.get_link"><a class="viewcode-back" href="../../../_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperatorLink.get_link">[docs]</a> <span class="k">def</span> <span class="nf">get_link</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">operator</span><span class="p">:</span> <span class="n">BaseOperator</span><span class="p">,</span> <span class="n">dttm</span><span class="p">:</span> <span class="n">datetime</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span></div></div>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Link to external system.</span>
<span class="sd"> :param operator: airflow operator</span>
<span class="sd"> :param dttm: datetime</span>
<span class="sd"> :return: link to external system</span>
<span class="sd"> &quot;&quot;&quot;</span>
</pre></div>
<div class="pager" role="navigation" aria-label="related navigation"><button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" disabled>Previous</button><button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" disabled>Next</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="rating-container">
<p class="bodytext__medium--greyish-brown font-weight-500">Was this entry helpful?</p>
<div class="rating">
<div id="rate-star-5" class="rate-star">
<svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02">
<g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)">
<path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path>
</g>
</svg>
</div>
<div id="rate-star-4" class="rate-star">
<svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02">
<g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)">
<path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path>
</g>
</svg>
</div>
<div id="rate-star-3" class="rate-star">
<svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02">
<g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)">
<path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path>
</g>
</svg>
</div>
<div id="rate-star-2" class="rate-star">
<svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02">
<g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)">
<path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path>
</g>
</svg>
</div>
<div id="rate-star-1" class="rate-star">
<svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02">
<g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)">
<path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path>
</g>
</svg>
</div>
</div>
</div>
</main>
<nav class="wy-nav-side-toc">
<div class="wy-menu-vertical">
</div>
</nav>
</div>
</div>
<footer>
<div class="footer-section footer-section__media-section">
<div class="d-flex align-items-center">
<a class="footer-section__media-section--link" target="_blank" href="https://github.com/apache/airflow">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2.365a8.284 8.284 0 0 1 .23 6.105 8.9 8.9 0 0 1 2.371 6.191c0 8.862-5.393 10.812-10.533 11.384a5.506 5.506 0 0 1 1.566 4.272c0 3.084-.028 5.572-.028 6.329 0 .617.415 1.334 1.586 1.109a23.073 23.073 0 0 0-7.308-44.958z" fill="#fff" fill-rule="evenodd" data-name="Path 207" transform="translate(-205.894 -1078.578)"></path>
</svg>
</a>
<a class="footer-section__media-section--link" target="_blank" href="https://github.com/apache/airflow/issues">
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45" viewBox="0 0 45 45">
<g id="Group_210" data-name="Group 210" transform="translate(-339.789 -1315.282)">
<path id="Path_218" d="M394.82 1315.282h-21.671a9.784 9.784 0 0 0 9.784 9.778h3.986v3.857a9.784 9.784 0 0 0 9.784 9.771v-21.523a1.884 1.884 0 0 0-1.883-1.883z" fill="#fff" data-name="Path 218" transform="translate(-11.914)"></path>
<path id="Path_219" d="M378.14 1332.072h-21.671a9.778 9.778 0 0 0 9.778 9.778h4.018v3.857a9.784 9.784 0 0 0 9.752 9.778v-21.536a1.877 1.877 0 0 0-1.877-1.877z" fill="#fff" data-name="Path 219" transform="translate(-5.957 -5.996)"></path>
<path id="Path_220" d="M361.46 1348.862h-21.671a9.778 9.778 0 0 0 9.778 9.778h3.992v3.857a9.778 9.778 0 0 0 9.778 9.778v-21.529a1.883 1.883 0 0 0-1.877-1.884z" fill="#fff" data-name="Path 220" transform="translate(0 -11.993)"></path>
</g>
</svg>
</a>
<a class="footer-section__media-section--link" target="_blank" href="https://s.apache.org/airflow-slack">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
<path id="Path_208" d="M670.634 856.859a4.744 4.744 0 1 1-4.744-4.744h4.744z" fill="#fff" data-name="Path 208" transform="translate(-661.145 -852.115)"></path>
<path id="Path_209" d="M684.059 856.859a4.744 4.744 0 0 1 9.489 0v11.861a4.744 4.744 0 1 1-9.489 0z" fill="#fff" data-name="Path 209" transform="translate(-672.198 -852.115)"></path>
</g>
<g id="Group_205" data-name="Group 205" transform="translate(661.145 806.287)">
<path id="Path_210" d="M688.8 815.776a4.744 4.744 0 1 1 4.744-4.745v4.745z" fill="#fff" data-name="Path 210" transform="translate(-672.198 -806.287)"></path>
<path id="Path_211" d="M677.751 829.2a4.744 4.744 0 0 1 0 9.489H665.89a4.744 4.744 0 1 1 0-9.489z" fill="#fff" data-name="Path 211" transform="translate(-661.145 -817.34)"></path>
</g>
<g id="Group_206" data-name="Group 206" transform="translate(684.868 806.287)">
<path id="Path_212" d="M729.887 833.945a4.744 4.744 0 1 1 4.745 4.745h-4.745z" fill="#fff" data-name="Path 212" transform="translate(-718.026 -817.34)"></path>
<path id="Path_213" d="M716.462 822.893a4.744 4.744 0 1 1-9.489 0v-11.862a4.744 4.744 0 0 1 9.489 0z" fill="#fff" data-name="Path 213" transform="translate(-706.973 -806.287)"></path>
</g>
<g id="Group_207" data-name="Group 207" transform="translate(684.868 830.01)">
<path id="Path_214" d="M711.718 875.029a4.744 4.744 0 1 1-4.745 4.744v-4.744z" fill="#fff" data-name="Path 214" transform="translate(-706.973 -863.168)"></path>
<path id="Path_215" d="M711.718 861.6a4.744 4.744 0 1 1 0-9.489h11.861a4.744 4.744 0 0 1 0 9.489z" fill="#fff" data-name="Path 215" transform="translate(-706.973 -852.115)"></path>
</g>
</g>
</svg>
</a>
<a class="footer-section__media-section--link" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"></path>
<path id="Path_217" d="M661.012 1003.008l19.467 4.069.824-3.914-19.467-4.069zm2.575-9.27l18.025 8.395 1.648-3.605-18.025-8.446zm5-8.858l15.3 12.721 2.524-3.039-15.3-12.721zm9.888-9.425l-3.193 2.369 11.845 15.965 3.193-2.369zm-17.875 36.617h19.879v-3.966H660.6z" fill="#fff" data-name="Path 217" transform="translate(-7.469)"></path>
</g>
</svg>
</a>
<a class="footer-section__media-section--link" target="_blank" href="https://twitter.com/ApacheAirflow">
<svg xmlns="http://www.w3.org/2000/svg" width="44.355" height="44.355" viewBox="0 0 44.355 44.355">
<g id="Group_211" data-name="Group 211" transform="translate(-503 -1382.2)">
<path id="Path_221" d="M541.811 1382.2h-33.267a5.546 5.546 0 0 0-5.544 5.544v33.266a5.547 5.547 0 0 0 5.544 5.545h33.267a5.546 5.546 0 0 0 5.544-5.545v-33.266a5.546 5.546 0 0 0-5.544-5.544zm-5.611 16.533c.011.244.011.488.011.732 0 7.507-5.722 16.178-16.179 16.178a16.173 16.173 0 0 1-8.7-2.539 10.92 10.92 0 0 0 1.353.078 11.4 11.4 0 0 0 7.064-2.44 5.685 5.685 0 0 1-5.311-3.947 5.725 5.725 0 0 0 2.561-.1 5.7 5.7 0 0 1-4.557-5.578v-.078a5.752 5.752 0 0 0 2.572.71 5.709 5.709 0 0 1-1.763-7.6 16.146 16.146 0 0 0 11.721 5.944 6.282 6.282 0 0 1-.144-1.3 5.688 5.688 0 0 1 9.836-3.892 11.3 11.3 0 0 0 3.615-1.375 5.721 5.721 0 0 1-2.506 3.149 11.538 11.538 0 0 0 3.271-.9 11.585 11.585 0 0 1-2.844 2.958z" fill="#fff" data-name="Path 221"></path>
</g>
</svg>
</a>
<a class="footer-section__media-section--link" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="translate(-1076 -1224.542)"></path>
</svg>
</a>
</div>
<div class="footer-section__media-section--button-with-text">
<span class="footer-section__media-section--text">Want to be a part of Apache Airflow?</span>
<a href="/community">
<button id="" class="btn-filled bodytext__medium--white ">Join community</button>
</a>
</div>
</div>
<div class="footer-section footer-section__policies-section">
<div class="footer-section">
<span>© The Apache Software Foundation <script>document.write(new Date().getFullYear())</script></span>
<div class="footer-section__policies-section--policies">
<a href="https://www.apache.org/licenses/" class="footer-section__policies-section--policy-item">
<span>License</span>
</a>
<a href="https://www.apache.org/foundation/sponsorship.html" class="footer-section__policies-section--policy-item">
<span>Donate</span>
</a>
<a href="https://www.apache.org/foundation/thanks.html" class="footer-section__policies-section--policy-item">
<span>Thanks</span>
</a>
<a href="https://www.apache.org/security/" class="footer-section__policies-section--policy-item">
<span>Security</span>
</a>
</div>
</div>
<span class="footer-section__policies-section--disclaimer">
Apache Airflow, Apache, Airflow, the Airflow logo, and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation.
All other products or name brands are trademarks of their respective holders, including The Apache Software Foundation.
</span>
</div>
</footer>
<script type="text/javascript" src="../../../_static/_gen/js/docs.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/clipboard.min.js"></script>
<script src="../../../_static/copybutton.js"></script>
<script src="../../../_static/jira-links.js"></script>
</body>
</html>