findly.unified-reporting-sdk 0.7.9__tar.gz → 0.7.11__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/PKG-INFO +1 -1
  2. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/common/common_parser.py +1 -1
  3. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/ga4/ga4_client.py +55 -17
  4. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/pyproject.toml +1 -1
  5. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/LICENSE +0 -0
  6. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/README.md +0 -0
  7. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/__init__.py +0 -0
  8. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/__init__.py +0 -0
  9. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/__init__.py +0 -0
  10. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/common/__init__.py +0 -0
  11. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/common/date_range_helper.py +0 -0
  12. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/common/entities.py +0 -0
  13. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/common/reports_client.py +0 -0
  14. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/common/where_string_comparison.py +0 -0
  15. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/fb_ads/__init__.py +0 -0
  16. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/fb_ads/fb_ads_client.py +0 -0
  17. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/fb_ads/fb_ads_query_args_parser.py +0 -0
  18. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/fb_ads/metadata/action_breakdowns.csv +0 -0
  19. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/fb_ads/metadata/breakdowns.csv +0 -0
  20. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/fb_ads/metadata/dimensions.jsonl +0 -0
  21. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/fb_ads/metadata/fields.csv +0 -0
  22. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/fb_ads/metadata/metrics.jsonl +0 -0
  23. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/ga4/__init__.py +0 -0
  24. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/ga4/ga4_query_args_parser.py +0 -0
  25. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/ga4/metadata/dimensions.jsonl +0 -0
  26. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/gsc/__init__.py +0 -0
  27. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/gsc/gsc_client.py +0 -0
  28. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/data_sources/gsc/gsc_service.py +0 -0
  29. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/protos/.gitignore +0 -0
  30. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/protos/__init__.py +0 -0
  31. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/protos/findly_semantic_layer_pb2.py +0 -0
  32. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/protos/findly_semantic_layer_pb2.pyi +0 -0
  33. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/urs.py +0 -0
  34. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/util/__init__.py +0 -0
  35. {findly_unified_reporting_sdk-0.7.9 → findly_unified_reporting_sdk-0.7.11}/findly/unified_reporting_sdk/util/create_numeric_string_series.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: findly.unified-reporting-sdk
3
- Version: 0.7.9
3
+ Version: 0.7.11
4
4
  Summary:
5
5
  License: GPL-3.0-only
6
6
  Requires-Python: >=3.9,<4.0
@@ -167,7 +167,7 @@ class CommonParser:
167
167
  def equalize_dataframe_rows(
168
168
  self, dataframes: List[pd.DataFrame], dimensions: List[str]
169
169
  ) -> List[pd.DataFrame]:
170
- if len(dataframes) <= 1 or not dimensions:
170
+ if len(dataframes) <= 1 or not dimensions or all(df.empty for df in dataframes):
171
171
  return dataframes
172
172
 
173
173
  # Check if all dimensions exist in all dataframes
@@ -240,6 +240,18 @@ class GA4Client(ReportsClient):
240
240
  )
241
241
  return None
242
242
 
243
+ def _deduplicate_dimensions(self, dimensions: List[Dimension]) -> List[Dimension]:
244
+ """
245
+ Deduplicate a list of Dimension objects using their name as a unique key.
246
+ """
247
+ seen = set()
248
+ deduped = []
249
+ for d in dimensions:
250
+ if d.name not in seen:
251
+ seen.add(d.name)
252
+ deduped.append(d)
253
+ return deduped
254
+
243
255
  @backoff.on_exception(
244
256
  backoff.expo, Exception, max_time=60, max_tries=3, giveup=give_up
245
257
  )
@@ -260,10 +272,11 @@ class GA4Client(ReportsClient):
260
272
  ) -> Optional[RunReportResponse]:
261
273
  report_response = None
262
274
  try:
275
+ deduplicated_dimensions = self._deduplicate_dimensions(dimensions)
263
276
  request = RunReportRequest(
264
277
  property=f"properties/{property_id}",
265
278
  date_ranges=date_ranges,
266
- dimensions=dimensions,
279
+ dimensions=deduplicated_dimensions,
267
280
  metrics=metrics,
268
281
  metric_filter=metric_filter,
269
282
  dimension_filter=dimension_filter,
@@ -313,23 +326,48 @@ class GA4Client(ReportsClient):
313
326
  include_totals: bool = True,
314
327
  **kwargs: str,
315
328
  ) -> Optional[RunReportResponse]:
316
-
317
- # deduplicate dimensions, otherwise we get an error
318
- deduplicated_dimensions = list(set(dimensions))
329
+ # Use the new deduplication method instead of set() to avoid the unhashable error.
330
+ deduplicated_dimensions = self._deduplicate_dimensions(dimensions)
319
331
 
320
- return await self._decorated_query_from_parts(
321
- metrics=metrics,
322
- dimensions=deduplicated_dimensions,
323
- date_ranges=date_ranges,
324
- dimension_filter=dimension_filter,
325
- metric_filter=metric_filter,
326
- order_bys=order_bys,
327
- limit=limit,
328
- offset=offset,
329
- property_id=property_id,
330
- include_totals=include_totals,
331
- **kwargs,
332
- )
332
+ try:
333
+ request = RunReportRequest(
334
+ property=f"properties/{property_id}",
335
+ date_ranges=date_ranges,
336
+ dimensions=deduplicated_dimensions,
337
+ metrics=metrics,
338
+ metric_filter=metric_filter,
339
+ dimension_filter=dimension_filter,
340
+ order_bys=order_bys,
341
+ limit=limit,
342
+ offset=offset,
343
+ keep_empty_rows=True,
344
+ metric_aggregations=(
345
+ [MetricAggregation.TOTAL] if include_totals else None
346
+ ),
347
+ )
348
+ report_response = await asyncio.wait_for(
349
+ self._client.run_report(request), timeout=REQUEST_TIMEOUT
350
+ )
351
+ except (TimeoutError, asyncio.exceptions.TimeoutError) as timeout_error:
352
+ LOGGER.warning(
353
+ {
354
+ "error": str(timeout_error),
355
+ "msg": "timeout_error_from_ga4_client",
356
+ "property_id": property_id,
357
+ }
358
+ )
359
+ raise timeout_error
360
+ except Exception as e:
361
+ LOGGER.warning(
362
+ {
363
+ "msg": "failed_to_run_report",
364
+ "property_id": property_id,
365
+ "error": str(e),
366
+ }
367
+ )
368
+ raise e
369
+
370
+ return report_response
333
371
 
334
372
  @cached(ttl=300, cache=Cache.MEMORY) # Cache results for 5 minutes
335
373
  async def _decorated_query(
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "findly.unified-reporting-sdk"
3
- version = "0.7.9"
3
+ version = "0.7.11"
4
4
  license = "GPL-3.0-only"
5
5
  description = ""
6
6
  authors = []