apache-airflow-providers-google 10.22.0rc1__py3-none-any.whl → 10.23.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 (57) hide show
  1. airflow/providers/google/__init__.py +1 -1
  2. airflow/providers/google/cloud/hooks/bigquery.py +91 -54
  3. airflow/providers/google/cloud/hooks/cloud_build.py +3 -2
  4. airflow/providers/google/cloud/hooks/dataflow.py +112 -47
  5. airflow/providers/google/cloud/hooks/datapipeline.py +3 -3
  6. airflow/providers/google/cloud/hooks/kubernetes_engine.py +15 -26
  7. airflow/providers/google/cloud/hooks/life_sciences.py +5 -7
  8. airflow/providers/google/cloud/hooks/secret_manager.py +3 -3
  9. airflow/providers/google/cloud/hooks/vertex_ai/auto_ml.py +28 -8
  10. airflow/providers/google/cloud/hooks/vertex_ai/custom_job.py +11 -6
  11. airflow/providers/google/cloud/hooks/vertex_ai/generative_model.py +214 -34
  12. airflow/providers/google/cloud/hooks/vertex_ai/model_service.py +11 -4
  13. airflow/providers/google/cloud/links/automl.py +13 -22
  14. airflow/providers/google/cloud/log/gcs_task_handler.py +1 -2
  15. airflow/providers/google/cloud/operators/bigquery.py +6 -4
  16. airflow/providers/google/cloud/operators/dataflow.py +186 -4
  17. airflow/providers/google/cloud/operators/datafusion.py +3 -2
  18. airflow/providers/google/cloud/operators/datapipeline.py +5 -6
  19. airflow/providers/google/cloud/operators/dataproc.py +30 -33
  20. airflow/providers/google/cloud/operators/gcs.py +4 -4
  21. airflow/providers/google/cloud/operators/kubernetes_engine.py +16 -2
  22. airflow/providers/google/cloud/operators/life_sciences.py +5 -7
  23. airflow/providers/google/cloud/operators/mlengine.py +42 -65
  24. airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +18 -4
  25. airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +5 -5
  26. airflow/providers/google/cloud/operators/vertex_ai/generative_model.py +280 -9
  27. airflow/providers/google/cloud/operators/vertex_ai/model_service.py +4 -0
  28. airflow/providers/google/cloud/secrets/secret_manager.py +3 -5
  29. airflow/providers/google/cloud/sensors/bigquery.py +8 -27
  30. airflow/providers/google/cloud/sensors/bigquery_dts.py +1 -4
  31. airflow/providers/google/cloud/sensors/cloud_composer.py +9 -14
  32. airflow/providers/google/cloud/sensors/dataflow.py +1 -25
  33. airflow/providers/google/cloud/sensors/dataform.py +1 -4
  34. airflow/providers/google/cloud/sensors/datafusion.py +1 -7
  35. airflow/providers/google/cloud/sensors/dataplex.py +1 -31
  36. airflow/providers/google/cloud/sensors/dataproc.py +1 -16
  37. airflow/providers/google/cloud/sensors/dataproc_metastore.py +1 -7
  38. airflow/providers/google/cloud/sensors/gcs.py +5 -27
  39. airflow/providers/google/cloud/sensors/looker.py +1 -13
  40. airflow/providers/google/cloud/sensors/pubsub.py +11 -5
  41. airflow/providers/google/cloud/sensors/workflows.py +1 -4
  42. airflow/providers/google/cloud/transfers/sftp_to_gcs.py +6 -0
  43. airflow/providers/google/cloud/triggers/dataflow.py +145 -1
  44. airflow/providers/google/cloud/triggers/kubernetes_engine.py +66 -3
  45. airflow/providers/google/common/deprecated.py +176 -0
  46. airflow/providers/google/common/hooks/base_google.py +3 -2
  47. airflow/providers/google/get_provider_info.py +8 -10
  48. airflow/providers/google/marketing_platform/hooks/analytics.py +4 -2
  49. airflow/providers/google/marketing_platform/hooks/search_ads.py +169 -30
  50. airflow/providers/google/marketing_platform/operators/analytics.py +16 -33
  51. airflow/providers/google/marketing_platform/operators/search_ads.py +217 -156
  52. airflow/providers/google/marketing_platform/sensors/display_video.py +1 -4
  53. {apache_airflow_providers_google-10.22.0rc1.dist-info → apache_airflow_providers_google-10.23.0rc1.dist-info}/METADATA +18 -16
  54. {apache_airflow_providers_google-10.22.0rc1.dist-info → apache_airflow_providers_google-10.23.0rc1.dist-info}/RECORD +56 -56
  55. airflow/providers/google/marketing_platform/sensors/search_ads.py +0 -92
  56. {apache_airflow_providers_google-10.22.0rc1.dist-info → apache_airflow_providers_google-10.23.0rc1.dist-info}/WHEEL +0 -0
  57. {apache_airflow_providers_google-10.22.0rc1.dist-info → apache_airflow_providers_google-10.23.0rc1.dist-info}/entry_points.txt +0 -0
