findly.unified-reporting-sdk 0.6.22__py3-none-any.whl → 0.7.1__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.
@@ -127,12 +127,9 @@ class CommonParser:
127
127
 
128
128
  # Date Where clause
129
129
  if query.date_ranges:
130
- sql_date_range = await self.get_date_ranges(
131
- date_str_range_list=list(query.date_ranges)
132
- )
133
- for date_range in sql_date_range:
134
- start_date = date_range["since"]
135
- end_date = date_range["until"]
130
+ for date_range in list(query.date_ranges):
131
+ start_date = date_range.start_date
132
+ end_date = date_range.end_date
136
133
  # Check if start and end dates are the same
137
134
  if start_date == end_date:
138
135
  # Use equality condition when dates are the same
@@ -158,7 +155,8 @@ class CommonParser:
158
155
 
159
156
  # Order By
160
157
  if query.order_by:
161
- query_parts.append(f"ORDER BY {query.order_by}")
158
+ order_by_str = ", ".join(query.order_by)
159
+ query_parts.append(f"ORDER BY {order_by_str}")
162
160
 
163
161
  # Limit
164
162
  if query.limit:
@@ -0,0 +1,10 @@
1
+ import dataclasses
2
+ from typing import List, Optional
3
+ from pandas import DataFrame
4
+
5
+
6
+ @dataclasses.dataclass
7
+ class ReportsClientQueryResult:
8
+ main_result: List[DataFrame]
9
+ totals_result: List[DataFrame]
10
+ sql_query: Optional[str] = None
@@ -1,8 +1,9 @@
1
- import logging
2
- import pandas as pd
3
1
  from abc import ABC, abstractmethod
4
- from typing import List, Tuple, Optional, Dict
2
+ from typing import List, Optional
5
3
 
4
+ from findly.unified_reporting_sdk.data_sources.common.entities import (
5
+ ReportsClientQueryResult,
6
+ )
6
7
  from findly.unified_reporting_sdk.protos.findly_semantic_layer_pb2 import (
7
8
  Dimension,
8
9
  Metric,
@@ -23,7 +24,7 @@ class ReportsClient(ABC):
23
24
  @abstractmethod
24
25
  async def query(
25
26
  self, query_args: QueryArgs, property_id: str, **kwargs: str
26
- ) -> Optional[Tuple[List[pd.DataFrame], List[pd.DataFrame]]]:
27
+ ) -> Optional[ReportsClientQueryResult]:
27
28
  """
28
29
  Executes the integration API request based on the SQL query parts.
29
30
 
@@ -32,7 +33,7 @@ class ReportsClient(ABC):
32
33
  property_id (str): The property ID to execute the query for.
33
34
 
34
35
  Returns:
35
- Optional[Tuple[List[pd.DataFrame], List[pd.DataFrame]]]: A tuple containing two lists of pandas DataFrames, or None if the query failed.
36
+ Optional[ReportsClientQueryResult]: The query result, or None if the query failed.
36
37
  """
37
38
  pass
38
39
 
@@ -194,6 +194,6 @@ def parse_where_column_condition(
194
194
  if __name__ == "__main__":
195
195
  # ERROR:findly.unified_reporting_sdk.data_sources.common.where_string_comparison:{'msg': 'error_parse_where_column_condition', 'where_clause': "WHERE LOWER(cargo) LIKE LOWER('%crude%') AND WHERE LOWER(imo__ais_destination_formatted) LIKE LOWER(%rotterdam%) ", 'sql_query': "select * from table WHERE LOWER(cargo) LIKE LOWER('%crude%') AND WHERE LOWER(imo__ais_destination_formatted) LIKE LOWER(%rotterdam%) ", 'error': "Required keyword: 'expression' missing for <class 'sqlglot.expressions.And'>. Line 1, Col: 70.\n select * from table WHERE LOWER(cargo) LIKE LOWER('%crude%') AND \x1b[4mWHERE\x1b[0m LOWER(imo__ais_destination_formatted) LIKE LOWER(%rotterdam%) "}
196
196
  # i want to test this case above
197
- where_clause_str = "WHERE LOWER(cargo) LIKE LOWER('%crude%') AND WHERE LOWER(imo__ais_destination_formatted) LIKE LOWER(%rotterdam%) "
197
+ where_clause_str = "WHERE LOWER(cargo) LIKE LOWER('%crude%') AND LOWER(imo__ais_destination_formatted) LIKE LOWER('%rotterdam%') "
198
198
  dialect = "bigquery"
199
199
  print(parse_where_column_condition(where_clause_str, dialect))
@@ -10,6 +10,9 @@ from facebook_business.adobjects.adsinsights import AdsInsights
10
10
  from facebook_business.adobjects.user import User
11
11
  from facebook_business.adobjects.business import Business
12
12
 
13
+ from findly.unified_reporting_sdk.data_sources.common.entities import (
14
+ ReportsClientQueryResult,
15
+ )
13
16
  from findly.unified_reporting_sdk.data_sources.common.reports_client import (
14
17
  ReportsClient,
15
18
  )
@@ -172,7 +175,6 @@ class FbAdsClient(ReportsClient):
172
175
  sort: Optional[List[str]] = None,
173
176
  filtering: Optional[List[Dict[str, str]]] = None,
174
177
  limit: Union[int, str] = DEFAULT_LIMIT_FOR_ADS_INSIGHTS_CURSOR,
175
- time_increment: Optional[str] = None,
176
178
  level: AdsInsights.Level = AdsInsights.Level.account,
177
179
  page_size: int = DEFAULT_PAGE_SIZE_FOR_FB_ADS_PAGINATED_CALL,
178
180
  **kwargs: str,
@@ -303,7 +305,7 @@ class FbAdsClient(ReportsClient):
303
305
  query_args: QueryArgs,
304
306
  property_id: str,
305
307
  **kwargs: str,
306
- ) -> Optional[Tuple[List[pd.DataFrame], List[pd.DataFrame]]]:
308
+ ) -> Optional[ReportsClientQueryResult]:
307
309
  params = await FB_PARSER.parse_query_args_to_request_params(
308
310
  query_args=query_args,
309
311
  property_id=property_id,
@@ -333,14 +335,17 @@ class FbAdsClient(ReportsClient):
333
335
  summary=summary,
334
336
  query_args=query_args,
335
337
  )
