apache-airflow-providers-databricks 7.7.1rc1__tar.gz → 7.7.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.

Potentially problematic release.


This version of apache-airflow-providers-databricks might be problematic. Click here for more details.

Files changed (95) hide show
  1. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/PKG-INFO +9 -10
  2. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/README.rst +4 -6
  3. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/changelog.rst +32 -0
  4. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/index.rst +5 -8
  5. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/task.rst +1 -1
  6. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/workflow.rst +5 -5
  7. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/provider.yaml +2 -1
  8. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/pyproject.toml +7 -5
  9. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/__init__.py +1 -1
  10. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/hooks/databricks.py +10 -0
  11. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/hooks/databricks_sql.py +2 -4
  12. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/operators/databricks.py +0 -4
  13. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/plugins/databricks_workflow.py +25 -18
  14. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/test_databricks.py +42 -1
  15. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/test_databricks_sql.py +15 -18
  16. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/test_databricks.py +0 -36
  17. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/test_databricks_workflow.py +0 -1
  18. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/plugins/test_databricks_workflow.py +5 -5
  19. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/sensors/test_databricks.py +2 -0
  20. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/.latest-doc-only-change.txt +0 -0
  21. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/commits.rst +0 -0
  22. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/conf.py +0 -0
  23. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/connections/databricks.rst +0 -0
  24. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/img/databricks_workflow_task_group_airflow_graph_view.png +0 -0
  25. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/img/workflow_plugin_launch_task.png +0 -0
  26. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/img/workflow_plugin_single_task.png +0 -0
  27. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/img/workflow_run_databricks_graph_view.png +0 -0
  28. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/installing-providers-from-sources.rst +0 -0
  29. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/integration-logos/Databricks.png +0 -0
  30. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/copy_into.rst +0 -0
  31. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/index.rst +0 -0
  32. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/jobs_create.rst +0 -0
  33. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/notebook.rst +0 -0
  34. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/repos_create.rst +0 -0
  35. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/repos_delete.rst +0 -0
  36. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/repos_update.rst +0 -0
  37. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/run_now.rst +0 -0
  38. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/sql.rst +0 -0
  39. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/sql_statements.rst +0 -0
  40. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/submit_run.rst +0 -0
  41. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/plugins/index.rst +0 -0
  42. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/plugins/workflow.rst +0 -0
  43. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/security.rst +0 -0
  44. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/__init__.py +0 -0
  45. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/__init__.py +0 -0
  46. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/LICENSE +0 -0
  47. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/exceptions.py +0 -0
  48. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/get_provider_info.py +0 -0
  49. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/hooks/__init__.py +0 -0
  50. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/hooks/databricks_base.py +0 -0
  51. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/operators/__init__.py +0 -0
  52. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/operators/databricks_repos.py +0 -0
  53. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/operators/databricks_sql.py +0 -0
  54. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/operators/databricks_workflow.py +0 -0
  55. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/plugins/__init__.py +0 -0
  56. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/sensors/__init__.py +0 -0
  57. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/sensors/databricks.py +0 -0
  58. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/sensors/databricks_partition.py +0 -0
  59. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/sensors/databricks_sql.py +0 -0
  60. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/triggers/__init__.py +0 -0
  61. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/triggers/databricks.py +0 -0
  62. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/utils/__init__.py +0 -0
  63. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/utils/databricks.py +0 -0
  64. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/utils/mixins.py +0 -0
  65. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/utils/openlineage.py +0 -0
  66. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/version_compat.py +0 -0
  67. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/conftest.py +0 -0
  68. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/__init__.py +0 -0
  69. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/__init__.py +0 -0
  70. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/example_databricks.py +0 -0
  71. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/example_databricks_repos.py +0 -0
  72. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/example_databricks_sensors.py +0 -0
  73. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/example_databricks_sql.py +0 -0
  74. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/example_databricks_workflow.py +0 -0
  75. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/__init__.py +0 -0
  76. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/__init__.py +0 -0
  77. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/__init__.py +0 -0
  78. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/test_databricks_azure_workload_identity.py +0 -0
  79. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/test_databricks_azure_workload_identity_async.py +0 -0
  80. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/test_databricks_base.py +0 -0
  81. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/__init__.py +0 -0
  82. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/test_databricks_copy.py +0 -0
  83. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/test_databricks_repos.py +0 -0
  84. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/test_databricks_sql.py +0 -0
  85. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/plugins/__init__.py +0 -0
  86. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/sensors/__init__.py +0 -0
  87. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/sensors/test_databricks_partition.py +0 -0
  88. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/sensors/test_databricks_sql.py +0 -0
  89. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/test_exceptions.py +0 -0
  90. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/triggers/__init__.py +0 -0
  91. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/triggers/test_databricks.py +0 -0
  92. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/utils/__init__.py +0 -0
  93. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/utils/test_databricks.py +0 -0
  94. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/utils/test_mixins.py +0 -0
  95. {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/utils/test_openlineage.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-databricks
3
- Version: 7.7.1rc1
3
+ Version: 7.7.2rc1
4
4
  Summary: Provider package apache-airflow-providers-databricks for Apache Airflow
5
5
  Keywords: airflow-provider,databricks,airflow,integration
6
6
  Author-email: Apache Software Foundation <dev@airflow.apache.org>
@@ -23,7 +23,6 @@ Classifier: Topic :: System :: Monitoring
23
23
  Requires-Dist: apache-airflow>=2.10.0rc1
24
24
  Requires-Dist: apache-airflow-providers-common-compat>=1.6.0rc1
25
25
  Requires-Dist: apache-airflow-providers-common-sql>=1.27.0rc1
26
- Requires-Dist: apache-airflow-providers-openlineage>=2.3.0rc1
27
26
  Requires-Dist: requests>=2.32.0,<3
28
27
  Requires-Dist: databricks-sql-connector>=4.0.0
29
28
  Requires-Dist: databricks-sqlalchemy>=1.0.2
@@ -35,17 +34,19 @@ Requires-Dist: pyarrow>=16.1.0; python_version < '3.13'
35
34
  Requires-Dist: pyarrow>=18.0.0; python_version >= '3.13'
36
35
  Requires-Dist: azure-identity>=1.3.1 ; extra == "azure-identity"
37
36
  Requires-Dist: apache-airflow-providers-fab>=2.2.0rc1 ; extra == "fab" and ( python_version < '3.13')
37
+ Requires-Dist: apache-airflow-providers-openlineage>=2.3.0rc1 ; extra == "openlineage"
38
38
  Requires-Dist: databricks-sdk==0.10.0 ; extra == "sdk"
39
39
  Requires-Dist: apache-airflow-providers-standard ; extra == "standard"
40
40
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
41
- Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.1/changelog.html
42
- Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.1
41
+ Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.2/changelog.html
42
+ Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.2
43
43
  Project-URL: Mastodon, https://fosstodon.org/@airflow
44
44
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
45
45
  Project-URL: Source Code, https://github.com/apache/airflow
46
46
  Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
47
47
  Provides-Extra: azure-identity
48
48
  Provides-Extra: fab
49
+ Provides-Extra: openlineage
49
50
  Provides-Extra: sdk
50
51
  Provides-Extra: standard
51
52
 
@@ -74,9 +75,8 @@ Provides-Extra: standard
74
75
 
75
76
  Package ``apache-airflow-providers-databricks``
76
77
 
77
- Release: ``7.7.1``
78
+ Release: ``7.7.2``
78
79
 
79
- Release Date: ``|PypiReleaseDate|``
80
80
 
81
81
  `Databricks <https://databricks.com/>`__
82
82
 
@@ -88,12 +88,12 @@ This is a provider package for ``databricks`` provider. All classes for this pro
88
88
  are in ``airflow.providers.databricks`` python package.
89
89
 
90
90
  You can find package information and changelog for the provider
91
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.1/>`_.
91
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.2/>`_.
92
92
 
93
93
  Installation
94
94
  ------------
95
95
 
96
- You can install this package on top of an existing Airflow 2 installation (see ``Requirements`` below
96
+ You can install this package on top of an existing Airflow installation (see ``Requirements`` below
97
97
  for the minimum Airflow version supported) via
98
98
  ``pip install apache-airflow-providers-databricks``
99
99
 
@@ -108,7 +108,6 @@ PIP package Version required
108
108
  ``apache-airflow`` ``>=2.10.0``
109
109
  ``apache-airflow-providers-common-compat`` ``>=1.6.0``
110
110
  ``apache-airflow-providers-common-sql`` ``>=1.27.0``
111
- ``apache-airflow-providers-openlineage`` ``>=2.3.0``
112
111
  ``requests`` ``>=2.32.0,<3``
113
112
  ``databricks-sql-connector`` ``>=4.0.0``
114
113
  ``databricks-sqlalchemy`` ``>=1.0.2``
@@ -143,5 +142,5 @@ Dependent package
143
142
  ================================================================================================================== =================
144
143
 
145
144
  The changelog for the provider package can be found in the
146
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.1/changelog.html>`_.
145
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.2/changelog.html>`_.
147
146
 
@@ -23,9 +23,8 @@
23
23
 
24
24
  Package ``apache-airflow-providers-databricks``
25
25
 
26
- Release: ``7.7.1``
26
+ Release: ``7.7.2``
27
27
 
28
- Release Date: ``|PypiReleaseDate|``
29
28
 
30
29
  `Databricks <https://databricks.com/>`__
31
30
 
@@ -37,12 +36,12 @@ This is a provider package for ``databricks`` provider. All classes for this pro
37
36
  are in ``airflow.providers.databricks`` python package.
38
37
 
39
38
  You can find package information and changelog for the provider
40
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.1/>`_.
39
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.2/>`_.
41
40
 
42
41
  Installation
43
42
  ------------
44
43
 
45
- You can install this package on top of an existing Airflow 2 installation (see ``Requirements`` below
44
+ You can install this package on top of an existing Airflow installation (see ``Requirements`` below
46
45
  for the minimum Airflow version supported) via
47
46
  ``pip install apache-airflow-providers-databricks``
48
47
 
@@ -57,7 +56,6 @@ PIP package Version required
57
56
  ``apache-airflow`` ``>=2.10.0``
58
57
  ``apache-airflow-providers-common-compat`` ``>=1.6.0``
59
58
  ``apache-airflow-providers-common-sql`` ``>=1.27.0``
60
- ``apache-airflow-providers-openlineage`` ``>=2.3.0``
61
59
  ``requests`` ``>=2.32.0,<3``
62
60
  ``databricks-sql-connector`` ``>=4.0.0``
63
61
  ``databricks-sqlalchemy`` ``>=1.0.2``
@@ -92,4 +90,4 @@ Dependent package
92
90
  ================================================================================================================== =================
93
91
 
94
92
  The changelog for the provider package can be found in the
95
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.1/changelog.html>`_.
93
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.2/changelog.html>`_.
@@ -26,6 +26,38 @@
26
26
  Changelog
27
27
  ---------
28
28
 
29
+ 7.7.2
30
+ .....
31
+
32
+
33
+ Release Date: ``|PypiReleaseDate|``
34
+
35
+ Bug Fixes
36
+ ~~~~~~~~~
37
+
38
+ * ``Fix Databricks sqlalchemy URL construction (#54478)``
39
+ * ``Ensures DatabricksWorkflowOperator updates ACL (if available) when resetting a job. (#47827)``
40
+
41
+ Misc
42
+ ~~~~
43
+
44
+ * ``Remove airflow.models.DAG (#54383)``
45
+ * ``chore: change openlineage to optional dependency (#54748)``
46
+ * ``Move DagBag to SDK and make it return SDK DAG objects (#53918)``
47
+
48
+ Doc-only
49
+ ~~~~~~~~
50
+
51
+ * ``Make term Dag consistent in providers docs (#55101)``
52
+
53
+ .. Below changes are excluded from the changelog. Move them to
54
+ appropriate section above if needed. Do not delete the lines(!):
55
+ * ``Switch pre-commit to prek (#54258)``
56
+ * ``Add CI support for SQLAlchemy 2.0 (#52233)``
57
+
58
+ .. Review and move the new changes to one of the sections above:
59
+ * ``Fix Airflow 2 reference in README/index of providers (#55240)``
60
+
29
61
  7.7.1
30
62
  .....
31
63
 
@@ -57,7 +57,7 @@
57
57
  :maxdepth: 1
58
58
  :caption: Resources
59
59
 
60
- Example DAGs <https://github.com/apache/airflow/tree/providers-databricks/|version|/providers/databricks/tests/system/databricks>
60
+ Example Dags <https://github.com/apache/airflow/tree/providers-databricks/|version|/providers/databricks/tests/system/databricks>
61
61
  PyPI Repository <https://pypi.org/project/apache-airflow-providers-databricks/>
62
62
  Installing from sources <installing-providers-from-sources>
63
63
 
@@ -78,9 +78,7 @@ apache-airflow-providers-databricks package
78
78
  `Databricks <https://databricks.com/>`__
79
79
 
80
80
 
81
- Release: 7.7.1
82
-
83
- Release Date: ``|PypiReleaseDate|``
81
+ Release: 7.7.2
84
82
 
85
83
  Provider package
86
84
  ----------------
@@ -91,7 +89,7 @@ All classes for this package are included in the ``airflow.providers.databricks`
91
89
  Installation
92
90
  ------------
93
91
 
94
- You can install this package on top of an existing Airflow 2 installation via
92
+ You can install this package on top of an existing Airflow installation via
95
93
  ``pip install apache-airflow-providers-databricks``.
96
94
  For the minimum Airflow version supported, see ``Requirements`` below.
97
95
 
@@ -106,7 +104,6 @@ PIP package Version required
106
104
  ``apache-airflow`` ``>=2.10.0``
107
105
  ``apache-airflow-providers-common-compat`` ``>=1.6.0``
108
106
  ``apache-airflow-providers-common-sql`` ``>=1.27.0``
109
- ``apache-airflow-providers-openlineage`` ``>=2.3.0``
110
107
  ``requests`` ``>=2.32.0,<3``
111
108
  ``databricks-sql-connector`` ``>=4.0.0``
112
109
  ``databricks-sqlalchemy`` ``>=1.0.2``
@@ -146,5 +143,5 @@ Downloading official packages
146
143
  You can download officially released packages and verify their checksums and signatures from the
147
144
  `Official Apache Download site <https://downloads.apache.org/airflow/providers/>`_
148
145
 
149
- * `The apache-airflow-providers-databricks 7.7.1 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.1.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.1.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.1.tar.gz.sha512>`__)
150
- * `The apache-airflow-providers-databricks 7.7.1 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.1-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.1-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.1-py3-none-any.whl.sha512>`__)
146
+ * `The apache-airflow-providers-databricks 7.7.2 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2.tar.gz.sha512>`__)
147
+ * `The apache-airflow-providers-databricks 7.7.2 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2-py3-none-any.whl.sha512>`__)
@@ -22,7 +22,7 @@ DatabricksTaskOperator
22
22
  ======================
23
23
 
24
24
  Use the :class:`~airflow.providers.databricks.operators.databricks.DatabricksTaskOperator` to launch and monitor
25
- task runs on Databricks as Airflow tasks. This can be used as a standalone operator in a DAG and as well as part of a
25
+ task runs on Databricks as Airflow tasks. This can be used as a standalone operator in a Dag and as well as part of a
26
26
  Databricks Workflow by using it as an operator(task) within the
27
27
  :class:`~airflow.providers.databricks.operators.databricks_workflow.DatabricksWorkflowTaskGroup`.
28
28
 
@@ -28,7 +28,7 @@ Databricks notebook job runs as Airflow tasks. The task group launches a `Databr
28
28
  There are a few advantages to defining your Databricks Workflows in Airflow:
29
29
 
30
30
  ======================================= ============================================= =================================
31
- Authoring interface via Databricks (Web-based with Databricks UI) via Airflow(Code with Airflow DAG)
31
+ Authoring interface via Databricks (Web-based with Databricks UI) via Airflow(Code with Airflow Dag)
32
32
  ======================================= ============================================= =================================
33
33
  Workflow compute pricing ✅ ✅
34
34
  Notebook code in source control ✅ ✅
@@ -36,14 +36,14 @@ Workflow structure in source control ✅
36
36
  Retry from beginning ✅ ✅
37
37
  Retry single task ✅ ✅
38
38
  Task groups within Workflows ✅
39
- Trigger workflows from other DAGs
39
+ Trigger workflows from other Dags
40
40
  Workflow-level parameters ✅
41
41
  ======================================= ============================================= =================================
42
42
 
43
43
  Examples
44
44
  --------
45
45
 
46
- Example of what a DAG looks like with a DatabricksWorkflowTaskGroup
46
+ Example of what a Dag looks like with a DatabricksWorkflowTaskGroup
47
47
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
48
48
  .. exampleinclude:: /../../databricks/tests/system/databricks/example_databricks_workflow.py
49
49
  :language: python
@@ -53,13 +53,13 @@ Example of what a DAG looks like with a DatabricksWorkflowTaskGroup
53
53
  With this example, Airflow will produce a job named ``<dag_name>.test_workflow_<USER>_<GROUP_ID>`` that will
54
54
  run task ``notebook_1`` and then ``notebook_2``. The job will be created in the databricks workspace
55
55
  if it does not already exist. If the job already exists, it will be updated to match
56
- the workflow defined in the DAG.
56
+ the workflow defined in the Dag.
57
57
 
58
58
  The following image displays the resulting Databricks Workflow in the Airflow UI (based on the above example provided)
59
59
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
60
60
  .. image:: ../img/databricks_workflow_task_group_airflow_graph_view.png
61
61
 
62
- The corresponding Databricks Workflow in the Databricks UI for the run triggered from the Airflow DAG is depicted below
62
+ The corresponding Databricks Workflow in the Databricks UI for the run triggered from the Airflow Dag is depicted below
63
63
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
64
64
 
65
65
  .. image:: ../img/workflow_run_databricks_graph_view.png
@@ -22,12 +22,13 @@ description: |
22
22
  `Databricks <https://databricks.com/>`__
23
23
 
24
24
  state: ready
25
- source-date-epoch: 1754503130
25
+ source-date-epoch: 1756876778
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
+ - 7.7.2
31
32
  - 7.7.1
32
33
  - 7.7.0
33
34
  - 7.6.0
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
25
25
 
26
26
  [project]
27
27
  name = "apache-airflow-providers-databricks"
28
- version = "7.7.1rc1"
28
+ version = "7.7.2rc1"
29
29
  description = "Provider package apache-airflow-providers-databricks for Apache Airflow"
30
30
  readme = "README.rst"
31
31
  authors = [
@@ -54,13 +54,12 @@ requires-python = ">=3.10"
54
54
 
55
55
  # The dependencies should be modified in place in the generated file.
56
56
  # Any change in the dependencies is preserved when the file is regenerated
57
- # Make sure to run ``breeze static-checks --type update-providers-dependencies --all-files``
57
+ # Make sure to run ``prek update-providers-dependencies --all-files``
58
58
  # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
59
59
  dependencies = [
60
60
  "apache-airflow>=2.10.0rc1",
61
61
  "apache-airflow-providers-common-compat>=1.6.0rc1",
62
62
  "apache-airflow-providers-common-sql>=1.27.0rc1",
63
- "apache-airflow-providers-openlineage>=2.3.0rc1",
64
63
  "requests>=2.32.0,<3",
65
64
  "databricks-sql-connector>=4.0.0",
66
65
  "databricks-sqlalchemy>=1.0.2",
@@ -88,6 +87,9 @@ dependencies = [
88
87
  "standard" = [
89
88
  "apache-airflow-providers-standard"
90
89
  ]
90
+ "openlineage" = [
91
+ "apache-airflow-providers-openlineage>=2.3.0rc1"
92
+ ]
91
93
 
92
94
  [dependency-groups]
93
95
  dev = [
@@ -131,8 +133,8 @@ apache-airflow-providers-common-sql = {workspace = true}
131
133
  apache-airflow-providers-standard = {workspace = true}
132
134
 
133
135
  [project.urls]
134
- "Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.1"
135
- "Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.1/changelog.html"
136
+ "Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.2"
137
+ "Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.2/changelog.html"
136
138
  "Bug Tracker" = "https://github.com/apache/airflow/issues"
137
139
  "Source Code" = "https://github.com/apache/airflow"
138
140
  "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__ = "7.7.1"
32
+ __version__ = "7.7.2"
33
33
 
34
34
  if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
35
35
  "2.10.0"
@@ -298,6 +298,16 @@ class DatabricksHook(BaseDatabricksHook):
298
298
 
299
299
  :param json: The data used in the new_settings of the request to the ``reset`` endpoint.
300
300
  """
301
+ access_control_list = json.get("access_control_list", None)
302
+ if access_control_list:
303
+ self.log.info(
304
+ "Updating job permission for Databricks workflow job id %s with access_control_list %s",
305
+ job_id,
306
+ access_control_list,
307
+ )
308
+ acl_json = {"access_control_list": access_control_list}
309
+ self.update_job_permission(job_id=int(job_id), json=acl_json)
310
+
301
311
  self._do_api_call(RESET_ENDPOINT, {"job_id": job_id, "new_settings": json})
302
312
 
303
313
  def update_job(self, job_id: str, json: dict) -> None:
@@ -179,7 +179,6 @@ class DatabricksSqlHook(BaseDatabricksHook, DbApiHook):
179
179
 
180
180
  :return: the extracted sqlalchemy.engine.URL object.
181
181
  """
182
- conn = self.get_conn()
183
182
  url_query = {
184
183
  "http_path": self._http_path,
185
184
  "catalog": self.catalog,
@@ -189,9 +188,8 @@ class DatabricksSqlHook(BaseDatabricksHook, DbApiHook):
189
188
  return URL.create(
190
189
  drivername="databricks",
191
190
  username="token",
192
- password=conn.password,
193
- host=conn.host,
194
- port=conn.port,
191
+ password=self._get_token(raise_error=True),
192
+ host=self.host,
195
193
  query=url_query,
196
194
  )
197
195
 
@@ -398,10 +398,6 @@ class DatabricksCreateJobsOperator(BaseOperator):
398
398
  if job_id is None:
399
399
  return self._hook.create_job(self.json)
400
400
  self._hook.reset_job(str(job_id), self.json)
401
- if (access_control_list := self.json.get("access_control_list")) is not None:
402
- acl_json = {"access_control_list": access_control_list}
403
- self._hook.update_job_permission(job_id, normalise_json_content(acl_json))
404
-
405
401
  return job_id
406
402
 
407
403
 
@@ -27,10 +27,8 @@ from flask_appbuilder import BaseView
27
27
  from flask_appbuilder.api import expose
28
28
 
29
29
  from airflow.exceptions import AirflowException, TaskInstanceNotFound
30
- from airflow.models import DagBag
31
- from airflow.models.dag import DAG, clear_task_instances
32
30
  from airflow.models.dagrun import DagRun
33
- from airflow.models.taskinstance import TaskInstance, TaskInstanceKey
31
+ from airflow.models.taskinstance import TaskInstance, TaskInstanceKey, clear_task_instances
34
32
  from airflow.plugins_manager import AirflowPlugin
35
33
  from airflow.providers.databricks.hooks.databricks import DatabricksHook
36
34
  from airflow.providers.databricks.version_compat import AIRFLOW_V_3_0_PLUS, BaseOperatorLink, TaskGroup, XCom
@@ -90,8 +88,15 @@ def get_databricks_task_ids(
90
88
  if not AIRFLOW_V_3_0_PLUS:
91
89
  from airflow.utils.session import NEW_SESSION, provide_session
92
90
 
93
- @provide_session
94
- def _get_dagrun(dag: DAG, run_id: str, session: Session | None = None) -> DagRun:
91
+ def _get_dag(dag_id: str, session: Session):
92
+ from airflow.models.serialized_dag import SerializedDagModel
93
+
94
+ dag = SerializedDagModel.get_dag(dag_id, session=session)
95
+ if not dag:
96
+ raise AirflowException("Dag not found.")
97
+ return dag
98
+
99
+ def _get_dagrun(dag, run_id: str, session: Session) -> DagRun:
95
100
  """
96
101
  Retrieve the DagRun object associated with the specified DAG and run_id.
97
102
 
@@ -107,10 +112,9 @@ if not AIRFLOW_V_3_0_PLUS:
107
112
 
108
113
  @provide_session
109
114
  def _clear_task_instances(
110
- dag_id: str, run_id: str, task_ids: list[str], log: logging.Logger, session: Session | None = None
115
+ dag_id: str, run_id: str, task_ids: list[str], log: logging.Logger, session: Session = NEW_SESSION
111
116
  ) -> None:
112
- dag_bag = DagBag(read_dags_from_db=True)
113
- dag = dag_bag.get_dag(dag_id)
117
+ dag = _get_dag(dag_id, session=session)
114
118
  log.debug("task_ids %s to clear", str(task_ids))
115
119
  dr: DagRun = _get_dagrun(dag, run_id, session=session)
116
120
  tis_to_clear = [ti for ti in dr.get_task_instances() if ti.databricks_task_key in task_ids]
@@ -274,13 +278,8 @@ class WorkflowJobRunLink(BaseOperatorLink, LoggingMixin):
274
278
  ti = get_task_instance(operator, dttm)
275
279
  ti_key = ti.key
276
280
  task_group = operator.task_group
277
-
278
281
  if not task_group:
279
282
  raise AirflowException("Task group is required for generating Databricks Workflow Job Run Link.")
280
-
281
- dag_bag = DagBag(read_dags_from_db=True)
282
- dag = dag_bag.get_dag(ti_key.dag_id)
283
- dag.get_task(ti_key.task_id)
284
283
  self.log.info("Getting link for task %s", ti_key.task_id)
285
284
  if ".launch" not in ti_key.task_id:
286
285
  self.log.debug("Finding the launch task for job run metadata %s", ti_key.task_id)
@@ -375,9 +374,12 @@ class WorkflowJobRepairAllFailedLink(BaseOperatorLink, LoggingMixin):
375
374
  raise AirflowException("Task group is required for generating repair link.")
376
375
  if not task_group.group_id:
377
376
  raise AirflowException("Task group ID is required for generating repair link.")
378
- dag_bag = DagBag(read_dags_from_db=True)
379
- dag = dag_bag.get_dag(ti_key.dag_id)
380
- dr = _get_dagrun(dag, ti_key.run_id)
377
+
378
+ from airflow.utils.session import create_session
379
+
380
+ with create_session() as session:
381
+ dag = _get_dag(ti_key.dag_id, session=session)
382
+ dr = _get_dagrun(dag, ti_key.run_id, session=session)
381
383
  log.debug("Getting failed and skipped tasks for dag run %s", dr.run_id)
382
384
  task_group_sub_tasks = self.get_task_group_children(task_group).items()
383
385
  failed_and_skipped_tasks = self._get_failed_and_skipped_tasks(dr)
@@ -435,9 +437,14 @@ class WorkflowJobRepairSingleTaskLink(BaseOperatorLink, LoggingMixin):
435
437
  task_group.group_id,
436
438
  ti_key.task_id,
437
439
  )
438
- dag_bag = DagBag(read_dags_from_db=True)
439
- dag = dag_bag.get_dag(ti_key.dag_id)
440
+
441
+ from airflow.utils.session import create_session
442
+
443
+ with create_session() as session:
444
+ dag = _get_dag(ti_key.dag_id, session=session)
440
445
  task = dag.get_task(ti_key.task_id)
446
+ if TYPE_CHECKING:
447
+ assert isinstance(task, DatabricksTaskBaseOperator)
441
448
 
442
449
  if ".launch" not in ti_key.task_id:
443
450
  launch_task_id = get_launch_task_id(task_group)
@@ -275,6 +275,13 @@ def list_spark_versions_endpoint(host):
275
275
  return f"https://{host}/api/2.0/clusters/spark-versions"
276
276
 
277
277
 
278
+ def permissions_endpoint(host, job_id):
279
+ """
280
+ Utility function to generate the permissions endpoint given the host
281
+ """
282
+ return f"https://{host}/api/2.0/permissions/jobs/{job_id}"
283
+
284
+
278
285
  def create_valid_response_mock(content):
279
286
  response = mock.MagicMock()
280
287
  response.json.return_value = content
@@ -474,7 +481,7 @@ class TestDatabricksHook:
474
481
  )
475
482
 
476
483
  @mock.patch("airflow.providers.databricks.hooks.databricks_base.requests")
477
- def test_reset(self, mock_requests):
484
+ def test_reset_with_no_acl(self, mock_requests):
478
485
  mock_requests.codes.ok = 200
479
486
  status_code_mock = mock.PropertyMock(return_value=200)
480
487
  type(mock_requests.post.return_value).status_code = status_code_mock
@@ -490,6 +497,40 @@ class TestDatabricksHook:
490
497
  timeout=self.hook.timeout_seconds,
491
498
  )
492
499
 
500
+ @mock.patch("airflow.providers.databricks.hooks.databricks_base.requests")
501
+ def test_reset_with_acl(self, mock_requests):
502
+ mock_requests.codes.ok = 200
503
+ status_code_mock = mock.PropertyMock(return_value=200)
504
+ type(mock_requests.post.return_value).status_code = status_code_mock
505
+ ACCESS_CONTROL_LIST = [{"permission_level": "CAN_MANAGE", "user_name": "test_user"}]
506
+ json = {
507
+ "access_control_list": ACCESS_CONTROL_LIST,
508
+ "name": "test",
509
+ }
510
+
511
+ self.hook.reset_job(JOB_ID, json)
512
+
513
+ mock_requests.post.assert_called_once_with(
514
+ reset_endpoint(HOST),
515
+ json={
516
+ "job_id": JOB_ID,
517
+ "new_settings": json,
518
+ },
519
+ params=None,
520
+ auth=HTTPBasicAuth(LOGIN, PASSWORD),
521
+ headers=self.hook.user_agent_header,
522
+ timeout=self.hook.timeout_seconds,
523
+ )
524
+
525
+ mock_requests.patch.assert_called_once_with(
526
+ permissions_endpoint(HOST, JOB_ID),
527
+ json={"access_control_list": ACCESS_CONTROL_LIST},
528
+ params=None,
529
+ auth=HTTPBasicAuth(LOGIN, PASSWORD),
530
+ headers=self.hook.user_agent_header,
531
+ timeout=self.hook.timeout_seconds,
532
+ )
533
+
493
534
  @mock.patch("airflow.providers.databricks.hooks.databricks_base.requests")
494
535
  def test_update(self, mock_requests):
495
536
  mock_requests.codes.ok = 200
@@ -39,7 +39,6 @@ TASK_ID = "databricks-sql-operator"
39
39
  DEFAULT_CONN_ID = "databricks_default"
40
40
  HOST = "xx.cloud.databricks.com"
41
41
  HOST_WITH_SCHEME = "https://xx.cloud.databricks.com"
42
- PORT = 443
43
42
  TOKEN = "token"
44
43
  HTTP_PATH = "sql/protocolv1/o/1234567890123456/0123-456789-abcd123"
45
44
  SCHEMA = "test_schema"
@@ -112,38 +111,36 @@ def mock_timer():
112
111
  yield mock_timer
113
112
 
114
113
 
115
- def make_mock_connection():
116
- return Connection(
117
- conn_id=DEFAULT_CONN_ID,
118
- conn_type="databricks",
119
- host=HOST,
120
- port=PORT,
121
- login="token",
122
- password=TOKEN,
123
- )
124
-
125
-
126
- def test_sqlachemy_url_property(mock_get_conn):
127
- mock_get_conn.return_value = make_mock_connection()
114
+ def test_sqlachemy_url_property():
128
115
  hook = DatabricksSqlHook(
129
116
  databricks_conn_id=DEFAULT_CONN_ID, http_path=HTTP_PATH, catalog=CATALOG, schema=SCHEMA
130
117
  )
131
118
  url = hook.sqlalchemy_url.render_as_string(hide_password=False)
132
119
  expected_url = (
133
- f"databricks://token:{TOKEN}@{HOST}:{PORT}?"
120
+ f"databricks://token:{TOKEN}@{HOST}?"
134
121
  f"catalog={CATALOG}&http_path={quote_plus(HTTP_PATH)}&schema={SCHEMA}"
135
122
  )
136
123
  assert url == expected_url
137
124
 
138
125
 
139
- def test_get_uri(mock_get_conn):
140
- mock_get_conn.return_value = make_mock_connection()
126
+ def test_get_sqlalchemy_engine():
127
+ hook = DatabricksSqlHook(
128
+ databricks_conn_id=DEFAULT_CONN_ID, http_path=HTTP_PATH, catalog=CATALOG, schema=SCHEMA
129
+ )
130
+ engine = hook.get_sqlalchemy_engine()
131
+ assert engine.url.render_as_string(hide_password=False) == (
132
+ f"databricks://token:{TOKEN}@{HOST}?"
133
+ f"catalog={CATALOG}&http_path={quote_plus(HTTP_PATH)}&schema={SCHEMA}"
134
+ )
135
+
136
+
137
+ def test_get_uri():
141
138
  hook = DatabricksSqlHook(
142
139
  databricks_conn_id=DEFAULT_CONN_ID, http_path=HTTP_PATH, catalog=CATALOG, schema=SCHEMA
143
140
  )
144
141
  uri = hook.get_uri()
145
142
  expected_uri = (
146
- f"databricks://token:{TOKEN}@{HOST}:{PORT}?"
143
+ f"databricks://token:{TOKEN}@{HOST}?"
147
144
  f"catalog={CATALOG}&http_path={quote_plus(HTTP_PATH)}&schema={SCHEMA}"
148
145
  )
149
146
  assert uri == expected_uri
@@ -569,42 +569,6 @@ class TestDatabricksCreateJobsOperator:
569
569
  db_mock.reset_job.assert_called_once_with(JOB_ID, expected)
570
570
  assert return_result == JOB_ID
571
571
 
572
- @mock.patch("airflow.providers.databricks.operators.databricks.DatabricksHook")
573
- def test_exec_update_job_permission(self, db_mock_class):
574
- """
575
- Test job permission update.
576
- """
577
- json = {
578
- "name": JOB_NAME,
579
- "tags": TAGS,
580
- "tasks": TASKS,
581
- "job_clusters": JOB_CLUSTERS,
582
- "email_notifications": EMAIL_NOTIFICATIONS,
583
- "webhook_notifications": WEBHOOK_NOTIFICATIONS,
584
- "timeout_seconds": TIMEOUT_SECONDS,
585
- "schedule": SCHEDULE,
586
- "max_concurrent_runs": MAX_CONCURRENT_RUNS,
587
- "git_source": GIT_SOURCE,
588
- "access_control_list": ACCESS_CONTROL_LIST,
589
- }
590
- op = DatabricksCreateJobsOperator(task_id=TASK_ID, json=json)
591
- db_mock = db_mock_class.return_value
592
- db_mock.find_job_id_by_name.return_value = JOB_ID
593
-
594
- op.execute({})
595
-
596
- expected = utils.normalise_json_content({"access_control_list": ACCESS_CONTROL_LIST})
597
-
598
- db_mock_class.assert_called_once_with(
599
- DEFAULT_CONN_ID,
600
- retry_limit=op.databricks_retry_limit,
601
- retry_delay=op.databricks_retry_delay,
602
- retry_args=None,
603
- caller="DatabricksCreateJobsOperator",
604
- )
605
-
606
- db_mock.update_job_permission.assert_called_once_with(JOB_ID, expected)
607
-
608
572
  @mock.patch("airflow.providers.databricks.operators.databricks.DatabricksHook")
609
573
  def test_exec_update_job_permission_with_empty_acl(self, db_mock_class):
610
574
  """
@@ -104,7 +104,6 @@ def test_create_or_reset_job_existing(mock_databricks_hook, context, mock_task_g
104
104
  operator = _CreateDatabricksWorkflowOperator(task_id="test_task", databricks_conn_id="databricks_default")
105
105
  operator.task_group = mock_task_group
106
106
  operator._hook.list_jobs.return_value = [{"job_id": 123}]
107
- operator._hook.create_job.return_value = 123
108
107
 
109
108
  job_id = operator._create_or_reset_job(context)
110
109
  assert job_id == 123
@@ -217,7 +217,7 @@ def test_workflow_job_run_link_airflow2():
217
217
  "airflow.providers.databricks.plugins.databricks_workflow.get_xcom_result"
218
218
  ) as mock_get_xcom_result:
219
219
  with patch(
220
- "airflow.providers.databricks.plugins.databricks_workflow.DagBag.get_dag"
220
+ "airflow.providers.databricks.plugins.databricks_workflow._get_dag"
221
221
  ) as mock_get_dag:
222
222
  mock_connection = Mock()
223
223
  mock_connection.extra_dejson = {"host": "mockhost"}
@@ -448,15 +448,15 @@ class TestDatabricksWorkflowPluginAirflow2:
448
448
  with patch(
449
449
  "airflow.providers.databricks.plugins.databricks_workflow.get_xcom_result"
450
450
  ) as mock_get_xcom:
451
- with patch("airflow.providers.databricks.plugins.databricks_workflow.DagBag") as mock_dag_bag:
451
+ with patch(
452
+ "airflow.providers.databricks.plugins.databricks_workflow._get_dag"
453
+ ) as mock_get_dag:
452
454
  with patch(
453
455
  "airflow.providers.databricks.plugins.databricks_workflow.DatabricksHook"
454
456
  ) as mock_hook:
455
457
  mock_get_ti.return_value = Mock(key=ti_key)
456
458
  mock_get_xcom.return_value = Mock(conn_id="conn_id", run_id=1, job_id=1)
457
- mock_dag_bag.return_value.get_dag.return_value.get_task.return_value = Mock(
458
- task_id="test_task"
459
- )
459
+ mock_get_dag.return_value.get_task.return_value = Mock(task_id="test_task")
460
460
 
461
461
  mock_hook_instance = Mock()
462
462
  mock_hook_instance.host = "test-host"
@@ -21,6 +21,8 @@ from unittest import mock
21
21
 
22
22
  import pytest
23
23
 
24
+ pytest.importorskip("flask_appbuilder") # Remove after upgrading to FAB5
25
+
24
26
  from airflow.exceptions import AirflowException, TaskDeferred
25
27
  from airflow.providers.databricks.hooks.databricks import SQLStatementState
26
28
  from airflow.providers.databricks.sensors.databricks import DatabricksSQLStatementsSensor