You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by el...@apache.org on 2023/10/15 18:22:55 UTC
[airflow] branch main updated: Add Open Search Provider (#34705)
This is an automated email from the ASF dual-hosted git repository.
eladkal pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 94f144196f Add Open Search Provider (#34705)
94f144196f is described below
commit 94f144196fbc0c78d615cb6a1ff39300e3f607ae
Author: Cary <ha...@gmail.com>
AuthorDate: Sun Oct 15 11:22:47 2023 -0700
Add Open Search Provider (#34705)
Add Open Search Provider
---------
Co-authored-by: Hussein Awala <hu...@awala.fr>
Co-authored-by: D. Ferruzzi <fe...@amazon.com>
---
.../airflow_providers_bug_report.yml | 1 +
CONTRIBUTING.rst | 8 +-
INSTALL | 8 +-
airflow/providers/opensearch/CHANGELOG.rst | 27 +++
airflow/providers/opensearch/__init__.py | 16 ++
airflow/providers/opensearch/hooks/__init__.py | 16 ++
airflow/providers/opensearch/hooks/opensearch.py | 122 +++++++++++++
airflow/providers/opensearch/operators/__init__.py | 16 ++
.../providers/opensearch/operators/opensearch.py | 194 +++++++++++++++++++++
airflow/providers/opensearch/provider.yaml | 52 ++++++
.../changelog.rst | 19 ++
.../commits.rst | 30 ++++
.../connections/index.rst | 29 +++
.../connections/opensearch.rst | 37 ++++
docs/apache-airflow-providers-opensearch/index.rst | 102 +++++++++++
.../installing-providers-from-sources.rst | 18 ++
.../operators/index.rst | 29 +++
.../operators/opensearch.rst | 72 ++++++++
.../security.rst | 38 ++++
docs/apache-airflow/extra-packages-ref.rst | 2 +
docs/integration-logos/opensearch/opensearch.png | Bin 0 -> 1955 bytes
docs/spelling_wordlist.txt | 2 +
generated/provider_dependencies.json | 8 +
images/breeze/output-commands-hash.txt | 18 +-
images/breeze/output_build-docs.svg | 58 +++---
...tput_release-management_add-back-references.svg | 6 +-
...management_generate-issue-content-providers.svg | 6 +-
...e-management_prepare-provider-documentation.svg | 6 +-
...elease-management_prepare-provider-packages.svg | 6 +-
.../output_release-management_publish-docs.svg | 68 ++++----
...output_sbom_generate-providers-requirements.svg | 50 +++---
tests/providers/opensearch/__init__.py | 16 ++
tests/providers/opensearch/conftest.py | 60 +++++++
tests/providers/opensearch/hooks/__init__.py | 16 ++
.../providers/opensearch/hooks/test_opensearch.py | 37 ++++
tests/providers/opensearch/operators/__init__.py | 16 ++
.../opensearch/operators/test_opensearch.py | 125 +++++++++++++
tests/system/providers/opensearch/__init__.py | 16 ++
.../providers/opensearch/example_opensearch.py | 129 ++++++++++++++
39 files changed, 1368 insertions(+), 111 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
index 02f6b38a85..87ff85308d 100644
--- a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
@@ -80,6 +80,7 @@ body:
- odbc
- openfaas
- openlineage
+ - opensearch
- opsgenie
- oracle
- pagerduty
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index b9858abfa9..aab84e7083 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -676,10 +676,10 @@ deprecated_api, devel, devel_all, devel_ci, devel_hadoop, dingding, discord, doc
druid, elasticsearch, exasol, facebook, ftp, gcp, gcp_api, github, github_enterprise, google,
google_auth, grpc, hashicorp, hdfs, hive, http, imap, influxdb, jdbc, jenkins, kerberos, kubernetes,
ldap, leveldb, microsoft.azure, microsoft.mssql, microsoft.psrp, microsoft.winrm, mongo, mssql,
-mysql, neo4j, odbc, openfaas, openlineage, opsgenie, oracle, otel, pagerduty, pandas, papermill,
-password, pinot, plexus, postgres, presto, rabbitmq, redis, s3, salesforce, samba, segment,
-sendgrid, sentry, sftp, singularity, slack, smtp, snowflake, spark, sqlite, ssh, statsd, tableau,
-tabular, telegram, trino, vertica, virtualenv, webhdfs, winrm, yandex, zendesk
+mysql, neo4j, odbc, openfaas, openlineage, opensearch, opsgenie, oracle, otel, pagerduty, pandas,
+papermill, password, pinot, plexus, postgres, presto, rabbitmq, redis, s3, salesforce, samba,
+segment, sendgrid, sentry, sftp, singularity, slack, smtp, snowflake, spark, sqlite, ssh, statsd,
+tableau, tabular, telegram, trino, vertica, virtualenv, webhdfs, winrm, yandex, zendesk
.. END EXTRAS HERE
Provider packages
diff --git a/INSTALL b/INSTALL
index 26351cf425..027d4a621c 100644
--- a/INSTALL
+++ b/INSTALL
@@ -103,10 +103,10 @@ deprecated_api, devel, devel_all, devel_ci, devel_hadoop, dingding, discord, doc
druid, elasticsearch, exasol, facebook, ftp, gcp, gcp_api, github, github_enterprise, google,
google_auth, grpc, hashicorp, hdfs, hive, http, imap, influxdb, jdbc, jenkins, kerberos, kubernetes,
ldap, leveldb, microsoft.azure, microsoft.mssql, microsoft.psrp, microsoft.winrm, mongo, mssql,
-mysql, neo4j, odbc, openfaas, openlineage, opsgenie, oracle, otel, pagerduty, pandas, papermill,
-password, pinot, plexus, postgres, presto, rabbitmq, redis, s3, salesforce, samba, segment,
-sendgrid, sentry, sftp, singularity, slack, smtp, snowflake, spark, sqlite, ssh, statsd, tableau,
-tabular, telegram, trino, vertica, virtualenv, webhdfs, winrm, yandex, zendesk
+mysql, neo4j, odbc, openfaas, openlineage, opensearch, opsgenie, oracle, otel, pagerduty, pandas,
+papermill, password, pinot, plexus, postgres, presto, rabbitmq, redis, s3, salesforce, samba,
+segment, sendgrid, sentry, sftp, singularity, slack, smtp, snowflake, spark, sqlite, ssh, statsd,
+tableau, tabular, telegram, trino, vertica, virtualenv, webhdfs, winrm, yandex, zendesk
# END EXTRAS HERE
# For installing Airflow in development environments - see CONTRIBUTING.rst
diff --git a/airflow/providers/opensearch/CHANGELOG.rst b/airflow/providers/opensearch/CHANGELOG.rst
new file mode 100644
index 0000000000..4cb4526149
--- /dev/null
+++ b/airflow/providers/opensearch/CHANGELOG.rst
@@ -0,0 +1,27 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+
+.. NOTE TO CONTRIBUTORS:
+ Please, only add notes to the Changelog just below the "Changelog" header when there are some breaking changes
+ and you want to add an explanation to the users on how they are supposed to deal with them.
+ The changelog is updated and maintained semi-automatically by release manager.
+
+``apache-airflow-providers-opensearch``
+
+Changelog
+---------
diff --git a/airflow/providers/opensearch/__init__.py b/airflow/providers/opensearch/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/airflow/providers/opensearch/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/airflow/providers/opensearch/hooks/__init__.py b/airflow/providers/opensearch/hooks/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/airflow/providers/opensearch/hooks/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/airflow/providers/opensearch/hooks/opensearch.py b/airflow/providers/opensearch/hooks/opensearch.py
new file mode 100644
index 0000000000..97907e54d5
--- /dev/null
+++ b/airflow/providers/opensearch/hooks/opensearch.py
@@ -0,0 +1,122 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import json
+from functools import cached_property
+from typing import Any
+
+from opensearchpy import OpenSearch, RequestsHttpConnection
+
+from airflow.exceptions import AirflowException
+from airflow.hooks.base import BaseHook
+
+
+class OpenSearchHook(BaseHook):
+ """
+ Provide a thin wrapper around the OpenSearch client.
+
+ :param: open_search_conn_id: Connection to use with Open Search
+ :param: log_query: Whether to log the query used for Open Search
+ """
+
+ conn_name_attr = "opensearch_conn_id"
+ default_conn_name = "opensearch_default"
+ conn_type = "opensearch"
+ hook_name = "OpenSearch Hook"
+
+ def __init__(self, open_search_conn_id: str, log_query: bool, **kwargs: Any):
+ super().__init__(**kwargs)
+ self.conn_id = open_search_conn_id
+ self.log_query = log_query
+
+ self.use_ssl = self.conn.extra_dejson.get("use_ssl", False)
+ self.verify_certs = self.conn.extra_dejson.get("verify_certs", False)
+ self.__SERVICE = "es"
+
+ @cached_property
+ def conn(self):
+ return self.get_connection(self.conn_id)
+
+ @cached_property
+ def client(self) -> OpenSearch:
+ """This function is intended for Operators that forward high level client objects."""
+ auth = (self.conn.login, self.conn.password)
+ client = OpenSearch(
+ hosts=[{"host": self.conn.host, "port": self.conn.port}],
+ http_auth=auth,
+ use_ssl=self.use_ssl,
+ verify_certs=self.verify_certs,
+ connection_class=RequestsHttpConnection,
+ )
+ return client
+
+ def search(self, query: dict, index_name: str, **kwargs: Any) -> Any:
+ """
+ Run a search query against the connected OpenSearch cluster.
+
+ :param: query: The query for the search against OpenSearch.
+ :param: index_name: The name of the index to search against
+ """
+ if self.log_query:
+ self.log.info("Searching %s with Query: %s", index_name, query)
+ return self.client.search(body=query, index=index_name, **kwargs)
+
+ def index(self, document: dict, index_name: str, doc_id: int, **kwargs: Any) -> Any:
+ """
+ Index a document on OpenSearch.
+
+ :param: document: A dictionary representation of the document
+ :param: index_name: the name of the index that this document will be associated with
+ :param: doc_id: the numerical identifier that will be used to identify the document on the index.
+ """
+ return self.client.index(index=index_name, id=doc_id, body=document, **kwargs)
+
+ def delete(self, index_name: str, query: dict | None = None, doc_id: int | None = None) -> Any:
+ """
+ Delete from an index by either a query or by the document id.
+
+ :param: index_name: the name of the index to delete from
+ :param: query: If deleting by query a dict representation of the query to run to
+ identify documents to delete.
+ :param: doc_id: The identifier of the document to delete.
+ """
+ if query is not None:
+ if self.log_query:
+ self.log.info("Deleting from %s using Query: %s", index_name, query)
+ return self.client.delete_by_query(index=index_name, body=query)
+ elif doc_id is not None:
+ return self.client.delete(index=index_name, id=doc_id)
+ else:
+ AirflowException("To delete a document you must include one of either a query or a document id. ")
+
+ @staticmethod
+ def get_ui_field_behaviour() -> dict[str, Any]:
+ """Returns custom UI field behaviour for Open Search Connection."""
+ return {
+ "hidden_fields": ["schema"],
+ "relabeling": {
+ "extra": "Open Search Configuration",
+ },
+ "placeholders": {
+ "extra": json.dumps(
+ {"use_ssl": True, "verify_certs": True},
+ indent=2,
+ ),
+ },
+ }
diff --git a/airflow/providers/opensearch/operators/__init__.py b/airflow/providers/opensearch/operators/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/airflow/providers/opensearch/operators/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/airflow/providers/opensearch/operators/opensearch.py b/airflow/providers/opensearch/operators/opensearch.py
new file mode 100644
index 0000000000..08ab1dc0ce
--- /dev/null
+++ b/airflow/providers/opensearch/operators/opensearch.py
@@ -0,0 +1,194 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+from functools import cached_property
+from typing import TYPE_CHECKING, Any, Sequence
+
+from opensearchpy.exceptions import OpenSearchException
+
+from airflow.exceptions import AirflowException
+from airflow.models import BaseOperator
+from airflow.providers.opensearch.hooks.opensearch import OpenSearchHook
+
+if TYPE_CHECKING:
+ from airflow.utils.context import Context
+
+
+class OpenSearchQueryOperator(BaseOperator):
+ """
+ Runs a query search against a given index on an OpenSearch cluster and returns results.
+
+ .. seealso::
+ For more information on how to use this operator, take a look at the guide:
+ :ref:`howto/operator:OpenSearchQueryOperator`
+
+ :param: query: A Dictionary Open Search DSL query.
+ :param: search_object: A Search object from opensearch-dsl.
+ :param: index_name: The name of the index to search for documents.
+ :param: opensearch_conn_id: opensearch connection to use
+ :param: log_query: Whether to log the query used. Defaults to True and logs query used.
+ """
+
+ template_fields: Sequence[str] = ["query"]
+
+ def __init__(
+ self,
+ *,
+ query: dict | None = None,
+ search_object: Any | None = None,
+ index_name: str | None = None,
+ opensearch_conn_id: str = "opensearch_default",
+ log_query: bool = True,
+ **kwargs,
+ ) -> None:
+ super().__init__(**kwargs)
+ self.query = query
+ self.index_name = index_name
+ self.opensearch_conn_id = opensearch_conn_id
+ self.log_query = log_query
+ self.search_object = search_object
+
+ @cached_property
+ def hook(self) -> OpenSearchHook:
+ """Gets an instance of an OpenSearchHook."""
+ return OpenSearchHook(open_search_conn_id=self.opensearch_conn_id, log_query=self.log_query)
+
+ def execute(self, context: Context) -> Any:
+ """Executes a search against a given index or a Search object on an OpenSearch Cluster."""
+ result = None
+
+ if self.query is not None:
+ if not self.query.get("query"):
+ raise AirflowException("Query input is missing required field Query in dictionary")
+ if self.index_name is None:
+ raise AirflowException("Index name is required when using the query input.")
+ try:
+ result = self.hook.search(index_name=self.index_name, query=self.query)
+ except OpenSearchException as e:
+ raise AirflowException(e)
+ elif self.search_object is not None:
+ try:
+ result = self.search_object.using(self.hook.client).execute()
+ except OpenSearchException as e:
+ raise AirflowException(e)
+ else:
+ raise AirflowException(
+ """Input missing required input of query or search_object.
+ Either query or search_object is required."""
+ )
+ return result
+
+
+class OpenSearchCreateIndexOperator(BaseOperator):
+ """
+ Create a new index on an Open Search cluster with a given index name.
+
+ .. seealso::
+ For more information on how to use this operator, take a look at the guide:
+ :ref:`howto/operator:OpenSearchCreateIndexOperator`
+
+ :param: index_name: The name of the index to be created.
+ :param: index_body: A dictionary that defines index settings
+ :param: opensearch_conn_id: opensearch connection to use
+ """
+
+ def __init__(
+ self,
+ *,
+ index_name: str,
+ index_body: dict[str, Any],
+ opensearch_conn_id: str = "opensearch_default",
+ **kwargs,
+ ) -> None:
+ super().__init__(**kwargs)
+ self.index_name = index_name
+ self.index_body = index_body
+ self.opensearch_conn_id = opensearch_conn_id
+
+ @cached_property
+ def hook(self) -> OpenSearchHook:
+ """Gets an instance of an OpenSearchHook."""
+ return OpenSearchHook(open_search_conn_id=self.opensearch_conn_id, log_query=False)
+
+ def execute(self, context: Context) -> Any:
+ """Creates an index on an Open Search cluster."""
+ try:
+ self.hook.client.indices.create(index=self.index_name, body=self.index_body)
+ except OpenSearchException as e:
+ raise AirflowException(e)
+
+
+class OpenSearchAddDocumentOperator(BaseOperator):
+ """
+ Add a new document to a given Index or overwrite an existing one.
+
+ .. seealso::
+ For more information on how to use this operator, take a look at the guide:
+ :ref:`howto/operator:OpenSearchAddDocumentOperator`
+
+ :param: index_name: The name of the index to put the document.
+ :param: document: A dictionary representation of the document.
+ :param: document_id: The id for the document in the index.
+ :param: doc_class: A Document subclassed object using opensearch-dsl
+ :param: opensearch_conn_id: opensearch connection to use
+ """
+
+ def __init__(
+ self,
+ *,
+ index_name: str | None = None,
+ document: dict[str, Any] | None = None,
+ doc_id: int | None = None,
+ doc_class: Any | None = None,
+ opensearch_conn_id: str = "opensearch_default",
+ **kwargs,
+ ) -> None:
+ super().__init__(**kwargs)
+ self.index_name = index_name
+ self.document = document
+ self.doc_id = doc_id
+ self.doc_class = doc_class
+ self.opensearch_conn_id = opensearch_conn_id
+
+ @cached_property
+ def hook(self) -> OpenSearchHook:
+ """Gets an instance of an OpenSearchHook."""
+ return OpenSearchHook(open_search_conn_id=self.opensearch_conn_id, log_query=False)
+
+ def execute(self, context: Context) -> Any:
+ """Saves a document to a given index on an OpenSearch cluster."""
+ if self.doc_class is not None:
+ try:
+ doc = self.doc_class.init(using=self.hook.client)
+ result = doc.save(using=self.hook.client)
+ except OpenSearchException as e:
+ raise AirflowException(e)
+ elif self.index_name is not None and self.document is not None and self.doc_id is not None:
+ try:
+ result = self.hook.index(
+ index_name=self.index_name, document=self.document, doc_id=self.doc_id
+ )
+ except OpenSearchException as e:
+ raise AirflowException(e)
+ else:
+ raise AirflowException(
+ "Index name, document dictionary and doc_id or a Document subclassed object is required."
+ )
+
+ return result
diff --git a/airflow/providers/opensearch/provider.yaml b/airflow/providers/opensearch/provider.yaml
new file mode 100644
index 0000000000..270d7cd208
--- /dev/null
+++ b/airflow/providers/opensearch/provider.yaml
@@ -0,0 +1,52 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+---
+package-name: apache-airflow-providers-opensearch
+name: Opensearch
+description: |
+ `Opensearch <https://opensearch.org/>`__
+
+suspended: false
+versions:
+ - 1.0.0
+
+dependencies:
+ - apache-airflow>=2.5.0
+ - opensearch-py>=2.2.0
+
+integrations:
+ - integration-name: Opensearch
+ external-doc-url: https://opensearch.org/
+ how-to-guide:
+ - /docs/apache-airflow-providers-opensearch/operators/opensearch.rst
+ logo: /integration-logos/opensearch/opensearch.png
+ tags: [software]
+
+hooks:
+ - integration-name: Opensearch
+ python-modules:
+ - airflow.providers.opensearch.hooks.opensearch
+
+operators:
+ - integration-name: Opensearch
+ python-modules:
+ - airflow.providers.opensearch.operators.opensearch
+
+connection-types:
+ - hook-class-name: airflow.providers.opensearch.hooks.opensearch.OpenSearchHook
+ connection-type: opensearch
diff --git a/docs/apache-airflow-providers-opensearch/changelog.rst b/docs/apache-airflow-providers-opensearch/changelog.rst
new file mode 100644
index 0000000000..d1bb0e4735
--- /dev/null
+++ b/docs/apache-airflow-providers-opensearch/changelog.rst
@@ -0,0 +1,19 @@
+
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+.. include:: ../../airflow/providers/opensearch/CHANGELOG.rst
diff --git a/docs/apache-airflow-providers-opensearch/commits.rst b/docs/apache-airflow-providers-opensearch/commits.rst
new file mode 100644
index 0000000000..d36d55467e
--- /dev/null
+++ b/docs/apache-airflow-providers-opensearch/commits.rst
@@ -0,0 +1,30 @@
+
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+
+Package apache-airflow-providers-opensearch
+------------------------------------------------------
+
+`OpenSearch <https://opensearch.org/>`__
+
+
+This is detailed commit list of changes for versions provider package: ``opensearch``.
+For high-level changelog, see :doc:`package information including changelog <index>`.
+
+1.0.0
+.....
diff --git a/docs/apache-airflow-providers-opensearch/connections/index.rst b/docs/apache-airflow-providers-opensearch/connections/index.rst
new file mode 100644
index 0000000000..72d2846638
--- /dev/null
+++ b/docs/apache-airflow-providers-opensearch/connections/index.rst
@@ -0,0 +1,29 @@
+
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+
+
+OpenSearch Connections
+=======================
+
+
+.. toctree::
+ :maxdepth: 1
+ :glob:
+
+ *
diff --git a/docs/apache-airflow-providers-opensearch/connections/opensearch.rst b/docs/apache-airflow-providers-opensearch/connections/opensearch.rst
new file mode 100644
index 0000000000..781f5da502
--- /dev/null
+++ b/docs/apache-airflow-providers-opensearch/connections/opensearch.rst
@@ -0,0 +1,37 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+
+
+OpenSearch Connection
+=====================
+The OpenSearch connection provides credentials for an OpenSearch instance.
+
+Configuring the Connection
+--------------------------
+Host (required)
+ The host address of the Open Search instance.
+Login (required)
+ The login user.
+Password (required)
+ The password for the login user.
+Extra (optional)
+ Specifying the extra parameters as a (json dictionary) that can be used in the OpenSearch connection.
+ The following parameters are all optional:
+
+ * ``use_ssl``: Boolean on requiring an ssl connection. Default is false.
+ * ``verify_certs``: Boolean indicating to verify certs for ssl. Default is false.
diff --git a/docs/apache-airflow-providers-opensearch/index.rst b/docs/apache-airflow-providers-opensearch/index.rst
new file mode 100644
index 0000000000..d122ba3831
--- /dev/null
+++ b/docs/apache-airflow-providers-opensearch/index.rst
@@ -0,0 +1,102 @@
+
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+``apache-airflow-providers-opensearch``
+=======================================
+
+
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: Basics
+
+ Home <self>
+ Changelog <changelog>
+ Security <security>
+
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: Guides
+
+ Connection types <connections/index>
+ Operators <operators/index>
+
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: References
+
+ Python API <_api/airflow/providers/opensearch/index>
+
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: System tests
+
+ System Tests <_api/tests/system/providers/opensearch/index>
+
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: Resources
+
+ PyPI Repository <https://pypi.org/project/apache-airflow-providers-opensearch/>
+ Installing from sources <installing-providers-from-sources>
+
+.. THE REMAINDER OF THE FILE IS AUTOMATICALLY GENERATED. IT WILL BE OVERWRITTEN AT RELEASE TIME!
+
+
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: Commits
+
+ Detailed list of commits <commits>
+
+
+Package apache-airflow-providers-opensearch
+------------------------------------------------------
+`OpenSearch <https://opensearch.org/>`__
+
+Release: 1.0.0
+
+Provider package
+----------------
+
+This is a provider package for ``opensearch`` provider. All classes for this provider package
+are in ``airflow.providers.opensearch`` python package.
+
+Installation
+------------
+
+You can install this package on top of an existing Airflow 2 installation (see ``Requirements`` below)
+for the minimum Airflow version supported) via
+``pip install apache-airflow-providers-opensearch``
+
+Requirements
+------------
+
+The minimum Apache Airflow version supported by this provider package is ``2.5.0``.
+
+=================== ==================
+PIP package Version required
+=================== ==================
+``apache-airflow`` ``>=2.5.0``
+``opensearchpy`` ``>=2.2.0``
+=================== ==================
diff --git a/docs/apache-airflow-providers-opensearch/installing-providers-from-sources.rst b/docs/apache-airflow-providers-opensearch/installing-providers-from-sources.rst
new file mode 100644
index 0000000000..b4e730f4ff
--- /dev/null
+++ b/docs/apache-airflow-providers-opensearch/installing-providers-from-sources.rst
@@ -0,0 +1,18 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+.. include:: ../exts/includes/installing-providers-from-sources.rst
diff --git a/docs/apache-airflow-providers-opensearch/operators/index.rst b/docs/apache-airflow-providers-opensearch/operators/index.rst
new file mode 100644
index 0000000000..bc0f38e110
--- /dev/null
+++ b/docs/apache-airflow-providers-opensearch/operators/index.rst
@@ -0,0 +1,29 @@
+
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+
+
+Open Search Operators
+======================
+
+
+.. toctree::
+ :maxdepth: 1
+ :glob:
+
+ *
diff --git a/docs/apache-airflow-providers-opensearch/operators/opensearch.rst b/docs/apache-airflow-providers-opensearch/operators/opensearch.rst
new file mode 100644
index 0000000000..77bb8a270e
--- /dev/null
+++ b/docs/apache-airflow-providers-opensearch/operators/opensearch.rst
@@ -0,0 +1,72 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+=============
+OpenSearch
+=============
+
+`OpenSearch <https://opensearch.org/>`__
+
+
+Operators
+---------
+
+.. _howto/operator:OpenSearchCreateIndexOperator:
+
+Create an Index in Open Search
+==============================
+
+Use :class:`~airflow.providers.opensearch.operators.opensearch.OpenSearchCreateIndexOperator`
+to create a new index in an Open Search domain.
+
+
+
+.. exampleinclude:: /../../tests/system/providers/opensearch/example_opensearch.py
+ :language: python
+ :start-after: [START howto_operator_opensearch_create_index]
+ :dedent: 4
+ :end-before: [END howto_operator_opensearch_create_index]
+
+
+.. _howto/operator:OpenSearchAddDocumentOperator:
+
+Add a Document to an Index on OpenSearch
+=========================================
+
+Use :class:`~airflow.providers.opensearch.operators.opensearch.OpenSearchAddDocumentOperator`
+to add single documents to an Open Search Index
+
+.. exampleinclude:: /../../tests/system/providers/opensearch/example_opensearch.py
+ :language: python
+ :start-after: [START howto_operator_opensearch_add_document]
+ :dedent: 4
+ :end-before: [END howto_operator_opensearch_add_document]
+
+
+.. _howto/operator:OpenSearchQueryOperator:
+
+Run a query against an Open Search Index
+=========================================
+
+Use :class:`~airflow.providers.opensearch.operators.opensearch.OpenSearchQueryOperator`
+to run a query against an Open Search index.
+
+.. exampleinclude:: /../../tests/system/providers/opensearch/example_opensearch.py
+ :language: python
+ :start-after: [START howto_operator_opensearch_query]
+ :dedent: 4
+ :end-before: [END howto_operator_opensearch_query]
diff --git a/docs/apache-airflow-providers-opensearch/security.rst b/docs/apache-airflow-providers-opensearch/security.rst
new file mode 100644
index 0000000000..66c6f79a4e
--- /dev/null
+++ b/docs/apache-airflow-providers-opensearch/security.rst
@@ -0,0 +1,38 @@
+
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+Releasing security patches
+--------------------------
+
+Airflow providers are released independently from Airflow itself and the information about vulnerabilities
+is published separately. You can upgrade providers independently from Airflow itself, following the
+instructions found in :doc:`apache-airflow:installation/installing-from-pypi`.
+
+When we release Provider version, the development is always done from the ``main`` branch where we prepare
+the next version. The provider uses strict `SemVer <https://semver.org>`_ versioning policy. Depending on
+the scope of the change, Provider will get ''MAJOR'' version upgrade when there are
+breaking changes, ``MINOR`` version upgrade when there are new features or ``PATCHLEVEL`` version upgrade
+when there are only bug fixes (including security bugfixes) - and this is the only version that receives
+security fixes by default, so you should upgrade to latest version of the provider if you want to receive
+all released security fixes.
+
+The only exception to that rule is when we have a critical security fix and good reason to provide an
+out-of-band release for the provider, in which case stakeholders in the provider might decide to cherry-pick
+and prepare a branch for an older version of the provider following the
+`mixed governance model <https://github.com/apache/airflow/blob/main/PROVIDERS.rst#mixed-governance-model>`_
+and requires interested parties to cherry-pick and test the fixes.
diff --git a/docs/apache-airflow/extra-packages-ref.rst b/docs/apache-airflow/extra-packages-ref.rst
index c24fe2d437..1fd5e157f6 100644
--- a/docs/apache-airflow/extra-packages-ref.rst
+++ b/docs/apache-airflow/extra-packages-ref.rst
@@ -301,6 +301,8 @@ These are extras that provide support for integration with external systems via
+---------------------+-----------------------------------------------------+--------------------------------------+--------------+
| openlineage | ``pip install 'apache-airflow[openlineage]'`` | Sending OpenLineage events | |
+---------------------+-----------------------------------------------------+--------------------------------------+--------------+
+| opensearch | ``pip install 'apache-airflow[opensearch]'`` | Opensearch hooks and operators | |
++---------------------+-----------------------------------------------------+--------------------------------------+--------------+
| papermill | ``pip install 'apache-airflow[papermill]'`` | Papermill hooks and operators | |
+---------------------+-----------------------------------------------------+--------------------------------------+--------------+
| sftp | ``pip install 'apache-airflow[sftp]'`` | SFTP hooks, operators and sensors | |
diff --git a/docs/integration-logos/opensearch/opensearch.png b/docs/integration-logos/opensearch/opensearch.png
new file mode 100644
index 0000000000..a51d300b3b
Binary files /dev/null and b/docs/integration-logos/opensearch/opensearch.png differ
diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt
index 14d7d52dd0..b37bdf3c22 100644
--- a/docs/spelling_wordlist.txt
+++ b/docs/spelling_wordlist.txt
@@ -1054,6 +1054,8 @@ Oozie
openapi
openfaas
openlineage
+OpenSearch
+opensearch
oper
OperatorLineage
Opsgenie
diff --git a/generated/provider_dependencies.json b/generated/provider_dependencies.json
index 3185f825ab..1a8c9c3a89 100644
--- a/generated/provider_dependencies.json
+++ b/generated/provider_dependencies.json
@@ -667,6 +667,14 @@
],
"excluded-python-versions": []
},
+ "opensearch": {
+ "deps": [
+ "apache-airflow>=2.5.0",
+ "opensearch-py>=2.2.0"
+ ],
+ "cross-providers-deps": [],
+ "excluded-python-versions": []
+ },
"opsgenie": {
"deps": [
"apache-airflow>=2.5.0",
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index b01b168832..18bd1a776e 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -2,7 +2,7 @@
# Please do not solve it but run `breeze setup regenerate-command-images`.
# This command should fix the conflict and regenerate help images that you have conflict with.
main:c97d8a728bb02c2be73002c4b39d0829
-build-docs:c5da2956cfff3989a9699c32aee63a13
+build-docs:27f59f285448615a47ee2ee22645ef2b
ci:find-backtracking-candidates:17fe56b867a745e5032a08dfcd3f73ee
ci:fix-ownership:3e5a73533cc96045e72cb258783cfc96
ci:free-space:49af17b032039c05c41a7a8283f365cc
@@ -36,25 +36,25 @@ prod-image:build:20f84ddadc2fe4ae2723b7ccdde0197f
prod-image:pull:3817ef211b023b76df84ee1110ef64dd
prod-image:verify:bd2b78738a7c388dbad6076c41a9f906
prod-image:e9ecd759e51ebd926df3170b29d1d2dc
-release-management:add-back-references:6da27012538a7cc79ddd4ec650470470
+release-management:add-back-references:298fd8d5dd342a076037e996f39ba371
release-management:create-minor-branch:a3834afc4aa5d1e98002c9e9e7a9931d
release-management:generate-constraints:01aef235b11e59ed7f10c970a5cdaba7
-release-management:generate-issue-content-providers:756d5dfd135c3e473756022ca6150c24
+release-management:generate-issue-content-providers:19c4c98c30b820685e5775a5396aebdf
release-management:generate-providers-metadata:d4e8e5cfaa024e3963af02d7a873048d
release-management:install-provider-packages:34c38aca17d23dbb454fe7a6bfd8e630
release-management:prepare-airflow-package:85d01c57e5b5ee0fb9e5f9d9706ed3b5
-release-management:prepare-provider-documentation:a53cd338bd719c77108b53bc8d45b634
-release-management:prepare-provider-packages:fc69d2ab8abdcbafcaaa63da380f4b76
-release-management:publish-docs:45a6ea090bfcf564ea0dd8fc61655d8a
+release-management:prepare-provider-documentation:d0dbef40ff62a19c966889f3735e747c
+release-management:prepare-provider-packages:5a87973bd373d20b6881f6fd62fbeb05
+release-management:publish-docs:130b14797fc4cd5f33d39c8277584f1c
release-management:release-prod-images:cfbfe8b19fee91fd90718f98ef2fd078
release-management:start-rc-process:b27bd524dd3c89f50a747b60a7e892c1
release-management:start-release:419f48f6a4ff4457cb9de7ff496aebbe
release-management:update-constraints:02ec4b119150e3fdbac52026e94820ef
release-management:verify-provider-packages:96dce5644aad6b37080acf77b3d8de3a
-release-management:885a5fe8a39a3773011cf1f9bd2983ad
-sbom:generate-providers-requirements:f8328b801efa7908d5b14b25a0097c4d
+release-management:856c346e8ec1cf320f656bcfe0af7451
+sbom:generate-providers-requirements:51e0c660a5f7846ada099e871ebd4c67
sbom:update-sbom-information:653be48be70b4b7ff5172d491aadc694
-sbom:104afc4ac8c007dcd99218d1b040047e
+sbom:b98ded4bbb76f0cb205cea32f3102aee
setup:autocomplete:fffcd49e102e09ccd69b3841a9e3ea8e
setup:check-all-params-in-groups:7aa55fa1b0f17a6f7b7ca225c6b82574
setup:config:aaff9748d0970f7cb02e592ac4046d5d
diff --git a/images/breeze/output_build-docs.svg b/images/breeze/output_build-docs.svg
index 1e801afbf5..71e474fd5c 100644
--- a/images/breeze/output_build-docs.svg
+++ b/images/breeze/output_build-docs.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 855.1999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 879.5999999999999" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -44,7 +44,7 @@
<defs>
<clipPath id="breeze-build-docs-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="804.1999999999999" />
+ <rect x="0" y="0" width="1463.0" height="828.5999999999999" />
</clipPath>
<clipPath id="breeze-build-docs-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -142,9 +142,12 @@
<clipPath id="breeze-build-docs-line-31">
<rect x="0" y="757.9" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-build-docs-line-32">
+ <rect x="0" y="782.3" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="853.2" rx="8"/><text class="breeze-build-docs-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: build-docs</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="877.6" rx="8"/><text class="breeze-build-docs-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: build-docs</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -163,30 +166,31 @@
</text><text class="breeze-build-docs-r4" x="12.2" y="166.4" textLength="97.6" clip-path="url(#breeze-build-docs-line-6)">arangodb</text><text class="breeze-build-docs-r1" x="109.8" y="166.4" textLength="36.6" clip-path="url(#breeze-build-docs-line-6)"> | </text><text class="breeze-build-docs-r4" x="146.4" y="166.4" textLength="61" clip-path="url(#breeze-build-docs-line-6)">asana</text><text class="breeze-build-docs-r1" x="207.4" y="166.4" textLength="36.6" clip-path="url(#bree [...]
</text><text class="breeze-build-docs-r4" x="12.2" y="190.8" textLength="85.4" clip-path="url(#breeze-build-docs-line-7)">datadog</text><text class="breeze-build-docs-r1" x="97.6" y="190.8" textLength="36.6" clip-path="url(#breeze-build-docs-line-7)"> | </text><text class="breeze-build-docs-r4" x="134.2" y="190.8" textLength="36.6" clip-path="url(#breeze-build-docs-line-7)">dbt</text><text class="breeze-build-docs-r1" x="170.8" y="190.8" textLength="12.2" clip-path="url(#breeze [...]
</text><text class="breeze-build-docs-r4" x="12.2" y="215.2" textLength="109.8" clip-path="url(#breeze-build-docs-line-8)">hashicorp</text><text class="breeze-build-docs-r1" x="122" y="215.2" textLength="36.6" clip-path="url(#breeze-build-docs-line-8)"> | </text><text class="breeze-build-docs-r4" x="158.6" y="215.2" textLength="48.8" clip-path="url(#breeze-build-docs-line-8)">http</text><text class="breeze-build-docs-r1" x="207.4" y="215.2" textLength="36.6" clip-path="url(#bre [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="239.6" textLength="109.8" clip-path="url(#breeze-build-docs-line-9)">microsoft</text><text class="breeze-build-docs-r1" x="122" y="239.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-9)">.</text><text class="breeze-build-docs-r4" x="134.2" y="239.6" textLength="61" clip-path="url(#breeze-build-docs-line-9)">winrm</text><text class="breeze-build-docs-r1" x="195.2" y="239.6" textLength="36.6" clip-path="url(#breeze-build-doc [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="264" textLength="73.2" clip-path="url(#breeze-build-docs-line-10)">plexus</text><text class="breeze-build-docs-r1" x="85.4" y="264" textLength="36.6" clip-path="url(#breeze-build-docs-line-10)"> | </text><text class="breeze-build-docs-r4" x="122" y="264" textLength="97.6" clip-path="url(#breeze-build-docs-line-10)">postgres</text><text class="breeze-build-docs-r1" x="219.6" y="264" textLength="36.6" clip-path="url(#breeze-bu [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="288.4" textLength="109.8" clip-path="url(#breeze-build-docs-line-11)">snowflake</text><text class="breeze-build-docs-r1" x="122" y="288.4" textLength="36.6" clip-path="url(#breeze-build-docs-line-11)"> | </text><text class="breeze-build-docs-r4" x="158.6" y="288.4" textLength="73.2" clip-path="url(#breeze-build-docs-line-11)">sqlite</text><text class="breeze-build-docs-r1" x="231.8" y="288.4" textLength="36.6" clip-path="url [...]
-</text><text class="breeze-build-docs-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-12)">
-</text><text class="breeze-build-docs-r1" x="12.2" y="337.2" textLength="195.2" clip-path="url(#breeze-build-docs-line-13)">Build documents.</text><text class="breeze-build-docs-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-13)">
-</text><text class="breeze-build-docs-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-14)">
-</text><text class="breeze-build-docs-r5" x="0" y="386" textLength="24.4" clip-path="url(#breeze-build-docs-line-15)">╭─</text><text class="breeze-build-docs-r5" x="24.4" y="386" textLength="134.2" clip-path="url(#breeze-build-docs-line-15)"> Doc flags </text><text class="breeze-build-docs-r5" x="158.6" y="386" textLength="1281" clip-path="url(#breeze-build-docs-line-15)">────────────────────────────────────────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-build-docs-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-16)">│</text><text class="breeze-build-docs-r4" x="24.4" y="410.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-16)">-</text><text class="breeze-build-docs-r4" x="36.6" y="410.4" textLength="61" clip-path="url(#breeze-build-docs-line-16)">-docs</text><text class="breeze-build-docs-r4" x="97.6" y="410.4" textLength="61" clip-path="url(#breeze-build-docs-line-16)"> [...]
-</text><text class="breeze-build-docs-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">│</text><text class="breeze-build-docs-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">-</text><text class="breeze-build-docs-r4" x="36.6" y="434.8" textLength="134.2" clip-path="url(#breeze-build-docs-line-17)">-spellcheck</text><text class="breeze-build-docs-r4" x="170.8" y="434.8" textLength="61" clip-path="url(#breeze-build-docs- [...]
-</text><text class="breeze-build-docs-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">│</text><text class="breeze-build-docs-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">-</text><text class="breeze-build-docs-r4" x="36.6" y="459.2" textLength="73.2" clip-path="url(#breeze-build-docs-line-18)">-clean</text><text class="breeze-build-docs-r4" x="109.8" y="459.2" textLength="73.2" clip-path="url(#breeze-build-docs-line [...]
-</text><text class="breeze-build-docs-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">│</text><text class="breeze-build-docs-r1" x="329.4" y="483.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-19)">before the build - useful for a clean build.                            [...]
-</text><text class="breeze-build-docs-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-build-docs-line-20)">│</text><text class="breeze-build-docs-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-build-docs-line-20)">-</text><text class="breeze-build-docs-r4" x="36.6" y="508" textLength="48.8" clip-path="url(#breeze-build-docs-line-20)">-one</text><text class="breeze-build-docs-r4" x="85.4" y="508" textLength="122" clip-path="url(#breeze-build-docs-line-20)">-pass- [...]
-</text><text class="breeze-build-docs-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">│</text><text class="breeze-build-docs-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">-</text><text class="breeze-build-docs-r4" x="36.6" y="532.4" textLength="97.6" clip-path="url(#breeze-build-docs-line-21)">-package</text><text class="breeze-build-docs-r4" x="134.2" y="532.4" textLength="85.4" clip-path="url(#breeze-build-docs-li [...]
-</text><text class="breeze-build-docs-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">│</text><text class="breeze-build-docs-r1" x="329.4" y="556.8" textLength="305" clip-path="url(#breeze-build-docs-line-22)">apache-airflow-providers-</text><text class="breeze-build-docs-r7" x="634.4" y="556.8" textLength="122" clip-path="url(#breeze-build-docs-line-22)"><provider></text><text class="breeze-build-docs-r1" x="756.4" y="556.8" textLength="683.2" cli [...]
-</text><text class="breeze-build-docs-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-23)">│</text><text class="breeze-build-docs-r1" x="329.4" y="581.2" textLength="780.8" clip-path="url(#breeze-build-docs-line-23)">full package name. The list of short hand names can be found in </text><text class="breeze-build-docs-r4" x="1110.2" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-li [...]
-</text><text class="breeze-build-docs-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-24)">│</text><text class="breeze-build-docs-r8" x="329.4" y="605.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-24)">(TEXT)                                         [...]
-</text><text class="breeze-build-docs-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-build-docs-line-25)">│</text><text class="breeze-build-docs-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-build-docs-line-25)">-</text><text class="breeze-build-docs-r4" x="36.6" y="630" textLength="85.4" clip-path="url(#breeze-build-docs-line-25)">-github</text><text class="breeze-build-docs-r4" x="122" y="630" textLength="134.2" clip-path="url(#breeze-build-docs-line-25)">-r [...]
-</text><text class="breeze-build-docs-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">│</text><text class="breeze-build-docs-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">-</text><text class="breeze-build-docs-r4" x="36.6" y="654.4" textLength="97.6" clip-path="url(#breeze-build-docs-line-26)">-builder</text><text class="breeze-build-docs-r1" x="329.4" y="654.4" textLength="756.4" clip-path="url(#breeze-build-docs-l [...]
-</text><text class="breeze-build-docs-r5" x="0" y="678.8" textLength="1464" clip-path="url(#breeze-build-docs-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-build-docs-r1" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">
-</text><text class="breeze-build-docs-r5" x="0" y="703.2" textLength="24.4" clip-path="url(#breeze-build-docs-line-28)">╭─</text><text class="breeze-build-docs-r5" x="24.4" y="703.2" textLength="195.2" clip-path="url(#breeze-build-docs-line-28)"> Common options </text><text class="breeze-build-docs-r5" x="219.6" y="703.2" textLength="1220" clip-path="url(#breeze-build-docs-line-28)">─────────────────────────────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-build-docs-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">│</text><text class="breeze-build-docs-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">-</text><text class="breeze-build-docs-r4" x="36.6" y="727.6" textLength="97.6" clip-path="url(#breeze-build-docs-line-29)">-verbose</text><text class="breeze-build-docs-r6" x="158.6" y="727.6" textLength="24.4" clip-path="url(#breeze-build-docs-li [...]
-</text><text class="breeze-build-docs-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">│</text><text class="breeze-build-docs-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">-</text><text class="breeze-build-docs-r4" x="36.6" y="752" textLength="48.8" clip-path="url(#breeze-build-docs-line-30)">-dry</text><text class="breeze-build-docs-r4" x="85.4" y="752" textLength="48.8" clip-path="url(#breeze-build-docs-line-30)">-run< [...]
-</text><text class="breeze-build-docs-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">│</text><text class="breeze-build-docs-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">-</text><text class="breeze-build-docs-r4" x="36.6" y="776.4" textLength="61" clip-path="url(#breeze-build-docs-line-31)">-help</text><text class="breeze-build-docs-r6" x="158.6" y="776.4" textLength="24.4" clip-path="url(#breeze-build-docs-line-31 [...]
-</text><text class="breeze-build-docs-r5" x="0" y="800.8" textLength="1464" clip-path="url(#breeze-build-docs-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-build-docs-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-32)">
+</text><text class="breeze-build-docs-r4" x="12.2" y="239.6" textLength="109.8" clip-path="url(#breeze-build-docs-line-9)">microsoft</text><text class="breeze-build-docs-r1" x="122" y="239.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-9)">.</text><text class="breeze-build-docs-r4" x="134.2" y="239.6" textLength="61" clip-path="url(#breeze-build-docs-line-9)">winrm</text><text class="breeze-build-docs-r1" x="195.2" y="239.6" textLength="36.6" clip-path="url(#breeze-build-doc [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="264" textLength="109.8" clip-path="url(#breeze-build-docs-line-10)">papermill</text><text class="breeze-build-docs-r1" x="122" y="264" textLength="36.6" clip-path="url(#breeze-build-docs-line-10)"> | </text><text class="breeze-build-docs-r4" x="158.6" y="264" textLength="73.2" clip-path="url(#breeze-build-docs-line-10)">plexus</text><text class="breeze-build-docs-r1" x="231.8" y="264" textLength="36.6" clip-path="url(#breeze [...]
+</text><text class="breeze-build-docs-r1" x="12.2" y="288.4" textLength="24.4" clip-path="url(#breeze-build-docs-line-11)">| </text><text class="breeze-build-docs-r4" x="36.6" y="288.4" textLength="48.8" clip-path="url(#breeze-build-docs-line-11)">smtp</text><text class="breeze-build-docs-r1" x="85.4" y="288.4" textLength="36.6" clip-path="url(#breeze-build-docs-line-11)"> | </text><text class="breeze-build-docs-r4" x="122" y="288.4" textLength="109.8" clip-path="url(#bree [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="312.8" textLength="109.8" clip-path="url(#breeze-build-docs-line-12)">providers</text><text class="breeze-build-docs-r1" x="122" y="312.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-12)">-</text><text class="breeze-build-docs-r4" x="134.2" y="312.8" textLength="61" clip-path="url(#breeze-build-docs-line-12)">index</text><text class="breeze-build-docs-r1" x="195.2" y="312.8" textLength="1256.6" clip-path="url(#breeze-buil [...]
+</text><text class="breeze-build-docs-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-13)">
+</text><text class="breeze-build-docs-r1" x="12.2" y="361.6" textLength="195.2" clip-path="url(#breeze-build-docs-line-14)">Build documents.</text><text class="breeze-build-docs-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-14)">
+</text><text class="breeze-build-docs-r1" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-build-docs-line-15)">
+</text><text class="breeze-build-docs-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#breeze-build-docs-line-16)">╭─</text><text class="breeze-build-docs-r5" x="24.4" y="410.4" textLength="134.2" clip-path="url(#breeze-build-docs-line-16)"> Doc flags </text><text class="breeze-build-docs-r5" x="158.6" y="410.4" textLength="1281" clip-path="url(#breeze-build-docs-line-16)">──────────────────────────────────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-build-docs-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">│</text><text class="breeze-build-docs-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">-</text><text class="breeze-build-docs-r4" x="36.6" y="434.8" textLength="61" clip-path="url(#breeze-build-docs-line-17)">-docs</text><text class="breeze-build-docs-r4" x="97.6" y="434.8" textLength="61" clip-path="url(#breeze-build-docs-line-17)"> [...]
+</text><text class="breeze-build-docs-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">│</text><text class="breeze-build-docs-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">-</text><text class="breeze-build-docs-r4" x="36.6" y="459.2" textLength="134.2" clip-path="url(#breeze-build-docs-line-18)">-spellcheck</text><text class="breeze-build-docs-r4" x="170.8" y="459.2" textLength="61" clip-path="url(#breeze-build-docs- [...]
+</text><text class="breeze-build-docs-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">│</text><text class="breeze-build-docs-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">-</text><text class="breeze-build-docs-r4" x="36.6" y="483.6" textLength="73.2" clip-path="url(#breeze-build-docs-line-19)">-clean</text><text class="breeze-build-docs-r4" x="109.8" y="483.6" textLength="73.2" clip-path="url(#breeze-build-docs-line [...]
+</text><text class="breeze-build-docs-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-build-docs-line-20)">│</text><text class="breeze-build-docs-r1" x="329.4" y="508" textLength="1110.2" clip-path="url(#breeze-build-docs-line-20)">before the build - useful for a clean build.                            [...]
+</text><text class="breeze-build-docs-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">│</text><text class="breeze-build-docs-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">-</text><text class="breeze-build-docs-r4" x="36.6" y="532.4" textLength="48.8" clip-path="url(#breeze-build-docs-line-21)">-one</text><text class="breeze-build-docs-r4" x="85.4" y="532.4" textLength="122" clip-path="url(#breeze-build-docs-line-21) [...]
+</text><text class="breeze-build-docs-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">│</text><text class="breeze-build-docs-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">-</text><text class="breeze-build-docs-r4" x="36.6" y="556.8" textLength="97.6" clip-path="url(#breeze-build-docs-line-22)">-package</text><text class="breeze-build-docs-r4" x="134.2" y="556.8" textLength="85.4" clip-path="url(#breeze-build-docs-li [...]
+</text><text class="breeze-build-docs-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-23)">│</text><text class="breeze-build-docs-r1" x="329.4" y="581.2" textLength="305" clip-path="url(#breeze-build-docs-line-23)">apache-airflow-providers-</text><text class="breeze-build-docs-r7" x="634.4" y="581.2" textLength="122" clip-path="url(#breeze-build-docs-line-23)"><provider></text><text class="breeze-build-docs-r1" x="756.4" y="581.2" textLength="683.2" cli [...]
+</text><text class="breeze-build-docs-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-24)">│</text><text class="breeze-build-docs-r1" x="329.4" y="605.6" textLength="780.8" clip-path="url(#breeze-build-docs-line-24)">full package name. The list of short hand names can be found in </text><text class="breeze-build-docs-r4" x="1110.2" y="605.6" textLength="12.2" clip-path="url(#breeze-build-docs-li [...]
+</text><text class="breeze-build-docs-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-build-docs-line-25)">│</text><text class="breeze-build-docs-r8" x="329.4" y="630" textLength="1110.2" clip-path="url(#breeze-build-docs-line-25)">(TEXT)                                         [...]
+</text><text class="breeze-build-docs-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">│</text><text class="breeze-build-docs-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">-</text><text class="breeze-build-docs-r4" x="36.6" y="654.4" textLength="85.4" clip-path="url(#breeze-build-docs-line-26)">-github</text><text class="breeze-build-docs-r4" x="122" y="654.4" textLength="134.2" clip-path="url(#breeze-build-docs-line [...]
+</text><text class="breeze-build-docs-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">│</text><text class="breeze-build-docs-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">-</text><text class="breeze-build-docs-r4" x="36.6" y="678.8" textLength="97.6" clip-path="url(#breeze-build-docs-line-27)">-builder</text><text class="breeze-build-docs-r1" x="329.4" y="678.8" textLength="756.4" clip-path="url(#breeze-build-docs-l [...]
+</text><text class="breeze-build-docs-r5" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-build-docs-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-build-docs-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-28)">
+</text><text class="breeze-build-docs-r5" x="0" y="727.6" textLength="24.4" clip-path="url(#breeze-build-docs-line-29)">╭─</text><text class="breeze-build-docs-r5" x="24.4" y="727.6" textLength="195.2" clip-path="url(#breeze-build-docs-line-29)"> Common options </text><text class="breeze-build-docs-r5" x="219.6" y="727.6" textLength="1220" clip-path="url(#breeze-build-docs-line-29)">─────────────────────────────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-build-docs-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">│</text><text class="breeze-build-docs-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">-</text><text class="breeze-build-docs-r4" x="36.6" y="752" textLength="97.6" clip-path="url(#breeze-build-docs-line-30)">-verbose</text><text class="breeze-build-docs-r6" x="158.6" y="752" textLength="24.4" clip-path="url(#breeze-build-docs-line-30)"> [...]
+</text><text class="breeze-build-docs-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">│</text><text class="breeze-build-docs-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">-</text><text class="breeze-build-docs-r4" x="36.6" y="776.4" textLength="48.8" clip-path="url(#breeze-build-docs-line-31)">-dry</text><text class="breeze-build-docs-r4" x="85.4" y="776.4" textLength="48.8" clip-path="url(#breeze-build-docs-line-31 [...]
+</text><text class="breeze-build-docs-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-32)">│</text><text class="breeze-build-docs-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-32)">-</text><text class="breeze-build-docs-r4" x="36.6" y="800.8" textLength="61" clip-path="url(#breeze-build-docs-line-32)">-help</text><text class="breeze-build-docs-r6" x="158.6" y="800.8" textLength="24.4" clip-path="url(#breeze-build-docs-line-32 [...]
+</text><text class="breeze-build-docs-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-build-docs-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-build-docs-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-33)">
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management_add-back-references.svg b/images/breeze/output_release-management_add-back-references.svg
index ce7c70c8b8..b5fc79d1c6 100644
--- a/images/breeze/output_release-management_add-back-references.svg
+++ b/images/breeze/output_release-management_add-back-references.svg
@@ -134,9 +134,9 @@
</text><text class="breeze-release-management-add-back-references-r4" x="12.2" y="166.4" textLength="97.6" clip-path="url(#breeze-release-management-add-back-references-line-6)">arangodb</text><text class="breeze-release-management-add-back-references-r1" x="109.8" y="166.4" textLength="36.6" clip-path="url(#breeze-release-management-add-back-references-line-6)"> | </text><text class="breeze-release-management-add-back-references-r4" x="146.4" y="166.4" textLength="61" clip-pat [...]
</text><text class="breeze-release-management-add-back-references-r4" x="12.2" y="190.8" textLength="85.4" clip-path="url(#breeze-release-management-add-back-references-line-7)">datadog</text><text class="breeze-release-management-add-back-references-r1" x="97.6" y="190.8" textLength="36.6" clip-path="url(#breeze-release-management-add-back-references-line-7)"> | </text><text class="breeze-release-management-add-back-references-r4" x="134.2" y="190.8" textLength="36.6" clip-pat [...]
</text><text class="breeze-release-management-add-back-references-r4" x="12.2" y="215.2" textLength="109.8" clip-path="url(#breeze-release-management-add-back-references-line-8)">hashicorp</text><text class="breeze-release-management-add-back-references-r1" x="122" y="215.2" textLength="36.6" clip-path="url(#breeze-release-management-add-back-references-line-8)"> | </text><text class="breeze-release-management-add-back-references-r4" x="158.6" y="215.2" textLength="48.8" clip-p [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2" y="239.6" textLength="109.8" clip-path="url(#breeze-release-management-add-back-references-line-9)">microsoft</text><text class="breeze-release-management-add-back-references-r1" x="122" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-9)">.</text><text class="breeze-release-management-add-back-references-r4" x="134.2" y="239.6" textLength="61" clip-path="url(#bree [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2" y="264" textLength="73.2" clip-path="url(#breeze-release-management-add-back-references-line-10)">plexus</text><text class="breeze-release-management-add-back-references-r1" x="85.4" y="264" textLength="36.6" clip-path="url(#breeze-release-management-add-back-references-line-10)"> | </text><text class="breeze-release-management-add-back-references-r4" x="122" y="264" textLength="97.6" clip-path="url( [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2" y="288.4" textLength="109.8" clip-path="url(#breeze-release-management-add-back-references-line-11)">snowflake</text><text class="breeze-release-management-add-back-references-r1" x="122" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-add-back-references-line-11)"> | </text><text class="breeze-release-management-add-back-references-r4" x="158.6" y="288.4" textLength="73.2" clip [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2" y="239.6" textLength="109.8" clip-path="url(#breeze-release-management-add-back-references-line-9)">microsoft</text><text class="breeze-release-management-add-back-references-r1" x="122" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-9)">.</text><text class="breeze-release-management-add-back-references-r4" x="134.2" y="239.6" textLength="61" clip-path="url(#bree [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2" y="264" textLength="109.8" clip-path="url(#breeze-release-management-add-back-references-line-10)">papermill</text><text class="breeze-release-management-add-back-references-r1" x="122" y="264" textLength="36.6" clip-path="url(#breeze-release-management-add-back-references-line-10)"> | </text><text class="breeze-release-management-add-back-references-r4" x="158.6" y="264" textLength="73.2" clip-path= [...]
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="288.4" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-11)">| </text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="288.4" textLength="48.8" clip-path="url(#breeze-release-management-add-back-references-line-11)">smtp</text><text class="breeze-release-management-add-back-references-r1" x="85.4" y="288.4" textLength="36.6" clip-path="url(# [...]
</text><text class="breeze-release-management-add-back-references-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-12)">
</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="337.2" textLength="976" clip-path="url(#breeze-release-management-add-back-references-line-13)">Command to add back references for documentation to make it backward compatible.</text><text class="breeze-release-management-add-back-references-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-13)">
</text><text class="breeze-release-management-add-back-references-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-14)">
diff --git a/images/breeze/output_release-management_generate-issue-content-providers.svg b/images/breeze/output_release-management_generate-issue-content-providers.svg
index 19c291f89d..fe19f7b813 100644
--- a/images/breeze/output_release-management_generate-issue-content-providers.svg
+++ b/images/breeze/output_release-management_generate-issue-content-providers.svg
@@ -147,9 +147,9 @@
</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="12.2" y="166.4" textLength="73.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-6)">celery</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="85.4" y="166.4" textLength="36.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-6)"> | </text><text class="breeze-release-management-generate-issue-cont [...]
</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="12.2" y="190.8" textLength="85.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-7)">discord</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="97.6" y="190.8" textLength="36.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-7)"> | </text><text class="breeze-release-management-generate-issue-con [...]
</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="12.2" y="215.2" textLength="97.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-8)">influxdb</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="109.8" y="215.2" textLength="36.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-8)"> | </text><text class="breeze-release-management-generate-issue-c [...]
-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="12.2" y="239.6" textLength="61" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)">neo4j</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="73.2" y="239.6" textLength="36.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)"> | </text><text class="breeze-release-management-generate-issue-content [...]
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="264" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-10)">| </text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="264" textLength="122" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-10)">salesforce</text><text class="breeze-release-management-generate-issue-content-p [...]
-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="12.2" y="288.4" textLength="85.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)">tabular</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="97.6" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)"> | </text><text class="breeze-release-management-generate-issue-c [...]
+</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="12.2" y="239.6" textLength="61" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)">neo4j</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="73.2" y="239.6" textLength="36.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)"> | </text><text class="breeze-release-management-generate-issue-content [...]
+</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="12.2" y="264" textLength="73.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-10)">presto</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="85.4" y="264" textLength="36.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-10)"> | </text><text class="breeze-release-management-generate-issue-conten [...]
+</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="12.2" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)">ssh</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="48.8" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)"> | </text><text class="breeze-release-management-generate-issue-conte [...]
</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-12)">
</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="337.2" textLength="585.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-13)">Generates content for issue to test the release.</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-13)">
</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-14)">
diff --git a/images/breeze/output_release-management_prepare-provider-documentation.svg b/images/breeze/output_release-management_prepare-provider-documentation.svg
index dfd1b8ec5d..c639e6645d 100644
--- a/images/breeze/output_release-management_prepare-provider-documentation.svg
+++ b/images/breeze/output_release-management_prepare-provider-documentation.svg
@@ -159,9 +159,9 @@
</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="12.2" y="166.4" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-6)">celery</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="85.4" y="166.4" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-6)"> | </text><text class="breeze-release-management-prepare-provider-documentat [...]
</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="12.2" y="190.8" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-7)">discord</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="97.6" y="190.8" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-7)"> | </text><text class="breeze-release-management-prepare-provider-documenta [...]
</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="12.2" y="215.2" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-8)">influxdb</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="109.8" y="215.2" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-8)"> | </text><text class="breeze-release-management-prepare-provider-documen [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="12.2" y="239.6" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)">neo4j</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="73.2" y="239.6" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)"> | </text><text class="breeze-release-management-prepare-provider-documentation [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="264" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-10)">| </text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="264" textLength="122" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-10)">salesforce</text><text class="breeze-release-management-prepare-provider-documentation-r [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="12.2" y="288.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)">tabular</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="97.6" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)"> | </text><text class="breeze-release-management-prepare-provider-documen [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="12.2" y="239.6" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)">neo4j</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="73.2" y="239.6" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)"> | </text><text class="breeze-release-management-prepare-provider-documentation [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="12.2" y="264" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-10)">presto</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="85.4" y="264" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-10)"> | </text><text class="breeze-release-management-prepare-provider-documentatio [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="12.2" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)">ssh</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="48.8" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)"> | </text><text class="breeze-release-management-prepare-provider-documentati [...]
</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-12)">
</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="337.2" textLength="780.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-13)">Prepare CHANGELOG, README and COMMITS information for providers.</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation- [...]
</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-14)">
diff --git a/images/breeze/output_release-management_prepare-provider-packages.svg b/images/breeze/output_release-management_prepare-provider-packages.svg
index c53094a9fe..3d99765b34 100644
--- a/images/breeze/output_release-management_prepare-provider-packages.svg
+++ b/images/breeze/output_release-management_prepare-provider-packages.svg
@@ -144,9 +144,9 @@
</text><text class="breeze-release-management-prepare-provider-packages-r4" x="12.2" y="166.4" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-6)">celery</text><text class="breeze-release-management-prepare-provider-packages-r1" x="85.4" y="166.4" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-6)"> | </text><text class="breeze-release-management-prepare-provider-packages-r4" x="122" y="166.4" [...]
</text><text class="breeze-release-management-prepare-provider-packages-r4" x="12.2" y="190.8" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-7)">discord</text><text class="breeze-release-management-prepare-provider-packages-r1" x="97.6" y="190.8" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-7)"> | </text><text class="breeze-release-management-prepare-provider-packages-r4" x="134.2" y="190 [...]
</text><text class="breeze-release-management-prepare-provider-packages-r4" x="12.2" y="215.2" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-8)">influxdb</text><text class="breeze-release-management-prepare-provider-packages-r1" x="109.8" y="215.2" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-8)"> | </text><text class="breeze-release-management-prepare-provider-packages-r4" x="146.4" y="2 [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="12.2" y="239.6" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)">neo4j</text><text class="breeze-release-management-prepare-provider-packages-r1" x="73.2" y="239.6" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)"> | </text><text class="breeze-release-management-prepare-provider-packages-r4" x="109.8" y="239.6" [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="264" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-10)">| </text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="264" textLength="122" clip-path="url(#breeze-release-management-prepare-provider-packages-line-10)">salesforce</text><text class="breeze-release-management-prepare-provider-packages-r1" x="158.6" y="264" text [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="12.2" y="288.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)">tabular</text><text class="breeze-release-management-prepare-provider-packages-r1" x="97.6" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)"> | </text><text class="breeze-release-management-prepare-provider-packages-r4" x="134.2" y="2 [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r4" x="12.2" y="239.6" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)">neo4j</text><text class="breeze-release-management-prepare-provider-packages-r1" x="73.2" y="239.6" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)"> | </text><text class="breeze-release-management-prepare-provider-packages-r4" x="109.8" y="239.6" [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r4" x="12.2" y="264" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-10)">presto</text><text class="breeze-release-management-prepare-provider-packages-r1" x="85.4" y="264" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-10)"> | </text><text class="breeze-release-management-prepare-provider-packages-r4" x="122" y="264" tex [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r4" x="12.2" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)">ssh</text><text class="breeze-release-management-prepare-provider-packages-r1" x="48.8" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)"> | </text><text class="breeze-release-management-prepare-provider-packages-r4" x="85.4" y="288.4" [...]
</text><text class="breeze-release-management-prepare-provider-packages-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-12)">
</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="337.2" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-13)">Prepare sdist/whl packages of Airflow Providers.</text><text class="breeze-release-management-prepare-provider-packages-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-13)">
</text><text class="breeze-release-management-prepare-provider-packages-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-14)">
diff --git a/images/breeze/output_release-management_publish-docs.svg b/images/breeze/output_release-management_publish-docs.svg
index 764d5fec83..a6ade4e70d 100644
--- a/images/breeze/output_release-management_publish-docs.svg
+++ b/images/breeze/output_release-management_publish-docs.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 977.1999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1001.5999999999999" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -46,7 +46,7 @@
<defs>
<clipPath id="breeze-release-management-publish-docs-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="926.1999999999999" />
+ <rect x="0" y="0" width="1463.0" height="950.5999999999999" />
</clipPath>
<clipPath id="breeze-release-management-publish-docs-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -159,9 +159,12 @@
<clipPath id="breeze-release-management-publish-docs-line-36">
<rect x="0" y="879.9" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-release-management-publish-docs-line-37">
+ <rect x="0" y="904.3" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="975.2" rx="8"/><text class="breeze-release-management-publish-docs-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management publish-docs</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="999.6" rx="8"/><text class="breeze-release-management-publish-docs-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management publish-docs</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -180,35 +183,36 @@
</text><text class="breeze-release-management-publish-docs-r4" x="12.2" y="166.4" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-6)">arangodb</text><text class="breeze-release-management-publish-docs-r1" x="109.8" y="166.4" textLength="36.6" clip-path="url(#breeze-release-management-publish-docs-line-6)"> | </text><text class="breeze-release-management-publish-docs-r4" x="146.4" y="166.4" textLength="61" clip-path="url(#breeze-release-management-p [...]
</text><text class="breeze-release-management-publish-docs-r4" x="12.2" y="190.8" textLength="85.4" clip-path="url(#breeze-release-management-publish-docs-line-7)">datadog</text><text class="breeze-release-management-publish-docs-r1" x="97.6" y="190.8" textLength="36.6" clip-path="url(#breeze-release-management-publish-docs-line-7)"> | </text><text class="breeze-release-management-publish-docs-r4" x="134.2" y="190.8" textLength="36.6" clip-path="url(#breeze-release-management-p [...]
</text><text class="breeze-release-management-publish-docs-r4" x="12.2" y="215.2" textLength="109.8" clip-path="url(#breeze-release-management-publish-docs-line-8)">hashicorp</text><text class="breeze-release-management-publish-docs-r1" x="122" y="215.2" textLength="36.6" clip-path="url(#breeze-release-management-publish-docs-line-8)"> | </text><text class="breeze-release-management-publish-docs-r4" x="158.6" y="215.2" textLength="48.8" clip-path="url(#breeze-release-management [...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2" y="239.6" textLength="109.8" clip-path="url(#breeze-release-management-publish-docs-line-9)">microsoft</text><text class="breeze-release-management-publish-docs-r1" x="122" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-9)">.</text><text class="breeze-release-management-publish-docs-r4" x="134.2" y="239.6" textLength="61" clip-path="url(#breeze-release-management-publish-docs- [...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2" y="264" textLength="73.2" clip-path="url(#breeze-release-management-publish-docs-line-10)">plexus</text><text class="breeze-release-management-publish-docs-r1" x="85.4" y="264" textLength="36.6" clip-path="url(#breeze-release-management-publish-docs-line-10)"> | </text><text class="breeze-release-management-publish-docs-r4" x="122" y="264" textLength="97.6" clip-path="url(#breeze-release-management-publish- [...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2" y="288.4" textLength="109.8" clip-path="url(#breeze-release-management-publish-docs-line-11)">snowflake</text><text class="breeze-release-management-publish-docs-r1" x="122" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-publish-docs-line-11)"> | </text><text class="breeze-release-management-publish-docs-r4" x="158.6" y="288.4" textLength="73.2" clip-path="url(#breeze-release-manageme [...]
-</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-12)">
-</text><text class="breeze-release-management-publish-docs-r1" x="12.2" y="337.2" textLength="707.6" clip-path="url(#breeze-release-management-publish-docs-line-13)">Command to publish generated documentation to airflow-site</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-13)">
-</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-14)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="386" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-15)">╭─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="386" textLength="170.8" clip-path="url(#breeze-release-management-publish-docs-line-15)"> Publish Docs </text><text class="breeze-release-management-publish-docs-r5" x="195.2" y="386" textLength="1244.4" clip-path="url(#breeze-release-manag [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-16)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-16)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="410.4" textLength="109.8" clip-path="url(#breeze-release-management-publish-docs-line-16)" [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-17)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-17)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="434.8" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-17)"> [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-18)">│</text><text class="breeze-release-management-publish-docs-r1" x="427" y="459.2" textLength="305" clip-path="url(#breeze-release-management-publish-docs-line-18)">apache-airflow-providers-</text><text class="breeze-release-management-publish-docs-r7" x="732" y="459.2" textLength="122" clip-path="url(#breeze-release-management-p [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-19)">│</text><text class="breeze-release-management-publish-docs-r1" x="427" y="483.6" textLength="939.4" clip-path="url(#breeze-release-management-publish-docs-line-19)">matching the full package name. The list of short hand names can be found in </text><text [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-20)">│</text><text class="breeze-release-management-publish-docs-r1" x="427" y="508" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-20)">output                            [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-21)">│</text><text class="breeze-release-management-publish-docs-r8" x="427" y="532.4" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-21)">(TEXT)                          & [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-22)">│</text><text class="breeze-release-management-publish-docs-r9" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-22)">*</text><text class="breeze-release-management-publish-docs-r4" x="61" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-22)"> [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="581.2" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-23)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="605.6" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-24)">╭─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="605.6" textLength="219.6" clip-path="url(#breeze-release-management-publish-docs-line-24)"> Parallel running </text><text class="breeze-release-management-publish-docs-r5" x="244" y="605.6" textLength="1195.6" clip-path="url(#breeze-relea [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-25)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-25)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="630" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-25)">-run [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-26)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-26)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="654.4" textLength="146.4" clip-path="url(#breeze-release-management-publish-docs-line-26 [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-27)">│</text><text class="breeze-release-management-publish-docs-r8" x="378.2" y="678.8" textLength="915" clip-path="url(#breeze-release-management-publish-docs-line-27)">(INTEGER RANGE)                         [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-28)">│</text><text class="breeze-release-management-publish-docs-r5" x="378.2" y="703.2" textLength="915" clip-path="url(#breeze-release-management-publish-docs-line-28)">[default: 4; 1<=x<=8]                     & [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-29)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-29)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="727.6" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-29)"> [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-30)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-30)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="752" textLength="73.2" clip-path="url(#breeze-release-management-publish-docs-line-30)">-deb [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-31)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-31)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="776.4" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-31) [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="800.8" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-32)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="825.2" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-33)">╭─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="825.2" textLength="195.2" clip-path="url(#breeze-release-management-publish-docs-line-33)"> Common options </text><text class="breeze-release-management-publish-docs-r5" x="219.6" y="825.2" textLength="1220" clip-path="url(#breeze-release [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-34)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-34)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="849.6" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-34) [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-35)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-35)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="874" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-35)">-dry [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-36)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-36)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="898.4" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-36)"> [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="922.8" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-37)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-37)">
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2" y="239.6" textLength="109.8" clip-path="url(#breeze-release-management-publish-docs-line-9)">microsoft</text><text class="breeze-release-management-publish-docs-r1" x="122" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-9)">.</text><text class="breeze-release-management-publish-docs-r4" x="134.2" y="239.6" textLength="61" clip-path="url(#breeze-release-management-publish-docs- [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2" y="264" textLength="109.8" clip-path="url(#breeze-release-management-publish-docs-line-10)">papermill</text><text class="breeze-release-management-publish-docs-r1" x="122" y="264" textLength="36.6" clip-path="url(#breeze-release-management-publish-docs-line-10)"> | </text><text class="breeze-release-management-publish-docs-r4" x="158.6" y="264" textLength="73.2" clip-path="url(#breeze-release-management-pub [...]
+</text><text class="breeze-release-management-publish-docs-r1" x="12.2" y="288.4" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-11)">| </text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="288.4" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-11)">smtp</text><text class="breeze-release-management-publish-docs-r1" x="85.4" y="288.4" textLength="36.6" clip-path="url(#breeze-release-management-publish-d [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2" y="312.8" textLength="109.8" clip-path="url(#breeze-release-management-publish-docs-line-12)">providers</text><text class="breeze-release-management-publish-docs-r1" x="122" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-12)">-</text><text class="breeze-release-management-publish-docs-r4" x="134.2" y="312.8" textLength="61" clip-path="url(#breeze-release-management-publish-doc [...]
+</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-13)">
+</text><text class="breeze-release-management-publish-docs-r1" x="12.2" y="361.6" textLength="707.6" clip-path="url(#breeze-release-management-publish-docs-line-14)">Command to publish generated documentation to airflow-site</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-14)">
+</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-15)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-16)">╭─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="410.4" textLength="170.8" clip-path="url(#breeze-release-management-publish-docs-line-16)"> Publish Docs </text><text class="breeze-release-management-publish-docs-r5" x="195.2" y="410.4" textLength="1244.4" clip-path="url(#breeze-release [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-17)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-17)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="434.8" textLength="109.8" clip-path="url(#breeze-release-management-publish-docs-line-17)" [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-18)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-18)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="459.2" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-18)"> [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-19)">│</text><text class="breeze-release-management-publish-docs-r1" x="427" y="483.6" textLength="305" clip-path="url(#breeze-release-management-publish-docs-line-19)">apache-airflow-providers-</text><text class="breeze-release-management-publish-docs-r7" x="732" y="483.6" textLength="122" clip-path="url(#breeze-release-management-p [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-20)">│</text><text class="breeze-release-management-publish-docs-r1" x="427" y="508" textLength="939.4" clip-path="url(#breeze-release-management-publish-docs-line-20)">matching the full package name. The list of short hand names can be found in </text><text cla [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-21)">│</text><text class="breeze-release-management-publish-docs-r1" x="427" y="532.4" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-21)">output                          & [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-22)">│</text><text class="breeze-release-management-publish-docs-r8" x="427" y="556.8" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-22)">(TEXT)                          & [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-23)">│</text><text class="breeze-release-management-publish-docs-r9" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-23)">*</text><text class="breeze-release-management-publish-docs-r4" x="61" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-23)"> [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="605.6" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-24)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="630" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-25)">╭─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="630" textLength="219.6" clip-path="url(#breeze-release-management-publish-docs-line-25)"> Parallel running </text><text class="breeze-release-management-publish-docs-r5" x="244" y="630" textLength="1195.6" clip-path="url(#breeze-release-man [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-26)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-26)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="654.4" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-26) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-27)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-27)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="678.8" textLength="146.4" clip-path="url(#breeze-release-management-publish-docs-line-27 [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-28)">│</text><text class="breeze-release-management-publish-docs-r8" x="378.2" y="703.2" textLength="915" clip-path="url(#breeze-release-management-publish-docs-line-28)">(INTEGER RANGE)                         [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-29)">│</text><text class="breeze-release-management-publish-docs-r5" x="378.2" y="727.6" textLength="915" clip-path="url(#breeze-release-management-publish-docs-line-29)">[default: 4; 1<=x<=8]                     & [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-30)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-30)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="752" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-30)">-skip< [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-31)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-31)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="776.4" textLength="73.2" clip-path="url(#breeze-release-management-publish-docs-line-31) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-32)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-32)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="800.8" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-32) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-33)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="849.6" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-34)">╭─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="849.6" textLength="195.2" clip-path="url(#breeze-release-management-publish-docs-line-34)"> Common options </text><text class="breeze-release-management-publish-docs-r5" x="219.6" y="849.6" textLength="1220" clip-path="url(#breeze-release [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-35)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-35)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="874" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-35)">-ver [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-36)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-36)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="898.4" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-36) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-37)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-37)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="922.8" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-37)"> [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="947.2" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-38)">
</text>
</g>
</g>
diff --git a/images/breeze/output_sbom_generate-providers-requirements.svg b/images/breeze/output_sbom_generate-providers-requirements.svg
index f853a6f7d4..1d5d38d00e 100644
--- a/images/breeze/output_sbom_generate-providers-requirements.svg
+++ b/images/breeze/output_sbom_generate-providers-requirements.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 928.4" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 952.8" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-sbom-generate-providers-requirements-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="877.4" />
+ <rect x="0" y="0" width="1463.0" height="901.8" />
</clipPath>
<clipPath id="breeze-sbom-generate-providers-requirements-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -150,9 +150,12 @@
<clipPath id="breeze-sbom-generate-providers-requirements-line-34">
<rect x="0" y="831.1" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-sbom-generate-providers-requirements-line-35">
+ <rect x="0" y="855.5" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="926.4" rx="8"/><text class="breeze-sbom-generate-providers-requirements-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: sbom generate-providers-requirements</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="950.8" rx="8"/><text class="breeze-sbom-generate-providers-requirements-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: sbom generate-providers-requirements</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -178,26 +181,27 @@
</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="337.2" textLength="1159" clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">databricks | datadog | dbt.cloud | dingding | discord | docker | elasticsearch  [...]
</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="361.6" textLength="1159" clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">facebook | ftp | github | google | grpc | hashicorp | http | imap |& [...]
</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="386" textLength="1159" clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql |  [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="410.4" textLength="1159" clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">odbc | openfaas | openlineage | opsgenie | oracle | pagerduty | papermill | [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="434.8" textLength="1159" clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">presto | redis | salesforce | samba | segment | sendgrid | sftp | singula [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="459.2" textLength="1159" clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">snowflake | sqlite | ssh | tableau | tabular | telegram | trino | vertica [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="483.6" textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="508" textLength="1464" clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="532.4" textLength="24.4" clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">╭─</text><text class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="532.4" textLength="219.6" clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)"> Parallel running </text><text class="breeze-sbom-generate-providers-requirements-r5" x="244" y="532.4" textLength="1195.6" cli [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="556.8" textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="581.2" textLength="146.4" clip-path="url(#breeze-sbom-generate- [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="378.2" y="605.6" textLength="915" clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">(INTEGER RANGE)                     [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">│</text><text class="breeze-sbom-generate-providers-requirements-r5" x="378.2" y="630" textLength="915" clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">[default: 4; 1<=x<=8]                   [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="654.4" textLength="61" clip-path="url(#breeze-sbom-generate-pro [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="678.8" textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="703.2" textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="727.6" textLength="1464" clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="752" textLength="24.4" clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">╭─</text><text class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="752" textLength="195.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)"> Common options </text><text class="breeze-sbom-generate-providers-requirements-r5" x="219.6" y="752" textLength="1220" clip-path=" [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="776.4" textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="800.8" textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="825.2" textLength="85.4" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="849.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="849.6" textLength="61" clip-path="url(#breeze-sbom-generate-pro [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="874" textLength="1464" clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="410.4" textLength="1159" clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">odbc | openfaas | openlineage | opensearch | opsgenie | oracle | pagerduty |&# [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="434.8" textLength="1159" clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">| postgres | presto | redis | salesforce | samba | segment | sendgrid |&# [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="459.2" textLength="1159" clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">slack | smtp | snowflake | sqlite | ssh | tableau | tabular | telegram [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="483.6" textLength="1159" clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">yandex | zendesk)                   &# [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="508" textLength="73.2" clip-path="url(#breeze-sbom-generate-provide [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="532.4" textLength="1464" clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="556.8" textLength="24.4" clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">╭─</text><text class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="556.8" textLength="219.6" clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)"> Parallel running </text><text class="breeze-sbom-generate-providers-requirements-r5" x="244" y="556.8" textLength="1195.6" cli [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="581.2" textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="605.6" textLength="146.4" clip-path="url(#breeze-sbom-generate- [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">│</text><text class="breeze-sbom-generate-providers-requirements-r6" x="378.2" y="630" textLength="915" clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">(INTEGER RANGE)                     &# [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">│</text><text class="breeze-sbom-generate-providers-requirements-r5" x="378.2" y="654.4" textLength="915" clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">[default: 4; 1<=x<=8]                   [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="678.8" textLength="61" clip-path="url(#breeze-sbom-generate-pro [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="703.2" textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="727.6" textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="752" textLength="1464" clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="776.4" textLength="24.4" clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">╭─</text><text class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="776.4" textLength="195.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)"> Common options </text><text class="breeze-sbom-generate-providers-requirements-r5" x="219.6" y="776.4" textLength="1220" clip- [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="800.8" textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="825.2" textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="849.6" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="849.6" textLength="85.4" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">│</text><text class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="874" textLength="61" clip-path="url(#breeze-sbom-generate-providers [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" y="898.4" textLength="1464" clip-path="url(#breeze-sbom-generate-providers-requirements-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-sbom-generate-providers-requirements-line-36)">
</text>
</g>
</g>
diff --git a/tests/providers/opensearch/__init__.py b/tests/providers/opensearch/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/tests/providers/opensearch/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/tests/providers/opensearch/conftest.py b/tests/providers/opensearch/conftest.py
new file mode 100644
index 0000000000..b369fa30b8
--- /dev/null
+++ b/tests/providers/opensearch/conftest.py
@@ -0,0 +1,60 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+from typing import Any
+
+import pytest
+
+from airflow.models import Connection
+from airflow.providers.opensearch.hooks.opensearch import OpenSearchHook
+from airflow.utils import db
+
+MOCK_RETURN = {"status": "test"}
+
+
+class MockSearch(OpenSearchHook):
+ # Mock class to override the Hook for monkeypatching
+ def client(self) -> None:
+ return None
+
+ def search(self, query: dict, index_name: str, **kwargs: Any) -> Any:
+ return MOCK_RETURN
+
+ def index(self, document: dict, index_name: str, doc_id: int, **kwargs: Any) -> Any:
+ return doc_id
+
+
+@pytest.fixture
+def mock_hook(monkeypatch):
+ monkeypatch.setattr(OpenSearchHook, "search", MockSearch.search)
+ monkeypatch.setattr(OpenSearchHook, "client", MockSearch.client)
+ monkeypatch.setattr(OpenSearchHook, "index", MockSearch.index)
+
+
+@pytest.fixture(autouse=True)
+def setup_connection():
+ # We need to set up a Connection into the database for all tests.
+ db.merge_conn(
+ Connection(
+ conn_id="opensearch_default",
+ conn_type="opensearch",
+ host="myopensearch.com",
+ login="test_user",
+ password="test",
+ )
+ )
diff --git a/tests/providers/opensearch/hooks/__init__.py b/tests/providers/opensearch/hooks/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/tests/providers/opensearch/hooks/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/tests/providers/opensearch/hooks/test_opensearch.py b/tests/providers/opensearch/hooks/test_opensearch.py
new file mode 100644
index 0000000000..0a39e9db3b
--- /dev/null
+++ b/tests/providers/opensearch/hooks/test_opensearch.py
@@ -0,0 +1,37 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+from airflow.providers.opensearch.hooks.opensearch import OpenSearchHook
+
+MOCK_SEARCH_RETURN = {"status": "test"}
+
+
+class TestOpenSearchHook:
+ def test_hook_search(self, mock_hook):
+ self.hook = OpenSearchHook(open_search_conn_id="opensearch_default", log_query=True)
+ result = self.hook.search(
+ index_name="testIndex",
+ query={"size": 1, "query": {"multi_match": {"query": "test", "fields": ["testField"]}}},
+ )
+
+ assert result == MOCK_SEARCH_RETURN
+
+ def test_hook_index(self, mock_hook):
+ self.hook = OpenSearchHook(open_search_conn_id="opensearch_default", log_query=True)
+ result = self.hook.index(index_name="test_index", document={"title": "Monty Python"}, doc_id=3)
+ assert result == 3
diff --git a/tests/providers/opensearch/operators/__init__.py b/tests/providers/opensearch/operators/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/tests/providers/opensearch/operators/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/tests/providers/opensearch/operators/test_opensearch.py b/tests/providers/opensearch/operators/test_opensearch.py
new file mode 100644
index 0000000000..f854ac1bf7
--- /dev/null
+++ b/tests/providers/opensearch/operators/test_opensearch.py
@@ -0,0 +1,125 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import pytest
+from opensearchpy import Document, Keyword, Text
+
+from airflow.models import DAG
+from airflow.providers.opensearch.operators.opensearch import (
+ OpenSearchAddDocumentOperator,
+ OpenSearchCreateIndexOperator,
+ OpenSearchQueryOperator,
+)
+from airflow.utils.timezone import datetime
+
+TEST_DAG_ID = "unit_tests"
+DEFAULT_DATE = datetime(2018, 1, 1)
+EXPECTED_SEARCH_RETURN = {"status": "test"}
+
+
+class FakeDocument(Document):
+ title = Text(fields={"raw": Keyword()})
+ author = Text()
+ published = Text()
+
+ def save(self, **kwargs):
+ return super().save(**kwargs)
+
+
+@pytest.fixture
+def dag_setup():
+ return DAG(
+ f"{TEST_DAG_ID}test_schedule_dag_once",
+ default_args={
+ "owner": "airflow",
+ "start_date": DEFAULT_DATE,
+ },
+ schedule="@once",
+ )
+
+
+class TestOpenSearchQueryOperator:
+ def setup_method(self, dag_setup):
+ self.dag = dag_setup
+
+ self.open_search = OpenSearchQueryOperator(
+ task_id="test_opensearch_query_operator",
+ index_name="test_index",
+ query={
+ "size": 5,
+ "query": {"multi_match": {"query": "test", "fields": ["test_title^2", "test_type"]}},
+ },
+ )
+
+ def test_init(self):
+ assert self.open_search.task_id == "test_opensearch_query_operator"
+ assert self.open_search.opensearch_conn_id == "opensearch_default"
+ assert self.open_search.query["size"] == 5
+
+ def test_search_query(self, mock_hook):
+ result = self.open_search.execute({})
+ assert result == EXPECTED_SEARCH_RETURN
+
+
+class TestOpenSearchCreateIndexOperator:
+ # This test does not test execute logic because there is only a redirect to the OpenSearch
+ # client.
+ def setup_method(self, dag_setup):
+
+ self.dag = dag_setup
+
+ self.open_search = OpenSearchCreateIndexOperator(
+ task_id="test_opensearch_query_operator", index_name="test_index", index_body={"test": 1}
+ )
+
+ def test_init(self):
+ assert self.open_search.task_id == "test_opensearch_query_operator"
+ assert self.open_search.opensearch_conn_id == "opensearch_default"
+ assert self.open_search.index_name == "test_index"
+
+
+class TestOpenSearchAddDocumentOperator:
+ def setup_method(self, dag_setup):
+ self.dag = dag_setup
+
+ self.open_search = OpenSearchAddDocumentOperator(
+ task_id="test_opensearch_doc_operator",
+ index_name="test_index",
+ document={"title": "Monty Python"},
+ doc_id=1,
+ )
+
+ self.open_search_with_doc_class = OpenSearchAddDocumentOperator(
+ task_id="test_opensearch_doc_class_operator",
+ doc_class=FakeDocument(meta={"id": 2}, title="Hamlet", author="Shakespeare", published="1299"),
+ )
+
+ def test_init_with_args(self):
+ assert self.open_search.task_id == "test_opensearch_doc_operator"
+ assert self.open_search.opensearch_conn_id == "opensearch_default"
+ assert self.open_search.index_name == "test_index"
+
+ def test_init_with_class(self):
+ # This operator uses the OpenSearch client method directly, testing here just
+ # confirming that the object is an instance of the class.
+ assert isinstance(self.open_search_with_doc_class.doc_class, FakeDocument)
+ assert self.open_search_with_doc_class.task_id == "test_opensearch_doc_class_operator"
+
+ def test_add_document_using_args(self, mock_hook):
+ result = self.open_search.execute({})
+ assert result == 1
diff --git a/tests/system/providers/opensearch/__init__.py b/tests/system/providers/opensearch/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/tests/system/providers/opensearch/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/tests/system/providers/opensearch/example_opensearch.py b/tests/system/providers/opensearch/example_opensearch.py
new file mode 100644
index 0000000000..b6e82291b1
--- /dev/null
+++ b/tests/system/providers/opensearch/example_opensearch.py
@@ -0,0 +1,129 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+from __future__ import annotations
+
+from datetime import datetime, timedelta
+
+from opensearchpy import Integer, Text
+from opensearchpy.helpers.document import Document
+from opensearchpy.helpers.search import Search
+
+from airflow.models.baseoperator import chain
+from airflow.models.dag import DAG
+from airflow.providers.opensearch.operators.opensearch import (
+ OpenSearchAddDocumentOperator,
+ OpenSearchCreateIndexOperator,
+ OpenSearchQueryOperator,
+)
+
+DAG_ID = "example_opensearch"
+INDEX_NAME = "example_index"
+
+default_args = {
+ "owner": "airflow",
+ "depend_on_past": False,
+ "email_on_failure": False,
+ "email_on_retry": False,
+ "retries": 1,
+ "retry_delay": timedelta(minutes=5),
+}
+
+
+class LogDocument(Document):
+ log_group_id = Integer()
+ logger = Text()
+ message = Text()
+
+ class Index:
+ name = INDEX_NAME
+
+ def save(self, **kwargs):
+ super().save(**kwargs)
+
+
+def load_connections():
+ # Connections needed for this example dag to finish
+ from airflow.models import Connection
+ from airflow.utils import db
+
+ db.merge_conn(
+ Connection(
+ conn_id="opensearch_test", conn_type="opensearch", host="127.0.0.1", login="test", password="test"
+ )
+ )
+
+
+with DAG(
+ dag_id=DAG_ID,
+ start_date=datetime(2021, 1, 1),
+ schedule="@once",
+ catchup=False,
+ tags=["example"],
+ default_args=default_args,
+ description="Examples of OpenSearch Operators",
+) as dag:
+
+ # [START howto_operator_opensearch_create_index]
+ create_index = OpenSearchCreateIndexOperator(
+ task_id="create_index",
+ index_name=INDEX_NAME,
+ index_body={"settings": {"index": {"number_of_shards": 1}}},
+ )
+ # [END howto_operator_opensearch_create_index]
+
+ # [START howto_operator_opensearch_add_document]
+ add_document_by_args = OpenSearchAddDocumentOperator(
+ task_id="add_document_with_args",
+ index_name=INDEX_NAME,
+ doc_id=1,
+ document={"log_group_id": 1, "logger": "python", "message": "hello world"},
+ )
+
+ add_document_by_class = OpenSearchAddDocumentOperator(
+ task_id="add_document_by_class",
+ doc_class=LogDocument(meta={"id": 2}, log_group_id=2, logger="airflow", message="hello airflow"),
+ )
+ # [END howto_operator_opensearch_add_document]
+
+ # [START howto_operator_opensearch_query]
+ search_low_level = OpenSearchQueryOperator(
+ task_id="low_level_query",
+ index_name="system_test",
+ query={"query": {"bool": {"must": {"match": {"message": "hello world"}}}}},
+ )
+ search_object = (
+ Search().index(INDEX_NAME).filter("term", logger="airflow").query("match", message="hello airflow")
+ )
+
+ search_high_level = OpenSearchQueryOperator(task_id="high_level_query", search_object=search_object)
+ # [END howto_operator_opensearch_query]
+
+ chain(create_index, add_document_by_class, add_document_by_args, search_high_level, search_low_level)
+
+ from tests.system.utils.watcher import watcher
+
+ # This test needs watcher in order to properly mark success/failure
+ # when "tearDown" task with trigger rule is part of the DAG
+ list(dag.tasks) >> watcher()
+
+
+from tests.system.utils import get_test_run # noqa: E402
+
+# Needed to run the example DAG with pytest (see: tests/system/README.md#run_via_pytest)
+test_run = get_test_run(dag)