apache-airflow-providers-google 10.18.0rc2__py3-none-any.whl → 10.19.0rc1__py3-none-any.whl

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 (25) hide show
  1. airflow/providers/google/__init__.py +1 -1
  2. airflow/providers/google/cloud/hooks/bigquery.py +11 -10
  3. airflow/providers/google/cloud/links/automl.py +38 -0
  4. airflow/providers/google/cloud/links/translate.py +180 -0
  5. airflow/providers/google/cloud/log/stackdriver_task_handler.py +1 -2
  6. airflow/providers/google/cloud/openlineage/BigQueryErrorRunFacet.json +30 -0
  7. airflow/providers/google/cloud/openlineage/BigQueryJobRunFacet.json +37 -0
  8. airflow/providers/google/cloud/openlineage/__init__.py +16 -0
  9. airflow/providers/google/cloud/openlineage/utils.py +388 -0
  10. airflow/providers/google/cloud/operators/automl.py +75 -63
  11. airflow/providers/google/cloud/operators/bigquery.py +1 -62
  12. airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +5 -0
  13. airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +6 -0
  14. airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py +7 -4
  15. airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +1 -1
  16. airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +1 -1
  17. airflow/providers/google/cloud/triggers/pubsub.py +8 -11
  18. airflow/providers/google/cloud/utils/credentials_provider.py +41 -32
  19. airflow/providers/google/common/hooks/base_google.py +11 -5
  20. airflow/providers/google/get_provider_info.py +8 -2
  21. {apache_airflow_providers_google-10.18.0rc2.dist-info → apache_airflow_providers_google-10.19.0rc1.dist-info}/METADATA +8 -8
  22. {apache_airflow_providers_google-10.18.0rc2.dist-info → apache_airflow_providers_google-10.19.0rc1.dist-info}/RECORD +24 -20
  23. airflow/providers/google/cloud/utils/openlineage.py +0 -81
  24. {apache_airflow_providers_google-10.18.0rc2.dist-info → apache_airflow_providers_google-10.19.0rc1.dist-info}/WHEEL +0 -0
  25. {apache_airflow_providers_google-10.18.0rc2.dist-info → apache_airflow_providers_google-10.19.0rc1.dist-info}/entry_points.txt +0 -0
@@ -28,9 +28,9 @@ from typing import Collection, Generator, Sequence
28
28
  from urllib.parse import urlencode
29
29
 
30
30
  import google.auth
31
- import google.auth.credentials
32
31
  import google.oauth2.service_account
33
32
  from google.auth import impersonated_credentials # type: ignore[attr-defined]
33
+ from google.auth.credentials import AnonymousCredentials, Credentials
34
34
  from google.auth.environment_vars import CREDENTIALS, LEGACY_PROJECT, PROJECT
35
35
 
36
36
  from airflow.exceptions import AirflowException
@@ -178,6 +178,7 @@ class _CredentialProvider(LoggingMixin):
178
178
  :param key_secret_name: Keyfile Secret Name in GCP Secret Manager.
179
179
  :param key_secret_project_id: Project ID to read the secrets from. If not passed, the project ID from
180
180
  default credentials will be used.
181
+ :param credential_config_file: File path to or content of a GCP credential configuration file.
181
182
  :param scopes: OAuth scopes for the connection
182
183
  :param delegate_to: The account to impersonate using domain-wide delegation of authority,
183
184
  if any. For this to work, the service account making the request must have
@@ -192,6 +193,8 @@ class _CredentialProvider(LoggingMixin):
192
193
  Service Account Token Creator IAM role to the directly preceding identity, with first
193
194
  account from the list granting this role to the originating account and target_principal
194
195
  granting the role to the last account from the list.
196
+ :param is_anonymous: Provides an anonymous set of credentials,
197
+ which is useful for APIs which do not require authentication.
195
198
  """
196
199
 
197
200
  def __init__(
@@ -206,13 +209,14 @@ class _CredentialProvider(LoggingMixin):
206
209
  disable_logging: bool = False,
207
210
  target_principal: str | None = None,
208
211
  delegates: Sequence[str] | None = None,
212
+ is_anonymous: bool | None = None,
209
213
  ) -> None:
210
214
  super().__init__()
211
- key_options = [key_path, key_secret_name, keyfile_dict]
215
+ key_options = [key_path, keyfile_dict, credential_config_file, key_secret_name, is_anonymous]
212
216
  if len([x for x in key_options if x]) > 1:
213
217
  raise AirflowException(
214
- "The `keyfile_dict`, `key_path`, and `key_secret_name` fields "
215
- "are all mutually exclusive. Please provide only one value."
218
+ "The `keyfile_dict`, `key_path`, `credential_config_file`, `is_anonymous` and"
219
+ " `key_secret_name` fields are all mutually exclusive. Please provide only one value."
216
220
  )
217
221
  self.key_path = key_path
218
222
  self.keyfile_dict = keyfile_dict
@@ -224,43 +228,48 @@ class _CredentialProvider(LoggingMixin):
224
228
  self.disable_logging = disable_logging
225
229
  self.target_principal = target_principal
226
230
  self.delegates = delegates
231
+ self.is_anonymous = is_anonymous
227
232
 
228
- def get_credentials_and_project(self) -> tuple[google.auth.credentials.Credentials, str]:
233
+ def get_credentials_and_project(self) -> tuple[Credentials, str]:
229
234
  """