@@ -19,217 +19,278 @@
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
- import json
23
- from tempfile import NamedTemporaryFile
22
+ from functools import cached_property
24
23
  from typing import TYPE_CHECKING, Any, Sequence
25
24
 
26
- from airflow.exceptions import AirflowException
27
25
  from airflow.models import BaseOperator
28
- from airflow.providers.google.cloud.hooks.gcs import GCSHook
29
- from airflow.providers.google.marketing_platform.hooks.search_ads import GoogleSearchAdsHook
26
+ from airflow.providers.google.marketing_platform.hooks.search_ads import GoogleSearchAdsReportingHook
30
27
 
31
28
  if TYPE_CHECKING:
32
29
  from airflow.utils.context import Context
33
30
 
34
31
 
35
- class GoogleSearchAdsInsertReportOperator(BaseOperator):
32
+ class _GoogleSearchAdsBaseOperator(BaseOperator):
36
33
  """
37
- Inserts a report request into the reporting system.
34
+ Base class to use in NextGen operator.
35
+
36
+ :param api_version: The version of the API that will be requested for example 'v0'.
37
+ :param gcp_conn_id: The connection ID to use when fetching connection info.
38
+ """
39
+
40
+ template_fields: Sequence[str] = (
41
+ "api_version",
42
+ "gcp_conn_id",
43
+ )
44
+
45
+ def __init__(
46
+ self,
47
+ *,
48
+ api_version: str = "v0",
49
+ gcp_conn_id: str = "google_search_ads_default",
50
+ **kwargs,
51
+ ):
52
+ super().__init__(**kwargs)
53
+ self.api_version = api_version
54
+ self.gcp_conn_id = gcp_conn_id
55
+
56
+ @cached_property
57
+ def hook(self):
58
+ return GoogleSearchAdsReportingHook(
59
+ gcp_conn_id=self.gcp_conn_id,
60
+ api_version=self.api_version,
61
+ )
62
+
63
+
64
+ class GoogleSearchAdsSearchOperator(_GoogleSearchAdsBaseOperator):
65
+ """
66
+ Search a report by query.
38
67
 
39
68
  .. seealso:
40
69
  For API documentation check:
41
- https://developers.google.com/search-ads/v2/reference/reports/request
70
+ https://developers.google.com/search-ads/reporting/api/reference/rest/v0/customers.searchAds360/search
42
71
 
43
72
  .. seealso::
44
73
  For more information on how to use this operator, take a look at the guide:
45
- :ref:`howto/operator:GoogleSearchAdsInsertReportOperator`
74
+ :ref:`howto/operator:GoogleSearchAdsSearchOperator`
46
75
 
47
- :param report: Report to be generated
48
- :param api_version: The version of the api that will be requested for example 'v3'.
76
+ :param customer_id: The ID of the customer being queried.
77
+ :param query: The query to execute.
78
+ :param page_token: Token of the page to retrieve. If not specified, the first page of results will be
79
+ returned. Use the value obtained from `next_page_token` in the previous response
80
+ in order to request the next page of results.
81
+ :param page_size: Number of elements to retrieve in a single page. When too large a page is requested,
82
+ the server may decide to further limit the number of returned resources.
83
+ Default is 10000.
84
+ :param return_total_results_count: If true, the total number of results that match the query ignoring
85
+ the LIMIT clause will be included in the response. Default is false.
86
+ :param summary_row_setting: Determines whether a summary row will be returned. By default,
87
+ summary row is not returned. If requested, the summary row will be sent
88
+ in a response by itself after all others query results are returned.
89
+ :param validate_only: If true, the request is validated but not executed. Default is false.
49
90
  :param gcp_conn_id: The connection ID to use when fetching connection info.
50
- :param delegate_to: The account to impersonate using domain-wide delegation of authority,
51
- if any. For this to work, the service account making the request must have
52
- domain-wide delegation enabled.
53
- :param impersonation_chain: Optional service account to impersonate using short-term
54
- credentials, or chained list of accounts required to get the access_token
55
- of the last account in the list, which will be impersonated in the request.
56
- If set as a string, the account must grant the originating account
57
- the Service Account Token Creator IAM role.
58
- If set as a sequence, the identities from the list must grant
59
- Service Account Token Creator IAM role to the directly preceding identity, with first
60
- account from the list granting this role to the originating account (templated).
91
+ :param api_version: The version of the API that will be requested for example 'v0'.
61
92
  """
