apache-airflow-providers-common-sql 1.27.1__tar.gz → 1.27.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of apache-airflow-providers-common-sql might be problematic. Click here for more details.
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/PKG-INFO +6 -6
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/README.rst +3 -3
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/changelog.rst +16 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/index.rst +3 -3
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/provider.yaml +2 -1
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/pyproject.toml +3 -3
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/__init__.py +1 -1
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/operators/generic_transfer.py +1 -1
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/operators/test_generic_transfer.py +87 -35
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/operators/test_sql.py +6 -6
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/.latest-doc-only-change.txt +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/commits.rst +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/conf.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/connections.rst +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/dataframes.rst +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/dialects.rst +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/installing-providers-from-sources.rst +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/integration-logos/sql.png +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/operators.rst +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/security.rst +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/docs/supported-database-types.rst +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/LICENSE +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/README_API.md +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/dialects/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/dialects/dialect.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/dialects/dialect.pyi +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/doc/adr/0001-record-architecture-decisions.md +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/doc/adr/0002-return-common-data-structure-from-dbapihook-derived-hooks.md +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/doc/adr/0003-introduce-notion-of-dialects-in-dbapihook.md +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/get_provider_info.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/get_provider_info.pyi +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/hooks/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/hooks/handlers.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/hooks/handlers.pyi +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/hooks/sql.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/hooks/sql.pyi +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/operators/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/operators/generic_transfer.pyi +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/operators/sql.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/sensors/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/sensors/sql.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/sensors/sql.pyi +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/triggers/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/triggers/sql.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/src/airflow/providers/common/sql/triggers/sql.pyi +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/conftest.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/system/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/system/common/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/system/common/sql/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/system/common/sql/example_generic_transfer.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/system/common/sql/example_sql_column_table_check.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/system/common/sql/example_sql_execute_query.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/system/common/sql/example_sql_threshold_check.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/dialects/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/dialects/test_dialect.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/hooks/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/hooks/test_dbapi.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/hooks/test_handlers.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/hooks/test_sql.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/hooks/test_sqlparse.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/operators/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/operators/test_sql_execute.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/sensors/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/sensors/test_sql.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/triggers/__init__.py +0 -0
- {apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/tests/unit/common/sql/triggers/test_sql.py +0 -0
{apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apache-airflow-providers-common-sql
|
|
3
|
-
Version: 1.27.
|
|
3
|
+
Version: 1.27.2
|
|
4
4
|
Summary: Provider package apache-airflow-providers-common-sql for Apache Airflow
|
|
5
5
|
Keywords: airflow-provider,common.sql,airflow,integration
|
|
6
6
|
Author-email: Apache Software Foundation <dev@airflow.apache.org>
|
|
@@ -28,8 +28,8 @@ Requires-Dist: apache-airflow-providers-openlineage ; extra == "openlineage"
|
|
|
28
28
|
Requires-Dist: pandas>=2.1.2,<2.2 ; extra == "pandas"
|
|
29
29
|
Requires-Dist: polars>=1.26.0 ; extra == "polars"
|
|
30
30
|
Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
|
|
31
|
-
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.
|
|
32
|
-
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.
|
|
31
|
+
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.2/changelog.html
|
|
32
|
+
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.2
|
|
33
33
|
Project-URL: Mastodon, https://fosstodon.org/@airflow
|
|
34
34
|
Project-URL: Slack Chat, https://s.apache.org/airflow-slack
|
|
35
35
|
Project-URL: Source Code, https://github.com/apache/airflow
|
|
@@ -63,7 +63,7 @@ Provides-Extra: polars
|
|
|
63
63
|
|
|
64
64
|
Package ``apache-airflow-providers-common-sql``
|
|
65
65
|
|
|
66
|
-
Release: ``1.27.
|
|
66
|
+
Release: ``1.27.2``
|
|
67
67
|
|
|
68
68
|
|
|
69
69
|
`Common SQL Provider <https://en.wikipedia.org/wiki/SQL>`__
|
|
@@ -76,7 +76,7 @@ This is a provider package for ``common.sql`` provider. All classes for this pro
|
|
|
76
76
|
are in ``airflow.providers.common.sql`` python package.
|
|
77
77
|
|
|
78
78
|
You can find package information and changelog for the provider
|
|
79
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.
|
|
79
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.2/>`_.
|
|
80
80
|
|
|
81
81
|
Installation
|
|
82
82
|
------------
|
|
@@ -119,5 +119,5 @@ Dependent package
|
|
|
119
119
|
============================================================================================================== ===============
|
|
120
120
|
|
|
121
121
|
The changelog for the provider package can be found in the
|
|
122
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.
|
|
122
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.2/changelog.html>`_.
|
|
123
123
|
|
{apache_airflow_providers_common_sql-1.27.1 → apache_airflow_providers_common_sql-1.27.2}/README.rst
RENAMED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
Package ``apache-airflow-providers-common-sql``
|
|
25
25
|
|
|
26
|
-
Release: ``1.27.
|
|
26
|
+
Release: ``1.27.2``
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
`Common SQL Provider <https://en.wikipedia.org/wiki/SQL>`__
|
|
@@ -36,7 +36,7 @@ This is a provider package for ``common.sql`` provider. All classes for this pro
|
|
|
36
36
|
are in ``airflow.providers.common.sql`` python package.
|
|
37
37
|
|
|
38
38
|
You can find package information and changelog for the provider
|
|
39
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.
|
|
39
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.2/>`_.
|
|
40
40
|
|
|
41
41
|
Installation
|
|
42
42
|
------------
|
|
@@ -79,4 +79,4 @@ Dependent package
|
|
|
79
79
|
============================================================================================================== ===============
|
|
80
80
|
|
|
81
81
|
The changelog for the provider package can be found in the
|
|
82
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.
|
|
82
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.2/changelog.html>`_.
|
|
@@ -25,6 +25,22 @@
|
|
|
25
25
|
Changelog
|
|
26
26
|
---------
|
|
27
27
|
|
|
28
|
+
1.27.2
|
|
29
|
+
......
|
|
30
|
+
|
|
31
|
+
Bug Fixes
|
|
32
|
+
~~~~~~~~~
|
|
33
|
+
|
|
34
|
+
* ``fix: Use source hook instead of destination hook when reading records in non-paginated mode in GenericTransfer (#50598)``
|
|
35
|
+
|
|
36
|
+
Misc
|
|
37
|
+
~~~~
|
|
38
|
+
|
|
39
|
+
* ``Port ''ti.run'' to Task SDK execution path (#50141)``
|
|
40
|
+
|
|
41
|
+
.. Below changes are excluded from the changelog. Move them to
|
|
42
|
+
appropriate section above if needed. Do not delete the lines(!):
|
|
43
|
+
|
|
28
44
|
1.27.1
|
|
29
45
|
......
|
|
30
46
|
|
|
@@ -79,7 +79,7 @@ apache-airflow-providers-common-sql package
|
|
|
79
79
|
`Common SQL Provider <https://en.wikipedia.org/wiki/SQL>`__
|
|
80
80
|
|
|
81
81
|
|
|
82
|
-
Release: 1.27.
|
|
82
|
+
Release: 1.27.2
|
|
83
83
|
|
|
84
84
|
Provider package
|
|
85
85
|
----------------
|
|
@@ -133,5 +133,5 @@ Downloading official packages
|
|
|
133
133
|
You can download officially released packages and verify their checksums and signatures from the
|
|
134
134
|
`Official Apache Download site <https://downloads.apache.org/airflow/providers/>`_
|
|
135
135
|
|
|
136
|
-
* `The apache-airflow-providers-common-sql 1.27.
|
|
137
|
-
* `The apache-airflow-providers-common-sql 1.27.
|
|
136
|
+
* `The apache-airflow-providers-common-sql 1.27.2 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.2.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.2.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.2.tar.gz.sha512>`__)
|
|
137
|
+
* `The apache-airflow-providers-common-sql 1.27.2 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.2-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.2-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.2-py3-none-any.whl.sha512>`__)
|
|
@@ -22,12 +22,13 @@ description: |
|
|
|
22
22
|
`Common SQL Provider <https://en.wikipedia.org/wiki/SQL>`__
|
|
23
23
|
|
|
24
24
|
state: ready
|
|
25
|
-
source-date-epoch:
|
|
25
|
+
source-date-epoch: 1749896343
|
|
26
26
|
# Note that those versions are maintained by release manager - do not update them manually
|
|
27
27
|
# with the exception of case where other provider in sources has >= new provider version.
|
|
28
28
|
# In such case adding >= NEW_VERSION and bumping to NEW_VERSION in a provider have
|
|
29
29
|
# to be done in the same PR
|
|
30
30
|
versions:
|
|
31
|
+
- 1.27.2
|
|
31
32
|
- 1.27.1
|
|
32
33
|
- 1.27.0
|
|
33
34
|
- 1.26.0
|
|
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
|
|
|
25
25
|
|
|
26
26
|
[project]
|
|
27
27
|
name = "apache-airflow-providers-common-sql"
|
|
28
|
-
version = "1.27.
|
|
28
|
+
version = "1.27.2"
|
|
29
29
|
description = "Provider package apache-airflow-providers-common-sql for Apache Airflow"
|
|
30
30
|
readme = "README.rst"
|
|
31
31
|
authors = [
|
|
@@ -122,8 +122,8 @@ apache-airflow-providers-common-sql = {workspace = true}
|
|
|
122
122
|
apache-airflow-providers-standard = {workspace = true}
|
|
123
123
|
|
|
124
124
|
[project.urls]
|
|
125
|
-
"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.
|
|
126
|
-
"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.
|
|
125
|
+
"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.2"
|
|
126
|
+
"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.2/changelog.html"
|
|
127
127
|
"Bug Tracker" = "https://github.com/apache/airflow/issues"
|
|
128
128
|
"Source Code" = "https://github.com/apache/airflow"
|
|
129
129
|
"Slack Chat" = "https://s.apache.org/airflow-slack"
|
|
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
|
|
|
29
29
|
|
|
30
30
|
__all__ = ["__version__"]
|
|
31
31
|
|
|
32
|
-
__version__ = "1.27.
|
|
32
|
+
__version__ = "1.27.2"
|
|
33
33
|
|
|
34
34
|
if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
|
|
35
35
|
"2.10.0"
|
|
@@ -162,7 +162,7 @@ class GenericTransfer(BaseOperator):
|
|
|
162
162
|
self.log.info("Extracting data from %s", self.source_conn_id)
|
|
163
163
|
self.log.info("Executing: \n %s", self.sql)
|
|
164
164
|
|
|
165
|
-
results = self.
|
|
165
|
+
results = self.source_hook.get_records(self.sql)
|
|
166
166
|
|
|
167
167
|
self.log.info("Inserting rows into %s", self.destination_conn_id)
|
|
168
168
|
self.destination_hook.insert_rows(table=self.destination_table, rows=results, **self.insert_args)
|
|
@@ -24,6 +24,7 @@ from unittest import mock
|
|
|
24
24
|
from unittest.mock import MagicMock
|
|
25
25
|
|
|
26
26
|
import pytest
|
|
27
|
+
from more_itertools import flatten
|
|
27
28
|
|
|
28
29
|
from airflow.exceptions import AirflowProviderDeprecationWarning
|
|
29
30
|
from airflow.models.connection import Connection
|
|
@@ -34,7 +35,7 @@ from airflow.providers.postgres.hooks.postgres import PostgresHook
|
|
|
34
35
|
from airflow.utils import timezone
|
|
35
36
|
|
|
36
37
|
from tests_common.test_utils.compat import GenericTransfer
|
|
37
|
-
from tests_common.test_utils.operators.run_deferrable import execute_operator
|
|
38
|
+
from tests_common.test_utils.operators.run_deferrable import execute_operator, mock_context
|
|
38
39
|
from tests_common.test_utils.providers import get_provider_min_airflow_version
|
|
39
40
|
|
|
40
41
|
pytestmark = pytest.mark.db_test
|
|
@@ -43,6 +44,12 @@ DEFAULT_DATE = timezone.datetime(2015, 1, 1)
|
|
|
43
44
|
DEFAULT_DATE_ISO = DEFAULT_DATE.isoformat()
|
|
44
45
|
DEFAULT_DATE_DS = DEFAULT_DATE_ISO[:10]
|
|
45
46
|
TEST_DAG_ID = "unit_test_dag"
|
|
47
|
+
INSERT_ARGS = {
|
|
48
|
+
"commit_every": 1000, # Number of rows inserted in each batch
|
|
49
|
+
"executemany": True, # Enable batch inserts
|
|
50
|
+
"fast_executemany": True, # Boost performance for MSSQL inserts
|
|
51
|
+
"replace": True, # Used for upserts/merges if needed
|
|
52
|
+
}
|
|
46
53
|
counter = 0
|
|
47
54
|
|
|
48
55
|
|
|
@@ -175,6 +182,44 @@ class TestPostgres:
|
|
|
175
182
|
|
|
176
183
|
|
|
177
184
|
class TestGenericTransfer:
|
|
185
|
+
mocked_source_hook = MagicMock(conn_name_attr="my_source_conn_id", spec=DbApiHook)
|
|
186
|
+
mocked_destination_hook = MagicMock(conn_name_attr="my_destination_conn_id", spec=DbApiHook)
|
|
187
|
+
mocked_hooks = {
|
|
188
|
+
"my_source_conn_id": mocked_source_hook,
|
|
189
|
+
"my_destination_conn_id": mocked_destination_hook,
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
@classmethod
|
|
193
|
+
def get_hook(cls, conn_id: str, hook_params: dict | None = None):
|
|
194
|
+
return cls.mocked_hooks[conn_id]
|
|
195
|
+
|
|
196
|
+
@classmethod
|
|
197
|
+
def get_connection(cls, conn_id: str):
|
|
198
|
+
mocked_hook = cls.get_hook(conn_id=conn_id)
|
|
199
|
+
mocked_conn = MagicMock(conn_id=conn_id, spec=Connection)
|
|
200
|
+
mocked_conn.get_hook.return_value = mocked_hook
|
|
201
|
+
return mocked_conn
|
|
202
|
+
|
|
203
|
+
def setup_method(self):
|
|
204
|
+
# Reset mock states before each test
|
|
205
|
+
self.mocked_source_hook.reset_mock()
|
|
206
|
+
self.mocked_destination_hook.reset_mock()
|
|
207
|
+
|
|
208
|
+
# Set up the side effect for paginated read
|
|
209
|
+
records = [
|
|
210
|
+
[[1, 2], [11, 12], [3, 4], [13, 14]],
|
|
211
|
+
[[3, 4], [13, 14]],
|
|
212
|
+
]
|
|
213
|
+
|
|
214
|
+
def get_records_side_effect(sql: str):
|
|
215
|
+
if records:
|
|
216
|
+
if "LIMIT" not in sql:
|
|
217
|
+
return list(flatten(records))
|
|
218
|
+
return records.pop(0)
|
|
219
|
+
return []
|
|
220
|
+
|
|
221
|
+
self.mocked_source_hook.get_records.side_effect = get_records_side_effect
|
|
222
|
+
|
|
178
223
|
def test_templated_fields(self):
|
|
179
224
|
dag = DAG(
|
|
180
225
|
"test_dag",
|
|
@@ -209,40 +254,37 @@ class TestGenericTransfer:
|
|
|
209
254
|
assert operator.preoperator == "my_preoperator"
|
|
210
255
|
assert operator.insert_args == {"commit_every": 5000, "executemany": True, "replace": True}
|
|
211
256
|
|
|
257
|
+
def test_non_paginated_read(self):
|
|
258
|
+
with mock.patch("airflow.hooks.base.BaseHook.get_connection", side_effect=self.get_connection):
|
|
259
|
+
with mock.patch("airflow.hooks.base.BaseHook.get_hook", side_effect=self.get_hook):
|
|
260
|
+
operator = GenericTransfer(
|
|
261
|
+
task_id="transfer_table",
|
|
262
|
+
source_conn_id="my_source_conn_id",
|
|
263
|
+
destination_conn_id="my_destination_conn_id",
|
|
264
|
+
sql="SELECT * FROM HR.EMPLOYEES",
|
|
265
|
+
destination_table="NEW_HR.EMPLOYEES",
|
|
266
|
+
insert_args=INSERT_ARGS,
|
|
267
|
+
execution_timeout=timedelta(hours=1),
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
operator.execute(context=mock_context(task=operator))
|
|
271
|
+
|
|
272
|
+
assert self.mocked_source_hook.get_records.call_count == 1
|
|
273
|
+
assert self.mocked_source_hook.get_records.call_args_list[0].args[0] == "SELECT * FROM HR.EMPLOYEES"
|
|
274
|
+
assert self.mocked_destination_hook.insert_rows.call_count == 1
|
|
275
|
+
assert self.mocked_destination_hook.insert_rows.call_args_list[0].kwargs == {
|
|
276
|
+
**INSERT_ARGS,
|
|
277
|
+
**{"rows": [[1, 2], [11, 12], [3, 4], [13, 14], [3, 4], [13, 14]], "table": "NEW_HR.EMPLOYEES"},
|
|
278
|
+
}
|
|
279
|
+
|
|
212
280
|
def test_paginated_read(self):
|
|
213
281
|
"""
|
|
214
282
|
This unit test is based on the example described in the medium article:
|
|
215
283
|
https://medium.com/apache-airflow/transfering-data-from-sap-hana-to-mssql-using-the-airflow-generictransfer-d29f147a9f1f
|
|
216
284
|
"""
|
|
217
285
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
[[1, 2], [11, 12], [3, 4], [13, 14]],
|
|
221
|
-
[[3, 4], [13, 14]],
|
|
222
|
-
]
|
|
223
|
-
|
|
224
|
-
def side_effect(sql: str):
|
|
225
|
-
if records:
|
|
226
|
-
return records.pop(0)
|
|
227
|
-
return []
|
|
228
|
-
|
|
229
|
-
return side_effect
|
|
230
|
-
|
|
231
|
-
get_records_side_effect = create_get_records_side_effect()
|
|
232
|
-
|
|
233
|
-
def get_hook(conn_id: str, hook_params: dict | None = None):
|
|
234
|
-
mocked_hook = MagicMock(conn_name_attr=conn_id, spec=DbApiHook)
|
|
235
|
-
mocked_hook.get_records.side_effect = get_records_side_effect
|
|
236
|
-
return mocked_hook
|
|
237
|
-
|
|
238
|
-
def get_connection(conn_id: str):
|
|
239
|
-
mocked_hook = get_hook(conn_id=conn_id)
|
|
240
|
-
mocked_conn = MagicMock(conn_id=conn_id, spec=Connection)
|
|
241
|
-
mocked_conn.get_hook.return_value = mocked_hook
|
|
242
|
-
return mocked_conn
|
|
243
|
-
|
|
244
|
-
with mock.patch("airflow.hooks.base.BaseHook.get_connection", side_effect=get_connection):
|
|
245
|
-
with mock.patch("airflow.hooks.base.BaseHook.get_hook", side_effect=get_hook):
|
|
286
|
+
with mock.patch("airflow.hooks.base.BaseHook.get_connection", side_effect=self.get_connection):
|
|
287
|
+
with mock.patch("airflow.hooks.base.BaseHook.get_hook", side_effect=self.get_hook):
|
|
246
288
|
operator = GenericTransfer(
|
|
247
289
|
task_id="transfer_table",
|
|
248
290
|
source_conn_id="my_source_conn_id",
|
|
@@ -250,12 +292,7 @@ class TestGenericTransfer:
|
|
|
250
292
|
sql="SELECT * FROM HR.EMPLOYEES",
|
|
251
293
|
destination_table="NEW_HR.EMPLOYEES",
|
|
252
294
|
page_size=1000, # Fetch data in chunks of 1000 rows for pagination
|
|
253
|
-
insert_args=
|
|
254
|
-
"commit_every": 1000, # Number of rows inserted in each batch
|
|
255
|
-
"executemany": True, # Enable batch inserts
|
|
256
|
-
"fast_executemany": True, # Boost performance for MSSQL inserts
|
|
257
|
-
"replace": True, # Used for upserts/merges if needed
|
|
258
|
-
},
|
|
295
|
+
insert_args=INSERT_ARGS,
|
|
259
296
|
execution_timeout=timedelta(hours=1),
|
|
260
297
|
)
|
|
261
298
|
|
|
@@ -267,6 +304,21 @@ class TestGenericTransfer:
|
|
|
267
304
|
assert events[1].payload["results"] == [[3, 4], [13, 14]]
|
|
268
305
|
assert not events[2].payload["results"]
|
|
269
306
|
|
|
307
|
+
assert self.mocked_source_hook.get_records.call_count == 3
|
|
308
|
+
assert (
|
|
309
|
+
self.mocked_source_hook.get_records.call_args_list[0].args[0]
|
|
310
|
+
== "SELECT * FROM HR.EMPLOYEES LIMIT 1000 OFFSET 0"
|
|
311
|
+
)
|
|
312
|
+
assert self.mocked_destination_hook.insert_rows.call_count == 2
|
|
313
|
+
assert self.mocked_destination_hook.insert_rows.call_args_list[0].kwargs == {
|
|
314
|
+
**INSERT_ARGS,
|
|
315
|
+
**{"rows": [[1, 2], [11, 12], [3, 4], [13, 14]], "table": "NEW_HR.EMPLOYEES"},
|
|
316
|
+
}
|
|
317
|
+
assert self.mocked_destination_hook.insert_rows.call_args_list[1].kwargs == {
|
|
318
|
+
**INSERT_ARGS,
|
|
319
|
+
**{"rows": [[3, 4], [13, 14]], "table": "NEW_HR.EMPLOYEES"},
|
|
320
|
+
}
|
|
321
|
+
|
|
270
322
|
def test_when_provider_min_airflow_version_is_3_0_or_higher_remove_obsolete_method(self):
|
|
271
323
|
"""
|
|
272
324
|
Once this test starts failing due to the fact that the minimum Airflow version is now 3.0.0 or higher
|
|
@@ -48,7 +48,7 @@ from airflow.utils.types import DagRunType
|
|
|
48
48
|
|
|
49
49
|
from tests_common.test_utils.markers import skip_if_force_lowest_dependencies_marker
|
|
50
50
|
from tests_common.test_utils.providers import get_provider_min_airflow_version
|
|
51
|
-
from tests_common.test_utils.version_compat import AIRFLOW_V_3_0_PLUS
|
|
51
|
+
from tests_common.test_utils.version_compat import AIRFLOW_V_3_0_1, AIRFLOW_V_3_0_PLUS
|
|
52
52
|
|
|
53
53
|
if AIRFLOW_V_3_0_PLUS:
|
|
54
54
|
from airflow.models.xcom import XComModel as XCom
|
|
@@ -1224,7 +1224,7 @@ class TestSqlBranch:
|
|
|
1224
1224
|
|
|
1225
1225
|
mock_get_records.return_value = 1
|
|
1226
1226
|
|
|
1227
|
-
if
|
|
1227
|
+
if AIRFLOW_V_3_0_1:
|
|
1228
1228
|
from airflow.exceptions import DownstreamTasksSkipped
|
|
1229
1229
|
|
|
1230
1230
|
with pytest.raises(DownstreamTasksSkipped) as exc_info:
|
|
@@ -1272,7 +1272,7 @@ class TestSqlBranch:
|
|
|
1272
1272
|
mock_get_records = mock_get_db_hook.return_value.get_first
|
|
1273
1273
|
mock_get_records.return_value = true_value
|
|
1274
1274
|
|
|
1275
|
-
if
|
|
1275
|
+
if AIRFLOW_V_3_0_1:
|
|
1276
1276
|
from airflow.exceptions import DownstreamTasksSkipped
|
|
1277
1277
|
|
|
1278
1278
|
with pytest.raises(DownstreamTasksSkipped) as exc_info:
|
|
@@ -1320,7 +1320,7 @@ class TestSqlBranch:
|
|
|
1320
1320
|
mock_get_records = mock_get_db_hook.return_value.get_first
|
|
1321
1321
|
|
|
1322
1322
|
mock_get_records.return_value = false_value
|
|
1323
|
-
if
|
|
1323
|
+
if AIRFLOW_V_3_0_1:
|
|
1324
1324
|
from airflow.exceptions import DownstreamTasksSkipped
|
|
1325
1325
|
|
|
1326
1326
|
with pytest.raises(DownstreamTasksSkipped) as exc_info:
|
|
@@ -1377,7 +1377,7 @@ class TestSqlBranch:
|
|
|
1377
1377
|
mock_get_records = mock_get_db_hook.return_value.get_first
|
|
1378
1378
|
mock_get_records.return_value = [["1"]]
|
|
1379
1379
|
|
|
1380
|
-
if
|
|
1380
|
+
if AIRFLOW_V_3_0_1:
|
|
1381
1381
|
from airflow.exceptions import DownstreamTasksSkipped
|
|
1382
1382
|
|
|
1383
1383
|
with pytest.raises(DownstreamTasksSkipped) as exc_info:
|
|
@@ -1495,7 +1495,7 @@ class TestSqlBranch:
|
|
|
1495
1495
|
mock_get_records = mock_get_db_hook.return_value.get_first
|
|
1496
1496
|
mock_get_records.return_value = [false_value]
|
|
1497
1497
|
|
|
1498
|
-
if
|
|
1498
|
+
if AIRFLOW_V_3_0_1:
|
|
1499
1499
|
from airflow.exceptions import DownstreamTasksSkipped
|
|
1500
1500
|
|
|
1501
1501
|
with pytest.raises(DownstreamTasksSkipped) as exc_info:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|