336
- return generated_result_df, generated_totals_df
338
+
339
+ return ReportsClientQueryResult(
340
+ main_result=generated_result_df, totals_result=generated_totals_df
341
+ )
337
342
 
338
343
  async def query(
339
344
  self,
340
345
  query_args: QueryArgs,
341
346
  property_id: str,
342
347
  **kwargs: str,
343
- ) -> Optional[Tuple[List[pd.DataFrame], List[pd.DataFrame]]]:
348
+ ) -> Optional[ReportsClientQueryResult]:
344
349
  return await self._decorated_query(
345
350
  query_args=query_args,
346
351
  property_id=property_id,
@@ -299,7 +299,7 @@ class FbAdsQueryArgsParser(CommonParser):
299
299
  exploded_df = df.explode(metric.name)
300
300
 
301
301
  # Normalize the dictionary in 'metric column to separate columns
302
- normalized_df = pd.json_normalize(exploded_df[metric.name])
302
+ normalized_df = pd.json_normalize(exploded_df[metric.name].tolist())
303
303
 
304
304
  # Identify overlapping columns
305
305
  overlapping_columns = list(
@@ -398,7 +398,7 @@ class FbAdsQueryArgsParser(CommonParser):
398
398
  )
399
399
  equalized_dataframes = self.equalize_dataframe_rows(
400
400
  dataframes=final_df_list,
401
- dimensions=dimensions_headers,
401
+ dimensions=list(query_args.group_by_columns),
402
402
  )
403
403
  return equalized_dataframes
404
404
 
@@ -493,7 +493,7 @@ class FbAdsQueryArgsParser(CommonParser):
493
493
  exploded_df = summary_df.explode(metric.name)
494
494
 
495
495
  # Normalize the dictionary in 'metric column to separate columns
496
- normalized_df = pd.json_normalize(exploded_df[metric.name])
496
+ normalized_df = pd.json_normalize(exploded_df[metric.name].tolist())
497
497
 
498
498
  # Identify overlapping columns
499
499
  overlapping_columns = list(
@@ -1,7 +1,6 @@
1
1
  import asyncio
2
2
  import backoff
3
3
  import json
4
- import pandas as pd
5
4
  from aiocache import cached, Cache
6
5
  from google.protobuf.json_format import ParseDict
7
6
  from google.analytics.data_v1beta import BetaAnalyticsDataAsyncClient
@@ -29,6 +28,10 @@ from google.analytics.data_v1beta.types import (
29
28
  CheckCompatibilityRequest,
30
29
  CheckCompatibilityResponse,
31
30
  )
31
+
32
+ from findly.unified_reporting_sdk.data_sources.common.entities import (
33
+ ReportsClientQueryResult,
34
+ )
32
35
  from findly.unified_reporting_sdk.protos.findly_semantic_layer_pb2 import (
33
36
  Dimension as DimensionProto,
34
37
  )
@@ -330,7 +333,7 @@ class GA4Client(ReportsClient):
330
333
  query_args: QueryArgs,
331
334
  property_id: str,
332
335
  **kwargs: str,
333
- ) -> Optional[Tuple[List[pd.DataFrame], List[pd.DataFrame]]]:
336
+ ) -> Optional[ReportsClientQueryResult]:
334
337
  params = await GA4_PARSER.parse_query_args_to_request_params(
335
338
  query_args=query_args,
336
339
  property_id=property_id,
@@ -357,14 +360,17 @@ class GA4Client(ReportsClient):
357
360
  generated_totals_df = GA4_PARSER.parse_totals_to_dataframe(
358
361
  report_response=result,
359
362
  )
360
- return generated_result_df, generated_totals_df
363
+
364
+ return ReportsClientQueryResult(
365
+ main_result=generated_result_df, totals_result=generated_totals_df
366
+ )
361
367
 
362
368
  async def query(
363
369
  self,
364
370
  query_args: QueryArgs,
365
371
  property_id: str,
366
372
  **kwargs: str,
367
- ) -> Optional[Tuple[List[pd.DataFrame], List[pd.DataFrame]]]:
373
+ ) -> Optional[ReportsClientQueryResult]:
368
374
  return await self._decorated_query(
369
375
  query_args=query_args, property_id=property_id, **kwargs
370
376
  )
@@ -109,7 +109,7 @@ class GA4QueryArgsParser(CommonParser):
109
109
  date_range_indices = set([row[DATE_RANGE_HEADER] for row in rows])
110
110
 
111
111
  # Create a list of dataframes.
112
- dataframes = []
112
+ dataframes_tuple: List[tuple[int, pd.DataFrame]] = []
113
113
  for date_range_index in date_range_indices:
114
114
  # Create a dataframe with the rows that have the same date range index.