62
93
 
63
94
  template_fields: Sequence[str] = (
64
- "report",
65
- "impersonation_chain",
95
+ *_GoogleSearchAdsBaseOperator.template_fields,
96
+ "page_token",
97
+ "page_size",
66
98
  )
67
- template_ext: Sequence[str] = (".json",)
68
99
 
69
100
  def __init__(
70
101
  self,
71
102
  *,
72
- report: dict[str, Any],
73
- api_version: str = "v2",
74
- gcp_conn_id: str = "google_cloud_default",
75
- delegate_to: str | None = None,
76
- impersonation_chain: str | Sequence[str] | None = None,
103
+ customer_id: str,
104
+ query: str,
105
+ page_token: str | None = None,
106
+ page_size: int = 10000,
107
+ return_total_results_count: bool = False,
108
+ summary_row_setting: str | None = None,
109
+ validate_only: bool = False,
77
110
  **kwargs,
78
111
  ) -> None:
79
112
  super().__init__(**kwargs)
80
- self.report = report
81
- self.api_version = api_version
82
- self.gcp_conn_id = gcp_conn_id
83
- self.delegate_to = delegate_to
84
- self.impersonation_chain = impersonation_chain
85
-
86
- def prepare_template(self) -> None:
87
- # If .json is passed then we have to read the file
88
- if isinstance(self.report, str) and self.report.endswith(".json"):
89
- with open(self.report) as file:
90
- self.report = json.load(file)
113
+ self.customer_id = customer_id
114
+ self.query = query
115
+ self.page_token = page_token
116
+ self.page_size = page_size
117
+ self.return_total_results_count = return_total_results_count
118
+ self.summary_row_setting = summary_row_setting
119
+ self.validate_only = validate_only
91
120
 
92
121
  def execute(self, context: Context):