230
235
  Get current credentials and project ID.
231
236
 
237
+ Project ID is an empty string when using anonymous credentials.
238
+
232
239
  :return: Google Auth Credentials
233
240
  """
234
- if self.key_path:
235
- credentials, project_id = self._get_credentials_using_key_path()
236
- elif self.key_secret_name:
237
- credentials, project_id = self._get_credentials_using_key_secret_name()
238
- elif self.keyfile_dict:
239
- credentials, project_id = self._get_credentials_using_keyfile_dict()
240
- elif self.credential_config_file:
241
- credentials, project_id = self._get_credentials_using_credential_config_file()
241
+ if self.is_anonymous:
242
+ credentials, project_id = AnonymousCredentials(), ""
242
243
  else:
243
- credentials, project_id = self._get_credentials_using_adc()
244
-
245
- if self.delegate_to:
246
- if hasattr(credentials, "with_subject"):
247
- credentials = credentials.with_subject(self.delegate_to)
244
+ if self.key_path:
245
+ credentials, project_id = self._get_credentials_using_key_path()
246
+ elif self.key_secret_name:
247
+ credentials, project_id = self._get_credentials_using_key_secret_name()
248
+ elif self.keyfile_dict:
249
+ credentials, project_id = self._get_credentials_using_keyfile_dict()
250
+ elif self.credential_config_file:
251
+ credentials, project_id = self._get_credentials_using_credential_config_file()
248
252
  else:
249
- raise AirflowException(
250
- "The `delegate_to` parameter cannot be used here as the current "
251
- "authentication method does not support account impersonate. "
252
- "Please use service-account for authorization."
253
+ credentials, project_id = self._get_credentials_using_adc()
254
+ if self.delegate_to:
255
+ if hasattr(credentials, "with_subject"):
256
+ credentials = credentials.with_subject(self.delegate_to)
257
+ else:
258
+ raise AirflowException(
259
+ "The `delegate_to` parameter cannot be used here as the current "
260
+ "authentication method does not support account impersonate. "
261
+ "Please use service-account for authorization."
262
+ )
263
+
264
+ if self.target_principal:
265
+ credentials = impersonated_credentials.Credentials(
266
+ source_credentials=credentials,
267
+ target_principal=self.target_principal,
268
+ delegates=self.delegates,
269
+ target_scopes=self.scopes,
253
270
  )
254
271
 
255
- if self.target_principal:
256
- credentials = impersonated_credentials.Credentials(
257
- source_credentials=credentials,
258
- target_principal=self.target_principal,
259
- delegates=self.delegates,
260
- target_scopes=self.scopes,
261
- )
262
-
263
- project_id = _get_project_id_from_service_account_email(self.target_principal)
272
+ project_id = _get_project_id_from_service_account_email(self.target_principal)
264
273
 
265
274
  return credentials, project_id
266
275
 
@@ -357,7 +366,7 @@ class _CredentialProvider(LoggingMixin):
357
366
  self.log.debug(*args, **kwargs)
358
367
 
359
368
 
360
- def get_credentials_and_project_id(*args, **kwargs) -> tuple[google.auth.credentials.Credentials, str]:
369
+ def get_credentials_and_project_id(*args, **kwargs) -> tuple[Credentials, str]:
361
370
  """Return the Credentials object for Google API and the associated project_id."""
362
371
  return _CredentialProvider(*args, **kwargs).get_credentials_and_project()
363
372
 
@@ -30,7 +30,6 @@ from subprocess import check_output
30
30
  from typing import TYPE_CHECKING, Any, Callable, Generator, Sequence, TypeVar, cast
31
31
 
32
32
  import google.auth
33
- import google.auth.credentials
34
33
  import google.oauth2.service_account
35
34
  import google_auth_httplib2
36
35
  import requests
@@ -223,7 +222,7 @@ class GoogleBaseHook(BaseHook):
223
222
  """Return connection widgets to add to connection form."""
224
223
  from flask_appbuilder.fieldwidgets import BS3PasswordFieldWidget, BS3TextFieldWidget
225
224
  from flask_babel import lazy_gettext
226
- from wtforms import IntegerField, PasswordField, StringField
225
+ from wtforms import BooleanField, IntegerField, PasswordField, StringField
227
226
  from wtforms.validators import NumberRange
228
227
 
229
228
  return {
@@ -249,6 +248,9 @@ class GoogleBaseHook(BaseHook):
249
248
  "impersonation_chain": StringField(
250
249
  lazy_gettext("Impersonation Chain"), widget=BS3TextFieldWidget()
251
250
  ),
251
+ "is_anonymous": BooleanField(
252
+ lazy_gettext("Anonymous credentials (ignores all other settings)"), default=False
253
+ ),
252
254
  }
253
255
 
254
256
  @classmethod
@@ -270,10 +272,10 @@ class GoogleBaseHook(BaseHook):
270
272
  self.delegate_to = delegate_to
271
273
  self.impersonation_chain = impersonation_chain
272
274
  self.extras: dict = self.get_connection(self.gcp_conn_id).extra_dejson
273
- self._cached_credentials: google.auth.credentials.Credentials | None = None
275
+ self._cached_credentials: Credentials | None = None
274
276
  self._cached_project_id: str | None = None
275
277
 
276
- def get_credentials_and_project_id(self) -> tuple[google.auth.credentials.Credentials, str | None]:
278
+ def get_credentials_and_project_id(self) -> tuple[Credentials, str | None]:
277
279
  """Return the Credentials object for Google API and the associated project_id."""
278
280
  if self._cached_credentials is not None:
279
281
  return self._cached_credentials, self._cached_project_id
@@ -301,6 +303,7 @@ class GoogleBaseHook(BaseHook):
301
303
  self.impersonation_chain = [s.strip() for s in self.impersonation_chain.split(",")]
302
304
 
303
305
  target_principal, delegates = _get_target_principal_and_delegates(self.impersonation_chain)
306
+ is_anonymous = self._get_field("is_anonymous")
304
307
 
305
308
  credentials, project_id = get_credentials_and_project_id(
306
309
  key_path=key_path,
@@ -312,6 +315,7 @@ class GoogleBaseHook(BaseHook):
312
315
  delegate_to=self.delegate_to,
313
316
  target_principal=target_principal,
314
317
  delegates=delegates,
318
+ is_anonymous=is_anonymous,
315
319
  )
316
320
 
317
321
  overridden_project_id = self._get_field("project")
@@ -323,7 +327,7 @@ class GoogleBaseHook(BaseHook):
323
327
 
324
328
  return credentials, project_id
325
329
 
326
- def get_credentials(self) -> google.auth.credentials.Credentials:
330
+ def get_credentials(self) -> Credentials:
327
331
  """Return the Credentials object for Google API."""
328
332
  credentials, _ = self.get_credentials_and_project_id()
329
333
  return credentials
@@ -655,6 +659,8 @@ class GoogleBaseHook(BaseHook):
655
659
  def test_connection(self):
656
660
  """Test the Google cloud connectivity from UI."""
657
661
  status, message = False, ""
662
+ if self._get_field("is_anonymous"):
663
+ return True, "Credentials are anonymous"
658
664
  try:
659
665
  token = self._get_access_token()
660
666
  url = f"https://www.googleapis.com/oauth2/v3/tokeninfo?access_token={token}"
@@ -28,8 +28,9 @@ def get_provider_info():
28
28
  "name": "Google",
29
29
  "description": "Google services including:\n\n - `Google Ads <https://ads.google.com/>`__\n - `Google Cloud (GCP) <https://cloud.google.com/>`__\n - `Google Firebase <https://firebase.google.com/>`__\n - `Google LevelDB <https://github.com/google/leveldb/>`__\n - `Google Marketing Platform <https://marketingplatform.google.com/>`__\n - `Google Workspace <https://workspace.google.com/>`__ (formerly Google Suite)\n",
30
30
  "state": "ready",
31
- "source-date-epoch": 1715384437,
31
+ "source-date-epoch": 1716287849,
32
32
  "versions": [
33
+ "10.19.0",
33
34
  "10.18.0",
34
35
  "10.17.0",
35
36
  "10.16.0",
@@ -102,7 +103,7 @@ def get_provider_info():
102
103
  "google-auth-httplib2>=0.0.1",
103
104
  "google-cloud-aiplatform>=1.42.1",
104
105
  "google-cloud-automl>=2.12.0",
105
- "google-cloud-bigquery>=3.0.1",
106
+ "google-cloud-bigquery<3.21.0,>=3.0.1",
106
107
  "google-cloud-bigquery-datatransfer>=3.13.0",
107
108
  "google-cloud-bigtable>=2.17.0",
108
109
  "google-cloud-build>=3.22.0",
@@ -1580,6 +1581,11 @@ def get_provider_info():
1580
1581
  "airflow.providers.google.common.links.storage.StorageLink",
1581
1582
  "airflow.providers.google.common.links.storage.FileDetailsLink",
1582
1583
  "airflow.providers.google.marketing_platform.links.analytics_admin.GoogleAnalyticsPropertyLink",
1584
+ "airflow.providers.google.cloud.links.translate.TranslationLegacyDatasetLink",
1585
+ "airflow.providers.google.cloud.links.translate.TranslationDatasetListLink",
1586
+ "airflow.providers.google.cloud.links.translate.TranslationLegacyModelLink",
1587
+ "airflow.providers.google.cloud.links.translate.TranslationLegacyModelTrainLink",
1588
+ "airflow.providers.google.cloud.links.translate.TranslationLegacyModelPredictLink",
1583
1589
  ],
1584
1590
  "secrets-backends": [
1585
1591
  "airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: apache-airflow-providers-google
3
- Version: 10.18.0rc2
3
+ Version: 10.19.0rc1
4
4
  Summary: Provider package apache-airflow-providers-google for Apache Airflow
5
5
  Keywords: airflow-provider,google,airflow,integration
6
6
  Author-email: Apache Software Foundation <dev@airflow.apache.org>
@@ -39,7 +39,7 @@ Requires-Dist: google-cloud-aiplatform>=1.42.1
39
39
  Requires-Dist: google-cloud-automl>=2.12.0
40
40
  Requires-Dist: google-cloud-batch>=0.13.0
41
41
  Requires-Dist: google-cloud-bigquery-datatransfer>=3.13.0
42
- Requires-Dist: google-cloud-bigquery>=3.0.1
42
+ Requires-Dist: google-cloud-bigquery<3.21.0,>=3.0.1
43
43
  Requires-Dist: google-cloud-bigtable>=2.17.0
44
44
  Requires-Dist: google-cloud-build>=3.22.0
45
45
  Requires-Dist: google-cloud-compute>=1.10.0
@@ -102,8 +102,8 @@ Requires-Dist: apache-airflow-providers-sftp ; extra == "sftp"
102
102
  Requires-Dist: apache-airflow-providers-ssh ; extra == "ssh"
103
103
  Requires-Dist: apache-airflow-providers-trino ; extra == "trino"
104
104
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
105
- Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-google/10.18.0/changelog.html
106
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-google/10.18.0
105
+ Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-google/10.19.0/changelog.html
106
+ Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-google/10.19.0
107
107
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
108
108
  Project-URL: Source Code, https://github.com/apache/airflow
109
109
  Project-URL: Twitter, https://twitter.com/ApacheAirflow
@@ -171,7 +171,7 @@ Provides-Extra: trino
171
171
 
172
172
  Package ``apache-airflow-providers-google``
173
173
 
174
- Release: ``10.18.0.rc2``
174
+ Release: ``10.19.0.rc1``
175
175
 
176
176
 
177
177
  Google services including:
@@ -191,7 +191,7 @@ This is a provider package for ``google`` provider. All classes for this provide
191
191
  are in ``airflow.providers.google`` python package.
192
192
 
193
193
  You can find package information and changelog for the provider
194
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-google/10.18.0/>`_.
194
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-google/10.19.0/>`_.
195
195
 
196
196
  Installation
197
197
  ------------
@@ -223,7 +223,7 @@ PIP package Version required
223
223
  ``google-auth-httplib2`` ``>=0.0.1``
224
224
  ``google-cloud-aiplatform`` ``>=1.42.1``
225
225
  ``google-cloud-automl`` ``>=2.12.0``
226
- ``google-cloud-bigquery`` ``>=3.0.1``
226
+ ``google-cloud-bigquery`` ``>=3.0.1,<3.21.0``
227
227
  ``google-cloud-bigquery-datatransfer`` ``>=3.13.0``
228
228
  ``google-cloud-bigtable`` ``>=2.17.0``
229
229
  ``google-cloud-build`` ``>=3.22.0``
@@ -307,4 +307,4 @@ Dependent package
307
307
  ======================================================================================================================== ====================
308
308
 
309
309
  The changelog for the provider package can be found in the
310
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-google/10.18.0/changelog.html>`_.
310
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-google/10.19.0/changelog.html>`_.
@@ -1,6 +1,6 @@
1
1
  airflow/providers/google/LICENSE,sha256=ywUBpKZc7Jb96rVt5I3IDbg7dIJAbUSHkuoDcF3jbH4,13569
2
- airflow/providers/google/__init__.py,sha256=-STVmWYvzAtQZziT5ntqECeACWw8HYuYxEWguvYiPuI,1495
3
- airflow/providers/google/get_provider_info.py,sha256=5EIhNOVNxiPbvIwu-Rqa-FoQV-Gzg_R3S2ZxXtSV9pk,81204
2
+ airflow/providers/google/__init__.py,sha256=HUAzlPMwd7ZcKlpNWvIEzhsb03w5fHEZL1TUuffqeB4,1495
3
+ airflow/providers/google/get_provider_info.py,sha256=0Yt7U4KS6kyRqOy9webKBMT6SdgdXmlEAzwnZAVcuxk,81694
4
4
  airflow/providers/google/go_module_utils.py,sha256=QZcIY0BAsy_GlwJpaCDcSRWHueZvkqDCj2ecICn_-gY,1770
5
5
  airflow/providers/google/ads/.gitignore,sha256=z_qaKzblF2LuVvP-06iDord9JBeyzIlNeJ4bx3LbtGc,167
6
6
  airflow/providers/google/ads/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
@@ -23,7 +23,7 @@ airflow/providers/google/cloud/fs/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2x
23
23
  airflow/providers/google/cloud/fs/gcs.py,sha256=fJBGhHEE46_U5Rmbs1W0uenvGhECv13CtVSh3z7pM60,2457
24
24
  airflow/providers/google/cloud/hooks/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
25
25
  airflow/providers/google/cloud/hooks/automl.py,sha256=5fp8vZ96at8jH-a4yYipu4FI3J809b2E6XLCOQVhzmY,28959
26
- airflow/providers/google/cloud/hooks/bigquery.py,sha256=ivglJpV5jL2la6UhEXC_ABa1q-SyP2-Jbf3aSU8NimE,155228
26
+ airflow/providers/google/cloud/hooks/bigquery.py,sha256=Z-oOfzrM2vxN2BpOP-pdiaZ_I1Pdf87H3up8wgYRF6Y,155305
27
27
  airflow/providers/google/cloud/hooks/bigquery_dts.py,sha256=3wLKj-6tQwWphjwKBLGg1rjoXAAknv0WLh6T3MqsNWA,15228
28
28
  airflow/providers/google/cloud/hooks/bigtable.py,sha256=wReDIbDyQGP8oZIzg0vsfgD6zrLmY-oYghBNCPVPorw,12580
29
29
  airflow/providers/google/cloud/hooks/cloud_batch.py,sha256=FjpR_Av7z8oMnB4Q7S-aPTMO8HZMxAo_1akdHpE7iA8,7809
@@ -79,7 +79,7 @@ airflow/providers/google/cloud/hooks/vertex_ai/model_service.py,sha256=KCqCyxjsx
79
79
  airflow/providers/google/cloud/hooks/vertex_ai/pipeline_job.py,sha256=b4PlBV0MqrOUIwR6heuPwiFGFnEHaaduPTV3iibbs_Y,29023
80
80
  airflow/providers/google/cloud/hooks/vertex_ai/prediction_service.py,sha256=Q-EzmMtE4hjEg_tH-vnE-PcrXTvoQY2QFh77reVH840,4263
81
81
  airflow/providers/google/cloud/links/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
82
- airflow/providers/google/cloud/links/automl.py,sha256=tJ0tIYFicB4urFltg4uTp_Yk7ZeaD0SA8Q3GWyeMw4Y,4781
82
+ airflow/providers/google/cloud/links/automl.py,sha256=_NtdMn9WG0PQMegzVB3Tnb_QYcnsqHW7HHjcNCNok6E,6375
83
83
  airflow/providers/google/cloud/links/base.py,sha256=6Y96NArcm-f4Yw1YYqaoRdXfLLWwMH01XDAzIA-a3NA,1660
84
84
  airflow/providers/google/cloud/links/bigquery.py,sha256=VUUKpzqVd0GWXQUne3xFtwpQrIoauebQqzIypGSqByY,2532
85
85
  airflow/providers/google/cloud/links/bigquery_dts.py,sha256=0zRXjws8jmWLs-4GxoQAvnQv7V_AZnTMhw1YkYJZ3ec,1876
@@ -106,14 +106,19 @@ airflow/providers/google/cloud/links/mlengine.py,sha256=lvhRkVVExFvwoaSskckm31BW
106
106
  airflow/providers/google/cloud/links/pubsub.py,sha256=MqCg3vHUvPVT1nkEwnjhNf5mmF5zPGtqsyxE-qkRCIw,2423
107
107
  airflow/providers/google/cloud/links/spanner.py,sha256=L2j8b6VIrLta1zTM_hsoK5sYpGb3VPf6HQ92qYhQyWk,2510
108
108
  airflow/providers/google/cloud/links/stackdriver.py,sha256=WgO-KeX9guf5l4Z3TLPUD_Pns8UZzUfbRVL4kdec8z0,2413
109
+ airflow/providers/google/cloud/links/translate.py,sha256=p0tHVr_CHPJswCmNheQAnpPreM8a30AT7EjD9xW4LJk,5467
109
110
  airflow/providers/google/cloud/links/vertex_ai.py,sha256=T5WGK77wKIPTiHtxKuQXvokArjVQYwZPjX5IgJX1dds,11138
110
111
  airflow/providers/google/cloud/links/workflows.py,sha256=Ux7bwq2fspvSoNT4X3xFXX2SSmp8EuwDyPQsTO-z7bI,3303
111
112
  airflow/providers/google/cloud/log/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
112
113
  airflow/providers/google/cloud/log/gcs_task_handler.py,sha256=d2zTPtoQHwdFIXuWbHu0xniA2oor9BEBYBNgJaWeF-0,10386
113
- airflow/providers/google/cloud/log/stackdriver_task_handler.py,sha256=Z_aHF0_hjGwoDxk4VVtZ1sWTeqOdpSsRqg4yg6eOL80,15637
114
+ airflow/providers/google/cloud/log/stackdriver_task_handler.py,sha256=mOpGUHR1vCyge2ysf7m3Jv02VSDkUXq5IfJCu0qvyk8,15512
115
+ airflow/providers/google/cloud/openlineage/BigQueryErrorRunFacet.json,sha256=3whXAY38LjxmQTpCnExiIU1Q1-8dZGtWjiK0A4JQWTA,688
116
+ airflow/providers/google/cloud/openlineage/BigQueryJobRunFacet.json,sha256=sWvE1o30bCqBBmB19n6wFZyL6BBcc22kCGWe0qcsYBc,850
117
+ airflow/providers/google/cloud/openlineage/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
118
+ airflow/providers/google/cloud/openlineage/utils.py,sha256=VmYxUSj_Vg36rj9F8d3M7gO5BHUO9V0UC6Hj6u-NNpM,14699
114
119
  airflow/providers/google/cloud/operators/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
115
- airflow/providers/google/cloud/operators/automl.py,sha256=fBwkwLcKr9sAPCacjdHHQcQrh3KD65oxm1PUIQsbKuI,61727
116
- airflow/providers/google/cloud/operators/bigquery.py,sha256=dfTzs1ouMYEoC7SXfRIZMeHCoVut17OFl_GbNM2nO1U,129660
120
+ airflow/providers/google/cloud/operators/automl.py,sha256=uZ-PSDqfBBviH0YWxh8gefr4DU5xiEkucYGRtSyDOG8,63479
121
+ airflow/providers/google/cloud/operators/bigquery.py,sha256=xCc5j4U7KNJ4Lq_asI7s1H0bZeeVZEUnOTavtL5VNy8,127444
117
122
  airflow/providers/google/cloud/operators/bigquery_dts.py,sha256=6VJISM4HoMBQ3EQ5nz3zxFk8tfluGA1d2vcUNUlYLPc,17695
118
123
  airflow/providers/google/cloud/operators/bigtable.py,sha256=BnWHnTEscyPbsKWFaSreLr62W68fmHu5loQVZex7LPs,26921
119
124
  airflow/providers/google/cloud/operators/cloud_base.py,sha256=Xysh4znvIQIxbQqmfKoaL6O09FikndHrQuKKUnEV7KU,1483
@@ -155,9 +160,9 @@ airflow/providers/google/cloud/operators/video_intelligence.py,sha256=NQvEueDegd
155
160
  airflow/providers/google/cloud/operators/vision.py,sha256=RQrf9-dgRfgYxDceR--WMvc03d2a1zZaOQWzZxjrJYo,67630
156
161
  airflow/providers/google/cloud/operators/workflows.py,sha256=fnyWLqRHz0UYu6AnQKKZIMlfSIg_v5nNbZAt6ASe4fI,28977
157
162
  airflow/providers/google/cloud/operators/vertex_ai/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
158
- airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py,sha256=Txeaul_QFrAKvEBGUa-AwcDEDtxhKWLNhbXSaBldTQE,30987
163
+ airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py,sha256=gkJ94t0IMFVbpWNwbBL8_KhL6S6gYLNlwK-Qvb2kVa0,31442
159
164
  airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py,sha256=e0oFWmCRH3aQHNckjEf_YO5zP9LqiLVTzB1QTgv3iUo,28828
160
- airflow/providers/google/cloud/operators/vertex_ai/custom_job.py,sha256=lPo4lCT273V_LlGqDiu9lAPcMSdlN3quAOQi1xglRMQ,100098
165
+ airflow/providers/google/cloud/operators/vertex_ai/custom_job.py,sha256=LGCdbHyaXd8I0z8CBq2JOmc6WN4NZkoO0hhMP3KKAvA,100374
161
166
  airflow/providers/google/cloud/operators/vertex_ai/dataset.py,sha256=u_iEOIJEoZj10bbiymvoAT7aJP50HyZMt7_2KxUKbxM,23051
162
167
  airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py,sha256=mtbgC2NrolxIxyxOmqlnokc22NtCspa8oXwuHo140EU,26739
163
168
  airflow/providers/google/cloud/operators/vertex_ai/generative_model.py,sha256=k86sTqmDNWVcESuyAUxY1neeifASrusCo5MbKff6EWU,13634
@@ -187,9 +192,9 @@ airflow/providers/google/cloud/sensors/workflows.py,sha256=iJdPt5J-9nTNFIWRcQqzX
187
192
  airflow/providers/google/cloud/transfers/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
188
193
  airflow/providers/google/cloud/transfers/adls_to_gcs.py,sha256=ona1WA9oNhozj_JPI28sFUOukMJehkvQyjB558vfp4Q,6739
189
194
  airflow/providers/google/cloud/transfers/azure_blob_to_gcs.py,sha256=kizj9bNJp_wBgWT2Ytk4Dsj1O0EpWssMKkA_n7PquUM,4813
190
- airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py,sha256=scvWzZ-98bNSLmfEQj4Q9G_EERCA3tsPjF_Jwp_18Tw,7931
195
+ airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py,sha256=JlPRkiDsUBbu4WWHw-rTE2efmMw3uI84LR7pz4jHn1o,8182
191
196
  airflow/providers/google/cloud/transfers/bigquery_to_bigquery.py,sha256=jQzd_QtgGDAcfWvLgKPSQuH70t-GFFbzrV7vS6Y-Zd4,8180
192
- airflow/providers/google/cloud/transfers/bigquery_to_gcs.py,sha256=Hj4fMLxXuxdlnYvSjhnzbBPWmAii3oDYn80jkvyX2XE,14854
197
+ airflow/providers/google/cloud/transfers/bigquery_to_gcs.py,sha256=tmcQ1T6Lr6k2a-0WWGdUE8x3lTxHPFNTk6F7EQIrLdU,14854
193
198
  airflow/providers/google/cloud/transfers/bigquery_to_mssql.py,sha256=24MKm3FeZ1HLVnNhxVUre4nr5KztYJKFgc-yO55sdAk,4056
194
199
  airflow/providers/google/cloud/transfers/bigquery_to_mysql.py,sha256=zMEadzSW-lXrxvSVHimNX9NQN2_6Q55dzrqHehQJKlA,3092
195
200
  airflow/providers/google/cloud/transfers/bigquery_to_postgres.py,sha256=4vmVgmZlBzBJOPMnuW4nUiTee6l3QDyvVL8AqhD4YPA,1984
@@ -197,7 +202,7 @@ airflow/providers/google/cloud/transfers/bigquery_to_sql.py,sha256=n9MdtPYPLTXQx
197
202
  airflow/providers/google/cloud/transfers/calendar_to_gcs.py,sha256=Yba_iwBxCFXW-jHcpB9fTd8bCgq5J4yJr764N1Xe7Ss,8399
198
203
  airflow/providers/google/cloud/transfers/cassandra_to_gcs.py,sha256=3f2Q6seMBXHbLOXYa3m5GDh6N8fY-IOQSn1lu6Jmnv4,15814
199
204
  airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py,sha256=FFUOMx6S4DRgFbIBIkRZKcHfwDICawSKSc16260PPuo,10322
200
- airflow/providers/google/cloud/transfers/gcs_to_bigquery.py,sha256=uCryybqvvXVbRZHO77OYi3K5tT7rvybPtBKR5PLNesQ,36690
205
+ airflow/providers/google/cloud/transfers/gcs_to_bigquery.py,sha256=o6Jn8AfVPQBmt1O6rKxYy_IEGU7gmrqMjW2A3czAFGo,36690
201
206
  airflow/providers/google/cloud/transfers/gcs_to_gcs.py,sha256=ItZBJZsIziOfRgCEAZ0-Z28K1afk-UcGD7cKDTGRVNA,26315
202
207
  airflow/providers/google/cloud/transfers/gcs_to_local.py,sha256=qWUR9TZrj3Z5WzvO7gBAbr_V8LNhVHCAnjdlVgyuZBY,5274
203
208
  airflow/providers/google/cloud/transfers/gcs_to_sftp.py,sha256=km9StbMCeVZc3Nupzkp9CJk9B2c_8dLmrbhwF1lTukU,8409
@@ -231,12 +236,12 @@ airflow/providers/google/cloud/triggers/dataproc.py,sha256=5eCSAkjg6FDL56P_7gvXu
231
236
  airflow/providers/google/cloud/triggers/gcs.py,sha256=pMjeNOkWHkOyiAxeK-JoyDInUf2VNtefOZxp8K-aNjw,18973
232
237
  airflow/providers/google/cloud/triggers/kubernetes_engine.py,sha256=XnCnGtHaZUEaYS1Yra0PTMovE06d2fcSUCNhIRsuCGc,12328
233
238
  airflow/providers/google/cloud/triggers/mlengine.py,sha256=qpOa9Gz8FmHDxXvPWrXO3M7snGbRTq92gy6kGafCUiY,5265
234
- airflow/providers/google/cloud/triggers/pubsub.py,sha256=LbKGL-g6WfeiRhmkItWwl8hRgI3Lr6B3Ib2GNChL4mg,5724
239
+ airflow/providers/google/cloud/triggers/pubsub.py,sha256=3t6foghoMpa_I_al8IQMkmxktqpcZbcuIhMIOe1MvZo,5604
235
240
  airflow/providers/google/cloud/triggers/vertex_ai.py,sha256=99ah7Rcc_kYBihDXGcekZvkUz7ZNyXKv7j6R3vddcCE,9927
236
241
  airflow/providers/google/cloud/utils/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
237
242
  airflow/providers/google/cloud/utils/bigquery.py,sha256=nMPUMpfsf-7QQEJG3wo1QqKuPGPwDUwKLGhE9SBjCaI,2145
238
243
  airflow/providers/google/cloud/utils/bigquery_get_data.py,sha256=srSJSckp8ljprQ5Z_zqUAgdaEJlrFedccwe9ISlJkPQ,2092
239
- airflow/providers/google/cloud/utils/credentials_provider.py,sha256=AGy1mMh1qd9M2kDw7upupoaR1oxwjHoh3InUzB15wLA,17577
244
+ airflow/providers/google/cloud/utils/credentials_provider.py,sha256=CWNy9iJZ066fr7VJfbIg_0JTyIPI1586VTIOZ8H-6Wc,18255
240
245
  airflow/providers/google/cloud/utils/dataform.py,sha256=3ZrADuvqnhUdE-iaNN12X2k-2SZyoRfwzdmvZg_NQD8,7117
241
246
  airflow/providers/google/cloud/utils/datafusion.py,sha256=IArDPasSlUjJykrAbU0uTSZXSAoGdJttZ0TA21cvrP0,1307
242
247
  airflow/providers/google/cloud/utils/dataproc.py,sha256=2oyNiVlUKcHLt6e_yg76a856RYh78V5MDd_-F2YyLTs,960
@@ -245,13 +250,12 @@ airflow/providers/google/cloud/utils/field_validator.py,sha256=VUUDA8jKdl_Ct9lZh
245
250
  airflow/providers/google/cloud/utils/helpers.py,sha256=h_stPmyWOProJhuDGc2tTX9GP4bDqses9hWHQUptp-Q,1899
246
251
  airflow/providers/google/cloud/utils/mlengine_operator_utils.py,sha256=_dkQdytcnpK5-SJ_i8udzqsd1eMFyBTeeykedq7cfrM,11688
247
252
  airflow/providers/google/cloud/utils/mlengine_prediction_summary.py,sha256=U3UKIraP01g14VByj1tVJRH0cqOR_S9RKmBifzYWOo0,7667
248
- airflow/providers/google/cloud/utils/openlineage.py,sha256=dG-GMF_qDAzq91Rp-7iJa-csen6JbtuQbPMKiPlROKs,2885
249
253
  airflow/providers/google/common/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
250
254
  airflow/providers/google/common/consts.py,sha256=KKjQX0FO6HP4MuzS8DDfWPoQNk0mhdOrYe5CzDUx2e4,1050
251
255
  airflow/providers/google/common/auth_backend/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
252
256
  airflow/providers/google/common/auth_backend/google_openid.py,sha256=HvUAoHfpuK8gZiss0DCgB7R3wk2c1aDjAhwc7GknV4c,4525
253
257
  airflow/providers/google/common/hooks/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
254
- airflow/providers/google/common/hooks/base_google.py,sha256=eTwHZVpl0pZgB9C6sfNADx5iDOTcrlz9G1rVoxxJtuY,31453
258
+ airflow/providers/google/common/hooks/base_google.py,sha256=i-woTvSJbzrnsCiXehuY99r70p9ssUmNwBhkneZzMDs,31710
255
259
  airflow/providers/google/common/hooks/discovery_api.py,sha256=dHA3AHwsY7ETWM1fRoNknZZgz4cMnWw4q0PTQt0TiNA,6767
256
260
  airflow/providers/google/common/links/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
257
261
  airflow/providers/google/common/links/storage.py,sha256=24tb1xQ00gbGyOu26wryNkTYXlk_9H-ieUra9WmuPIY,2265
@@ -304,7 +308,7 @@ airflow/providers/google/suite/transfers/gcs_to_gdrive.py,sha256=CxtVhp3wlEOBtjR
304
308
  airflow/providers/google/suite/transfers/gcs_to_sheets.py,sha256=4nwXWkTySeBXNuThPxzO7uww_hH6PthpppTeuShn27Q,4363
305
309
  airflow/providers/google/suite/transfers/local_to_drive.py,sha256=eYCJghA0Ou2vUUvN_wfBQvpt2yzR9RmmeNdPgh2Cbjo,6100
306
310
  airflow/providers/google/suite/transfers/sql_to_sheets.py,sha256=sORkYSUDArRPnvi8WCiXP7YIXtpAgpEPhf8cqgpu644,5220
307
- apache_airflow_providers_google-10.18.0rc2.dist-info/entry_points.txt,sha256=Ay1Uo7uHxdXCxWew3CyBHumZ44Ld-iR7AcSR2fY-PLw,102
308
- apache_airflow_providers_google-10.18.0rc2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
309
- apache_airflow_providers_google-10.18.0rc2.dist-info/METADATA,sha256=PekTdpC6hyG7aBZeQIeJBjBliPVeQoWoRDNmlJbXBgw,15979
310
- apache_airflow_providers_google-10.18.0rc2.dist-info/RECORD,,
311
+ apache_airflow_providers_google-10.19.0rc1.dist-info/entry_points.txt,sha256=Ay1Uo7uHxdXCxWew3CyBHumZ44Ld-iR7AcSR2fY-PLw,102
312
+ apache_airflow_providers_google-10.19.0rc1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
313
+ apache_airflow_providers_google-10.19.0rc1.dist-info/METADATA,sha256=TEL1HiGTymPKt43Emg4NAlWhXKBDlUGKVF7GtvIQeUc,15995
314
+ apache_airflow_providers_google-10.19.0rc1.dist-info/RECORD,,
@@ -1,81 +0,0 @@
1
- #
2
- # Licensed to the Apache Software Foundation (ASF) under one
3
- # or more contributor license agreements. See the NOTICE file
4
- # distributed with this work for additional information
5
- # regarding copyright ownership. The ASF licenses this file
6
- # to you under the Apache License, Version 2.0 (the
7
- # "License"); you may not use this file except in compliance
8
- # with the License. You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing,
13
- # software distributed under the License is distributed on an
14
- # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
- # KIND, either express or implied. See the License for the
16
- # specific language governing permissions and limitations
17
- # under the License.
18
- """This module contains code related to OpenLineage and lineage extraction."""
19
-
20
- from __future__ import annotations
21
-
22
- from typing import TYPE_CHECKING, Any
23
-
24
- from openlineage.client.facet import (
25
- ColumnLineageDatasetFacet,
26
- ColumnLineageDatasetFacetFieldsAdditional,
27
- ColumnLineageDatasetFacetFieldsAdditionalInputFields,
28
- DocumentationDatasetFacet,
29
- SchemaDatasetFacet,
30
- SchemaField,
31
- )
32
-
33
- if TYPE_CHECKING:
34
- from google.cloud.bigquery.table import Table
35
- from openlineage.client.run import Dataset
36
-
37
-
38
- def get_facets_from_bq_table(table: Table) -> dict[Any, Any]:
39
- """Get facets from BigQuery table object."""
40
- facets = {
41
- "schema": SchemaDatasetFacet(
42
- fields=[
43
- SchemaField(name=field.name, type=field.field_type, description=field.description)
44
- for field in table.schema
45
- ]
46
- ),
47
- "documentation": DocumentationDatasetFacet(description=table.description or ""),
48
- }
49
-
50
- return facets
51
-
52
-
53
- def get_identity_column_lineage_facet(
54
- field_names: list[str],
55
- input_datasets: list[Dataset],
56
- ) -> ColumnLineageDatasetFacet:
57
- """
58
- Get column lineage facet.
59
-
60
- Simple lineage will be created, where each source column corresponds to single destination column
61
- in each input dataset and there are no transformations made.
62
- """
63
- if field_names and not input_datasets:
64
- raise ValueError("When providing `field_names` You must provide at least one `input_dataset`.")
65
-
66
- column_lineage_facet = ColumnLineageDatasetFacet(
67
- fields={
68
- field: ColumnLineageDatasetFacetFieldsAdditional(
69
- inputFields=[
70
- ColumnLineageDatasetFacetFieldsAdditionalInputFields(
71
- namespace=dataset.namespace, name=dataset.name, field=field
72
- )
73
- for dataset in input_datasets
74
- ],
75
- transformationType="IDENTITY",
76
- transformationDescription="identical",
77
- )
78
- for field in field_names
79
- }
80
- )
81
- return column_lineage_facet