115
115
  date_range_df = pd.DataFrame(
@@ -120,14 +120,14 @@ class GA4QueryArgsParser(CommonParser):
120
120
  date_range_df = date_range_df.drop(columns=[DATE_RANGE_HEADER])
121
121
 
122
122
  # Add the dataframe to the list of dataframes.
123
- dataframes.append(
123
+ dataframes_tuple.append(
124
124
  (int(str(date_range_index).split("_")[-1]), date_range_df)
125
125
  )
126
126
  # Sort the dataframes based on the date range index.
127
- dataframes.sort()
127
+ dataframes_tuple.sort()
128
128
 
129
129
  # Remove the date range index from the tuples.
130
- dataframes = [df for _, df in dataframes]
130
+ dataframes: List[pd.DataFrame] = [df for _, df in dataframes_tuple]
131
131
 
132
132
  # remove DATE_RANGE_HEADER from the dimension headers.
133
133
  if DATE_RANGE_HEADER in dimension_headers:
@@ -196,7 +196,7 @@ class GA4QueryArgsParser(CommonParser):
196
196
  date_range_indices = set([row[DATE_RANGE_HEADER] for row in rows])
197
197
 
198
198
  # Create a list of dataframes.
199
- dataframes = []
199
+ dataframes_tuple: List[tuple[int, pd.DataFrame]] = []
200
200
  for date_range_index in date_range_indices:
201
201
  # Create a dataframe with the rows that have the same date range index.
202
202
  date_range_df = pd.DataFrame(
@@ -207,14 +207,14 @@ class GA4QueryArgsParser(CommonParser):
207
207
  date_range_df = date_range_df.drop(columns=[DATE_RANGE_HEADER])
208
208
 
209
209
  # Add the dataframe to the list of dataframes.
210
- dataframes.append(
210
+ dataframes_tuple.append(
211
211
  (int(str(date_range_index).split("_")[-1]), date_range_df)
212
212
  )
213
213
  # Sort the dataframes based on the date range index.
214
- dataframes.sort()
214
+ dataframes_tuple.sort()
215
215
 
216
216
  # Remove the date range index from the tuples.
217
- dataframes = [df for _, df in dataframes]
217
+ dataframes: List[pd.DataFrame] = [df for _, df in dataframes_tuple]
218
218
 
219
219
  # remove DATE_RANGE_HEADER from the dimension headers.
220
220
  if DATE_RANGE_HEADER in dimension_headers:
@@ -2,10 +2,10 @@
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
3
  # source: findly_semantic_layer.proto
4
4
  """Generated protocol buffer code."""
5
- from google.protobuf.internal import builder as _builder
6
5
  from google.protobuf import descriptor as _descriptor
7
6
  from google.protobuf import descriptor_pool as _descriptor_pool
8
7
  from google.protobuf import symbol_database as _symbol_database
8
+ from google.protobuf.internal import builder as _builder
9
9
  # @@protoc_insertion_point(imports)
10
10
 
11
11
  _sym_db = _symbol_database.Default()
@@ -15,37 +15,37 @@ _sym_db = _symbol_database.Default()
15
15
 
16
16
  DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1b\x66indly_semantic_layer.proto\x12\x15\x66indly_semantic_layer\"\xd4\x02\n\tDimension\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0c\n\x04\x65xpr\x18\x03 \x01(\t\x12\x32\n\x04type\x18\x04 \x01(\x0e\x32$.findly_semantic_layer.DimensionType\x12?\n\x0btype_params\x18\x05 \x01(\x0b\x32*.findly_semantic_layer.DimensionTypeParams\x12\x14\n\x0ctop_n_values\x18\x06 \x03(\t\x12\x16\n\nvalue_type\x18\x07 \x01(\tB\x02\x18\x01\x12\x19\n\x11\x64\x61ta_source_names\x18\x08 \x03(\t\x12\x14\n\x0c\x64isplay_name\x18\t \x01(\t\x12\x42\n\x0fvalue_type_enum\x18\n \x01(\x0e\x32).findly_semantic_layer.DimensionValueType\"k\n\x13\x44imensionTypeParams\x12@\n\x10time_granularity\x18\x01 \x01(\x0e\x32&.findly_semantic_layer.DateGranularity\x12\x12\n\nis_primary\x18\x02 \x01(\x08\"\x8b\x03\n\x06Metric\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x12\n\nexpression\x18\x04 \x01(\t\x12\x18\n\x10view_id_of_table\x18\x05 \x01(\t\x12\x12\n\ntable_name\x18\x06 \x01(\t\x12\x10\n\x08measures\x18\x07 \x03(\t\x12\x11\n\tnumerator\x18\x08 \x01(\t\x12\x13\n\x0b\x64\x65nominator\x18\t \x01(\t\x12/\n\x04type\x18\n \x01(\x0e\x32!.findly_semantic_layer.MetricType\x12\x10\n\x06window\x18\x0b \x01(\tH\x00\x12\x17\n\rgrain_to_date\x18\x0c \x01(\tH\x00\x12:\n\nvalue_type\x18\r \x01(\x0e\x32&.findly_semantic_layer.MetricValueType\x12\x14\n\x0c\x64isplay_name\x18\x0e \x01(\t\x12\x12\n\nis_numeric\x18\x0f \x01(\x08\x42\x14\n\x12\x63umulative_process\"4\n\x0c\x44\x61teStrRange\x12\x12\n\nstart_date\x18\x01 \x01(\t\x12\x10\n\x08\x65nd_date\x18\x02 \x01(\t\"\xf4\x02\n\tQueryArgs\x12\x14\n\x0cwhere_clause\x18\x01 \x01(\t\x12\x18\n\x10group_by_columns\x18\x02 \x03(\t\x12\x1a\n\x12metrics_expression\x18\x03 \x03(\t\x12\r\n\x05limit\x18\x04 \x01(\t\x12\x10\n\x08order_by\x18\x05 \x03(\t\x12\x19\n\x11\x64\x61te_where_clause\x18\x06 \x01(\t\x12\x0f\n\x07metrics\x18\x07 \x03(\t\x12\x15\n\rhaving_clause\x18\x08 \x01(\t\x12\x1c\n\x14incompatible_metrics\x18\t \x03(\t\x12\x1f\n\x17incompatible_dimensions\x18\n \x03(\t\x12\x38\n\x0b\x64\x61te_ranges\x18\x0b \x03(\x0b\x32#.findly_semantic_layer.DateStrRange\x12\x17\n\x0fsql_explanation\x18\x0c \x01(\t\x12\r\n\x05level\x18\r \x01(\t\x12\x16\n\x0etime_increment\x18\x0e \x01(\t\"\x80\x01\n\x12\x44\x61tasourceMetadata\x12>\n\x08location\x18\x01 \x01(\x0e\x32,.findly_semantic_layer.DataSourceIntegration\x12\x13\n\x0bproperty_id\x18\x02 \x01(\t\x12\x15\n\rproperty_name\x18\x03 \x01(\t*b\n\x15\x44\x61taSourceIntegration\x12 \n\x1c\x44\x41TA_SOURCE_LOCATION_UNKNOWN\x10\x00\x12\x12\n\x0eSEMANTIC_LAYER\x10\x01\x12\x07\n\x03GA4\x10\x02\x12\n\n\x06\x46\x42_ADS\x10\x03*S\n\x0f\x44\x61teGranularity\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03\x44\x41Y\x10\x01\x12\x08\n\x04WEEK\x10\x02\x12\t\n\x05MONTH\x10\x03\x12\x0b\n\x07QUARTER\x10\x04\x12\x08\n\x04YEAR\x10\x05*\x7f\n\x0b\x41ggregation\x12\x17\n\x13\x41GGREGATION_UNKNOWN\x10\x00\x12\x07\n\x03SUM\x10\x01\x12\x0f\n\x0bSUM_BOOLEAN\x10\x02\x12\x12\n\x0e\x43OUNT_DISTINCT\x10\x03\x12\x07\n\x03MIN\x10\x04\x12\x07\n\x03MAX\x10\x05\x12\x0b\n\x07\x41VERAGE\x10\x06\x12\n\n\x06MEDIAN\x10\x07*\xab\x01\n\rDimensionType\x12\x15\n\x11\x44IMENSION_UNKNOWN\x10\x00\x12\x0f\n\x0b\x43\x41TEGORICAL\x10\x01\x12\x08\n\x04TIME\x10\x02\x12\x10\n\x0c\x46\x42_ADS_FIELD\x10\x03\x12\x14\n\x10\x46\x42_ADS_BREAKDOWN\x10\x04\x12\x1b\n\x17\x46\x42_ADS_ACTION_BREAKDOWN\x10\x05\x12#\n\x1f\x46\x42_ADS_SUMMARY_ACTION_BREAKDOWN\x10\x06*\x84\x01\n\x12\x44imensionValueType\x12\x16\n\x12VALUE_TYPE_UNKNOWN\x10\x00\x12\n\n\x06STRING\x10\x01\x12\x0b\n\x07INTEGER\x10\x02\x12\t\n\x05\x46LOAT\x10\x03\x12\x0b\n\x07\x42OOLEAN\x10\x04\x12\x08\n\x04\x44\x41TE\x10\x05\x12\x0c\n\x08\x44\x41TETIME\x10\x06\x12\r\n\tTIMESTAMP\x10\x07*o\n\nMetricType\x12\x12\n\x0eMETRIC_UNKNOWN\x10\x00\x12\x11\n\rMEASURE_PROXY\x10\x01\x12\x0e\n\nCUMULATIVE\x10\x02\x12\t\n\x05RATIO\x10\x03\x12\x0b\n\x07\x44\x45RIVED\x10\x04\x12\x12\n\x0eSQL_EXPRESSION\x10\x05*\xf9\x04\n\x0fMetricValueType\x12\x1d\n\x19METRIC_VALUE_TYPE_UNKNOWN\x10\x00\x12\x1d\n\x19METRIC_VALUE_TYPE_INTEGER\x10\x01\x12\x1b\n\x17METRIC_VALUE_TYPE_FLOAT\x10\x02\x12\x1d\n\x19METRIC_VALUE_TYPE_SECONDS\x10\x03\x12\"\n\x1eMETRIC_VALUE_TYPE_MILLISECONDS\x10\x04\x12\x1d\n\x19METRIC_VALUE_TYPE_MINUTES\x10\x05\x12\x1b\n\x17METRIC_VALUE_TYPE_HOURS\x10\x06\x12\x1e\n\x1aMETRIC_VALUE_TYPE_STANDARD\x10\x07\x12\x1e\n\x1aMETRIC_VALUE_TYPE_CURRENCY\x10\x08\x12\x1a\n\x16METRIC_VALUE_TYPE_FEET\x10\t\x12\x1b\n\x17METRIC_VALUE_TYPE_MILES\x10\n\x12\x1c\n\x18METRIC_VALUE_TYPE_METERS\x10\x0b\x12 \n\x1cMETRIC_VALUE_TYPE_KILOMETERS\x10\x0c\x12\x1c\n\x18METRIC_VALUE_TYPE_STRING\x10\r\x12$\n METRIC_VALUE_TYPE_NUMERIC_STRING\x10\x0e\x12+\n\'METRIC_VALUE_TYPE_LIST_ADS_ACTION_STATS\x10\x0f\x12\x32\n.METRIC_VALUE_TYPE_LIST_ADS_INSIGHTS_DDA_RESULT\x10\x10\x12.\n*METRIC_VALUE_TYPE_LIST_ADS_HISTOGRAM_STATS\x10\x11\x62\x06proto3')
17
17
 
18
- _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
19
- _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'findly_semantic_layer_pb2', globals())
18
+ _globals = globals()
19
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
20
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'findly_semantic_layer_pb2', _globals)
20
21
  if _descriptor._USE_C_DESCRIPTORS == False:
21
-
22
22
  DESCRIPTOR._options = None
23
- _DIMENSION.fields_by_name['value_type']._options = None
24
- _DIMENSION.fields_by_name['value_type']._serialized_options = b'\030\001'
25
- _DATASOURCEINTEGRATION._serialized_start=1464
26
- _DATASOURCEINTEGRATION._serialized_end=1562
27
- _DATEGRANULARITY._serialized_start=1564
28
- _DATEGRANULARITY._serialized_end=1647
29
- _AGGREGATION._serialized_start=1649
30
- _AGGREGATION._serialized_end=1776
31
- _DIMENSIONTYPE._serialized_start=1779
32
- _DIMENSIONTYPE._serialized_end=1950
33
- _DIMENSIONVALUETYPE._serialized_start=1953
34
- _DIMENSIONVALUETYPE._serialized_end=2085
35
- _METRICTYPE._serialized_start=2087
36
- _METRICTYPE._serialized_end=2198
37
- _METRICVALUETYPE._serialized_start=2201
38
- _METRICVALUETYPE._serialized_end=2834
39
- _DIMENSION._serialized_start=55
40
- _DIMENSION._serialized_end=395
41
- _DIMENSIONTYPEPARAMS._serialized_start=397
42
- _DIMENSIONTYPEPARAMS._serialized_end=504
43
- _METRIC._serialized_start=507
44
- _METRIC._serialized_end=902
45
- _DATESTRRANGE._serialized_start=904
46
- _DATESTRRANGE._serialized_end=956
47
- _QUERYARGS._serialized_start=959
48
- _QUERYARGS._serialized_end=1331
49
- _DATASOURCEMETADATA._serialized_start=1334
50
- _DATASOURCEMETADATA._serialized_end=1462
23
+ _globals['_DIMENSION'].fields_by_name['value_type']._options = None
24
+ _globals['_DIMENSION'].fields_by_name['value_type']._serialized_options = b'\030\001'
25
+ _globals['_DATASOURCEINTEGRATION']._serialized_start=1464
26
+ _globals['_DATASOURCEINTEGRATION']._serialized_end=1562
27
+ _globals['_DATEGRANULARITY']._serialized_start=1564
28
+ _globals['_DATEGRANULARITY']._serialized_end=1647
29
+ _globals['_AGGREGATION']._serialized_start=1649
30
+ _globals['_AGGREGATION']._serialized_end=1776
31
+ _globals['_DIMENSIONTYPE']._serialized_start=1779
32
+ _globals['_DIMENSIONTYPE']._serialized_end=1950
33
+ _globals['_DIMENSIONVALUETYPE']._serialized_start=1953
34
+ _globals['_DIMENSIONVALUETYPE']._serialized_end=2085
35
+ _globals['_METRICTYPE']._serialized_start=2087
36
+ _globals['_METRICTYPE']._serialized_end=2198
37
+ _globals['_METRICVALUETYPE']._serialized_start=2201
38
+ _globals['_METRICVALUETYPE']._serialized_end=2834
39
+ _globals['_DIMENSION']._serialized_start=55
40
+ _globals['_DIMENSION']._serialized_end=395
41
+ _globals['_DIMENSIONTYPEPARAMS']._serialized_start=397
42
+ _globals['_DIMENSIONTYPEPARAMS']._serialized_end=504
43
+ _globals['_METRIC']._serialized_start=507
44
+ _globals['_METRIC']._serialized_end=902
45
+ _globals['_DATESTRRANGE']._serialized_start=904
46
+ _globals['_DATESTRRANGE']._serialized_end=956
47
+ _globals['_QUERYARGS']._serialized_start=959
48
+ _globals['_QUERYARGS']._serialized_end=1331
49
+ _globals['_DATASOURCEMETADATA']._serialized_start=1334
50
+ _globals['_DATASOURCEMETADATA']._serialized_end=1462
51
51
  # @@protoc_insertion_point(module_scope)
@@ -2,7 +2,6 @@
2
2
  @generated by mypy-protobuf. Do not edit manually!
3
3
  isort:skip_file
4
4
  """
5
-
6
5
  import builtins
7
6
  import collections.abc
8
7
  import google.protobuf.descriptor
@@ -287,7 +286,7 @@ METRIC_VALUE_TYPE_LIST_ADS_INSIGHTS_DDA_RESULT: MetricValueType.ValueType # 16
287
286
  METRIC_VALUE_TYPE_LIST_ADS_HISTOGRAM_STATS: MetricValueType.ValueType # 17
288
287
  global___MetricValueType = MetricValueType
289
288
 
290
- @typing.final
289
+ @typing_extensions.final
291
290
  class Dimension(google.protobuf.message.Message):
292
291
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
293
292
 
@@ -313,25 +312,22 @@ class Dimension(google.protobuf.message.Message):
313
312
  """
314
313
  type: global___DimensionType.ValueType
315
314
  """The type of the dimension, e.g. CATEGORICAL or TIME."""
316
- value_type: builtins.str
317
- """The type of the values of the dimension, e.g. STRING, INTEGER, FLOAT, etc.
318
- Prefer to use the value_type_enum field
319
- """
320
- display_name: builtins.str
321
- """The display name."""
322
- value_type_enum: global___DimensionValueType.ValueType
323
315
  @property
324
316
  def type_params(self) -> global___DimensionTypeParams:
325
317
  """The parameters of the dimension type."""
326
-
327
318
  @property
328
319
  def top_n_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
329
320
  """The top n values of the dimension."""
330
-
321
+ value_type: builtins.str
322
+ """The type of the values of the dimension, e.g. STRING, INTEGER, FLOAT, etc.
323
+ Prefer to use the value_type_enum field
324
+ """
331
325
  @property
332
326
  def data_source_names(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
333
327
  """The data source names that the dimension is available in."""
334
-
328
+ display_name: builtins.str
329
+ """The display name."""
330
+ value_type_enum: global___DimensionValueType.ValueType
335
331
  def __init__(
336
332
  self,
337
333
  *,
@@ -346,12 +342,12 @@ class Dimension(google.protobuf.message.Message):
346
342
  display_name: builtins.str = ...,
347
343
  value_type_enum: global___DimensionValueType.ValueType = ...,
348
344
  ) -> None: ...
349
- def HasField(self, field_name: typing.Literal["type_params", b"type_params"]) -> builtins.bool: ...
350
- def ClearField(self, field_name: typing.Literal["data_source_names", b"data_source_names", "description", b"description", "display_name", b"display_name", "expr", b"expr", "name", b"name", "top_n_values", b"top_n_values", "type", b"type", "type_params", b"type_params", "value_type", b"value_type", "value_type_enum", b"value_type_enum"]) -> None: ...
345
+ def HasField(self, field_name: typing_extensions.Literal["type_params", b"type_params"]) -> builtins.bool: ...
346
+ def ClearField(self, field_name: typing_extensions.Literal["data_source_names", b"data_source_names", "description", b"description", "display_name", b"display_name", "expr", b"expr", "name", b"name", "top_n_values", b"top_n_values", "type", b"type", "type_params", b"type_params", "value_type", b"value_type", "value_type_enum", b"value_type_enum"]) -> None: ...
351
347
 
352
348
  global___Dimension = Dimension
353
349
 
354
- @typing.final
350
+ @typing_extensions.final
355
351
  class DimensionTypeParams(google.protobuf.message.Message):
356
352
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
357
353
 
@@ -369,11 +365,11 @@ class DimensionTypeParams(google.protobuf.message.Message):
369
365
  time_granularity: global___DateGranularity.ValueType = ...,
370
366
  is_primary: builtins.bool = ...,
371
367
  ) -> None: ...
372
- def ClearField(self, field_name: typing.Literal["is_primary", b"is_primary", "time_granularity", b"time_granularity"]) -> None: ...
368
+ def ClearField(self, field_name: typing_extensions.Literal["is_primary", b"is_primary", "time_granularity", b"time_granularity"]) -> None: ...
373
369
 
374
370
  global___DimensionTypeParams = DimensionTypeParams
375
371
 
376
- @typing.final
372
+ @typing_extensions.final
377
373
  class Metric(google.protobuf.message.Message):
378
374
  """Parameters that are associated with metrics include:
379
375
 
@@ -419,6 +415,13 @@ class Metric(google.protobuf.message.Message):
419
415
  """The id of the table view that the metric is defined on."""
420
416
  table_name: builtins.str
421
417
  """The name of the table view that the metric is defined on."""
418
+ @property
419
+ def measures(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
420
+ """The measures of the metric.
421
+ If type is MEASURE_PROXY, then this should be a list of exactly one measure.
422
+ It should be included only measures that are defined in a data source.
423
+ Two metrics of type MEASURE_PROXY cannot refer to the same measure.
424
+ """
422
425
  numerator: builtins.str
423
426
  """Numerator and denominator are only used if type is RATIO. Don't use identifiers as numerator or denominator.
424
427
  It should be included only measures that are defined in a data source.
@@ -443,14 +446,6 @@ class Metric(google.protobuf.message.Message):
443
446
  display_name: builtins.str
444
447
  is_numeric: builtins.bool
445
448
  """If the metric is numeric or not."""
446
- @property
447
- def measures(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
448
- """The measures of the metric.
449
- If type is MEASURE_PROXY, then this should be a list of exactly one measure.
450
- It should be included only measures that are defined in a data source.
451
- Two metrics of type MEASURE_PROXY cannot refer to the same measure.
452
- """
453
-
454
449
  def __init__(
455
450
  self,
456
451
  *,
@@ -470,13 +465,13 @@ class Metric(google.protobuf.message.Message):
470
465
  display_name: builtins.str = ...,
471
466
  is_numeric: builtins.bool = ...,
472
467
  ) -> None: ...
473
- def HasField(self, field_name: typing.Literal["cumulative_process", b"cumulative_process", "grain_to_date", b"grain_to_date", "window", b"window"]) -> builtins.bool: ...
474
- def ClearField(self, field_name: typing.Literal["cumulative_process", b"cumulative_process", "denominator", b"denominator", "description", b"description", "display_name", b"display_name", "expression", b"expression", "grain_to_date", b"grain_to_date", "id", b"id", "is_numeric", b"is_numeric", "measures", b"measures", "name", b"name", "numerator", b"numerator", "table_name", b"table_name", "type", b"type", "value_type", b"value_type", "view_id_of_table", b"view_id_of_table", "window", b"window"]) -> None: ...
475
- def WhichOneof(self, oneof_group: typing.Literal["cumulative_process", b"cumulative_process"]) -> typing.Literal["window", "grain_to_date"] | None: ...
468
+ def HasField(self, field_name: typing_extensions.Literal["cumulative_process", b"cumulative_process", "grain_to_date", b"grain_to_date", "window", b"window"]) -> builtins.bool: ...
469
+ def ClearField(self, field_name: typing_extensions.Literal["cumulative_process", b"cumulative_process", "denominator", b"denominator", "description", b"description", "display_name", b"display_name", "expression", b"expression", "grain_to_date", b"grain_to_date", "id", b"id", "is_numeric", b"is_numeric", "measures", b"measures", "name", b"name", "numerator", b"numerator", "table_name", b"table_name", "type", b"type", "value_type", b"value_type", "view_id_of_table", b"view_id_of_table", "window", b"window"]) -> None: ...
470
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["cumulative_process", b"cumulative_process"]) -> typing_extensions.Literal["window", "grain_to_date"] | None: ...
476
471
 
477
472
  global___Metric = Metric
478
473
 
479
- @typing.final
474
+ @typing_extensions.final
480
475
  class DateStrRange(google.protobuf.message.Message):
481
476
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
482
477
 
@@ -492,11 +487,11 @@ class DateStrRange(google.protobuf.message.Message):
492
487
  start_date: builtins.str = ...,
493
488
  end_date: builtins.str = ...,
494
489
  ) -> None: ...
495
- def ClearField(self, field_name: typing.Literal["end_date", b"end_date", "start_date", b"start_date"]) -> None: ...
490
+ def ClearField(self, field_name: typing_extensions.Literal["end_date", b"end_date", "start_date", b"start_date"]) -> None: ...
496
491
 
497
492
  global___DateStrRange = DateStrRange
498
493
 
499
- @typing.final
494
+ @typing_extensions.final
500
495
  class QueryArgs(google.protobuf.message.Message):
501
496
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
502
497
 
@@ -516,45 +511,38 @@ class QueryArgs(google.protobuf.message.Message):
516
511
  TIME_INCREMENT_FIELD_NUMBER: builtins.int
517
512
  where_clause: builtins.str
518
513
  """This is the where clause of the generated sql."""
519
- limit: builtins.str
520
- """This is the LIMIT clause of the generated sql."""
521
- date_where_clause: builtins.str
522
- having_clause: builtins.str
523
- sql_explanation: builtins.str
524
- """The explanation of the generated sql."""
525
- level: builtins.str
526
- """level and time_increment are important info for Facebook Ads insights
527
- https://developers.facebook.com/docs/marketing-api/reference/ad-account/insights/
528
- """
529
- time_increment: builtins.str
530
514
  @property
531
515
  def group_by_columns(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
532
516
  """This is the group by clause of the generated sql."""
533
-
534
517
  @property
535
518
  def metrics_expression(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
536
519
  """This is the metric expression of the generated sql."""
537
-
520
+ limit: builtins.str
521
+ """This is the LIMIT clause of the generated sql."""
538
522
  @property
539
523
  def order_by(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
540
524
  """Column names for ordering. Descending order is indicated by a prepended '-'."""
541
-
525
+ date_where_clause: builtins.str
542
526
  @property
543
527
  def metrics(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
544
528
  """The name of the metrics to be queried."""
545
-
529
+ having_clause: builtins.str
546
530
  @property
547
531
  def incompatible_metrics(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
548
532
  """The list of metrics selected by the pipeline, but are incompatible for the request."""
549
-
550
533
  @property
551
534
  def incompatible_dimensions(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
552
535
  """The list of dimensions selected by the pipeline, but are incompatible for the request."""
553
-
554
536
  @property
555
537
  def date_ranges(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DateStrRange]:
556
538
  """The date ranges to be queried."""
557
-
539
+ sql_explanation: builtins.str
540
+ """The explanation of the generated sql."""
541
+ level: builtins.str
542
+ """level and time_increment are important info for Facebook Ads insights
543
+ https://developers.facebook.com/docs/marketing-api/reference/ad-account/insights/
544
+ """
545
+ time_increment: builtins.str
558
546
  def __init__(
559
547
  self,
560
548
  *,
@@ -573,11 +561,11 @@ class QueryArgs(google.protobuf.message.Message):
573
561
  level: builtins.str = ...,
574
562
  time_increment: builtins.str = ...,
575
563
  ) -> None: ...
576
- def ClearField(self, field_name: typing.Literal["date_ranges", b"date_ranges", "date_where_clause", b"date_where_clause", "group_by_columns", b"group_by_columns", "having_clause", b"having_clause", "incompatible_dimensions", b"incompatible_dimensions", "incompatible_metrics", b"incompatible_metrics", "level", b"level", "limit", b"limit", "metrics", b"metrics", "metrics_expression", b"metrics_expression", "order_by", b"order_by", "sql_explanation", b"sql_explanation", "time_increment", b"time_increment", "where_clause", b"where_clause"]) -> None: ...
564
+ def ClearField(self, field_name: typing_extensions.Literal["date_ranges", b"date_ranges", "date_where_clause", b"date_where_clause", "group_by_columns", b"group_by_columns", "having_clause", b"having_clause", "incompatible_dimensions", b"incompatible_dimensions", "incompatible_metrics", b"incompatible_metrics", "level", b"level", "limit", b"limit", "metrics", b"metrics", "metrics_expression", b"metrics_expression", "order_by", b"order_by", "sql_explanation", b"sql_explanation", "time_increment", b"time_increment", "where_clause", b"where_clause"]) -> None: ...
577
565
 
578
566
  global___QueryArgs = QueryArgs
579
567
 
580
- @typing.final
568
+ @typing_extensions.final
581
569
  class DatasourceMetadata(google.protobuf.message.Message):
582
570
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
583
571
 
@@ -594,6 +582,6 @@ class DatasourceMetadata(google.protobuf.message.Message):
594
582
  property_id: builtins.str = ...,
595
583
  property_name: builtins.str = ...,
596
584
  ) -> None: ...
597
- def ClearField(self, field_name: typing.Literal["location", b"location", "property_id", b"property_id", "property_name", b"property_name"]) -> None: ...
585
+ def ClearField(self, field_name: typing_extensions.Literal["location", b"location", "property_id", b"property_id", "property_name", b"property_name"]) -> None: ...
598
586
 
599
587
  global___DatasourceMetadata = DatasourceMetadata
@@ -1,10 +1,11 @@
1
+ from typing import List, Optional, Any
2
+
1
3
  from findly.unified_reporting_sdk.data_sources.common.reports_client import (
2
4
  ReportsClient,
3
5
  )
4
- import logging
5
- import pandas as pd
6
- from typing import List, Tuple, Optional, Any
7
-
6
+ from findly.unified_reporting_sdk.data_sources.common.entities import (
7
+ ReportsClientQueryResult,
8
+ )
8
9
  from findly.unified_reporting_sdk.protos.findly_semantic_layer_pb2 import (
9
10
  Dimension,
10
11
  Metric,
@@ -44,7 +45,7 @@ class Urs(ReportsClient):
44
45
 
45
46
  async def query(
46
47
  self, query_args: QueryArgs, property_id: str, **kwargs: str
47
- ) -> Optional[Tuple[List[pd.DataFrame], List[pd.DataFrame]]]:
48
+ ) -> Optional[ReportsClientQueryResult]:
48
49
  return await self._client.query(
49
50
  query_args=query_args, property_id=property_id, **kwargs
50
51
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: findly.unified-reporting-sdk
3
- Version: 0.6.22
3
+ Version: 0.7.1
4
4
  Summary:
5
5
  License: GPL-3.0-only
6
6
  Requires-Python: >=3.9,<4.0
@@ -2,33 +2,34 @@ findly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  findly/unified_reporting_sdk/__init__.py,sha256=1GE1LJq5zf-0fuObZtLXJN6RaxkeByKX3-bgEkzpi6I,342
3
3
  findly/unified_reporting_sdk/data_sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  findly/unified_reporting_sdk/data_sources/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- findly/unified_reporting_sdk/data_sources/common/common_parser.py,sha256=OymaK3T9U10ZiIpMqwYQv3ukvCmBu9ALgxS5zQmKpLY,7897
5
+ findly/unified_reporting_sdk/data_sources/common/common_parser.py,sha256=3pT27dAsOMBUGuBL77hqtiAaNtvjsOUp5ndETGD8I3c,7828
6
6
  findly/unified_reporting_sdk/data_sources/common/date_range_helper.py,sha256=z2L1YU1Mzbybkl1wZK_mXL9lKFfG6CEomvlTfADD_80,971
7
- findly/unified_reporting_sdk/data_sources/common/reports_client.py,sha256=fCza94iwZz05QPr6B3mmsrvQQdymgD3CzMbvAYEOetw,3647
8
- findly/unified_reporting_sdk/data_sources/common/where_string_comparison.py,sha256=0DgrMklgE-Lj2jBJO0GzWRdMlFd68CoDMYyTMBOy_g4,8302
7
+ findly/unified_reporting_sdk/data_sources/common/entities.py,sha256=vz6V1KaZVqMpLghFOD-KaBGuTikt1rJFzfpkz53gBbU,243
8
+ findly/unified_reporting_sdk/data_sources/common/reports_client.py,sha256=zvr6itv2MSV_O1zlhlgiHSWZNMyyjs-2OQG59aWMZLg,3628
9
+ findly/unified_reporting_sdk/data_sources/common/where_string_comparison.py,sha256=rraEwXe_bo0R1Fbq6-C_Ooz0_J5C0tr1VwHvajKWfsg,8298
9
10
  findly/unified_reporting_sdk/data_sources/fb_ads/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- findly/unified_reporting_sdk/data_sources/fb_ads/fb_ads_client.py,sha256=hVrxsbf0DLoTka5B7DACBbcMeVEh4PRU_s8WZ8nlvFY,21913
11
- findly/unified_reporting_sdk/data_sources/fb_ads/fb_ads_query_args_parser.py,sha256=kM1ewN1bQqL_hTfbItkPGJenbwYeEpUXZEYnoTjTbDo,31949
11
+ findly/unified_reporting_sdk/data_sources/fb_ads/fb_ads_client.py,sha256=K4Z6cIBNdQWBrD_NKT_QRz8-gJE7YnoOeZmxGhgUT8A,22004
12
+ findly/unified_reporting_sdk/data_sources/fb_ads/fb_ads_query_args_parser.py,sha256=HY-p7gX2vn34UtFtQWDfhps0SJgNtg8Cz5LPW4yDsuQ,31982
12
13
  findly/unified_reporting_sdk/data_sources/fb_ads/metadata/action_breakdowns.csv,sha256=FUjp_e4aPnkKPIjCmEq4gOmSInFefAZQNsSs3-rRcLg,1492
13
14
  findly/unified_reporting_sdk/data_sources/fb_ads/metadata/breakdowns.csv,sha256=-i_hd5NAJjHkcfMboqemRmnAalZ4Z8TczNzeYuaFnsw,5778
14
15
  findly/unified_reporting_sdk/data_sources/fb_ads/metadata/dimensions.jsonl,sha256=066M3G-khDomEBN3BwE2wf5QVTZDucC7Cqr_77CZfN8,16133
15
16
  findly/unified_reporting_sdk/data_sources/fb_ads/metadata/fields.csv,sha256=9FQ8yMY7DuD7NG_3vIlbHg-U2O__MQBZ5oRdX5ZeYIE,17708
16
17
  findly/unified_reporting_sdk/data_sources/fb_ads/metadata/metrics.jsonl,sha256=k46VIKAOZiuefpo-umQ7SYZnl8I5NIzP7_KITLfL974,19606
17
18
  findly/unified_reporting_sdk/data_sources/ga4/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- findly/unified_reporting_sdk/data_sources/ga4/ga4_client.py,sha256=YbnLpfH9WNsHv4jJ8Ru7BkFz0GmONW-FpnUV-bwPZtk,38179
19
- findly/unified_reporting_sdk/data_sources/ga4/ga4_query_args_parser.py,sha256=j0PY267q9XOXNc2G0KvYPF1XKSXtJRxw0qMro6qFgXo,30180
19
+ findly/unified_reporting_sdk/data_sources/ga4/ga4_client.py,sha256=xx2joP4BOObyNPxASjPO2mYuCsGwfYnAvcU_swp3KsI,38297
20
+ findly/unified_reporting_sdk/data_sources/ga4/ga4_query_args_parser.py,sha256=I8iuEqWHUS_S6iXKEXRE1-RVWCOdb1HP11MyTS_fPag,30332
20
21
  findly/unified_reporting_sdk/data_sources/ga4/metadata/dimensions.jsonl,sha256=nSecS8Pi0ZTjsd1PlIyqAbYF56Chw2zLYRWetLkG9VQ,33511
21
22
  findly/unified_reporting_sdk/data_sources/gsc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
23
  findly/unified_reporting_sdk/data_sources/gsc/gsc_client.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
24
  findly/unified_reporting_sdk/data_sources/gsc/gsc_service.py,sha256=uWs9b5qNgmNaqBWml8tkTKGlE1RgXs6Hn8eNZ5fCnZg,1038
24
25
  findly/unified_reporting_sdk/protos/.gitignore,sha256=jyvVCY11J1OlOGM-nZCWKSR1vfO6fP65lnH65qf5W20,27
25
26
  findly/unified_reporting_sdk/protos/__init__.py,sha256=sfz7Yn3hvQrnhTfoZPGTbo0F1_Fw4X494wPSZojRajA,137
26
- findly/unified_reporting_sdk/protos/findly_semantic_layer_pb2.py,sha256=MugAV1tSmvX9bB3w_bS0i5d_aNqUZttJzH-vu1lspOs,6874
27
- findly/unified_reporting_sdk/protos/findly_semantic_layer_pb2.pyi,sha256=PmMDYAWRyTS3Uo7L1Zy9VQiTBSlfWDGekr7u4GbaE3w,30848
28
- findly/unified_reporting_sdk/urs.py,sha256=8um_pLJNOu1FGd0IO7XlNBIFAvGYD2nXnxiHMjkraKs,2915
27
+ findly/unified_reporting_sdk/protos/findly_semantic_layer_pb2.py,sha256=1QkWH9LLhvbZPDH1HEX2nDblrwBJc3liKfckW93myew,7228
28
+ findly/unified_reporting_sdk/protos/findly_semantic_layer_pb2.pyi,sha256=QwFz5TD5qW3eC7pVODIb8ystAHfHmRvk8Hyj4RzXwvM,31012
29
+ findly/unified_reporting_sdk/urs.py,sha256=-vhOFpi-M0uo_tZ_O_hTDDEGO-ATf78nqEf5JhIcaz4,2956
29
30
  findly/unified_reporting_sdk/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
31
  findly/unified_reporting_sdk/util/create_numeric_string_series.py,sha256=MmufpYatIhcVxA9e3H1dR1CrejXRnA8j4NNjJxfvBVA,457
31
- findly_unified_reporting_sdk-0.6.22.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
32
- findly_unified_reporting_sdk-0.6.22.dist-info/METADATA,sha256=HWKuw3LoXhUAb7-15610if6rNIY0zM-wCuBBKtRDsXE,3160
33
- findly_unified_reporting_sdk-0.6.22.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
34
- findly_unified_reporting_sdk-0.6.22.dist-info/RECORD,,
32
+ findly_unified_reporting_sdk-0.7.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
33
+ findly_unified_reporting_sdk-0.7.1.dist-info/METADATA,sha256=2TPLRnZFIBNXP9E1H7w--htXoHTjJ9qz7rPlDtgwtHY,3159
34
+ findly_unified_reporting_sdk-0.7.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
35
+ findly_unified_reporting_sdk-0.7.1.dist-info/RECORD,,