93
- hook = GoogleSearchAdsHook(
94
- gcp_conn_id=self.gcp_conn_id,
95
- delegate_to=self.delegate_to,
96
- api_version=self.api_version,
97
- impersonation_chain=self.impersonation_chain,
122
+ self.log.info("Querying Search Ads")
123
+ response = self.hook.search(
124
+ customer_id=self.customer_id,
125
+ query=self.query,
126
+ page_size=self.page_size,
127
+ page_token=self.page_token,
128
+ return_total_results_count=self.return_total_results_count,
129
+ summary_row_setting=self.summary_row_setting,
130
+ validate_only=self.validate_only,
98
131
  )
99
- self.log.info("Generating Search Ads report")
100
- response = hook.insert_report(report=self.report)
101
- report_id = response.get("id")
102
- self.xcom_push(context, key="report_id", value=report_id)
103
- self.log.info("Report generated, id: %s", report_id)
132
+ self.log.info("Query result: %s", response)
133
+ return response
134
+
135
+
136
+ class GoogleSearchAdsGetFieldOperator(_GoogleSearchAdsBaseOperator):
137
+ """
138
+ Retrieve metadata for a resource or a field.
139
+
140
+ .. seealso:
141
+ For API documentation check:
142
+ https://developers.google.com/search-ads/reporting/api/reference/rest/v0/searchAds360Fields/get
143
+
144
+ .. seealso::
145
+ For more information on how to use this operator, take a look at the guide:
146
+ :ref:`howto/operator:GoogleSearchAdsGetFieldOperator`
147
+
148
+ :param field_name: The name of the field.
149
+ :param gcp_conn_id: The connection ID to use when fetching connection info.
150
+ :param api_version: The version of the API that will be requested for example 'v0'.
151
+ """
152
+
153
+ def __init__(
154
+ self,
155
+ *,
156
+ field_name: str,
157
+ **kwargs,
158
+ ):
159
+ super().__init__(**kwargs)
160
+ self.field_name = field_name
161
+
162
+ def execute(self, context: Context) -> Any:
163
+ self.log.info("Retrieving the metadata for the field '%s'", self.field_name)
164
+ response = self.hook.get_field(field_name=self.field_name)
165
+ self.log.info("Retrieved field: %s", response["resourceName"])
104
166
  return response
105
167
 
106
168
 
107
- class GoogleSearchAdsDownloadReportOperator(BaseOperator):
169
+ class GoogleSearchAdsSearchFieldsOperator(_GoogleSearchAdsBaseOperator):
108
170
  """
109
- Downloads a report to GCS bucket.
171
+ Retrieve metadata for resource(s) or field(s) by the query syntax.
110
172
 
111
173
  .. seealso:
112
174
  For API documentation check:
113
- https://developers.google.com/search-ads/v2/reference/reports/getFile
175
+ https://developers.google.com/search-ads/reporting/api/reference/rest/v0/searchAds360Fields/search
114
176
 
115
177
  .. seealso::
116
178
  For more information on how to use this operator, take a look at the guide:
117
- :ref:`howto/operator:GoogleSearchAdsGetfileReportOperator`
118
-
119
- :param report_id: ID of the report.
120
- :param bucket_name: The bucket to upload to.
121
- :param report_name: The report name to set when uploading the local file. If not provided then
122
- report_id is used.
123
- :param gzip: Option to compress local file or file data for upload
124
- :param api_version: The version of the api that will be requested for example 'v3'.
179
+ :ref:`howto/operator:GoogleSearchAdsSearchFieldsOperator`
180
+
181
+ :param query: The query string to execute.
182
+ :param page_token: Token of the page to retrieve. If not specified, the first page of results will be
183
+ returned. Use the value obtained from `next_page_token` in the previous response
184
+ in order to request the next page of results.
185
+ :param page_size: Number of elements to retrieve in a single page. When too large a page is requested,
186
+ the server may decide to further limit the number of returned resources.
187
+ Default 10000.
125
188
  :param gcp_conn_id: The connection ID to use when fetching connection info.
126
- :param delegate_to: The account to impersonate using domain-wide delegation of authority,
127
- if any. For this to work, the service account making the request must have
128
- domain-wide delegation enabled.
129
- :param impersonation_chain: Optional service account to impersonate using short-term
130
- credentials, or chained list of accounts required to get the access_token
131
- of the last account in the list, which will be impersonated in the request.
132
- If set as a string, the account must grant the originating account
133
- the Service Account Token Creator IAM role.
134
- If set as a sequence, the identities from the list must grant
135
- Service Account Token Creator IAM role to the directly preceding identity, with first
136
- account from the list granting this role to the originating account (templated).
189
+ :param api_version: The version of the API that will be requested for example 'v0'.
137
190
  """
138
191
 
139
192
  template_fields: Sequence[str] = (
140
- "report_name",
141
- "report_id",
142
- "bucket_name",
143
- "impersonation_chain",
193
+ *_GoogleSearchAdsBaseOperator.template_fields,
194
+ "page_token",
195
+ "page_size",
144
196
  )
145
197
 
146
198
  def __init__(
147
199
  self,
148
200
  *,
149
- report_id: str,
150
- bucket_name: str,
151
- report_name: str | None = None,
152
- gzip: bool = True,
153
- chunk_size: int = 10 * 1024 * 1024,
154
- api_version: str = "v2",
155
- gcp_conn_id: str = "google_cloud_default",
156
- delegate_to: str | None = None,
157
- impersonation_chain: str | Sequence[str] | None = None,
201
+ query: str,
202
+ page_token: str | None = None,
203
+ page_size: int = 10000,
204
+ **kwargs,
205
+ ):
206
+ super().__init__(**kwargs)
207
+ self.query = query
208
+
209
+ self.page_token = page_token
210
+ self.page_size = page_size
211
+
212
+ def execute(self, context: Context) -> Any:
213
+ self.log.info("Retrieving the metadata for %s", self.query)
214
+ response = self.hook.search_fields(
215
+ query=self.query,
216
+ page_token=self.page_token,
217
+ page_size=self.page_size,
218
+ )
219
+ self.log.info("Num of fields retrieved, #%d", len(response["results"]))
220
+ return response
221
+
222
+
223
+ class GoogleSearchAdsGetCustomColumnOperator(_GoogleSearchAdsBaseOperator):
224
+ """
225
+ Retrieve details of a custom column for the given customer_id and campaign_id.
226
+
227
+ .. seealso:
228
+ For API documentation check:
229
+ https://developers.google.com/search-ads/reporting/api/reference/rest/v0/customers.customColumns/get
230
+
231
+ .. seealso::
232
+ For more information on how to use this operator, take a look at the guide:
233
+ :ref:`howto/operator:GoogleSearchAdsGetCustomColumnOperator`
234
+
235
+ :param customer_id: The customer ID for the custom column.
236
+ :param custom_column_id: The ID for the custom column.
237
+ :param gcp_conn_id: The connection ID to use when fetching connection info.
238
+ :param api_version: The version of the API that will be requested for example 'v0'.
239
+ """
240
+
241
+ def __init__(
242
+ self,
243
+ *,
244
+ customer_id: str,
245
+ custom_column_id: str,
158
246
  **kwargs,
159
247
  ) -> None:
160
248
  super().__init__(**kwargs)
161
- self.report_id = report_id
162
- self.api_version = api_version
163
- self.gcp_conn_id = gcp_conn_id
164
- self.delegate_to = delegate_to
165
- self.report_id = report_id
166
- self.chunk_size = chunk_size
167
- self.gzip = gzip
168
- self.bucket_name = bucket_name
169
- self.report_name = report_name
170
- self.impersonation_chain = impersonation_chain
171
-
172
- def _resolve_file_name(self, name: str) -> str:
173
- csv = ".csv"
174
- gzip = ".gz"
175
- if not name.endswith(csv):
176
- name += csv
177
- if self.gzip:
178
- name += gzip
179
- return name
180
-
181
- @staticmethod
182
- def _set_bucket_name(name: str) -> str:
183
- bucket = name if not name.startswith("gs://") else name[5:]
184
- return bucket.strip("/")
185
-
186
- @staticmethod
187
- def _handle_report_fragment(fragment: bytes) -> bytes:
188
- fragment_records = fragment.split(b"\n", 1)
189
- if len(fragment_records) > 1:
190
- return fragment_records[1]
191
- return b""
249
+ self.customer_id = customer_id
250
+ self.custom_column_id = custom_column_id
192
251
 
193
252
  def execute(self, context: Context):
194
- hook = GoogleSearchAdsHook(
195
- gcp_conn_id=self.gcp_conn_id,
196
- delegate_to=self.delegate_to,
197
- api_version=self.api_version,
198
- impersonation_chain=self.impersonation_chain,
253
+ self.log.info(
254
+ "Retrieving the custom column for the customer %s with the id of %s",
255
+ self.customer_id,
256
+ self.custom_column_id,
199
257
  )
200
-
201
- gcs_hook = GCSHook(
202
- gcp_conn_id=self.gcp_conn_id,
203
- delegate_to=self.delegate_to,
204
- impersonation_chain=self.impersonation_chain,
258
+ response = self.hook.get_custom_column(
259
+ customer_id=self.customer_id,
260
+ custom_column_id=self.custom_column_id,
205
261
  )
262
+ self.log.info("Retrieved custom column: %s", response["id"])
263
+ return response
264
+
265
+
266
+ class GoogleSearchAdsListCustomColumnsOperator(_GoogleSearchAdsBaseOperator):
267
+ """
268
+ List all custom columns.
269
+
270
+ .. seealso:
271
+ For API documentation check:
272
+ https://developers.google.com/search-ads/reporting/api/reference/rest/v0/customers.customColumns/list
273
+
274
+ .. seealso::
275
+ For more information on how to use this operator, take a look at the guide:
276
+ :ref:`howto/operator:GoogleSearchAdsListCustomColumnsOperator`
206
277
 
207
- # Resolve file name of the report
208
- report_name = self.report_name or self.report_id
209
- report_name = self._resolve_file_name(report_name)
210
-
211
- response = hook.get(report_id=self.report_id)
212
- if not response["isReportReady"]:
213
- raise AirflowException(f"Report {self.report_id} is not ready yet")
214
-
215
- # Resolve report fragments
216
- fragments_count = len(response["files"])
217
-
218
- # Download chunks of report's data
219
- self.log.info("Downloading Search Ads report %s", self.report_id)
220
- with NamedTemporaryFile() as temp_file:
221
- for i in range(fragments_count):
222
- byte_content = hook.get_file(report_fragment=i, report_id=self.report_id)
223
- fragment = byte_content if i == 0 else self._handle_report_fragment(byte_content)
224
- temp_file.write(fragment)
225
-
226
- temp_file.flush()
227
-
228
- bucket_name = self._set_bucket_name(self.bucket_name)
229
- gcs_hook.upload(
230
- bucket_name=bucket_name,
231
- object_name=report_name,
232
- gzip=self.gzip,
233
- filename=temp_file.name,
234
- )
235
- self.xcom_push(context, key="file_name", value=report_name)
278
+ :param customer_id: The customer ID for the custom column.
279
+ :param gcp_conn_id: The connection ID to use when fetching connection info.
280
+ :param api_version: The version of the API that will be requested for example 'v0'.
281
+ """
282
+
283
+ def __init__(
284
+ self,
285
+ *,
286
+ customer_id: str,
287
+ **kwargs,
288
+ ) -> None:
289
+ super().__init__(**kwargs)
290
+ self.customer_id = customer_id
291
+
292
+ def execute(self, context: Context):
293
+ self.log.info("Listing the custom columns for %s", self.customer_id)
294
+ response = self.hook.list_custom_columns(customer_id=self.customer_id)
295
+ self.log.info("Num of retrieved custom column: %d", len(response.get("customColumns")))
296
+ return response
@@ -20,7 +20,7 @@ from __future__ import annotations
20
20
 
21
21
  from typing import TYPE_CHECKING, Sequence
22
22
 
23
- from airflow.exceptions import AirflowException, AirflowSkipException
23
+ from airflow.exceptions import AirflowException
24
24
  from airflow.providers.google.marketing_platform.hooks.display_video import GoogleDisplayVideo360Hook
25
25
  from airflow.sensors.base import BaseSensorOperator
26
26
 
@@ -88,10 +88,7 @@ class GoogleDisplayVideo360GetSDFDownloadOperationSensor(BaseSensorOperator):
88
88
  )
89
89
  operation = hook.get_sdf_download_operation(operation_name=self.operation_name)
90
90
  if "error" in operation:
91
- # TODO: remove this if block when min_airflow_version is set to higher than 2.7.1
92
91
  message = f'The operation finished in error with {operation["error"]}'
93
- if self.soft_fail:
94
- raise AirflowSkipException(message)
95
92
  raise AirflowException(message)
96
93
  if operation and operation.get("done"):
97
94
  return True
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: apache-airflow-providers-google
3
- Version: 10.22.0rc1
3
+ Version: 10.23.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>
@@ -31,17 +31,17 @@ Requires-Dist: gcloud-aio-auth>=5.2.0
31
31
  Requires-Dist: gcloud-aio-bigquery>=6.1.2
32
32
  Requires-Dist: gcloud-aio-storage>=9.0.0
33
33
  Requires-Dist: gcsfs>=2023.10.0
34
- Requires-Dist: google-ads>=24.1.0
34
+ Requires-Dist: google-ads>=25.0.0
35
35
  Requires-Dist: google-analytics-admin>=0.9.0
36
36
  Requires-Dist: google-api-core>=2.11.0,!=2.16.0,!=2.18.0
37
37
  Requires-Dist: google-api-python-client>=2.0.2
38
38
  Requires-Dist: google-auth-httplib2>=0.0.1
39
39
  Requires-Dist: google-auth>=2.29.0
40
- Requires-Dist: google-cloud-aiplatform>=1.57.0
40
+ Requires-Dist: google-cloud-aiplatform>=1.63.0
41
41
  Requires-Dist: google-cloud-automl>=2.12.0
42
42
  Requires-Dist: google-cloud-batch>=0.13.0
43
43
  Requires-Dist: google-cloud-bigquery-datatransfer>=3.13.0
44
- Requires-Dist: google-cloud-bigquery<3.21.0,>=3.4.0
44
+ Requires-Dist: google-cloud-bigquery>=3.4.0,!=3.21.*,!=3.22.0,!=3.23.*
45
45
  Requires-Dist: google-cloud-bigtable>=2.17.0
46
46
  Requires-Dist: google-cloud-build>=3.22.0
47
47
  Requires-Dist: google-cloud-compute>=1.10.0
@@ -51,7 +51,7 @@ Requires-Dist: google-cloud-dataflow-client>=0.8.6
51
51
  Requires-Dist: google-cloud-dataform>=0.5.0
52
52
  Requires-Dist: google-cloud-dataplex>=1.10.0
53
53
  Requires-Dist: google-cloud-dataproc-metastore>=1.12.0
54
- Requires-Dist: google-cloud-dataproc>=5.8.0
54
+ Requires-Dist: google-cloud-dataproc>=5.12.0
55
55
  Requires-Dist: google-cloud-dlp>=3.12.0
56
56
  Requires-Dist: google-cloud-kms>=2.15.0
57
57
  Requires-Dist: google-cloud-language>=2.9.0
@@ -64,7 +64,7 @@ Requires-Dist: google-cloud-pubsub>=2.19.0
64
64
  Requires-Dist: google-cloud-redis>=2.12.0
65
65
  Requires-Dist: google-cloud-run>=0.10.0
66
66
  Requires-Dist: google-cloud-secret-manager>=2.16.0
67
- Requires-Dist: google-cloud-spanner>=3.11.1
67
+ Requires-Dist: google-cloud-spanner>=3.11.1,!=3.49.0
68
68
  Requires-Dist: google-cloud-speech>=2.18.0
69
69
  Requires-Dist: google-cloud-storage-transfer>=1.4.1
70
70
  Requires-Dist: google-cloud-storage>=2.7.0
@@ -76,6 +76,7 @@ Requires-Dist: google-cloud-vision>=3.4.0
76
76
  Requires-Dist: google-cloud-workflows>=1.10.0
77
77
  Requires-Dist: grpcio-gcp>=0.2.2
78
78
  Requires-Dist: httpx>=0.25.0
79
+ Requires-Dist: immutabledict>=4.2.0
79
80
  Requires-Dist: json-merge-patch>=0.2
80
81
  Requires-Dist: looker-sdk>=22.4.0
81
82
  Requires-Dist: pandas-gbq>=0.7.0
@@ -107,8 +108,8 @@ Requires-Dist: apache-airflow-providers-sftp ; extra == "sftp"
107
108
  Requires-Dist: apache-airflow-providers-ssh ; extra == "ssh"
108
109
  Requires-Dist: apache-airflow-providers-trino ; extra == "trino"
109
110
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
110
- Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-google/10.22.0/changelog.html
111
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-google/10.22.0
111
+ Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-google/10.23.0/changelog.html
112
+ Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-google/10.23.0
112
113
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
113
114
  Project-URL: Source Code, https://github.com/apache/airflow
114
115
  Project-URL: Twitter, https://twitter.com/ApacheAirflow
@@ -177,7 +178,7 @@ Provides-Extra: trino
177
178
 
178
179
  Package ``apache-airflow-providers-google``
179
180
 
180
- Release: ``10.22.0.rc1``
181
+ Release: ``10.23.0.rc1``
181
182
 
182
183
 
183
184
  Google services including:
@@ -197,7 +198,7 @@ This is a provider package for ``google`` provider. All classes for this provide
197
198
  are in ``airflow.providers.google`` python package.
198
199
 
199
200
  You can find package information and changelog for the provider
200
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-google/10.22.0/>`_.
201
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-google/10.23.0/>`_.
201
202
 
202
203
  Installation
203
204
  ------------
@@ -223,15 +224,15 @@ PIP package Version required
223
224
  ``gcloud-aio-bigquery`` ``>=6.1.2``
224
225
  ``gcloud-aio-storage`` ``>=9.0.0``
225
226
  ``gcsfs`` ``>=2023.10.0``
226
- ``google-ads`` ``>=24.1.0``
227
+ ``google-ads`` ``>=25.0.0``
227
228
  ``google-analytics-admin`` ``>=0.9.0``
228
229
  ``google-api-core`` ``>=2.11.0,!=2.16.0,!=2.18.0``
229
230
  ``google-api-python-client`` ``>=2.0.2``
230
231
  ``google-auth`` ``>=2.29.0``
231
232
  ``google-auth-httplib2`` ``>=0.0.1``
232
- ``google-cloud-aiplatform`` ``>=1.57.0``
233
+ ``google-cloud-aiplatform`` ``>=1.63.0``
233
234
  ``google-cloud-automl`` ``>=2.12.0``
234
- ``google-cloud-bigquery`` ``<3.21.0,>=3.4.0``
235
+ ``google-cloud-bigquery`` ``!=3.21.*,!=3.22.0,!=3.23.*,>=3.4.0``
235
236
  ``google-cloud-bigquery-datatransfer`` ``>=3.13.0``
236
237
  ``google-cloud-bigtable`` ``>=2.17.0``
237
238
  ``google-cloud-build`` ``>=3.22.0``
@@ -241,7 +242,7 @@ PIP package Version required
241
242
  ``google-cloud-dataflow-client`` ``>=0.8.6``
242
243
  ``google-cloud-dataform`` ``>=0.5.0``
243
244
  ``google-cloud-dataplex`` ``>=1.10.0``
244
- ``google-cloud-dataproc`` ``>=5.8.0``
245
+ ``google-cloud-dataproc`` ``>=5.12.0``
245
246
  ``google-cloud-dataproc-metastore`` ``>=1.12.0``
246
247
  ``google-cloud-dlp`` ``>=3.12.0``
247
248
  ``google-cloud-kms`` ``>=2.15.0``
@@ -254,7 +255,7 @@ PIP package Version required
254
255
  ``google-cloud-pubsub`` ``>=2.19.0``
255
256
  ``google-cloud-redis`` ``>=2.12.0``
256
257
  ``google-cloud-secret-manager`` ``>=2.16.0``
257
- ``google-cloud-spanner`` ``>=3.11.1``
258
+ ``google-cloud-spanner`` ``>=3.11.1,!=3.49.0``
258
259
  ``google-cloud-speech`` ``>=2.18.0``
259
260
  ``google-cloud-storage`` ``>=2.7.0``
260
261
  ``google-cloud-storage-transfer`` ``>=1.4.1``
@@ -279,6 +280,7 @@ PIP package Version required
279
280
  ``sqlalchemy-bigquery`` ``>=1.2.1``
280
281
  ``sqlalchemy-spanner`` ``>=1.6.2``
281
282
  ``tenacity`` ``>=8.1.0``
283
+ ``immutabledict`` ``>=4.2.0``
282
284
  ========================================== =========================================
283
285
 
284
286
  Cross provider package dependencies
@@ -318,4 +320,4 @@ Dependent package
318
320
  ======================================================================================================================== ====================
319
321
 
320
322
  The changelog for the provider package can be found in the
321
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-google/10.22.0/changelog.html>`_.
323
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-google/10.23.0/changelog.html>`_.