apache-airflow-providers-common-sql 1.27.1rc1__tar.gz → 1.27.2rc1__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.
Files changed (72) hide show
  1. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/PKG-INFO +6 -6
  2. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/README.rst +3 -3
  3. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/changelog.rst +16 -0
  4. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/index.rst +3 -3
  5. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/provider.yaml +2 -1
  6. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/pyproject.toml +3 -3
  7. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/__init__.py +1 -1
  8. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/operators/generic_transfer.py +1 -1
  9. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/operators/test_generic_transfer.py +87 -35
  10. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/operators/test_sql.py +6 -6
  11. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/.latest-doc-only-change.txt +0 -0
  12. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/commits.rst +0 -0
  13. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/conf.py +0 -0
  14. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/connections.rst +0 -0
  15. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/dataframes.rst +0 -0
  16. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/dialects.rst +0 -0
  17. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/installing-providers-from-sources.rst +0 -0
  18. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/integration-logos/sql.png +0 -0
  19. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/operators.rst +0 -0
  20. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/security.rst +0 -0
  21. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/docs/supported-database-types.rst +0 -0
  22. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/__init__.py +0 -0
  23. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/__init__.py +0 -0
  24. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/__init__.py +0 -0
  25. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/LICENSE +0 -0
  26. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/README_API.md +0 -0
  27. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/dialects/__init__.py +0 -0
  28. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/dialects/dialect.py +0 -0
  29. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/dialects/dialect.pyi +0 -0
  30. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/doc/adr/0001-record-architecture-decisions.md +0 -0
  31. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/doc/adr/0002-return-common-data-structure-from-dbapihook-derived-hooks.md +0 -0
  32. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/doc/adr/0003-introduce-notion-of-dialects-in-dbapihook.md +0 -0
  33. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/get_provider_info.py +0 -0
  34. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/get_provider_info.pyi +0 -0
  35. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/hooks/__init__.py +0 -0
  36. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/hooks/handlers.py +0 -0
  37. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/hooks/handlers.pyi +0 -0
  38. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/hooks/sql.py +0 -0
  39. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/hooks/sql.pyi +0 -0
  40. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/operators/__init__.py +0 -0
  41. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/operators/generic_transfer.pyi +0 -0
  42. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/operators/sql.py +0 -0
  43. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/sensors/__init__.py +0 -0
  44. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/sensors/sql.py +0 -0
  45. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/sensors/sql.pyi +0 -0
  46. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/triggers/__init__.py +0 -0
  47. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/triggers/sql.py +0 -0
  48. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/src/airflow/providers/common/sql/triggers/sql.pyi +0 -0
  49. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/conftest.py +0 -0
  50. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/system/__init__.py +0 -0
  51. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/system/common/__init__.py +0 -0
  52. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/system/common/sql/__init__.py +0 -0
  53. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/system/common/sql/example_generic_transfer.py +0 -0
  54. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/system/common/sql/example_sql_column_table_check.py +0 -0
  55. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/system/common/sql/example_sql_execute_query.py +0 -0
  56. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/system/common/sql/example_sql_threshold_check.py +0 -0
  57. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/__init__.py +0 -0
  58. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/__init__.py +0 -0
  59. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/__init__.py +0 -0
  60. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/dialects/__init__.py +0 -0
  61. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/dialects/test_dialect.py +0 -0
  62. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/hooks/__init__.py +0 -0
  63. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/hooks/test_dbapi.py +0 -0
  64. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/hooks/test_handlers.py +0 -0
  65. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/hooks/test_sql.py +0 -0
  66. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/hooks/test_sqlparse.py +0 -0
  67. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/operators/__init__.py +0 -0
  68. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/operators/test_sql_execute.py +0 -0
  69. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/sensors/__init__.py +0 -0
  70. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/sensors/test_sql.py +0 -0
  71. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/triggers/__init__.py +0 -0
  72. {apache_airflow_providers_common_sql-1.27.1rc1 → apache_airflow_providers_common_sql-1.27.2rc1}/tests/unit/common/sql/triggers/test_sql.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-common-sql
3
- Version: 1.27.1rc1
3
+ Version: 1.27.2rc1
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.staged.apache.org/docs/apache-airflow-providers-common-sql/1.27.1/changelog.html
32
- Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-common-sql/1.27.1
31
+ Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-common-sql/1.27.2/changelog.html
32
+ Project-URL: Documentation, https://airflow.staged.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.1``
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.1/>`_.
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.1/changelog.html>`_.
122
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.27.2/changelog.html>`_.
123
123
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  Package ``apache-airflow-providers-common-sql``
25
25
 
26
- Release: ``1.27.1``
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.1/>`_.
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.1/changelog.html>`_.
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.1
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.1 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.1.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.1.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.1.tar.gz.sha512>`__)
137
- * `The apache-airflow-providers-common-sql 1.27.1 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.1-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.1-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-1.27.1-py3-none-any.whl.sha512>`__)
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: 1747132237
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.1rc1"
28
+ version = "1.27.2rc1"
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.staged.apache.org/docs/apache-airflow-providers-common-sql/1.27.1"
126
- "Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-common-sql/1.27.1/changelog.html"
125
+ "Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-common-sql/1.27.2"
126
+ "Changelog" = "https://airflow.staged.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.1"
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.destination_hook.get_records(self.sql)
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
- def create_get_records_side_effect():
219
- records = [
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 AIRFLOW_V_3_0_PLUS:
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 AIRFLOW_V_3_0_PLUS:
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 AIRFLOW_V_3_0_PLUS:
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 AIRFLOW_V_3_0_PLUS:
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 AIRFLOW_V_3_0_PLUS:
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: