diff --git a/VERSION b/VERSION index 6abaeb2f..798e3899 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.2.0 +6.3.0 diff --git a/exabel_data_sdk/client/api/api_client/grpc/kpi_grpc_client.py b/exabel_data_sdk/client/api/api_client/grpc/kpi_grpc_client.py new file mode 100644 index 00000000..c6ab4244 --- /dev/null +++ b/exabel_data_sdk/client/api/api_client/grpc/kpi_grpc_client.py @@ -0,0 +1,62 @@ +from exabel_data_sdk.client.api.api_client.exabel_api_group import ExabelApiGroup +from exabel_data_sdk.client.api.api_client.grpc.base_grpc_client import BaseGrpcClient +from exabel_data_sdk.client.api.api_client.kpi_api_client import KpiApiClient +from exabel_data_sdk.client.client_config import ClientConfig +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_service_pb2 import ( + ListCompanyBaseModelResultsRequest, + ListCompanyBaseModelResultsResponse, + ListCompanyHierarchicalModelResultsRequest, + ListCompanyHierarchicalModelResultsResponse, + ListCompanyKpiMappingResultsRequest, + ListCompanyKpiMappingResultsResponse, + ListCompanyKpiModelResultsRequest, + ListCompanyKpiModelResultsResponse, + ListKpiMappingResultsRequest, + ListKpiMappingResultsResponse, +) +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_service_pb2_grpc import KpiServiceStub + + +class KpiGrpcClient(KpiApiClient, BaseGrpcClient): + """ + Client which sends KPI requests to the Exabel Data API with gRPC. + """ + + def __init__(self, config: ClientConfig): + super().__init__(config, ExabelApiGroup.ANALYTICS_API) + self.stub = KpiServiceStub(self.channel) + + def list_kpi_mapping_results( + self, request: ListKpiMappingResultsRequest + ) -> ListKpiMappingResultsResponse: + return self.stub.ListKpiMappingResults( + request, metadata=self.metadata, timeout=self.config.timeout + ) + + def list_company_base_model_results( + self, request: ListCompanyBaseModelResultsRequest + ) -> ListCompanyBaseModelResultsResponse: + return self.stub.ListCompanyBaseModelResults( + request, metadata=self.metadata, timeout=self.config.timeout + ) + + def list_company_hierarchical_model_results( + self, request: ListCompanyHierarchicalModelResultsRequest + ) -> ListCompanyHierarchicalModelResultsResponse: + return self.stub.ListCompanyHierarchicalModelResults( + request, metadata=self.metadata, timeout=self.config.timeout + ) + + def list_company_kpi_mapping_results( + self, request: ListCompanyKpiMappingResultsRequest + ) -> ListCompanyKpiMappingResultsResponse: + return self.stub.ListCompanyKpiMappingResults( + request, metadata=self.metadata, timeout=self.config.timeout + ) + + def list_company_kpi_model_results( + self, request: ListCompanyKpiModelResultsRequest + ) -> ListCompanyKpiModelResultsResponse: + return self.stub.ListCompanyKpiModelResults( + request, metadata=self.metadata, timeout=self.config.timeout + ) diff --git a/exabel_data_sdk/client/api/api_client/kpi_api_client.py b/exabel_data_sdk/client/api/api_client/kpi_api_client.py new file mode 100644 index 00000000..c63a4211 --- /dev/null +++ b/exabel_data_sdk/client/api/api_client/kpi_api_client.py @@ -0,0 +1,50 @@ +from abc import ABC, abstractmethod + +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_service_pb2 import ( + ListCompanyBaseModelResultsRequest, + ListCompanyBaseModelResultsResponse, + ListCompanyHierarchicalModelResultsRequest, + ListCompanyHierarchicalModelResultsResponse, + ListCompanyKpiMappingResultsRequest, + ListCompanyKpiMappingResultsResponse, + ListCompanyKpiModelResultsRequest, + ListCompanyKpiModelResultsResponse, + ListKpiMappingResultsRequest, + ListKpiMappingResultsResponse, +) + + +class KpiApiClient(ABC): + """ + Superclass for clients that sends KPI requests to the Exabel Analytics API. + """ + + @abstractmethod + def list_kpi_mapping_results( + self, request: ListKpiMappingResultsRequest + ) -> ListKpiMappingResultsResponse: + """List KPI mapping results for a single KPI mapping collection.""" + + @abstractmethod + def list_company_base_model_results( + self, request: ListCompanyBaseModelResultsRequest + ) -> ListCompanyBaseModelResultsResponse: + """List base model results for a company.""" + + @abstractmethod + def list_company_hierarchical_model_results( + self, request: ListCompanyHierarchicalModelResultsRequest + ) -> ListCompanyHierarchicalModelResultsResponse: + """List hierarchical model results for a company.""" + + @abstractmethod + def list_company_kpi_mapping_results( + self, request: ListCompanyKpiMappingResultsRequest + ) -> ListCompanyKpiMappingResultsResponse: + """List KPI mapping results for a single company KPI.""" + + @abstractmethod + def list_company_kpi_model_results( + self, request: ListCompanyKpiModelResultsRequest + ) -> ListCompanyKpiModelResultsResponse: + """List model results for a single company KPI.""" diff --git a/exabel_data_sdk/client/api/data_classes/company.py b/exabel_data_sdk/client/api/data_classes/company.py new file mode 100644 index 00000000..debcb027 --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/company.py @@ -0,0 +1,28 @@ +from dataclasses import dataclass + +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import Company as ProtoCompany + + +@dataclass +class Company: + """ + A company. + + Attributes: + name: The resource name of the company. + display_name: The display name of the company. + bloomberg_ticker: The Bloomberg ticker of the company. + """ + + name: str + display_name: str + bloomberg_ticker: str + + @staticmethod + def from_proto(proto: ProtoCompany) -> "Company": + """Create a Company from the given protobuf Company.""" + return Company( + name=proto.name, + display_name=proto.display_name, + bloomberg_ticker=proto.bloomberg_ticker, + ) diff --git a/exabel_data_sdk/client/api/data_classes/company_kpi_mapping_results.py b/exabel_data_sdk/client/api/data_classes/company_kpi_mapping_results.py new file mode 100644 index 00000000..f5f975ae --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/company_kpi_mapping_results.py @@ -0,0 +1,59 @@ +from dataclasses import dataclass +from typing import List, Sequence + +from exabel_data_sdk.client.api.data_classes.company import Company +from exabel_data_sdk.client.api.data_classes.kpi import Kpi +from exabel_data_sdk.client.api.data_classes.kpi_mapping_result_data import KpiMappingResultData +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + CompanyKpiMappingResults as ProtoCompanyKpiMappingResults, +) +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + SingleCompanyKpiMappingResults as ProtoSingleCompanyKpiMappingResults, +) + + +@dataclass +class SingleCompanyKpiMappingResults: + """ + KPI mapping results for a single company KPI. + + Attributes: + kpi: The KPI. + data: The results. + """ + + kpi: Kpi + data: List[KpiMappingResultData] + + @staticmethod + def from_proto(proto: ProtoSingleCompanyKpiMappingResults) -> "SingleCompanyKpiMappingResults": + """ + Create a SingleCompanyKpiMappingResults from the given protobuf + SingleCompanyKpiMappingResults. + """ + return SingleCompanyKpiMappingResults( + kpi=Kpi.from_proto(proto.kpi), + data=[KpiMappingResultData.from_proto(d) for d in proto.data], + ) + + +@dataclass +class CompanyKpiMappingResults: + """ + KPI mapping results for a company. + + Attributes: + company: The company. + results: The results. + """ + + company: Company + results: Sequence[SingleCompanyKpiMappingResults] + + @staticmethod + def from_proto(proto: ProtoCompanyKpiMappingResults) -> "CompanyKpiMappingResults": + """Create a CompanyKpiMappingResults from the given protobuf CompanyKpiMappingResults.""" + return CompanyKpiMappingResults( + company=Company.from_proto(proto.entity), + results=[SingleCompanyKpiMappingResults.from_proto(r) for r in proto.kpi_results], + ) diff --git a/exabel_data_sdk/client/api/data_classes/company_kpi_model_result.py b/exabel_data_sdk/client/api/data_classes/company_kpi_model_result.py new file mode 100644 index 00000000..6583e6c8 --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/company_kpi_model_result.py @@ -0,0 +1,38 @@ +from dataclasses import dataclass + +from exabel_data_sdk.client.api.data_classes.kpi import Kpi +from exabel_data_sdk.client.api.data_classes.kpi_model import KpiModel +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + CompanyKpiModelResult as ProtoCompanyKpiModelResult, +) + + +@dataclass +class CompanyKpiModelResult: + """ + A company KPI model result. + + Attributes: + kpi: The KPI. + model: The KPI model. + accessible_mappings_count: The number of accessible KPI mappings for the current user. + total_mappings_count: The total number of KPI mappings. + models_count: The number of KPI models. + """ + + kpi: Kpi + model: KpiModel + accessible_mappings_count: int + total_mappings_count: int + models_count: int + + @staticmethod + def from_proto(proto: ProtoCompanyKpiModelResult) -> "CompanyKpiModelResult": + """Create a CompanyKpiModelResult from the given protobuf CompanyKpiModelResult.""" + return CompanyKpiModelResult( + kpi=Kpi.from_proto(proto.kpi), + model=KpiModel.from_proto(proto.model), + accessible_mappings_count=proto.accessible_mappings_count, + total_mappings_count=proto.total_mappings_count, + models_count=proto.models_count, + ) diff --git a/exabel_data_sdk/client/api/data_classes/company_kpi_models.py b/exabel_data_sdk/client/api/data_classes/company_kpi_models.py new file mode 100644 index 00000000..0f5a9c53 --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/company_kpi_models.py @@ -0,0 +1,44 @@ +from dataclasses import dataclass +from typing import Optional, Sequence + +from exabel_data_sdk.client.api.data_classes.kpi_mapping_model import KpiMappingModel +from exabel_data_sdk.client.api.data_classes.kpi_model import KpiModel +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_service_pb2 import ( + ListCompanyKpiModelResultsResponse, +) + + +@dataclass +class CompanyKpiModels: + """ + Models for a company KPI. + + Attributes: + exabel_model: The Exabel model. + hierarchical_model: The hierarchical model. + custom_models: The custom models. + kpi_mapping_models: The KPI mapping models. + """ + + exabel_model: Optional[KpiModel] + hierarchical_model: Optional[KpiModel] + custom_models: Sequence[KpiModel] + kpi_mapping_models: Sequence[KpiMappingModel] + + @staticmethod + def from_proto(proto: ListCompanyKpiModelResultsResponse) -> "CompanyKpiModels": + """Create a CompanyKpiModelResult from the given ListCompanyKpiModelResultsResponse.""" + return CompanyKpiModels( + exabel_model=( + KpiModel.from_proto(proto.exabel_model) if proto.HasField("exabel_model") else None + ), + hierarchical_model=( + KpiModel.from_proto(proto.hierarchical_model) + if proto.HasField("hierarchical_model") + else None + ), + custom_models=[KpiModel.from_proto(model) for model in proto.custom_models], + kpi_mapping_models=[ + KpiMappingModel.from_proto(model) for model in proto.kpi_mapping_models + ], + ) diff --git a/exabel_data_sdk/client/api/data_classes/data_set.py b/exabel_data_sdk/client/api/data_classes/data_set.py index 48451cb4..e54cb78e 100644 --- a/exabel_data_sdk/client/api/data_classes/data_set.py +++ b/exabel_data_sdk/client/api/data_classes/data_set.py @@ -8,11 +8,14 @@ class DataSet: A data set resource in the Data API. Attributes: - name (str): The resource name of the data set, for example "dataSets/ns.mydata". - display_name (str): The display name of the data set. - description (str): One or more paragraphs of text description. - signals ([str]): Resource names of signals this data set contains. - read_only (bool): Whether this resource is read only. + name (str): The resource name of the data set, for example, + "dataSets/ns.mydata". + display_name (str): The display name of the data set. + description (str): One or more paragraphs of text description. + signals ([str]): Resource names of signals this data set contains. + read_only (bool): Whether this resource is read only. + derived_signals ([str]): Resource names of signals this data set contains. + highlighted_signals ([str]): Resource names of signals this data set contains. """ def __init__( @@ -22,31 +25,40 @@ def __init__( description: str = "", signals: Optional[Sequence[str]] = None, read_only: bool = False, + derived_signals: Optional[Sequence[str]] = None, + highlighted_signals: Optional[Sequence[str]] = None, ): """ Create a data set resource in the Data API. Args: - name (str): The resource name of the data set, for example "dataSets/ns.mydata". - display_name: The display name of the data set. - description: One or more paragraphs of text description. - signals: Resource names of signals this data set contains. - read_only: Whether this resource is read only. + name (str): The resource name of the data set, for example, + "dataSets/ns.mydata". + display_name: The display name of the data set. + description: One or more paragraphs of text description. + signals: Resource names of signals this data set contains. + read_only: Whether this resource is read only. + derived_signals: Resource names of derived signals for this data set. + highlighted_signals: Resource names of highlighted signals for this data set. """ self.name = name self.display_name = display_name self.description = description self.read_only = read_only self.signals = signals or [] + self.derived_signals = derived_signals or [] + self.highlighted_signals = highlighted_signals or [] @staticmethod def from_proto(data_set: ProtoDataSet) -> "DataSet": - """Create an DataSet from the given protobuf DataSet.""" + """Create a DataSet from the given protobuf DataSet.""" return DataSet( name=data_set.name, display_name=data_set.display_name, description=data_set.description, signals=list(data_set.signals), + derived_signals=list(data_set.derived_signals), + highlighted_signals=list(data_set.highlighted_signals), read_only=data_set.read_only, ) @@ -57,6 +69,8 @@ def to_proto(self) -> ProtoDataSet: display_name=self.display_name, description=self.description, signals=self.signals if self.signals else None, + derived_signals=self.derived_signals if self.derived_signals else None, + highlighted_signals=self.highlighted_signals if self.highlighted_signals else None, ) def __eq__(self, other: object) -> bool: @@ -68,12 +82,16 @@ def __eq__(self, other: object) -> bool: and self.description == other.description and self.read_only == other.read_only and sorted(self.signals) == sorted(other.signals) + and self.derived_signals == other.derived_signals + and sorted(self.highlighted_signals) == sorted(other.highlighted_signals) ) def __repr__(self) -> str: return ( f"DataSet(name='{self.name}', display_name='{self.display_name}', " f"description='{self.description}', signals={self.signals}, " + f"derived_signals={self.derived_signals}, " + f"highlighted_signals={self.highlighted_signals}, " f"read_only={self.read_only})" ) @@ -91,3 +109,9 @@ def print_data_set(data_set: DataSet) -> None: print("Signals:") for signal in sorted(data_set.signals): print(f"\t{signal}") + print("Derived signals:") + for signal in sorted(data_set.derived_signals): + print(f"\t{signal}") + print("Highlighted signals:") + for signal in sorted(data_set.highlighted_signals): + print(f"\t{signal}") diff --git a/exabel_data_sdk/client/api/data_classes/kpi.py b/exabel_data_sdk/client/api/data_classes/kpi.py new file mode 100644 index 00000000..9d6af52c --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/kpi.py @@ -0,0 +1,61 @@ +from dataclasses import dataclass +from enum import Enum +from typing import Optional + +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import Kpi as ProtoKpi + + +class KpiType(Enum): + """Enum representing the KPI type.""" + + # Visible Alpha. + VISIBLE_ALPHA = "VISIBLE_ALPHA_STANDARD_KPI" + # FactSet Estimates. + FACTSET_ESTIMATES = "FACTSET_ESTIMATES" + # FactSet Fundamentals. + FACTSET_FUNDAMENTALS = "FACTSET_FUNDAMENTALS" + # FactSet Segments. + FACTSET_SEGMENTS = "FACTSET_SEGMENTS" + + +@dataclass +class Kpi: + """ + A KPI. + + Attributes: + type: The type of the KPI. + value: The value of the KPI. + freq: The frequency of the KPI. + display_name: The display name of the KPI. + is_ratio: Whether the KPI is a ratio. + """ + + type: KpiType + value: str + freq: str + display_name: Optional[str] = None + is_ratio: Optional[bool] = None + + @staticmethod + def from_proto(proto: ProtoKpi) -> "Kpi": + """Create a KPI from the given protobuf KPI.""" + return Kpi( + type=KpiType(proto.type), + value=proto.value, + freq=proto.freq, + display_name=proto.display_name, + is_ratio=proto.is_ratio if proto.HasField("is_ratio") else None, + ) + + def to_proto(self) -> ProtoKpi: + """ + Create a proto KPI from this KPI. + + Only the type, value, and freq fields are set. + """ + return ProtoKpi( + type=self.type.value, + value=self.value, + freq=self.freq, + ) diff --git a/exabel_data_sdk/client/api/data_classes/kpi_hierarchy.py b/exabel_data_sdk/client/api/data_classes/kpi_hierarchy.py new file mode 100644 index 00000000..af348aea --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/kpi_hierarchy.py @@ -0,0 +1,81 @@ +from dataclasses import dataclass +from typing import Optional, Sequence + +from exabel_data_sdk.client.api.data_classes.kpi import Kpi +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiBreakdown as ProtoKpiBreakdown, +) +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiBreakdownNode as ProtoKpiBreakdownNode, +) +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiHierarchy as ProtoKpiHierarchy, +) + + +@dataclass +class KpiBreakdownNode: + """ + A single node in a KpiBreakdown. + + Attributes: + kpi: The KPI represented by this node. + header: The string representing this node, when the node represents a grouping of KPIs + and not a single one. + children: The children of this node. + """ + + kpi: Optional[Kpi] + header: Optional[str] + children: Sequence["KpiBreakdownNode"] + + @staticmethod + def from_proto(proto: ProtoKpiBreakdownNode) -> "KpiBreakdownNode": + """Create a KpiBreakdownNode from the given protobuf KpiBreakdownNode.""" + return KpiBreakdownNode( + kpi=Kpi.from_proto(proto.kpi) if proto.HasField("kpi") else None, + header=proto.header if proto.HasField("header") else None, + children=[KpiBreakdownNode.from_proto(n) for n in proto.children], + ) + + +@dataclass +class KpiBreakdown: + """ + A KpiBreakdown. + + Attributes: + nodes: The nodes of the KpiBreakdown. + """ + + kpis: Sequence[KpiBreakdownNode] + + @staticmethod + def from_proto(proto: ProtoKpiBreakdown) -> "KpiBreakdown": + """Create a KpiBreakdown from the given protobuf KpiBreakdown.""" + return KpiBreakdown(kpis=[KpiBreakdownNode.from_proto(kpi) for kpi in proto.kpis]) + + +@dataclass +class KpiHierarchy: + """ + A KpiHierarchy. + + Attributes: + name: The resource name of the KpiHierarchy. + freq: The frequency of the KpiHierarchy. + breakdown: The breakdown of the KpiHierarchy. + """ + + name: str + freq: str + breakdown: KpiBreakdown + + @staticmethod + def from_proto(proto: ProtoKpiHierarchy) -> "KpiHierarchy": + """Create a KpiHierarchy from the given protobuf KpiHierarchy.""" + return KpiHierarchy( + name=proto.name, + freq=proto.freq, + breakdown=KpiBreakdown.from_proto(proto.breakdown), + ) diff --git a/exabel_data_sdk/client/api/data_classes/kpi_mapping_group.py b/exabel_data_sdk/client/api/data_classes/kpi_mapping_group.py new file mode 100644 index 00000000..0d111650 --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/kpi_mapping_group.py @@ -0,0 +1,30 @@ +from dataclasses import dataclass + +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiMappingGroup as ProtoKpiMappingGroup, +) + + +@dataclass +class KpiMappingGroup: + """ + A KPI mapping group. + + Attributes: + name: The resource name of the KPI mapping group. + display_name: The display name of the KPI mapping group. + vendor_display_name: The display name of the vendor the group belongs to. + """ + + name: str + display_name: str + vendor_display_name: str + + @staticmethod + def from_proto(proto: ProtoKpiMappingGroup) -> "KpiMappingGroup": + """Create a KpiMappingGroup from the given protobuf KpiMappingGroup.""" + return KpiMappingGroup( + name=proto.name, + display_name=proto.display_name, + vendor_display_name=proto.vendor_display_name, + ) diff --git a/exabel_data_sdk/client/api/data_classes/kpi_mapping_model.py b/exabel_data_sdk/client/api/data_classes/kpi_mapping_model.py new file mode 100644 index 00000000..c0f1cb43 --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/kpi_mapping_model.py @@ -0,0 +1,29 @@ +from dataclasses import dataclass + +from exabel_data_sdk.client.api.data_classes.kpi_mapping_group import KpiMappingGroup +from exabel_data_sdk.client.api.data_classes.kpi_model_data import KpiModelData +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiMappingModel as ProtoKpiMappingModel, +) + + +@dataclass +class KpiMappingModel: + """ + Represents a model built on a single KPI mapping. + + Attributes: + group: The KPI mapping group of the model. + data: The data for the model. + """ + + group: KpiMappingGroup + data: KpiModelData + + @staticmethod + def from_proto(proto: ProtoKpiMappingModel) -> "KpiMappingModel": + """Create a KpiMappingModel from the given protobuf KpiMappingModel.""" + return KpiMappingModel( + group=KpiMappingGroup.from_proto(proto.source), + data=KpiModelData.from_proto(proto.kpi_model_data), + ) diff --git a/exabel_data_sdk/client/api/data_classes/kpi_mapping_result_data.py b/exabel_data_sdk/client/api/data_classes/kpi_mapping_result_data.py new file mode 100644 index 00000000..cb99e566 --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/kpi_mapping_result_data.py @@ -0,0 +1,95 @@ +from dataclasses import dataclass +from typing import Optional + +import pandas as pd + +from exabel_data_sdk.client.api.data_classes.kpi_mapping_group import KpiMappingGroup +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiMappingResultData as ProtoKpiMappingResultData, +) + + +@dataclass +class KpiMappingResultData: + """Data for a KPI mapping result. + + Attributes: + model_mape: The MAPE (mean absolute percentage error) for a model built using + only this KPI mapping. + model_mae: The model MAE (mean absolute error) for a model built using only + this KPI mapping. + model_hit_rate: The hit rate for a model built using only this KPI mapping. + number_of_data_points: The number of data points. + mae_pop: The period-over-period MAE (mean absolute error). + mae_yoy: The year-over-year MAE (mean absolute error). + correlation_abs: The absolute correlation. + correlation_pop: The period-over-period correlation. + correlation_yoy: The year-over-year correlation. + p_value_abs: The absolute p-value. + p_value_pop: The period-over-period p-value. + p_value_yoy: The year-over-year p-value. + last_value_date: The last date with a value for the KPI mapping proxy signal. + """ + + source: KpiMappingGroup + model_mape: Optional[float] + model_mae: Optional[float] + model_hit_rate: Optional[float] + number_of_data_points: Optional[int] + mae_pop: Optional[float] + mae_yoy: Optional[float] + correlation_abs: Optional[float] + correlation_pop: Optional[float] + correlation_yoy: Optional[float] + p_value_abs: Optional[float] + p_value_pop: Optional[float] + p_value_yoy: Optional[float] + last_value_date: Optional[pd.Timestamp] + + @staticmethod + def from_proto(proto: ProtoKpiMappingResultData) -> "KpiMappingResultData": + """Create a KpiMappingResultData from the given protobuf KpiMappingResultData.""" + return KpiMappingResultData( + source=KpiMappingGroup.from_proto(proto.source), + model_mape=proto.model_mape if proto.HasField("model_mape") else None, + model_mae=proto.model_mae if proto.HasField("model_mae") else None, + model_hit_rate=proto.model_hit_rate if proto.HasField("model_hit_rate") else None, + number_of_data_points=( + proto.number_of_data_points if proto.HasField("number_of_data_points") else None + ), + mae_pop=( + proto.period_over_period_mae if proto.HasField("period_over_period_mae") else None + ), + mae_yoy=(proto.year_over_year_mae if proto.HasField("year_over_year_mae") else None), + correlation_abs=( + proto.absolute_correlation if proto.HasField("absolute_correlation") else None + ), + correlation_pop=( + proto.period_over_period_correlation + if proto.HasField("period_over_period_correlation") + else None + ), + correlation_yoy=( + proto.year_over_year_correlation + if proto.HasField("year_over_year_correlation") + else None + ), + p_value_abs=proto.absolute_p_value if proto.HasField("absolute_p_value") else None, + p_value_pop=( + proto.period_over_period_p_value + if proto.HasField("period_over_period_p_value") + else None + ), + p_value_yoy=( + proto.year_over_year_p_value if proto.HasField("year_over_year_p_value") else None + ), + last_value_date=( + pd.Timestamp( + year=proto.last_value_date.year, + month=proto.last_value_date.month, + day=proto.last_value_date.day, + ) + if proto.HasField("last_value_date") + else None + ), + ) diff --git a/exabel_data_sdk/client/api/data_classes/kpi_model.py b/exabel_data_sdk/client/api/data_classes/kpi_model.py new file mode 100644 index 00000000..6a30b66c --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/kpi_model.py @@ -0,0 +1,36 @@ +from dataclasses import dataclass + +from exabel_data_sdk.client.api.data_classes.kpi_model_data import KpiModelData +from exabel_data_sdk.client.api.data_classes.kpi_model_weight_groups import KpiModelWeightGroups +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import KpiModel as ProtoKpiModel + + +@dataclass +class KpiModel: + """ + Represents a KPI model. + + Attributes: + name: The resource name of the model. + id: The numeric id of the model. + display_name: The display name of the model. + data: The data of the model. + weights: The weight groups of the model. + """ + + name: str + id: int + display_name: str + data: KpiModelData + weights: KpiModelWeightGroups + + @staticmethod + def from_proto(proto: ProtoKpiModel) -> "KpiModel": + """Create a KpiModel from the given protobuf KpiModel.""" + return KpiModel( + name=proto.name, + id=proto.id, + display_name=proto.display_name, + data=KpiModelData.from_proto(proto.data), + weights=KpiModelWeightGroups.from_proto(proto.weights), + ) diff --git a/exabel_data_sdk/client/api/data_classes/kpi_model_data.py b/exabel_data_sdk/client/api/data_classes/kpi_model_data.py new file mode 100644 index 00000000..3cab4e22 --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/kpi_model_data.py @@ -0,0 +1,126 @@ +from dataclasses import dataclass +from enum import Enum +from typing import Optional + +import pandas as pd + +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiModelData as ProtoKpiModelData, +) +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + ModelQuality as ProtoModelQuality, +) + + +class ModelQuality(Enum): + """Enum representing the model quality.""" + + # Low model quality. + LOW = 1 + # Medium model quality. + MEDIUM = 2 + # High model quality. + HIGH = 3 + # Very high model quality. + VERY_HIGH = 4 + + @staticmethod + def from_proto(proto: ProtoModelQuality.ValueType) -> "ModelQuality": + """Create a ModelQuality from the given protobuf ModelQuality.""" + if proto == ProtoModelQuality.MODEL_QUALITY_LOW: + return ModelQuality.LOW + if proto == ProtoModelQuality.MODEL_QUALITY_MEDIUM: + return ModelQuality.MEDIUM + if proto == ProtoModelQuality.MODEL_QUALITY_HIGH: + return ModelQuality.HIGH + if proto == ProtoModelQuality.MODEL_QUALITY_VERY_HIGH: + return ModelQuality.VERY_HIGH + raise AssertionError("Unknown model quality") + + +@dataclass +class KpiModelData: + """ + Data for a KPI model. + + Attributes: + prediction: The prediction. + prediction_yoy_rel: The relative YoY prediction. + prediction_yoy_abs: The absolute YoY prediction. + consensus: The consensus. + consensus_yoy_rel: The relative YoY consensus. + consensus_yoy_abs: The absolute YoY consensus. + delta_abs: The absolute delta. + delta_rel: The relative delta. + delta_by_error: The delta by error. + model_quality: The model quality. + mape: The MAPE (mean absolute percentage error). + mape_pit: The point-in-time MAPE (mean absolute percentage error). + mae: The MAE (mean absolute error). + mae_pit: The point-in-time MAE (mean absolute error). + hit_rate: The hit rate. + revision_1_week: The 1 week revision. + revision_1_month: The 1 month revision. + error: Optional error, if the model estimation failed. + """ + + prediction: Optional[float] + prediction_yoy_rel: Optional[float] + prediction_yoy_abs: Optional[float] + consensus: Optional[float] + consensus_yoy_rel: Optional[float] + consensus_yoy_abs: Optional[float] + delta_abs: Optional[float] + delta_rel: Optional[float] + delta_by_error: Optional[float] + model_quality: Optional[ModelQuality] + mape: Optional[float] + mape_pit: Optional[float] + mae: Optional[float] + mae_pit: Optional[float] + hit_rate: Optional[float] + revision_1_week: Optional[float] + revision_1_month: Optional[float] + date: Optional[pd.Timestamp] + error: str + + @staticmethod + def from_proto(proto: ProtoKpiModelData) -> "KpiModelData": + """Create a KpiModelData from the given protobuf KpiModelData.""" + return KpiModelData( + prediction=proto.prediction if proto.HasField("prediction") else None, + prediction_yoy_rel=( + proto.prediction_yoy_rel if proto.HasField("prediction_yoy_rel") else None + ), + prediction_yoy_abs=( + proto.prediction_yoy_abs if proto.HasField("prediction_yoy_abs") else None + ), + consensus=proto.consensus if proto.HasField("consensus") else None, + consensus_yoy_rel=( + proto.consensus_yoy_rel if proto.HasField("consensus_yoy_rel") else None + ), + consensus_yoy_abs=( + proto.consensus_yoy_abs if proto.HasField("consensus_yoy_abs") else None + ), + delta_abs=proto.delta_abs if proto.HasField("delta_abs") else None, + delta_rel=proto.delta_rel if proto.HasField("delta_rel") else None, + delta_by_error=proto.delta_by_error if proto.HasField("delta_by_error") else None, + model_quality=( + ModelQuality.from_proto(proto.model_quality) + if proto.model_quality != ProtoModelQuality.MODEL_QUALITY_UNSPECIFIED + else None + ), + mape=proto.mape if proto.HasField("mape") else None, + mape_pit=proto.mape_pit if proto.HasField("mape_pit") else None, + mae=proto.mae if proto.HasField("mae") else None, + mae_pit=proto.mae_pit if proto.HasField("mae_pit") else None, + hit_rate=proto.hit_rate if proto.HasField("hit_rate") else None, + revision_1_week=proto.revision_1_week if proto.HasField("revision_1_week") else None, + revision_1_month=proto.revision_1_month if proto.HasField("revision_1_month") else None, + date=( + pd.Timestamp(year=proto.date.year, month=proto.date.month, day=proto.date.day) + if proto.HasField("date") + else None + ), + error=proto.error, + ) diff --git a/exabel_data_sdk/client/api/data_classes/kpi_model_weight_groups.py b/exabel_data_sdk/client/api/data_classes/kpi_model_weight_groups.py new file mode 100644 index 00000000..26592124 --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/kpi_model_weight_groups.py @@ -0,0 +1,84 @@ +from dataclasses import dataclass +from typing import Optional, Sequence + +from exabel_data_sdk.client.api.data_classes.kpi_mapping_group import KpiMappingGroup +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiModelFeatureWeight as ProtoKpiModelFeatureWeight, +) +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiModelWeightGroup as ProtoKpiModelWeightGroup, +) +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiModelWeightGroups as ProtoKpiModelWeightGroups, +) + + +@dataclass +class KpiModelFeatureWeight: + """ " + The weight for a single feature. + + Attributes: + display_name: The display name of the feature. + weight: The weight of the feature. + """ + + display_name: str + weight: Optional[float] + + @staticmethod + def from_proto( + proto: ProtoKpiModelFeatureWeight, + ) -> "KpiModelFeatureWeight": + """Create a KpiModelFeatureWeight from the given protobuf KpiModelFeatureWeight.""" + return KpiModelFeatureWeight( + display_name=proto.display_name, + weight=proto.weight if proto.HasField("weight") else None, + ) + + +@dataclass +class KpiModelWeightGroup: + """ " + Represents a weight group. + + Attributes: + display_name: The display name of the weight group. + group: The KPI mapping group the group originates from, if any. + weights: The weights of the weight group. + """ + + display_name: str + group: Optional[KpiMappingGroup] + weights: Sequence[KpiModelFeatureWeight] + + @staticmethod + def from_proto(proto: ProtoKpiModelWeightGroup) -> "KpiModelWeightGroup": + """Create a KpiModelWeightGroup from the given protobuf KpiModelWeightGroup.""" + return KpiModelWeightGroup( + display_name=proto.display_name, + group=KpiMappingGroup.from_proto(proto.group) if proto.HasField("group") else None, + weights=[KpiModelFeatureWeight.from_proto(w) for w in proto.feature_weights], + ) + + +@dataclass +class KpiModelWeightGroups: + """ + Represents the weight groups of a KPI model. + + Attributes: + is_coefficients: Whether the weight groups are coefficients. + weight_groups: The weight groups. + """ + + is_coefficients: bool + weight_groups: Sequence[KpiModelWeightGroup] + + @staticmethod + def from_proto(proto: ProtoKpiModelWeightGroups) -> "KpiModelWeightGroups": + """Create a KpiModelWeightGroups from the given protobuf KpiModelWeightGroups.""" + return KpiModelWeightGroups( + is_coefficients=proto.is_coefficients, + weight_groups=[KpiModelWeightGroup.from_proto(wg) for wg in proto.weight_groups], + ) diff --git a/exabel_data_sdk/client/api/data_classes/kpi_source.py b/exabel_data_sdk/client/api/data_classes/kpi_source.py new file mode 100644 index 00000000..2516d8cd --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/kpi_source.py @@ -0,0 +1,23 @@ +from enum import Enum + +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiSource as ProtoKpiSource, +) + + +class KpiSource(Enum): + """Enum representing the source of a KPI.""" + + # Visible Alpha. + VISIBLE_ALPHA = 1 + + # Factset. + FACTSET = 2 + + def to_proto(self) -> ProtoKpiSource.ValueType: + """Create a protobuf KpiSource from this KpiSource.""" + return ( + ProtoKpiSource.KPI_SOURCE_FACTSET + if self == KpiSource.FACTSET + else ProtoKpiSource.KPI_SOURCE_VISIBLE_ALPHA + ) diff --git a/exabel_data_sdk/client/api/kpi_api.py b/exabel_data_sdk/client/api/kpi_api.py new file mode 100644 index 00000000..b199620c --- /dev/null +++ b/exabel_data_sdk/client/api/kpi_api.py @@ -0,0 +1,176 @@ +from typing import Literal, Optional, Sequence, Union + +import pandas as pd + +from exabel_data_sdk.client.api.api_client.grpc.kpi_grpc_client import KpiGrpcClient +from exabel_data_sdk.client.api.data_classes.company_kpi_mapping_results import ( + CompanyKpiMappingResults, +) +from exabel_data_sdk.client.api.data_classes.company_kpi_model_result import CompanyKpiModelResult +from exabel_data_sdk.client.api.data_classes.company_kpi_models import CompanyKpiModels +from exabel_data_sdk.client.api.data_classes.kpi import Kpi, KpiType +from exabel_data_sdk.client.api.data_classes.kpi_mapping_result_data import KpiMappingResultData +from exabel_data_sdk.client.api.data_classes.kpi_source import KpiSource +from exabel_data_sdk.client.api.data_classes.paging_result import PagingResult +from exabel_data_sdk.client.client_config import ClientConfig +from exabel_data_sdk.stubs.exabel.api.analytics.v1.all_pb2 import ( + FiscalPeriodSelector, + RelativeFiscalPeriodSelector, +) +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_service_pb2 import ( + ListCompanyBaseModelResultsRequest, + ListCompanyHierarchicalModelResultsRequest, + ListCompanyKpiMappingResultsRequest, + ListCompanyKpiModelResultsRequest, + ListKpiMappingResultsRequest, +) +from exabel_data_sdk.stubs.exabel.api.time.date_pb2 import Date + + +class KpiApi: + """ + API class for KPI operations. + """ + + def __init__(self, config: ClientConfig): + self.client = KpiGrpcClient(config) + + def list_kpi_mapping_results( + self, kpi_mapping: str, page_size: int = 20, page_token: str = "" + ) -> PagingResult[CompanyKpiMappingResults]: + """ + List KPI mapping results for a single KPI mapping collection. + + Args: + kpi_mapping: KPI mapping resource name. + page_size: The maximum number of results to return. + page_token: The page token to resume the results from. + """ + request = ListKpiMappingResultsRequest( + parent=kpi_mapping, page_size=page_size, page_token=page_token + ) + response = self.client.list_kpi_mapping_results(request) + return PagingResult( + [CompanyKpiMappingResults.from_proto(result) for result in response.results], + next_page_token=response.next_page_token, + total_size=response.total_size, + ) + + def list_company_base_model_results( + self, + company: str, + source_filter: Optional[KpiSource] = None, + fiscal_period: Union[Literal["previous", "current", "next"], pd.Timestamp] = "current", + freq: Optional[Literal["FQ", "FS", "FY"]] = None, + ) -> Sequence[CompanyKpiModelResult]: + """ + List base model results for a company. + + Args: + company: Company resource name. + source_filter: Optional KPI source filter. + fiscal_period: Fiscal period to retrieve data for. + freq: Frequency to retrieve data for. If not provided, frequency is + determined based on KPI counts. + """ + request = ListCompanyBaseModelResultsRequest( + parent=company, + kpi_source=source_filter.to_proto() if source_filter else None, + period=self._get_fiscal_period_selector(fiscal_period, freq), + ) + response = self.client.list_company_base_model_results(request) + return [CompanyKpiModelResult.from_proto(result) for result in response.results] + + def list_company_hierarchical_model_results( + self, + company: str, + source_filter: Optional[KpiSource] = None, + fiscal_period: Union[Literal["previous", "current", "next"], pd.Timestamp] = "current", + freq: Optional[Literal["FQ", "FS", "FY"]] = None, + ) -> Sequence[CompanyKpiModelResult]: + """ + List hierarchical model results for a company. + + Args: + company: Company resource name. + source_filter: Optional KPI source filter. + fiscal_period: Fiscal period to retrieve data for. + freq: Frequency to retrieve data for. If not provided, frequency is + determined based on KPI counts. + """ + request = ListCompanyHierarchicalModelResultsRequest( + parent=company, + kpi_source=source_filter.to_proto() if source_filter else None, + period=self._get_fiscal_period_selector(fiscal_period, freq), + ) + response = self.client.list_company_hierarchical_model_results(request) + return [CompanyKpiModelResult.from_proto(result) for result in response.results] + + def list_company_kpi_mapping_results( + self, + company: str, + kpi_type: KpiType, + kpi_value: str, + kpi_freq: Literal["FQ", "FS", "FY"], + ) -> Sequence[KpiMappingResultData]: + """ + List KPI mapping results for a single company KPI. + + Args: + company: Company resource name. + kpi_type: KPI type. + kpi_value: KPI value. + kpi_freq: KPI frequency. + """ + request = ListCompanyKpiMappingResultsRequest( + parent=company, kpi=Kpi(type=kpi_type, value=kpi_value, freq=kpi_freq).to_proto() + ) + response = self.client.list_company_kpi_mapping_results(request) + return [KpiMappingResultData.from_proto(result) for result in response.results] + + def list_company_kpi_model_results( + self, company: str, kpi_type: KpiType, kpi_value: str, kpi_freq: Literal["FQ", "FS", "FY"] + ) -> CompanyKpiModels: + """ + List model results for a single company KPI. + + Args: + company: Company resource name. + kpi_type: KPI type. + kpi_value: KPI value. + kpi_freq: KPI frequency. + """ + request = ListCompanyKpiModelResultsRequest( + parent=company, kpi=Kpi(type=kpi_type, value=kpi_value, freq=kpi_freq).to_proto() + ) + response = self.client.list_company_kpi_model_results(request) + return CompanyKpiModels.from_proto(response) + + @staticmethod + def _get_fiscal_period_selector( + fiscal_period: Union[Literal["previous", "current", "next"], pd.Timestamp], + freq: Optional[Literal["FQ", "FS", "FY"]], + ) -> FiscalPeriodSelector: + if freq not in ["FQ", "FS", "FY", None]: + raise ValueError("Frequency must be one of FQ, FS and FY.") + + if fiscal_period == "previous": + return FiscalPeriodSelector( + relative_selector=RelativeFiscalPeriodSelector.PREVIOUS, freq=freq + ) + if fiscal_period == "current": + return FiscalPeriodSelector( + relative_selector=RelativeFiscalPeriodSelector.CURRENT, freq=freq + ) + if fiscal_period == "next": + return FiscalPeriodSelector( + relative_selector=RelativeFiscalPeriodSelector.NEXT, freq=freq + ) + if isinstance(fiscal_period, pd.Timestamp): + return FiscalPeriodSelector( + period_end=Date( + year=fiscal_period.year, month=fiscal_period.month, day=fiscal_period.day + ), + freq=freq, + ) + raise ValueError(f"Invalid fiscal period: {fiscal_period}") diff --git a/exabel_data_sdk/client/exabel_client.py b/exabel_data_sdk/client/exabel_client.py index dede1aab..f8d51e4a 100644 --- a/exabel_data_sdk/client/exabel_client.py +++ b/exabel_data_sdk/client/exabel_client.py @@ -3,6 +3,7 @@ from exabel_data_sdk.client.api.data_set_api import DataSetApi from exabel_data_sdk.client.api.derived_signal_api import DerivedSignalApi from exabel_data_sdk.client.api.entity_api import EntityApi +from exabel_data_sdk.client.api.kpi_api import KpiApi from exabel_data_sdk.client.api.library_api import LibraryApi from exabel_data_sdk.client.api.namespace_api import NamespaceApi from exabel_data_sdk.client.api.prediction_model_api import PredictionModelApi @@ -75,6 +76,7 @@ def __init__( self.tag_api = TagApi(config) self.user_api = UserApi(config) self.library_api = LibraryApi(config) + self.kpi_api = KpiApi(config) self.namespace_api = NamespaceApi(config) self._namespace: Optional[str] = None diff --git a/exabel_data_sdk/scripts/delete_time_series.py b/exabel_data_sdk/scripts/delete_time_series.py index 37a54bd6..975501b5 100644 --- a/exabel_data_sdk/scripts/delete_time_series.py +++ b/exabel_data_sdk/scripts/delete_time_series.py @@ -33,15 +33,13 @@ def __init__(self, argv: Sequence[str], description: str): help="Only print to console instead of deleting", ) - def run_script(self, client: ExabelClient, args: argparse.Namespace) -> None: - all_time_series = self._list_time_series( - client, - entity=args.entity, - signal=args.signal, - entity_type=args.entity_type, - show_progress=args.show_progress, - ) - + def _delete_time_series( + self, + client: ExabelClient, + all_time_series: Sequence[str], + show_progress: bool = False, + dry_run: bool = False, + ) -> None: if not all_time_series: print("No time series to delete.") return @@ -62,7 +60,7 @@ def delete_time_series(time_series: str) -> int: for i in conditional_progress_bar( range(0, num_time_series, PAGE_SIZE), desc="Deleting time series: ", - show_progress=args.show_progress, + show_progress=show_progress, ): batch = ( all_time_series[i : i + PAGE_SIZE] @@ -70,9 +68,9 @@ def delete_time_series(time_series: str) -> int: else all_time_series[i:] ) - if args.dry_run: - for time_series in batch: - tqdm.write(f"Delete: {time_series}") + if dry_run: + for ts in batch: + tqdm.write(f"Delete: {ts}") num_deleted += len(batch) continue @@ -81,13 +79,29 @@ def delete_time_series(time_series: str) -> int: num_deleted += api_results_counter[SUCCESS] num_failed += api_results_counter[ERROR] - if args.dry_run: + if dry_run: print(f"Would have deleted {num_deleted} time series.") return print(f"Successfully deleted {num_deleted} time series.") if num_failed > 0: print(f"Failed to delete {num_failed} time series.") + def run_script(self, client: ExabelClient, args: argparse.Namespace) -> None: + all_time_series = self._list_time_series( + client, + entity=args.entity, + signal=args.signal, + entity_type=args.entity_type, + show_progress=args.show_progress, + ) + + self._delete_time_series( + client, + all_time_series, + show_progress=args.show_progress, + dry_run=args.dry_run, + ) + if __name__ == "__main__": DeleteTimeSeries( diff --git a/exabel_data_sdk/scripts/list_time_series.py b/exabel_data_sdk/scripts/list_time_series.py index 06405e6d..6b72df43 100644 --- a/exabel_data_sdk/scripts/list_time_series.py +++ b/exabel_data_sdk/scripts/list_time_series.py @@ -1,5 +1,6 @@ import argparse import sys +from concurrent.futures import ThreadPoolExecutor from math import ceil from typing import List, Optional, Sequence @@ -8,7 +9,7 @@ from exabel_data_sdk.client.api.data_classes.paging_result import PagingResult from exabel_data_sdk.scripts import utils from exabel_data_sdk.scripts.base_script import BaseScript -from exabel_data_sdk.scripts.utils import PAGE_SIZE, conditional_progress_bar +from exabel_data_sdk.scripts.utils import MAX_WORKERS, PAGE_SIZE, conditional_progress_bar class ListTimeSeries(BaseScript): @@ -91,7 +92,7 @@ def _list_time_series( print(f"Fetching time series in pages of size {PAGE_SIZE}...") for _ in conditional_progress_bar( range(1, ceil(num_time_series / PAGE_SIZE) + 1), - desc="Fetching time series: ", + desc="Fetching time series names: ", show_progress=show_progress, initial=1, ): @@ -129,19 +130,37 @@ def _list_time_series( ) if all_entities and not all_time_series: - for item in conditional_progress_bar( - all_entities, desc="Fetching time series: ", show_progress=show_progress - ): + num_entities = len(all_entities) + + def _get_entity_time_series(entity: Entity) -> Sequence[str]: page_token = None + ts_list: List[str] = [] while True: result = client.time_series_api.get_entity_time_series( - item.name, page_size=PAGE_SIZE, page_token=page_token + entity.name, page_size=PAGE_SIZE, page_token=page_token ) - all_time_series.extend(self._filter_ts_list(result.results, signal)) + ts_list.extend(self._filter_ts_list(result.results, signal)) page_token = result.next_page_token if len(result.results) < PAGE_SIZE: break + return ts_list + + with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: + for i in conditional_progress_bar( + range(0, num_entities, PAGE_SIZE), + desc="Fetching time series names: ", + show_progress=show_progress, + ): + batch = ( + all_entities[i : i + PAGE_SIZE] + if i + PAGE_SIZE < num_entities + else all_entities[i:] + ) + + for ts_sequence in executor.map(_get_entity_time_series, batch): + all_time_series.extend(ts_sequence) + return all_time_series def run_script(self, client: ExabelClient, args: argparse.Namespace) -> None: @@ -160,4 +179,4 @@ def run_script(self, client: ExabelClient, args: argparse.Namespace) -> None: if __name__ == "__main__": - ListTimeSeries(sys.argv, "Lists time series.").run() + ListTimeSeries(sys.argv, "List time series names.").run() diff --git a/exabel_data_sdk/services/file_time_series_loader.py b/exabel_data_sdk/services/file_time_series_loader.py index 8a981645..61719da3 100644 --- a/exabel_data_sdk/services/file_time_series_loader.py +++ b/exabel_data_sdk/services/file_time_series_loader.py @@ -894,7 +894,7 @@ def check_signal_name_errors(signals: Sequence[str]) -> None: error_message = ( "Encountered invalid signal names. Signal names must start with a letter, " "and can only consist of letters, numbers, and underscore (_), and be " - "at most 64 characters. " + "at most 128 characters. " ) if invalid_signals: error_message += f"Invalid signal names: {', '.join(invalid_signals)}. " diff --git a/exabel_data_sdk/services/file_time_series_parser.py b/exabel_data_sdk/services/file_time_series_parser.py index 27590707..46b0f3ca 100644 --- a/exabel_data_sdk/services/file_time_series_parser.py +++ b/exabel_data_sdk/services/file_time_series_parser.py @@ -478,6 +478,10 @@ def _set_index(cls, data: pd.DataFrame) -> pd.DataFrame: @classmethod def _try_parsing_date_column(cls, data: pd.DataFrame, column: str) -> pd.DatetimeIndex: + if bool(data[column].isna().any()): + raise FileLoadingException( + f"The '{column}' column has missing values, which is not permitted." + ) try: return pd.DatetimeIndex(data[column], tz=tz.tzutc()) except Exception as e: @@ -853,10 +857,14 @@ def _get_series_with_potential_duplicate_data_points( @classmethod def _set_index(cls, data: pd.DataFrame) -> pd.DataFrame: + if bool(data.iloc[:, 0].isna().any()): + raise FileLoadingException( + "The first column has missing values, which is not permitted." + ) date_index = pd.DatetimeIndex(data.iloc[:, 0], tz=tz.tzutc()) date_index.name = None - data.set_index(date_index, inplace=True) - data.drop(columns=data.columns[0], inplace=True) + data = data.set_index(date_index) + data = data.drop(columns=data.columns[0]) return data @classmethod diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/__init__.pyi b/exabel_data_sdk/stubs/exabel/api/analytics/v1/__init__.pyi index 0596e94d..1ea2a317 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/__init__.pyi +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/__init__.pyi @@ -1,6 +1,8 @@ from . import derived_signal_messages_pb2 from . import derived_signal_service_pb2 from . import item_messages_pb2 +from . import kpi_messages_pb2 +from . import kpi_service_pb2 from . import prediction_model_messages_pb2 from . import prediction_model_service_pb2 from . import service_pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/all_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/all_pb2.py index 623ede18..695da533 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/all_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/all_pb2.py @@ -4,6 +4,8 @@ from .derived_signal_messages_pb2 import * from .derived_signal_service_pb2 import * from .item_messages_pb2 import * +from .kpi_messages_pb2 import * +from .kpi_service_pb2 import * from .prediction_model_messages_pb2 import * from .prediction_model_service_pb2 import * from .service_pb2 import * diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/all_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/all_pb2_grpc.py index 66248b36..79587bc0 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/all_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/all_pb2_grpc.py @@ -4,6 +4,8 @@ from .derived_signal_messages_pb2_grpc import * from .derived_signal_service_pb2_grpc import * from .item_messages_pb2_grpc import * +from .kpi_messages_pb2_grpc import * +from .kpi_service_pb2_grpc import * from .prediction_model_messages_pb2_grpc import * from .prediction_model_service_pb2_grpc import * from .service_pb2_grpc import * diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2.py index e0eb557b..4127648f 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/analytics/v1/derived_signal_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/analytics/v1/derived_signal_messages.proto') _sym_db = _symbol_database.Default() from .....exabel.api.data.v1 import common_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_common__messages__pb2 from .....exabel.api.math import aggregation_pb2 as exabel_dot_api_dot_math_dot_aggregation__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2_grpc.py index e4fddda0..b9cd2974 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_service_pb2.py index dbebcdac..62257c05 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/analytics/v1/derived_signal_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/analytics/v1/derived_signal_service.proto') _sym_db = _symbol_database.Default() from .....exabel.api.analytics.v1 import derived_signal_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_derived__signal__messages__pb2 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_service_pb2_grpc.py index 00e62694..e5bec74f 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_service_pb2_grpc.py @@ -4,7 +4,7 @@ from .....exabel.api.analytics.v1 import derived_signal_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_derived__signal__messages__pb2 from .....exabel.api.analytics.v1 import derived_signal_service_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_derived__signal__service__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/item_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/item_messages_pb2.py index 332eeb91..db7391c6 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/item_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/item_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/analytics/v1/item_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/analytics/v1/item_messages.proto') _sym_db = _symbol_database.Default() from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/item_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/item_messages_pb2_grpc.py index 40f8b8dd..1631809b 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/item_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/item_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_messages_pb2.py new file mode 100644 index 00000000..d6b8c57f --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_messages_pb2.py @@ -0,0 +1,56 @@ +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/analytics/v1/kpi_messages.proto') +_sym_db = _symbol_database.Default() +from .....exabel.api.time import date_pb2 as exabel_dot_api_dot_time_dot_date__pb2 +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*exabel/api/analytics/v1/kpi_messages.proto\x12\x17exabel.api.analytics.v1\x1a\x1aexabel/api/time/date.proto"\x9a\x01\n\x18CompanyKpiMappingResults\x120\n\x06entity\x18\x01 \x01(\x0b2 .exabel.api.analytics.v1.Company\x12L\n\x0bkpi_results\x18\x02 \x03(\x0b27.exabel.api.analytics.v1.SingleCompanyKpiMappingResults"G\n\x07Company\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0cdisplay_name\x18\x02 \x01(\t\x12\x18\n\x10bloomberg_ticker\x18\x03 \x01(\t"\x88\x01\n\x1eSingleCompanyKpiMappingResults\x12)\n\x03kpi\x18\x01 \x01(\x0b2\x1c.exabel.api.analytics.v1.Kpi\x12;\n\x04data\x18\x02 \x03(\x0b2-.exabel.api.analytics.v1.KpiMappingResultData"\x87\x01\n\x03Kpi\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x12\n\x05value\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cdisplay_name\x18\x03 \x01(\t\x12\x11\n\x04freq\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x15\n\x08is_ratio\x18\x05 \x01(\x08H\x02\x88\x01\x01B\x08\n\x06_valueB\x07\n\x05_freqB\x0b\n\t_is_ratio"\xc4\x06\n\x14KpiMappingResultData\x128\n\x06source\x18\x01 \x01(\x0b2(.exabel.api.analytics.v1.KpiMappingGroup\x12\x17\n\nmodel_mape\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x16\n\tmodel_mae\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1b\n\x0emodel_hit_rate\x18\x04 \x01(\x01H\x02\x88\x01\x01\x12.\n\x0flast_value_date\x18\x05 \x01(\x0b2\x15.exabel.api.time.Date\x12"\n\x15number_of_data_points\x18\x06 \x01(\x05H\x03\x88\x01\x01\x12#\n\x16period_over_period_mae\x18\x07 \x01(\x01H\x04\x88\x01\x01\x12\x1f\n\x12year_over_year_mae\x18\x08 \x01(\x01H\x05\x88\x01\x01\x12!\n\x14absolute_correlation\x18\t \x01(\x01H\x06\x88\x01\x01\x12+\n\x1eperiod_over_period_correlation\x18\n \x01(\x01H\x07\x88\x01\x01\x12\'\n\x1ayear_over_year_correlation\x18\x0b \x01(\x01H\x08\x88\x01\x01\x12\x1d\n\x10absolute_p_value\x18\x0c \x01(\x01H\t\x88\x01\x01\x12\'\n\x1aperiod_over_period_p_value\x18\r \x01(\x01H\n\x88\x01\x01\x12#\n\x16year_over_year_p_value\x18\x0e \x01(\x01H\x0b\x88\x01\x01B\r\n\x0b_model_mapeB\x0c\n\n_model_maeB\x11\n\x0f_model_hit_rateB\x18\n\x16_number_of_data_pointsB\x19\n\x17_period_over_period_maeB\x15\n\x13_year_over_year_maeB\x17\n\x15_absolute_correlationB!\n\x1f_period_over_period_correlationB\x1d\n\x1b_year_over_year_correlationB\x13\n\x11_absolute_p_valueB\x1d\n\x1b_period_over_period_p_valueB\x19\n\x17_year_over_year_p_value"R\n\x0fKpiMappingGroup\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0cdisplay_name\x18\x02 \x01(\t\x12\x1b\n\x13vendor_display_name\x18\x03 \x01(\t"\xcb\x01\n\x15CompanyKpiModelResult\x12)\n\x03kpi\x18\x01 \x01(\x0b2\x1c.exabel.api.analytics.v1.Kpi\x120\n\x05model\x18\x02 \x01(\x0b2!.exabel.api.analytics.v1.KpiModel\x12!\n\x19accessible_mappings_count\x18\x03 \x01(\x05\x12\x1c\n\x14total_mappings_count\x18\x04 \x01(\x05\x12\x14\n\x0cmodels_count\x18\x05 \x01(\x05"\xaf\x01\n\x08KpiModel\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x14\n\x0cdisplay_name\x18\x03 \x01(\t\x123\n\x04data\x18\x04 \x01(\x0b2%.exabel.api.analytics.v1.KpiModelData\x12>\n\x07weights\x18\x05 \x01(\x0b2-.exabel.api.analytics.v1.KpiModelWeightGroups"\x8a\x01\n\x0fKpiMappingModel\x128\n\x06source\x18\x01 \x01(\x0b2(.exabel.api.analytics.v1.KpiMappingGroup\x12=\n\x0ekpi_model_data\x18\x02 \x01(\x0b2%.exabel.api.analytics.v1.KpiModelData"\xac\x06\n\x0cKpiModelData\x12\x17\n\nprediction\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x1f\n\x12prediction_yoy_rel\x18\x02 \x01(\x01H\x01\x88\x01\x01\x12\x1f\n\x12prediction_yoy_abs\x18\x03 \x01(\x01H\x02\x88\x01\x01\x12\x16\n\tconsensus\x18\x04 \x01(\x01H\x03\x88\x01\x01\x12\x1e\n\x11consensus_yoy_rel\x18\x05 \x01(\x01H\x04\x88\x01\x01\x12\x1e\n\x11consensus_yoy_abs\x18\x06 \x01(\x01H\x05\x88\x01\x01\x12\x16\n\tdelta_abs\x18\x07 \x01(\x01H\x06\x88\x01\x01\x12\x16\n\tdelta_rel\x18\x08 \x01(\x01H\x07\x88\x01\x01\x12\x1b\n\x0edelta_by_error\x18\t \x01(\x01H\x08\x88\x01\x01\x12<\n\rmodel_quality\x18\n \x01(\x0e2%.exabel.api.analytics.v1.ModelQuality\x12\x11\n\x04mape\x18\x0b \x01(\x01H\t\x88\x01\x01\x12\x15\n\x08mape_pit\x18\x0c \x01(\x01H\n\x88\x01\x01\x12\x10\n\x03mae\x18\r \x01(\x01H\x0b\x88\x01\x01\x12\x14\n\x07mae_pit\x18\x0e \x01(\x01H\x0c\x88\x01\x01\x12\x15\n\x08hit_rate\x18\x0f \x01(\x01H\r\x88\x01\x01\x12\x1c\n\x0frevision_1_week\x18\x10 \x01(\x01H\x0e\x88\x01\x01\x12\x1d\n\x10revision_1_month\x18\x11 \x01(\x01H\x0f\x88\x01\x01\x12#\n\x04date\x18\x12 \x01(\x0b2\x15.exabel.api.time.Date\x12\r\n\x05error\x18d \x01(\tB\r\n\x0b_predictionB\x15\n\x13_prediction_yoy_relB\x15\n\x13_prediction_yoy_absB\x0c\n\n_consensusB\x14\n\x12_consensus_yoy_relB\x14\n\x12_consensus_yoy_absB\x0c\n\n_delta_absB\x0c\n\n_delta_relB\x11\n\x0f_delta_by_errorB\x07\n\x05_mapeB\x0b\n\t_mape_pitB\x06\n\x04_maeB\n\n\x08_mae_pitB\x0b\n\t_hit_rateB\x12\n\x10_revision_1_weekB\x13\n\x11_revision_1_month"t\n\x14KpiModelWeightGroups\x12C\n\rweight_groups\x18\x01 \x03(\x0b2,.exabel.api.analytics.v1.KpiModelWeightGroup\x12\x17\n\x0fis_coefficients\x18\x02 \x01(\x08"\xad\x01\n\x13KpiModelWeightGroup\x12\x14\n\x0cdisplay_name\x18\x01 \x01(\t\x127\n\x05group\x18\x02 \x01(\x0b2(.exabel.api.analytics.v1.KpiMappingGroup\x12G\n\x0ffeature_weights\x18\x03 \x03(\x0b2..exabel.api.analytics.v1.KpiModelFeatureWeight"M\n\x15KpiModelFeatureWeight\x12\x13\n\x06weight\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x14\n\x0cdisplay_name\x18\x02 \x01(\tB\t\n\x07_weight"\xa1\x01\n\x14FiscalPeriodSelector\x12P\n\x11relative_selector\x18\x01 \x01(\x0e25.exabel.api.analytics.v1.RelativeFiscalPeriodSelector\x12)\n\nperiod_end\x18\x02 \x01(\x0b2\x15.exabel.api.time.Date\x12\x0c\n\x04freq\x18\x03 \x01(\t"d\n\x0cKpiHierarchy\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04freq\x18\x02 \x01(\t\x128\n\tbreakdown\x18\x03 \x01(\x0b2%.exabel.api.analytics.v1.KpiBreakdown"G\n\x0cKpiBreakdown\x127\n\x04kpis\x18\x01 \x03(\x0b2).exabel.api.analytics.v1.KpiBreakdownNode"\x99\x01\n\x10KpiBreakdownNode\x12+\n\x03kpi\x18\x01 \x01(\x0b2\x1c.exabel.api.analytics.v1.KpiH\x00\x12\x10\n\x06header\x18\x02 \x01(\tH\x00\x12;\n\x08children\x18\x03 \x03(\x0b2).exabel.api.analytics.v1.KpiBreakdownNodeB\t\n\x07content*]\n\tKpiSource\x12\x1a\n\x16KPI_SOURCE_UNSPECIFIED\x10\x00\x12\x1c\n\x18KPI_SOURCE_VISIBLE_ALPHA\x10\x01\x12\x16\n\x12KPI_SOURCE_FACTSET\x10\x02*\x93\x01\n\x0cModelQuality\x12\x1d\n\x19MODEL_QUALITY_UNSPECIFIED\x10\x00\x12\x15\n\x11MODEL_QUALITY_LOW\x10\n\x12\x18\n\x14MODEL_QUALITY_MEDIUM\x10\x14\x12\x16\n\x12MODEL_QUALITY_HIGH\x10\x1e\x12\x1b\n\x17MODEL_QUALITY_VERY_HIGH\x10(*t\n\x1cRelativeFiscalPeriodSelector\x12/\n+RELATIVE_FISCAL_PERIOD_SELECTOR_UNSPECIFIED\x10\x00\x12\x0c\n\x08PREVIOUS\x10\x01\x12\x0b\n\x07CURRENT\x10\x02\x12\x08\n\x04NEXT\x10\x03BN\n\x1bcom.exabel.api.analytics.v1B\x10KpiMessagesProtoP\x01Z\x1bexabel.com/api/analytics/v1b\x06proto3') +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'exabel.api.analytics.v1.kpi_messages_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\x1bcom.exabel.api.analytics.v1B\x10KpiMessagesProtoP\x01Z\x1bexabel.com/api/analytics/v1' + _globals['_KPISOURCE']._serialized_start = 3737 + _globals['_KPISOURCE']._serialized_end = 3830 + _globals['_MODELQUALITY']._serialized_start = 3833 + _globals['_MODELQUALITY']._serialized_end = 3980 + _globals['_RELATIVEFISCALPERIODSELECTOR']._serialized_start = 3982 + _globals['_RELATIVEFISCALPERIODSELECTOR']._serialized_end = 4098 + _globals['_COMPANYKPIMAPPINGRESULTS']._serialized_start = 100 + _globals['_COMPANYKPIMAPPINGRESULTS']._serialized_end = 254 + _globals['_COMPANY']._serialized_start = 256 + _globals['_COMPANY']._serialized_end = 327 + _globals['_SINGLECOMPANYKPIMAPPINGRESULTS']._serialized_start = 330 + _globals['_SINGLECOMPANYKPIMAPPINGRESULTS']._serialized_end = 466 + _globals['_KPI']._serialized_start = 469 + _globals['_KPI']._serialized_end = 604 + _globals['_KPIMAPPINGRESULTDATA']._serialized_start = 607 + _globals['_KPIMAPPINGRESULTDATA']._serialized_end = 1443 + _globals['_KPIMAPPINGGROUP']._serialized_start = 1445 + _globals['_KPIMAPPINGGROUP']._serialized_end = 1527 + _globals['_COMPANYKPIMODELRESULT']._serialized_start = 1530 + _globals['_COMPANYKPIMODELRESULT']._serialized_end = 1733 + _globals['_KPIMODEL']._serialized_start = 1736 + _globals['_KPIMODEL']._serialized_end = 1911 + _globals['_KPIMAPPINGMODEL']._serialized_start = 1914 + _globals['_KPIMAPPINGMODEL']._serialized_end = 2052 + _globals['_KPIMODELDATA']._serialized_start = 2055 + _globals['_KPIMODELDATA']._serialized_end = 2867 + _globals['_KPIMODELWEIGHTGROUPS']._serialized_start = 2869 + _globals['_KPIMODELWEIGHTGROUPS']._serialized_end = 2985 + _globals['_KPIMODELWEIGHTGROUP']._serialized_start = 2988 + _globals['_KPIMODELWEIGHTGROUP']._serialized_end = 3161 + _globals['_KPIMODELFEATUREWEIGHT']._serialized_start = 3163 + _globals['_KPIMODELFEATUREWEIGHT']._serialized_end = 3240 + _globals['_FISCALPERIODSELECTOR']._serialized_start = 3243 + _globals['_FISCALPERIODSELECTOR']._serialized_end = 3404 + _globals['_KPIHIERARCHY']._serialized_start = 3406 + _globals['_KPIHIERARCHY']._serialized_end = 3506 + _globals['_KPIBREAKDOWN']._serialized_start = 3508 + _globals['_KPIBREAKDOWN']._serialized_end = 3579 + _globals['_KPIBREAKDOWNNODE']._serialized_start = 3582 + _globals['_KPIBREAKDOWNNODE']._serialized_end = 3735 \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_messages_pb2.pyi b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_messages_pb2.pyi new file mode 100644 index 00000000..95d2275e --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_messages_pb2.pyi @@ -0,0 +1,749 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +Copyright (c) 2025 Exabel AS. All rights reserved.""" +import builtins +import collections.abc +from ..... import exabel +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message +import sys +import typing +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _KpiSource: + ValueType = typing.NewType('ValueType', builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _KpiSourceEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_KpiSource.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + KPI_SOURCE_UNSPECIFIED: _KpiSource.ValueType + 'Unspecified.' + KPI_SOURCE_VISIBLE_ALPHA: _KpiSource.ValueType + 'Visible Alpha.' + KPI_SOURCE_FACTSET: _KpiSource.ValueType + 'FactSet.' + +class KpiSource(_KpiSource, metaclass=_KpiSourceEnumTypeWrapper): + """KPI source.""" +KPI_SOURCE_UNSPECIFIED: KpiSource.ValueType +'Unspecified.' +KPI_SOURCE_VISIBLE_ALPHA: KpiSource.ValueType +'Visible Alpha.' +KPI_SOURCE_FACTSET: KpiSource.ValueType +'FactSet.' +global___KpiSource = KpiSource + +class _ModelQuality: + ValueType = typing.NewType('ValueType', builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _ModelQualityEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_ModelQuality.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + MODEL_QUALITY_UNSPECIFIED: _ModelQuality.ValueType + 'Unspecified.' + MODEL_QUALITY_LOW: _ModelQuality.ValueType + 'Low quality.' + MODEL_QUALITY_MEDIUM: _ModelQuality.ValueType + 'Medium quality.' + MODEL_QUALITY_HIGH: _ModelQuality.ValueType + 'High quality.' + MODEL_QUALITY_VERY_HIGH: _ModelQuality.ValueType + 'Very high quality.' + +class ModelQuality(_ModelQuality, metaclass=_ModelQualityEnumTypeWrapper): + """Model quality.""" +MODEL_QUALITY_UNSPECIFIED: ModelQuality.ValueType +'Unspecified.' +MODEL_QUALITY_LOW: ModelQuality.ValueType +'Low quality.' +MODEL_QUALITY_MEDIUM: ModelQuality.ValueType +'Medium quality.' +MODEL_QUALITY_HIGH: ModelQuality.ValueType +'High quality.' +MODEL_QUALITY_VERY_HIGH: ModelQuality.ValueType +'Very high quality.' +global___ModelQuality = ModelQuality + +class _RelativeFiscalPeriodSelector: + ValueType = typing.NewType('ValueType', builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _RelativeFiscalPeriodSelectorEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_RelativeFiscalPeriodSelector.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + RELATIVE_FISCAL_PERIOD_SELECTOR_UNSPECIFIED: _RelativeFiscalPeriodSelector.ValueType + 'Unspecified.' + PREVIOUS: _RelativeFiscalPeriodSelector.ValueType + 'Last reported fiscal period.' + CURRENT: _RelativeFiscalPeriodSelector.ValueType + 'Current unreported fiscal period.' + NEXT: _RelativeFiscalPeriodSelector.ValueType + 'Next unreported fiscal period.' + +class RelativeFiscalPeriodSelector(_RelativeFiscalPeriodSelector, metaclass=_RelativeFiscalPeriodSelectorEnumTypeWrapper): + """Selector for a relative fiscal period.""" +RELATIVE_FISCAL_PERIOD_SELECTOR_UNSPECIFIED: RelativeFiscalPeriodSelector.ValueType +'Unspecified.' +PREVIOUS: RelativeFiscalPeriodSelector.ValueType +'Last reported fiscal period.' +CURRENT: RelativeFiscalPeriodSelector.ValueType +'Current unreported fiscal period.' +NEXT: RelativeFiscalPeriodSelector.ValueType +'Next unreported fiscal period.' +global___RelativeFiscalPeriodSelector = RelativeFiscalPeriodSelector + +@typing.final +class CompanyKpiMappingResults(google.protobuf.message.Message): + """KPI mapping results for a single company.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + ENTITY_FIELD_NUMBER: builtins.int + KPI_RESULTS_FIELD_NUMBER: builtins.int + + @property + def entity(self) -> global___Company: + """The company these results apply to.""" + + @property + def kpi_results(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___SingleCompanyKpiMappingResults]: + """The results for each KPI.""" + + def __init__(self, *, entity: global___Company | None=..., kpi_results: collections.abc.Iterable[global___SingleCompanyKpiMappingResults] | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['entity', b'entity']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['entity', b'entity', 'kpi_results', b'kpi_results']) -> None: + ... +global___CompanyKpiMappingResults = CompanyKpiMappingResults + +@typing.final +class Company(google.protobuf.message.Message): + """A company.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + NAME_FIELD_NUMBER: builtins.int + DISPLAY_NAME_FIELD_NUMBER: builtins.int + BLOOMBERG_TICKER_FIELD_NUMBER: builtins.int + name: builtins.str + 'The resource name of the company.' + display_name: builtins.str + 'The display name of the company.' + bloomberg_ticker: builtins.str + 'The bloomberg ticker of the company.' + + def __init__(self, *, name: builtins.str | None=..., display_name: builtins.str | None=..., bloomberg_ticker: builtins.str | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['bloomberg_ticker', b'bloomberg_ticker', 'display_name', b'display_name', 'name', b'name']) -> None: + ... +global___Company = Company + +@typing.final +class SingleCompanyKpiMappingResults(google.protobuf.message.Message): + """KPI mapping results for a single company KPI.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + KPI_FIELD_NUMBER: builtins.int + DATA_FIELD_NUMBER: builtins.int + + @property + def kpi(self) -> global___Kpi: + """The KPI.""" + + @property + def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___KpiMappingResultData]: + """The KPI mapping results for this KPI.""" + + def __init__(self, *, kpi: global___Kpi | None=..., data: collections.abc.Iterable[global___KpiMappingResultData] | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['kpi', b'kpi']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['data', b'data', 'kpi', b'kpi']) -> None: + ... +global___SingleCompanyKpiMappingResults = SingleCompanyKpiMappingResults + +@typing.final +class Kpi(google.protobuf.message.Message): + """A KPI.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + TYPE_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + DISPLAY_NAME_FIELD_NUMBER: builtins.int + FREQ_FIELD_NUMBER: builtins.int + IS_RATIO_FIELD_NUMBER: builtins.int + type: builtins.str + 'The type of the KPI. A KPI is one of the following types:\n - `FACTSET_ESTIMATES`: FactSet actuals/estimates.\n - `FACTSET_FUNDAMENTALS`: FactSet fundamentals.\n - `FACTSET_SEGMENTS`: FactSet segments.\n - `VISIBLE_ALPHA_STANDARD_KPI`: Visible Alpha standard KPI.\n ' + value: builtins.str + 'A value which is dependent on the type:\n - `FACTSET_ESTIMATES`: Reporting number, e.g. `SALES`.\n - `FACTSET_FUNDAMENTALS`: Reporting number, e.g. `SALES`.\n - `FACTSET_SEGMENTS`: Factset segment resource name, e.g. `entityTypes/geo_segment/entities/factset.segment_123`.\n - `VISIBLE_ALPHA_STANDARD_KPI`: Line item parameter id. For example, the "Total revenue" parameter has a parameter id of `190`.\n ' + display_name: builtins.str + 'The display name of the KPI.' + freq: builtins.str + 'A textual representation of the KPI frequency. Either `FQ`, `FS` or `FY`.' + is_ratio: builtins.bool + 'Whether this KPI is a ratio or not.' + + def __init__(self, *, type: builtins.str | None=..., value: builtins.str | None=..., display_name: builtins.str | None=..., freq: builtins.str | None=..., is_ratio: builtins.bool | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['_freq', b'_freq', '_is_ratio', b'_is_ratio', '_value', b'_value', 'freq', b'freq', 'is_ratio', b'is_ratio', 'value', b'value']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['_freq', b'_freq', '_is_ratio', b'_is_ratio', '_value', b'_value', 'display_name', b'display_name', 'freq', b'freq', 'is_ratio', b'is_ratio', 'type', b'type', 'value', b'value']) -> None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_freq', b'_freq']) -> typing.Literal['freq'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_is_ratio', b'_is_ratio']) -> typing.Literal['is_ratio'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_value', b'_value']) -> typing.Literal['value'] | None: + ... +global___Kpi = Kpi + +@typing.final +class KpiMappingResultData(google.protobuf.message.Message): + """Data for a KPI mapping result.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + SOURCE_FIELD_NUMBER: builtins.int + MODEL_MAPE_FIELD_NUMBER: builtins.int + MODEL_MAE_FIELD_NUMBER: builtins.int + MODEL_HIT_RATE_FIELD_NUMBER: builtins.int + LAST_VALUE_DATE_FIELD_NUMBER: builtins.int + NUMBER_OF_DATA_POINTS_FIELD_NUMBER: builtins.int + PERIOD_OVER_PERIOD_MAE_FIELD_NUMBER: builtins.int + YEAR_OVER_YEAR_MAE_FIELD_NUMBER: builtins.int + ABSOLUTE_CORRELATION_FIELD_NUMBER: builtins.int + PERIOD_OVER_PERIOD_CORRELATION_FIELD_NUMBER: builtins.int + YEAR_OVER_YEAR_CORRELATION_FIELD_NUMBER: builtins.int + ABSOLUTE_P_VALUE_FIELD_NUMBER: builtins.int + PERIOD_OVER_PERIOD_P_VALUE_FIELD_NUMBER: builtins.int + YEAR_OVER_YEAR_P_VALUE_FIELD_NUMBER: builtins.int + model_mape: builtins.float + 'Mean absolute percentage error for a model built using this proxy.' + model_mae: builtins.float + 'Mean absolute error for a model built using this proxy.' + model_hit_rate: builtins.float + 'Hit rate for a model built using this proxy.' + number_of_data_points: builtins.int + 'Number of data points (after resampling).\n This is the number of data points where both the KPI and the proxy have data.\n ' + period_over_period_mae: builtins.float + 'Period-over-period mean absolute error.' + year_over_year_mae: builtins.float + 'Year-over-year mean absolute error.' + absolute_correlation: builtins.float + 'Absolute correlation.' + period_over_period_correlation: builtins.float + 'Period-over-period correlation.' + year_over_year_correlation: builtins.float + 'Year-over-year correlation.' + absolute_p_value: builtins.float + 'Absolute P-value.' + period_over_period_p_value: builtins.float + 'Period-over-period P-value.' + year_over_year_p_value: builtins.float + 'Year-over-year P-value.' + + @property + def source(self) -> global___KpiMappingGroup: + """The KPI mapping group from which this result originates""" + + @property + def last_value_date(self) -> exabel.api.time.date_pb2.Date: + """The date of the last observed proxy value.""" + + def __init__(self, *, source: global___KpiMappingGroup | None=..., model_mape: builtins.float | None=..., model_mae: builtins.float | None=..., model_hit_rate: builtins.float | None=..., last_value_date: exabel.api.time.date_pb2.Date | None=..., number_of_data_points: builtins.int | None=..., period_over_period_mae: builtins.float | None=..., year_over_year_mae: builtins.float | None=..., absolute_correlation: builtins.float | None=..., period_over_period_correlation: builtins.float | None=..., year_over_year_correlation: builtins.float | None=..., absolute_p_value: builtins.float | None=..., period_over_period_p_value: builtins.float | None=..., year_over_year_p_value: builtins.float | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['_absolute_correlation', b'_absolute_correlation', '_absolute_p_value', b'_absolute_p_value', '_model_hit_rate', b'_model_hit_rate', '_model_mae', b'_model_mae', '_model_mape', b'_model_mape', '_number_of_data_points', b'_number_of_data_points', '_period_over_period_correlation', b'_period_over_period_correlation', '_period_over_period_mae', b'_period_over_period_mae', '_period_over_period_p_value', b'_period_over_period_p_value', '_year_over_year_correlation', b'_year_over_year_correlation', '_year_over_year_mae', b'_year_over_year_mae', '_year_over_year_p_value', b'_year_over_year_p_value', 'absolute_correlation', b'absolute_correlation', 'absolute_p_value', b'absolute_p_value', 'last_value_date', b'last_value_date', 'model_hit_rate', b'model_hit_rate', 'model_mae', b'model_mae', 'model_mape', b'model_mape', 'number_of_data_points', b'number_of_data_points', 'period_over_period_correlation', b'period_over_period_correlation', 'period_over_period_mae', b'period_over_period_mae', 'period_over_period_p_value', b'period_over_period_p_value', 'source', b'source', 'year_over_year_correlation', b'year_over_year_correlation', 'year_over_year_mae', b'year_over_year_mae', 'year_over_year_p_value', b'year_over_year_p_value']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['_absolute_correlation', b'_absolute_correlation', '_absolute_p_value', b'_absolute_p_value', '_model_hit_rate', b'_model_hit_rate', '_model_mae', b'_model_mae', '_model_mape', b'_model_mape', '_number_of_data_points', b'_number_of_data_points', '_period_over_period_correlation', b'_period_over_period_correlation', '_period_over_period_mae', b'_period_over_period_mae', '_period_over_period_p_value', b'_period_over_period_p_value', '_year_over_year_correlation', b'_year_over_year_correlation', '_year_over_year_mae', b'_year_over_year_mae', '_year_over_year_p_value', b'_year_over_year_p_value', 'absolute_correlation', b'absolute_correlation', 'absolute_p_value', b'absolute_p_value', 'last_value_date', b'last_value_date', 'model_hit_rate', b'model_hit_rate', 'model_mae', b'model_mae', 'model_mape', b'model_mape', 'number_of_data_points', b'number_of_data_points', 'period_over_period_correlation', b'period_over_period_correlation', 'period_over_period_mae', b'period_over_period_mae', 'period_over_period_p_value', b'period_over_period_p_value', 'source', b'source', 'year_over_year_correlation', b'year_over_year_correlation', 'year_over_year_mae', b'year_over_year_mae', 'year_over_year_p_value', b'year_over_year_p_value']) -> None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_absolute_correlation', b'_absolute_correlation']) -> typing.Literal['absolute_correlation'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_absolute_p_value', b'_absolute_p_value']) -> typing.Literal['absolute_p_value'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_model_hit_rate', b'_model_hit_rate']) -> typing.Literal['model_hit_rate'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_model_mae', b'_model_mae']) -> typing.Literal['model_mae'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_model_mape', b'_model_mape']) -> typing.Literal['model_mape'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_number_of_data_points', b'_number_of_data_points']) -> typing.Literal['number_of_data_points'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_period_over_period_correlation', b'_period_over_period_correlation']) -> typing.Literal['period_over_period_correlation'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_period_over_period_mae', b'_period_over_period_mae']) -> typing.Literal['period_over_period_mae'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_period_over_period_p_value', b'_period_over_period_p_value']) -> typing.Literal['period_over_period_p_value'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_year_over_year_correlation', b'_year_over_year_correlation']) -> typing.Literal['year_over_year_correlation'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_year_over_year_mae', b'_year_over_year_mae']) -> typing.Literal['year_over_year_mae'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_year_over_year_p_value', b'_year_over_year_p_value']) -> typing.Literal['year_over_year_p_value'] | None: + ... +global___KpiMappingResultData = KpiMappingResultData + +@typing.final +class KpiMappingGroup(google.protobuf.message.Message): + """KPI mapping group.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + NAME_FIELD_NUMBER: builtins.int + DISPLAY_NAME_FIELD_NUMBER: builtins.int + VENDOR_DISPLAY_NAME_FIELD_NUMBER: builtins.int + name: builtins.str + 'Resource name.' + display_name: builtins.str + 'Display name.' + vendor_display_name: builtins.str + 'Vendor display name.' + + def __init__(self, *, name: builtins.str | None=..., display_name: builtins.str | None=..., vendor_display_name: builtins.str | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['display_name', b'display_name', 'name', b'name', 'vendor_display_name', b'vendor_display_name']) -> None: + ... +global___KpiMappingGroup = KpiMappingGroup + +@typing.final +class CompanyKpiModelResult(google.protobuf.message.Message): + """Result for a single company KPI.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + KPI_FIELD_NUMBER: builtins.int + MODEL_FIELD_NUMBER: builtins.int + ACCESSIBLE_MAPPINGS_COUNT_FIELD_NUMBER: builtins.int + TOTAL_MAPPINGS_COUNT_FIELD_NUMBER: builtins.int + MODELS_COUNT_FIELD_NUMBER: builtins.int + accessible_mappings_count: builtins.int + 'Number of KPI mappings for this company KPI that the current user has access to.' + total_mappings_count: builtins.int + 'Total number of KPI mappings for this company KPI, including both accessible\n KPI mappings and public KPI mappings.\n ' + models_count: builtins.int + 'Number of models for this company KPI.' + + @property + def kpi(self) -> global___Kpi: + """KPI.""" + + @property + def model(self) -> global___KpiModel: + """KPI model.""" + + def __init__(self, *, kpi: global___Kpi | None=..., model: global___KpiModel | None=..., accessible_mappings_count: builtins.int | None=..., total_mappings_count: builtins.int | None=..., models_count: builtins.int | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['kpi', b'kpi', 'model', b'model']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['accessible_mappings_count', b'accessible_mappings_count', 'kpi', b'kpi', 'model', b'model', 'models_count', b'models_count', 'total_mappings_count', b'total_mappings_count']) -> None: + ... +global___CompanyKpiModelResult = CompanyKpiModelResult + +@typing.final +class KpiModel(google.protobuf.message.Message): + """A KPI model.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + NAME_FIELD_NUMBER: builtins.int + ID_FIELD_NUMBER: builtins.int + DISPLAY_NAME_FIELD_NUMBER: builtins.int + DATA_FIELD_NUMBER: builtins.int + WEIGHTS_FIELD_NUMBER: builtins.int + name: builtins.str + 'Resource name.' + id: builtins.int + 'Integer id.' + display_name: builtins.str + 'Display name.' + + @property + def data(self) -> global___KpiModelData: + """Model data.""" + + @property + def weights(self) -> global___KpiModelWeightGroups: + """Model weights.""" + + def __init__(self, *, name: builtins.str | None=..., id: builtins.int | None=..., display_name: builtins.str | None=..., data: global___KpiModelData | None=..., weights: global___KpiModelWeightGroups | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['data', b'data', 'weights', b'weights']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['data', b'data', 'display_name', b'display_name', 'id', b'id', 'name', b'name', 'weights', b'weights']) -> None: + ... +global___KpiModel = KpiModel + +@typing.final +class KpiMappingModel(google.protobuf.message.Message): + """Single-predictor KPI mapping model.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + SOURCE_FIELD_NUMBER: builtins.int + KPI_MODEL_DATA_FIELD_NUMBER: builtins.int + + @property + def source(self) -> global___KpiMappingGroup: + """The KPI mapping group from which the model originates""" + + @property + def kpi_model_data(self) -> global___KpiModelData: + """Model data.""" + + def __init__(self, *, source: global___KpiMappingGroup | None=..., kpi_model_data: global___KpiModelData | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['kpi_model_data', b'kpi_model_data', 'source', b'source']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['kpi_model_data', b'kpi_model_data', 'source', b'source']) -> None: + ... +global___KpiMappingModel = KpiMappingModel + +@typing.final +class KpiModelData(google.protobuf.message.Message): + """Data for a KPI model.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + PREDICTION_FIELD_NUMBER: builtins.int + PREDICTION_YOY_REL_FIELD_NUMBER: builtins.int + PREDICTION_YOY_ABS_FIELD_NUMBER: builtins.int + CONSENSUS_FIELD_NUMBER: builtins.int + CONSENSUS_YOY_REL_FIELD_NUMBER: builtins.int + CONSENSUS_YOY_ABS_FIELD_NUMBER: builtins.int + DELTA_ABS_FIELD_NUMBER: builtins.int + DELTA_REL_FIELD_NUMBER: builtins.int + DELTA_BY_ERROR_FIELD_NUMBER: builtins.int + MODEL_QUALITY_FIELD_NUMBER: builtins.int + MAPE_FIELD_NUMBER: builtins.int + MAPE_PIT_FIELD_NUMBER: builtins.int + MAE_FIELD_NUMBER: builtins.int + MAE_PIT_FIELD_NUMBER: builtins.int + HIT_RATE_FIELD_NUMBER: builtins.int + REVISION_1_WEEK_FIELD_NUMBER: builtins.int + REVISION_1_MONTH_FIELD_NUMBER: builtins.int + DATE_FIELD_NUMBER: builtins.int + ERROR_FIELD_NUMBER: builtins.int + prediction: builtins.float + 'Absolute prediction.' + prediction_yoy_rel: builtins.float + 'Year-over-year prediction relative change.\n This is the absolute prediction compared to the observed value for the\n same period one year ago.\n ' + prediction_yoy_abs: builtins.float + 'Year-over-year prediction absolute change.\n This is the absolute prediction compared to the observed value for the\n same period one year ago.\n ' + consensus: builtins.float + 'Consensus.\n Only available for Visible Alpha KPIs for users with a subscription with export allowed.\n ' + consensus_yoy_rel: builtins.float + 'Year-over-year consensus relative change.\n This is the consensus compared to the observed value for the\n same period one year ago.\n ' + consensus_yoy_abs: builtins.float + 'Year-over-year consensus absolute change.\n This is the consensus compared to the observed value for the\n same period one year ago.\n ' + delta_abs: builtins.float + 'Absolute difference between the prediction and the consensus.\n This is calculated as prediction - consensus.\n Only available for Visible Alpha KPIs for users with a subscription with export allowed.\n ' + delta_rel: builtins.float + 'Relative difference between the prediction and the consensus.\n This is calculated as (prediction / consensus) - 1.\n Only available for Visible Alpha KPIs for users with a subscription with export allowed.\n ' + delta_by_error: builtins.float + 'The delta divided by the error.\n For ratio KPIs this is absolute delta / mae (using PiT mae if available).\n For non-ratio KPIs this is relative delta / mape (using PiT mape if available).\n Only available for Visible Alpha KPIs for users with a subscription with export allowed.\n ' + model_quality: global___ModelQuality.ValueType + 'Model quality.' + mape: builtins.float + 'Mean absolute percentage error.' + mape_pit: builtins.float + 'Point-in-time mean absolute percentage error.' + mae: builtins.float + 'Mean absolute error.' + mae_pit: builtins.float + 'Point-in-time mean absolute error.' + hit_rate: builtins.float + 'Hit rate.' + revision_1_week: builtins.float + 'Revision to the predicted value compared to the prediction from 1 week ago.\n If the KPI is a ratio, this is just the difference between the current prediction and the\n prediction from 1 week ago, otherwise this is the relative change.\n For Exabel Models and custom models, a backtest may be used to get the historical prediction.\n ' + revision_1_month: builtins.float + 'Revision to the predicted value compared to the prediction from 1 month ago.\n If the KPI is a ratio, this is just the difference between the current prediction and the\n prediction from 1 month ago, otherwise this is the relative change.\n For Exabel Models and custom models, a backtest may be used to get the historical prediction.\n ' + error: builtins.str + 'An error message in case the model training or backtesting failed.' + + @property + def date(self) -> exabel.api.time.date_pb2.Date: + """The fiscal period end date for which the prediction has been made.""" + + def __init__(self, *, prediction: builtins.float | None=..., prediction_yoy_rel: builtins.float | None=..., prediction_yoy_abs: builtins.float | None=..., consensus: builtins.float | None=..., consensus_yoy_rel: builtins.float | None=..., consensus_yoy_abs: builtins.float | None=..., delta_abs: builtins.float | None=..., delta_rel: builtins.float | None=..., delta_by_error: builtins.float | None=..., model_quality: global___ModelQuality.ValueType | None=..., mape: builtins.float | None=..., mape_pit: builtins.float | None=..., mae: builtins.float | None=..., mae_pit: builtins.float | None=..., hit_rate: builtins.float | None=..., revision_1_week: builtins.float | None=..., revision_1_month: builtins.float | None=..., date: exabel.api.time.date_pb2.Date | None=..., error: builtins.str | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['_consensus', b'_consensus', '_consensus_yoy_abs', b'_consensus_yoy_abs', '_consensus_yoy_rel', b'_consensus_yoy_rel', '_delta_abs', b'_delta_abs', '_delta_by_error', b'_delta_by_error', '_delta_rel', b'_delta_rel', '_hit_rate', b'_hit_rate', '_mae', b'_mae', '_mae_pit', b'_mae_pit', '_mape', b'_mape', '_mape_pit', b'_mape_pit', '_prediction', b'_prediction', '_prediction_yoy_abs', b'_prediction_yoy_abs', '_prediction_yoy_rel', b'_prediction_yoy_rel', '_revision_1_month', b'_revision_1_month', '_revision_1_week', b'_revision_1_week', 'consensus', b'consensus', 'consensus_yoy_abs', b'consensus_yoy_abs', 'consensus_yoy_rel', b'consensus_yoy_rel', 'date', b'date', 'delta_abs', b'delta_abs', 'delta_by_error', b'delta_by_error', 'delta_rel', b'delta_rel', 'hit_rate', b'hit_rate', 'mae', b'mae', 'mae_pit', b'mae_pit', 'mape', b'mape', 'mape_pit', b'mape_pit', 'prediction', b'prediction', 'prediction_yoy_abs', b'prediction_yoy_abs', 'prediction_yoy_rel', b'prediction_yoy_rel', 'revision_1_month', b'revision_1_month', 'revision_1_week', b'revision_1_week']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['_consensus', b'_consensus', '_consensus_yoy_abs', b'_consensus_yoy_abs', '_consensus_yoy_rel', b'_consensus_yoy_rel', '_delta_abs', b'_delta_abs', '_delta_by_error', b'_delta_by_error', '_delta_rel', b'_delta_rel', '_hit_rate', b'_hit_rate', '_mae', b'_mae', '_mae_pit', b'_mae_pit', '_mape', b'_mape', '_mape_pit', b'_mape_pit', '_prediction', b'_prediction', '_prediction_yoy_abs', b'_prediction_yoy_abs', '_prediction_yoy_rel', b'_prediction_yoy_rel', '_revision_1_month', b'_revision_1_month', '_revision_1_week', b'_revision_1_week', 'consensus', b'consensus', 'consensus_yoy_abs', b'consensus_yoy_abs', 'consensus_yoy_rel', b'consensus_yoy_rel', 'date', b'date', 'delta_abs', b'delta_abs', 'delta_by_error', b'delta_by_error', 'delta_rel', b'delta_rel', 'error', b'error', 'hit_rate', b'hit_rate', 'mae', b'mae', 'mae_pit', b'mae_pit', 'mape', b'mape', 'mape_pit', b'mape_pit', 'model_quality', b'model_quality', 'prediction', b'prediction', 'prediction_yoy_abs', b'prediction_yoy_abs', 'prediction_yoy_rel', b'prediction_yoy_rel', 'revision_1_month', b'revision_1_month', 'revision_1_week', b'revision_1_week']) -> None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_consensus', b'_consensus']) -> typing.Literal['consensus'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_consensus_yoy_abs', b'_consensus_yoy_abs']) -> typing.Literal['consensus_yoy_abs'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_consensus_yoy_rel', b'_consensus_yoy_rel']) -> typing.Literal['consensus_yoy_rel'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_delta_abs', b'_delta_abs']) -> typing.Literal['delta_abs'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_delta_by_error', b'_delta_by_error']) -> typing.Literal['delta_by_error'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_delta_rel', b'_delta_rel']) -> typing.Literal['delta_rel'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_hit_rate', b'_hit_rate']) -> typing.Literal['hit_rate'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_mae', b'_mae']) -> typing.Literal['mae'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_mae_pit', b'_mae_pit']) -> typing.Literal['mae_pit'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_mape', b'_mape']) -> typing.Literal['mape'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_mape_pit', b'_mape_pit']) -> typing.Literal['mape_pit'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_prediction', b'_prediction']) -> typing.Literal['prediction'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_prediction_yoy_abs', b'_prediction_yoy_abs']) -> typing.Literal['prediction_yoy_abs'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_prediction_yoy_rel', b'_prediction_yoy_rel']) -> typing.Literal['prediction_yoy_rel'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_revision_1_month', b'_revision_1_month']) -> typing.Literal['revision_1_month'] | None: + ... + + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal['_revision_1_week', b'_revision_1_week']) -> typing.Literal['revision_1_week'] | None: + ... +global___KpiModelData = KpiModelData + +@typing.final +class KpiModelWeightGroups(google.protobuf.message.Message): + """KPI model weight groups.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + WEIGHT_GROUPS_FIELD_NUMBER: builtins.int + IS_COEFFICIENTS_FIELD_NUMBER: builtins.int + is_coefficients: builtins.bool + 'Whether the weights are coefficients that should be formatted as decimal numbers.\n If false, the weights are normalized weights that add up to 1.\n ' + + @property + def weight_groups(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___KpiModelWeightGroup]: + """Weights for all predictors in the model.""" + + def __init__(self, *, weight_groups: collections.abc.Iterable[global___KpiModelWeightGroup] | None=..., is_coefficients: builtins.bool | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['is_coefficients', b'is_coefficients', 'weight_groups', b'weight_groups']) -> None: + ... +global___KpiModelWeightGroups = KpiModelWeightGroups + +@typing.final +class KpiModelWeightGroup(google.protobuf.message.Message): + """Weight for a group of related KPI model input features.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + DISPLAY_NAME_FIELD_NUMBER: builtins.int + GROUP_FIELD_NUMBER: builtins.int + FEATURE_WEIGHTS_FIELD_NUMBER: builtins.int + display_name: builtins.str + "Display name of the model input feature/predictor.\n For ratio prediction models, this is either 'Baseline' (representing the predictor built by forecasting\n the KPI time series) or it is the display name of the KPI mapping group from which the predictor originates.\n For other model types, display names include 'Seasonality' and 'Reported KPI (lagged)'.\n " + + @property + def group(self) -> global___KpiMappingGroup: + """The KPI mapping group from which the predictor originates. + Only set when the predictor originates from a KPI mapping group. + """ + + @property + def feature_weights(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___KpiModelFeatureWeight]: + """The individual feature weights.""" + + def __init__(self, *, display_name: builtins.str | None=..., group: global___KpiMappingGroup | None=..., feature_weights: collections.abc.Iterable[global___KpiModelFeatureWeight] | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['group', b'group']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['display_name', b'display_name', 'feature_weights', b'feature_weights', 'group', b'group']) -> None: + ... +global___KpiModelWeightGroup = KpiModelWeightGroup + +@typing.final +class KpiModelFeatureWeight(google.protobuf.message.Message): + """Weight for a single KPI model input feature.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + WEIGHT_FIELD_NUMBER: builtins.int + DISPLAY_NAME_FIELD_NUMBER: builtins.int + weight: builtins.float + 'The weight of the input feature.' + display_name: builtins.str + "Display name of the feature.\n If there is only a single feature weight, this is identical to the `KpiModelWeightGroup.display_name`.\n If there are multiple feature weights, this is the display name of the feature. For example,\n for seasonality, the individual feature weights may include 'Q1', 'Q2', 'Q3', 'Q4' (for the quarter features).\n " + + def __init__(self, *, weight: builtins.float | None=..., display_name: builtins.str | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['_weight', b'_weight', 'weight', b'weight']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['_weight', b'_weight', 'display_name', b'display_name', 'weight', b'weight']) -> None: + ... + + def WhichOneof(self, oneof_group: typing.Literal['_weight', b'_weight']) -> typing.Literal['weight'] | None: + ... +global___KpiModelFeatureWeight = KpiModelFeatureWeight + +@typing.final +class FiscalPeriodSelector(google.protobuf.message.Message): + """Selector for a fiscal period.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + RELATIVE_SELECTOR_FIELD_NUMBER: builtins.int + PERIOD_END_FIELD_NUMBER: builtins.int + FREQ_FIELD_NUMBER: builtins.int + relative_selector: global___RelativeFiscalPeriodSelector.ValueType + 'Relative fiscal period.' + freq: builtins.str + 'Fiscal period frequency.\n Allowed values are empty, "FQ", "FS" and "FY".\n Must be set to either "FQ", "FS" or "FY" if `period_end` is specified.\n If empty, frequency is determined based on KPI counts. The frequency\n with the most number of KPIs with mappings for the user is used.\n ' + + @property + def period_end(self) -> exabel.api.time.date_pb2.Date: + """Specific fiscal period end.""" + + def __init__(self, *, relative_selector: global___RelativeFiscalPeriodSelector.ValueType | None=..., period_end: exabel.api.time.date_pb2.Date | None=..., freq: builtins.str | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['period_end', b'period_end']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['freq', b'freq', 'period_end', b'period_end', 'relative_selector', b'relative_selector']) -> None: + ... +global___FiscalPeriodSelector = FiscalPeriodSelector + +@typing.final +class KpiHierarchy(google.protobuf.message.Message): + """Represents a hierarchy of KPIs for a specific company.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + NAME_FIELD_NUMBER: builtins.int + FREQ_FIELD_NUMBER: builtins.int + BREAKDOWN_FIELD_NUMBER: builtins.int + name: builtins.str + 'The resource name of the KPI hierarchy, e.g., "kpiHierarchies/135".' + freq: builtins.str + 'The frequency of the KPIs in this hierarchy.' + + @property + def breakdown(self) -> global___KpiBreakdown: + """A breakdown of the KPIs.""" + + def __init__(self, *, name: builtins.str | None=..., freq: builtins.str | None=..., breakdown: global___KpiBreakdown | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['breakdown', b'breakdown']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['breakdown', b'breakdown', 'freq', b'freq', 'name', b'name']) -> None: + ... +global___KpiHierarchy = KpiHierarchy + +@typing.final +class KpiBreakdown(google.protobuf.message.Message): + """A breakdown of the KPIs.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + KPIS_FIELD_NUMBER: builtins.int + + @property + def kpis(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___KpiBreakdownNode]: + """The top-level nodes in the breakdown, each of which represents a KPI.""" + + def __init__(self, *, kpis: collections.abc.Iterable[global___KpiBreakdownNode] | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['kpis', b'kpis']) -> None: + ... +global___KpiBreakdown = KpiBreakdown + +@typing.final +class KpiBreakdownNode(google.protobuf.message.Message): + """A node in the tree representing the breakdown of a KPI.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + KPI_FIELD_NUMBER: builtins.int + HEADER_FIELD_NUMBER: builtins.int + CHILDREN_FIELD_NUMBER: builtins.int + header: builtins.str + 'The string representing this node, when the node represents a grouping of KPIs and not a\n single one.\n ' + + @property + def kpi(self) -> global___Kpi: + """The KPI represented by this node. + Only StructuredKpi is supported, and only the KPI type and the value should be set. + """ + + @property + def children(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___KpiBreakdownNode]: + """The children of this node.""" + + def __init__(self, *, kpi: global___Kpi | None=..., header: builtins.str | None=..., children: collections.abc.Iterable[global___KpiBreakdownNode] | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['content', b'content', 'header', b'header', 'kpi', b'kpi']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['children', b'children', 'content', b'content', 'header', b'header', 'kpi', b'kpi']) -> None: + ... + + def WhichOneof(self, oneof_group: typing.Literal['content', b'content']) -> typing.Literal['kpi', 'header'] | None: + ... +global___KpiBreakdownNode = KpiBreakdownNode \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_messages_pb2_grpc.py new file mode 100644 index 00000000..8a110202 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_messages_pb2_grpc.py @@ -0,0 +1,13 @@ +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True +if _version_not_supported: + raise RuntimeError(f'The grpc package installed is at version {GRPC_VERSION},' + f' but the generated code in exabel/api/analytics/v1/kpi_messages_pb2_grpc.py depends on' + f' grpcio>={GRPC_GENERATED_VERSION}.' + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.') \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_service_pb2.py new file mode 100644 index 00000000..9666b4cb --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_service_pb2.py @@ -0,0 +1,65 @@ +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/analytics/v1/kpi_service.proto') +_sym_db = _symbol_database.Default() +from .....exabel.api.analytics.v1 import kpi_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_kpi__messages__pb2 +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 +from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 +from .....protoc_gen_openapiv2.options import annotations_pb2 as protoc__gen__openapiv2_dot_options_dot_annotations__pb2 +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n)exabel/api/analytics/v1/kpi_service.proto\x12\x17exabel.api.analytics.v1\x1a*exabel/api/analytics/v1/kpi_messages.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a.protoc_gen_openapiv2/options/annotations.proto"q\n\x1cListKpiMappingResultsRequest\x12*\n\x06parent\x18\x01 \x01(\tB\x1a\x92A\x14\xca>\x11\xfa\x02\x0ekpiMappingName\xe0A\x02\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t"\x90\x01\n\x1dListKpiMappingResultsResponse\x12B\n\x07results\x18\x01 \x03(\x0b21.exabel.api.analytics.v1.CompanyKpiMappingResults\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\x12\x12\n\ntotal_size\x18\x03 \x01(\x05"\xc4\x01\n"ListCompanyBaseModelResultsRequest\x12\'\n\x06parent\x18\x01 \x01(\tB\x17\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02\x12=\n\x06period\x18\x02 \x01(\x0b2-.exabel.api.analytics.v1.FiscalPeriodSelector\x126\n\nkpi_source\x18\x03 \x01(\x0e2".exabel.api.analytics.v1.KpiSource"f\n#ListCompanyBaseModelResultsResponse\x12?\n\x07results\x18\x01 \x03(\x0b2..exabel.api.analytics.v1.CompanyKpiModelResult"\xcc\x01\n*ListCompanyHierarchicalModelResultsRequest\x12\'\n\x06parent\x18\x01 \x01(\tB\x17\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02\x12=\n\x06period\x18\x02 \x01(\x0b2-.exabel.api.analytics.v1.FiscalPeriodSelector\x126\n\nkpi_source\x18\x03 \x01(\x0e2".exabel.api.analytics.v1.KpiSource"\xac\x01\n+ListCompanyHierarchicalModelResultsResponse\x12?\n\x07results\x18\x01 \x03(\x0b2..exabel.api.analytics.v1.CompanyKpiModelResult\x12<\n\rkpi_hierarchy\x18\x02 \x01(\x0b2%.exabel.api.analytics.v1.KpiHierarchy"\x8a\x01\n#ListCompanyKpiMappingResultsRequest\x12\'\n\x06parent\x18\x01 \x01(\tB\x17\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02\x12:\n\x03kpi\x18\x02 \x01(\x0b2\x1c.exabel.api.analytics.v1.KpiB\x0f\x92A\t\xca>\x06\xfa\x02\x03kpi\xe0A\x02"f\n$ListCompanyKpiMappingResultsResponse\x12>\n\x07results\x18\x01 \x03(\x0b2-.exabel.api.analytics.v1.KpiMappingResultData"\x88\x01\n!ListCompanyKpiModelResultsRequest\x12\'\n\x06parent\x18\x01 \x01(\tB\x17\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02\x12:\n\x03kpi\x18\x02 \x01(\x0b2\x1c.exabel.api.analytics.v1.KpiB\x0f\x92A\t\xca>\x06\xfa\x02\x03kpi\xe0A\x02"\x9c\x02\n"ListCompanyKpiModelResultsResponse\x127\n\x0cexabel_model\x18\x01 \x01(\x0b2!.exabel.api.analytics.v1.KpiModel\x12=\n\x12hierarchical_model\x18\x02 \x01(\x0b2!.exabel.api.analytics.v1.KpiModel\x128\n\rcustom_models\x18\x03 \x03(\x0b2!.exabel.api.analytics.v1.KpiModel\x12D\n\x12kpi_mapping_models\x18\x04 \x03(\x0b2(.exabel.api.analytics.v1.KpiMappingModel2\x9a\n\n\nKpiService\x12\xcf\x01\n\x15ListKpiMappingResults\x125.exabel.api.analytics.v1.ListKpiMappingResultsRequest\x1a6.exabel.api.analytics.v1.ListKpiMappingResultsResponse"G\x92A\x1a\x12\x18List KPI mapping results\x82\xd3\xe4\x93\x02$\x12"/v1/{parent=kpiMappings/*}/results\x12\x82\x02\n\x1bListCompanyBaseModelResults\x12;.exabel.api.analytics.v1.ListCompanyBaseModelResultsRequest\x1a<.exabel.api.analytics.v1.ListCompanyBaseModelResultsResponse"h\x92A!\x12\x1fList company base model results\x82\xd3\xe4\x93\x02>\x12\x11\xfa\x02\x0ekpiMappingName\xe0A\x02' + _globals['_LISTCOMPANYBASEMODELRESULTSREQUEST'].fields_by_name['parent']._loaded_options = None + _globals['_LISTCOMPANYBASEMODELRESULTSREQUEST'].fields_by_name['parent']._serialized_options = b'\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02' + _globals['_LISTCOMPANYHIERARCHICALMODELRESULTSREQUEST'].fields_by_name['parent']._loaded_options = None + _globals['_LISTCOMPANYHIERARCHICALMODELRESULTSREQUEST'].fields_by_name['parent']._serialized_options = b'\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02' + _globals['_LISTCOMPANYKPIMAPPINGRESULTSREQUEST'].fields_by_name['parent']._loaded_options = None + _globals['_LISTCOMPANYKPIMAPPINGRESULTSREQUEST'].fields_by_name['parent']._serialized_options = b'\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02' + _globals['_LISTCOMPANYKPIMAPPINGRESULTSREQUEST'].fields_by_name['kpi']._loaded_options = None + _globals['_LISTCOMPANYKPIMAPPINGRESULTSREQUEST'].fields_by_name['kpi']._serialized_options = b'\x92A\t\xca>\x06\xfa\x02\x03kpi\xe0A\x02' + _globals['_LISTCOMPANYKPIMODELRESULTSREQUEST'].fields_by_name['parent']._loaded_options = None + _globals['_LISTCOMPANYKPIMODELRESULTSREQUEST'].fields_by_name['parent']._serialized_options = b'\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02' + _globals['_LISTCOMPANYKPIMODELRESULTSREQUEST'].fields_by_name['kpi']._loaded_options = None + _globals['_LISTCOMPANYKPIMODELRESULTSREQUEST'].fields_by_name['kpi']._serialized_options = b'\x92A\t\xca>\x06\xfa\x02\x03kpi\xe0A\x02' + _globals['_KPISERVICE'].methods_by_name['ListKpiMappingResults']._loaded_options = None + _globals['_KPISERVICE'].methods_by_name['ListKpiMappingResults']._serialized_options = b'\x92A\x1a\x12\x18List KPI mapping results\x82\xd3\xe4\x93\x02$\x12"/v1/{parent=kpiMappings/*}/results' + _globals['_KPISERVICE'].methods_by_name['ListCompanyBaseModelResults']._loaded_options = None + _globals['_KPISERVICE'].methods_by_name['ListCompanyBaseModelResults']._serialized_options = b'\x92A!\x12\x1fList company base model results\x82\xd3\xe4\x93\x02>\x12 None: + ... + + def ClearField(self, field_name: typing.Literal['page_size', b'page_size', 'page_token', b'page_token', 'parent', b'parent']) -> None: + ... +global___ListKpiMappingResultsRequest = ListKpiMappingResultsRequest + +@typing.final +class ListKpiMappingResultsResponse(google.protobuf.message.Message): + """Response from ListKpiMappingResults.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + RESULTS_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + TOTAL_SIZE_FIELD_NUMBER: builtins.int + next_page_token: builtins.str + 'Token for the next page of results, which can be sent to a subsequent list query.' + total_size: builtins.int + 'Total number of rows, irrespective of paging.' + + @property + def results(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[exabel.api.analytics.v1.kpi_messages_pb2.CompanyKpiMappingResults]: + """List of results, one for each company. The end of the list is reached when the token is empty.""" + + def __init__(self, *, results: collections.abc.Iterable[exabel.api.analytics.v1.kpi_messages_pb2.CompanyKpiMappingResults] | None=..., next_page_token: builtins.str | None=..., total_size: builtins.int | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['next_page_token', b'next_page_token', 'results', b'results', 'total_size', b'total_size']) -> None: + ... +global___ListKpiMappingResultsResponse = ListKpiMappingResultsResponse + +@typing.final +class ListCompanyBaseModelResultsRequest(google.protobuf.message.Message): + """Request to ListCompanyBaseModelResults.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + PARENT_FIELD_NUMBER: builtins.int + PERIOD_FIELD_NUMBER: builtins.int + KPI_SOURCE_FIELD_NUMBER: builtins.int + parent: builtins.str + 'Resource name of the company get results for.' + kpi_source: exabel.api.analytics.v1.kpi_messages_pb2.KpiSource.ValueType + 'Optional KPI source.\n If not specified, all KPIs are returned.\n ' + + @property + def period(self) -> exabel.api.analytics.v1.kpi_messages_pb2.FiscalPeriodSelector: + """The fiscal period and frequency to get results for. + If not specified, `RelativeFiscalPeriodSelector.CURRENT` is used and frequency is + determined based on KPI counts. The frequency with the most number of KPIs with + mappings for the user is used. + """ + + def __init__(self, *, parent: builtins.str | None=..., period: exabel.api.analytics.v1.kpi_messages_pb2.FiscalPeriodSelector | None=..., kpi_source: exabel.api.analytics.v1.kpi_messages_pb2.KpiSource.ValueType | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['period', b'period']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['kpi_source', b'kpi_source', 'parent', b'parent', 'period', b'period']) -> None: + ... +global___ListCompanyBaseModelResultsRequest = ListCompanyBaseModelResultsRequest + +@typing.final +class ListCompanyBaseModelResultsResponse(google.protobuf.message.Message): + """Response from ListCompanyBaseModelResults.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + RESULTS_FIELD_NUMBER: builtins.int + + @property + def results(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[exabel.api.analytics.v1.kpi_messages_pb2.CompanyKpiModelResult]: + """List of results.""" + + def __init__(self, *, results: collections.abc.Iterable[exabel.api.analytics.v1.kpi_messages_pb2.CompanyKpiModelResult] | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['results', b'results']) -> None: + ... +global___ListCompanyBaseModelResultsResponse = ListCompanyBaseModelResultsResponse + +@typing.final +class ListCompanyHierarchicalModelResultsRequest(google.protobuf.message.Message): + """Request to ListCompanyHierarchicalModelResults.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + PARENT_FIELD_NUMBER: builtins.int + PERIOD_FIELD_NUMBER: builtins.int + KPI_SOURCE_FIELD_NUMBER: builtins.int + parent: builtins.str + 'Resource name of the company get results for.' + kpi_source: exabel.api.analytics.v1.kpi_messages_pb2.KpiSource.ValueType + 'Optional KPI source.\n If not specified, all KPIs are returned.\n ' + + @property + def period(self) -> exabel.api.analytics.v1.kpi_messages_pb2.FiscalPeriodSelector: + """The fiscal period and frequency to get results for. + If not specified, `RelativeFiscalPeriodSelector.CURRENT` is used and frequency is + determined based on KPI counts. The frequency with the most number of KPIs with + mappings for the user is used. + """ + + def __init__(self, *, parent: builtins.str | None=..., period: exabel.api.analytics.v1.kpi_messages_pb2.FiscalPeriodSelector | None=..., kpi_source: exabel.api.analytics.v1.kpi_messages_pb2.KpiSource.ValueType | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['period', b'period']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['kpi_source', b'kpi_source', 'parent', b'parent', 'period', b'period']) -> None: + ... +global___ListCompanyHierarchicalModelResultsRequest = ListCompanyHierarchicalModelResultsRequest + +@typing.final +class ListCompanyHierarchicalModelResultsResponse(google.protobuf.message.Message): + """Response from ListCompanyHierarchicalModelResults.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + RESULTS_FIELD_NUMBER: builtins.int + KPI_HIERARCHY_FIELD_NUMBER: builtins.int + + @property + def results(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[exabel.api.analytics.v1.kpi_messages_pb2.CompanyKpiModelResult]: + """List of results.""" + + @property + def kpi_hierarchy(self) -> exabel.api.analytics.v1.kpi_messages_pb2.KpiHierarchy: + """The KPI hierarchy for the company.""" + + def __init__(self, *, results: collections.abc.Iterable[exabel.api.analytics.v1.kpi_messages_pb2.CompanyKpiModelResult] | None=..., kpi_hierarchy: exabel.api.analytics.v1.kpi_messages_pb2.KpiHierarchy | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['kpi_hierarchy', b'kpi_hierarchy']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['kpi_hierarchy', b'kpi_hierarchy', 'results', b'results']) -> None: + ... +global___ListCompanyHierarchicalModelResultsResponse = ListCompanyHierarchicalModelResultsResponse + +@typing.final +class ListCompanyKpiMappingResultsRequest(google.protobuf.message.Message): + """Request to ListCompanyKpiMappingResults.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + PARENT_FIELD_NUMBER: builtins.int + KPI_FIELD_NUMBER: builtins.int + parent: builtins.str + 'Resource name of the company to get KPI mapping results for.' + + @property + def kpi(self) -> exabel.api.analytics.v1.kpi_messages_pb2.Kpi: + """KPI to get KPI mapping results for. + The fields `type`, `value` and `freq` must be specified. + """ + + def __init__(self, *, parent: builtins.str | None=..., kpi: exabel.api.analytics.v1.kpi_messages_pb2.Kpi | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['kpi', b'kpi']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['kpi', b'kpi', 'parent', b'parent']) -> None: + ... +global___ListCompanyKpiMappingResultsRequest = ListCompanyKpiMappingResultsRequest + +@typing.final +class ListCompanyKpiMappingResultsResponse(google.protobuf.message.Message): + """Response from ListCompanyKpiMappingResults.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + RESULTS_FIELD_NUMBER: builtins.int + + @property + def results(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[exabel.api.analytics.v1.kpi_messages_pb2.KpiMappingResultData]: + """KPI mapping results.""" + + def __init__(self, *, results: collections.abc.Iterable[exabel.api.analytics.v1.kpi_messages_pb2.KpiMappingResultData] | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['results', b'results']) -> None: + ... +global___ListCompanyKpiMappingResultsResponse = ListCompanyKpiMappingResultsResponse + +@typing.final +class ListCompanyKpiModelResultsRequest(google.protobuf.message.Message): + """Request to ListCompanyKpiModelResults.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + PARENT_FIELD_NUMBER: builtins.int + KPI_FIELD_NUMBER: builtins.int + parent: builtins.str + 'Resource name of the company to get model results for.' + + @property + def kpi(self) -> exabel.api.analytics.v1.kpi_messages_pb2.Kpi: + """KPI to get model results for. + The fields `type`, `value` and `freq` must be specified. + """ + + def __init__(self, *, parent: builtins.str | None=..., kpi: exabel.api.analytics.v1.kpi_messages_pb2.Kpi | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['kpi', b'kpi']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['kpi', b'kpi', 'parent', b'parent']) -> None: + ... +global___ListCompanyKpiModelResultsRequest = ListCompanyKpiModelResultsRequest + +@typing.final +class ListCompanyKpiModelResultsResponse(google.protobuf.message.Message): + """Response from ListCompanyKpiModelResults.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + EXABEL_MODEL_FIELD_NUMBER: builtins.int + HIERARCHICAL_MODEL_FIELD_NUMBER: builtins.int + CUSTOM_MODELS_FIELD_NUMBER: builtins.int + KPI_MAPPING_MODELS_FIELD_NUMBER: builtins.int + + @property + def exabel_model(self) -> exabel.api.analytics.v1.kpi_messages_pb2.KpiModel: + """Exabel model.""" + + @property + def hierarchical_model(self) -> exabel.api.analytics.v1.kpi_messages_pb2.KpiModel: + """Hierarchical model.""" + + @property + def custom_models(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[exabel.api.analytics.v1.kpi_messages_pb2.KpiModel]: + """Custom models.""" + + @property + def kpi_mapping_models(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[exabel.api.analytics.v1.kpi_messages_pb2.KpiMappingModel]: + """Single-predictor KPI mapping models.""" + + def __init__(self, *, exabel_model: exabel.api.analytics.v1.kpi_messages_pb2.KpiModel | None=..., hierarchical_model: exabel.api.analytics.v1.kpi_messages_pb2.KpiModel | None=..., custom_models: collections.abc.Iterable[exabel.api.analytics.v1.kpi_messages_pb2.KpiModel] | None=..., kpi_mapping_models: collections.abc.Iterable[exabel.api.analytics.v1.kpi_messages_pb2.KpiMappingModel] | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['exabel_model', b'exabel_model', 'hierarchical_model', b'hierarchical_model']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['custom_models', b'custom_models', 'exabel_model', b'exabel_model', 'hierarchical_model', b'hierarchical_model', 'kpi_mapping_models', b'kpi_mapping_models']) -> None: + ... +global___ListCompanyKpiModelResultsResponse = ListCompanyKpiModelResultsResponse \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_service_pb2_grpc.py new file mode 100644 index 00000000..8f37671b --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_service_pb2_grpc.py @@ -0,0 +1,99 @@ +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings +from .....exabel.api.analytics.v1 import kpi_service_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2 +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True +if _version_not_supported: + raise RuntimeError(f'The grpc package installed is at version {GRPC_VERSION},' + f' but the generated code in exabel/api/analytics/v1/kpi_service_pb2_grpc.py depends on' + f' grpcio>={GRPC_GENERATED_VERSION}.' + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.') + +class KpiServiceStub(object): + """Service to retrieve KPI results. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.ListKpiMappingResults = channel.unary_unary('/exabel.api.analytics.v1.KpiService/ListKpiMappingResults', request_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListKpiMappingResultsRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListKpiMappingResultsResponse.FromString, _registered_method=True) + self.ListCompanyBaseModelResults = channel.unary_unary('/exabel.api.analytics.v1.KpiService/ListCompanyBaseModelResults', request_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyBaseModelResultsRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyBaseModelResultsResponse.FromString, _registered_method=True) + self.ListCompanyHierarchicalModelResults = channel.unary_unary('/exabel.api.analytics.v1.KpiService/ListCompanyHierarchicalModelResults', request_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyHierarchicalModelResultsRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyHierarchicalModelResultsResponse.FromString, _registered_method=True) + self.ListCompanyKpiMappingResults = channel.unary_unary('/exabel.api.analytics.v1.KpiService/ListCompanyKpiMappingResults', request_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiMappingResultsRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiMappingResultsResponse.FromString, _registered_method=True) + self.ListCompanyKpiModelResults = channel.unary_unary('/exabel.api.analytics.v1.KpiService/ListCompanyKpiModelResults', request_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiModelResultsRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiModelResultsResponse.FromString, _registered_method=True) + +class KpiServiceServicer(object): + """Service to retrieve KPI results. + """ + + def ListKpiMappingResults(self, request, context): + """List KPI mapping results for a single KPI mapping collection. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListCompanyBaseModelResults(self, request, context): + """List base model results for a company. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListCompanyHierarchicalModelResults(self, request, context): + """List hierarchical model results for a company. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListCompanyKpiMappingResults(self, request, context): + """List KPI mapping results for a single company KPI. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListCompanyKpiModelResults(self, request, context): + """List model results for a single company KPI. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + +def add_KpiServiceServicer_to_server(servicer, server): + rpc_method_handlers = {'ListKpiMappingResults': grpc.unary_unary_rpc_method_handler(servicer.ListKpiMappingResults, request_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListKpiMappingResultsRequest.FromString, response_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListKpiMappingResultsResponse.SerializeToString), 'ListCompanyBaseModelResults': grpc.unary_unary_rpc_method_handler(servicer.ListCompanyBaseModelResults, request_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyBaseModelResultsRequest.FromString, response_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyBaseModelResultsResponse.SerializeToString), 'ListCompanyHierarchicalModelResults': grpc.unary_unary_rpc_method_handler(servicer.ListCompanyHierarchicalModelResults, request_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyHierarchicalModelResultsRequest.FromString, response_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyHierarchicalModelResultsResponse.SerializeToString), 'ListCompanyKpiMappingResults': grpc.unary_unary_rpc_method_handler(servicer.ListCompanyKpiMappingResults, request_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiMappingResultsRequest.FromString, response_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiMappingResultsResponse.SerializeToString), 'ListCompanyKpiModelResults': grpc.unary_unary_rpc_method_handler(servicer.ListCompanyKpiModelResults, request_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiModelResultsRequest.FromString, response_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiModelResultsResponse.SerializeToString)} + generic_handler = grpc.method_handlers_generic_handler('exabel.api.analytics.v1.KpiService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('exabel.api.analytics.v1.KpiService', rpc_method_handlers) + +class KpiService(object): + """Service to retrieve KPI results. + """ + + @staticmethod + def ListKpiMappingResults(request, target, options=(), channel_credentials=None, call_credentials=None, insecure=False, compression=None, wait_for_ready=None, timeout=None, metadata=None): + return grpc.experimental.unary_unary(request, target, '/exabel.api.analytics.v1.KpiService/ListKpiMappingResults', exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListKpiMappingResultsRequest.SerializeToString, exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListKpiMappingResultsResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata, _registered_method=True) + + @staticmethod + def ListCompanyBaseModelResults(request, target, options=(), channel_credentials=None, call_credentials=None, insecure=False, compression=None, wait_for_ready=None, timeout=None, metadata=None): + return grpc.experimental.unary_unary(request, target, '/exabel.api.analytics.v1.KpiService/ListCompanyBaseModelResults', exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyBaseModelResultsRequest.SerializeToString, exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyBaseModelResultsResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata, _registered_method=True) + + @staticmethod + def ListCompanyHierarchicalModelResults(request, target, options=(), channel_credentials=None, call_credentials=None, insecure=False, compression=None, wait_for_ready=None, timeout=None, metadata=None): + return grpc.experimental.unary_unary(request, target, '/exabel.api.analytics.v1.KpiService/ListCompanyHierarchicalModelResults', exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyHierarchicalModelResultsRequest.SerializeToString, exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyHierarchicalModelResultsResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata, _registered_method=True) + + @staticmethod + def ListCompanyKpiMappingResults(request, target, options=(), channel_credentials=None, call_credentials=None, insecure=False, compression=None, wait_for_ready=None, timeout=None, metadata=None): + return grpc.experimental.unary_unary(request, target, '/exabel.api.analytics.v1.KpiService/ListCompanyKpiMappingResults', exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiMappingResultsRequest.SerializeToString, exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiMappingResultsResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata, _registered_method=True) + + @staticmethod + def ListCompanyKpiModelResults(request, target, options=(), channel_credentials=None, call_credentials=None, insecure=False, compression=None, wait_for_ready=None, timeout=None, metadata=None): + return grpc.experimental.unary_unary(request, target, '/exabel.api.analytics.v1.KpiService/ListCompanyKpiModelResults', exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiModelResultsRequest.SerializeToString, exabel_dot_api_dot_analytics_dot_v1_dot_kpi__service__pb2.ListCompanyKpiModelResultsResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata, _registered_method=True) \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2.py index a0059e09..9c4344d1 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/analytics/v1/prediction_model_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/analytics/v1/prediction_model_messages.proto') _sym_db = _symbol_database.Default() from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 from .....protoc_gen_openapiv2.options import annotations_pb2 as protoc__gen__openapiv2_dot_options_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2_grpc.py index ed03492e..ebdb8a7a 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_service_pb2.py index f604505b..dceb9463 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/analytics/v1/prediction_model_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/analytics/v1/prediction_model_service.proto') _sym_db = _symbol_database.Default() from .....exabel.api.analytics.v1 import prediction_model_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_prediction__model__messages__pb2 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_service_pb2_grpc.py index fe120cad..7ae1de91 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/prediction_model_service_pb2_grpc.py @@ -3,7 +3,7 @@ import warnings from .....exabel.api.analytics.v1 import prediction_model_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_prediction__model__messages__pb2 from .....exabel.api.analytics.v1 import prediction_model_service_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_prediction__model__service__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/service_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/service_pb2.py index 2dd4e6b6..a6cf2394 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/service_pb2.py @@ -4,13 +4,13 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/analytics/v1/service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/analytics/v1/service.proto') _sym_db = _symbol_database.Default() from .....protoc_gen_openapiv2.options import annotations_pb2 as protoc__gen__openapiv2_dot_options_dot_annotations__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%exabel/api/analytics/v1/service.proto\x12\x17exabel.api.analytics.v1\x1a.protoc_gen_openapiv2/options/annotations.protoB\xe5\x02\n\x1bcom.exabel.api.analytics.v1B\x0cServiceProtoP\x01Z\x1bexabel.com/api/analytics/v1\x92A\x97\x02\x12T\n\x14Exabel Analytics API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x051.0.0\x1a\x18analytics.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZ\x1c\n\x1a\n\x07API key\x12\x0f\x08\x02\x1a\tx-api-key \x02b\r\n\x0b\n\x07API key\x12\x00rQ\n#More about the Exabel Analytics API\x12*https://help.exabel.com/docs/analytics-apib\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%exabel/api/analytics/v1/service.proto\x12\x17exabel.api.analytics.v1\x1a.protoc_gen_openapiv2/options/annotations.protoB\xa9\x03\n\x1bcom.exabel.api.analytics.v1B\x0cServiceProtoP\x01Z\x1bexabel.com/api/analytics/v1\x92A\xdb\x02\x12T\n\x14Exabel Analytics API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x051.0.0\x1a\x18analytics.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZR\n#\n\x07API key\x12\x18\x08\x02\x12\x07API key\x1a\tx-api-key \x02\n+\n\x06Bearer\x12!\x08\x02\x12\x0cAccess token\x1a\rauthorization \x02b\r\n\x0b\n\x07API key\x12\x00b\x0c\n\n\n\x06Bearer\x12\x00rQ\n#More about the Exabel Analytics API\x12*https://help.exabel.com/docs/analytics-apib\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'exabel.api.analytics.v1.service_pb2', _globals) if not _descriptor._USE_C_DESCRIPTORS: _globals['DESCRIPTOR']._loaded_options = None - _globals['DESCRIPTOR']._serialized_options = b'\n\x1bcom.exabel.api.analytics.v1B\x0cServiceProtoP\x01Z\x1bexabel.com/api/analytics/v1\x92A\x97\x02\x12T\n\x14Exabel Analytics API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x051.0.0\x1a\x18analytics.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZ\x1c\n\x1a\n\x07API key\x12\x0f\x08\x02\x1a\tx-api-key \x02b\r\n\x0b\n\x07API key\x12\x00rQ\n#More about the Exabel Analytics API\x12*https://help.exabel.com/docs/analytics-api' \ No newline at end of file + _globals['DESCRIPTOR']._serialized_options = b'\n\x1bcom.exabel.api.analytics.v1B\x0cServiceProtoP\x01Z\x1bexabel.com/api/analytics/v1\x92A\xdb\x02\x12T\n\x14Exabel Analytics API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x051.0.0\x1a\x18analytics.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZR\n#\n\x07API key\x12\x18\x08\x02\x12\x07API key\x1a\tx-api-key \x02\n+\n\x06Bearer\x12!\x08\x02\x12\x0cAccess token\x1a\rauthorization \x02b\r\n\x0b\n\x07API key\x12\x00b\x0c\n\n\n\x06Bearer\x12\x00rQ\n#More about the Exabel Analytics API\x12*https://help.exabel.com/docs/analytics-api' \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/service_pb2_grpc.py index 994918e3..86710262 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/service_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_messages_pb2.py index 486ede16..bf8975d9 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/analytics/v1/tag_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/analytics/v1/tag_messages.proto') _sym_db = _symbol_database.Default() from .....exabel.api.analytics.v1 import item_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_item__messages__pb2 from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_messages_pb2_grpc.py index 63dc28a4..62123476 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2.py index 34c3500f..6f124c58 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/analytics/v1/tag_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/analytics/v1/tag_service.proto') _sym_db = _symbol_database.Default() from .....exabel.api.analytics.v1 import tag_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_tag__messages__pb2 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2_grpc.py index 72dbfa26..1614010e 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2_grpc.py @@ -4,7 +4,7 @@ from .....exabel.api.analytics.v1 import tag_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_tag__messages__pb2 from .....exabel.api.analytics.v1 import tag_service_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_tag__service__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/common_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/common_messages_pb2.py index 75b26109..b8131f64 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/common_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/common_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/common_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/common_messages.proto') _sym_db = _symbol_database.Default() DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(exabel/api/data/v1/common_messages.proto\x12\x12exabel.api.data.v1"F\n\tEntitySet\x12\x10\n\x08entities\x18\x01 \x03(\t\x12\x0c\n\x04tags\x18\x02 \x03(\t\x12\x19\n\x11excluded_entities\x18\x03 \x03(\tBG\n\x16com.exabel.api.data.v1B\x13CommonMessagesProtoP\x01Z\x16exabel.com/api/data/v1b\x06proto3') _globals = globals() diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/common_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/common_messages_pb2_grpc.py index f702f6fd..3f5bb684 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/common_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/common_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_messages_pb2.py index f2c6eee4..3136e94d 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/data_set_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/data_set_messages.proto') _sym_db = _symbol_database.Default() from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 from .....protoc_gen_openapiv2.options import annotations_pb2 as protoc__gen__openapiv2_dot_options_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_messages_pb2_grpc.py index 8b24f29e..f18417e5 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2.py index 77fdf53b..ffd2079a 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/data_set_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/data_set_service.proto') _sym_db = _symbol_database.Default() from .....exabel.api.data.v1 import data_set_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_data__set__messages__pb2 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2.pyi b/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2.pyi index fa6c644c..7312e519 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2.pyi +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2.pyi @@ -108,7 +108,9 @@ global___UpdateDataSetRequest = UpdateDataSetRequest @typing.final class DeleteDataSetRequest(google.protobuf.message.Message): - """The request to delete one data set.""" + """The request to delete one data set. + A data set cannot be deleted if it is enabled for subscriptions. + """ DESCRIPTOR: google.protobuf.descriptor.Descriptor NAME_FIELD_NUMBER: builtins.int name: builtins.str diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2_grpc.py index b09b4c74..a3f28fcd 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/data_set_service_pb2_grpc.py @@ -4,7 +4,7 @@ from .....exabel.api.data.v1 import data_set_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_data__set__messages__pb2 from .....exabel.api.data.v1 import data_set_service_pb2 as exabel_dot_api_dot_data_dot_v1_dot_data__set__service__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/entity_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/entity_messages_pb2.py index a06bd327..53650184 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/entity_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/entity_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/entity_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/entity_messages.proto') _sym_db = _symbol_database.Default() from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/entity_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/entity_messages_pb2_grpc.py index d57424a3..dff9a5c3 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/entity_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/entity_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/entity_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/entity_service_pb2.py index 7a33aa66..aed6b6f3 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/entity_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/entity_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/entity_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/entity_service.proto') _sym_db = _symbol_database.Default() from .....exabel.api.data.v1 import entity_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_entity__messages__pb2 from .....exabel.api.data.v1 import search_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_search__messages__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/entity_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/entity_service_pb2_grpc.py index eec22a57..d5c47488 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/entity_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/entity_service_pb2_grpc.py @@ -4,7 +4,7 @@ from .....exabel.api.data.v1 import entity_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_entity__messages__pb2 from .....exabel.api.data.v1 import entity_service_pb2 as exabel_dot_api_dot_data_dot_v1_dot_entity__service__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: @@ -167,7 +167,7 @@ def SearchEntities(self, request, context): * `bloomberg_symbol` (eg `AAPL US Equity`) * `cusip` (Committee on Uniform Securities Identification Procedures) * `figi` (Financial Instruments Global Identifier) - * `factset_identifier`: either FactSet entity identifier or FactSet permanent identifier ("FSYM_ID") + * `factset_identifier`: either FactSet entity identifier (eg `000C7F-E`) or FactSet permanent identifier (FSYM_ID, eg `R85KLC-S`) * `text` `mic` and `ticker` must come in pairs, with `mic` immediately before `ticker`. Each pair is diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/import_job_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/import_job_service_pb2.py index 0d5990eb..fdea752f 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/import_job_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/import_job_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/import_job_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/import_job_service.proto') _sym_db = _symbol_database.Default() from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/import_job_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/import_job_service_pb2_grpc.py index 0b13cd26..e137ca03 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/import_job_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/import_job_service_pb2_grpc.py @@ -2,7 +2,7 @@ import grpc import warnings from .....exabel.api.data.v1 import import_job_service_pb2 as exabel_dot_api_dot_data_dot_v1_dot_import__job__service__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/namespace_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/namespace_service_pb2.py index 4d15005f..1d494204 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/namespace_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/namespace_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/namespace_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/namespace_service.proto') _sym_db = _symbol_database.Default() from .....exabel.api.data.v1 import namespaces_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_namespaces__messages__pb2 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/namespace_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/namespace_service_pb2_grpc.py index 8806a4c8..82cb15e9 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/namespace_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/namespace_service_pb2_grpc.py @@ -2,7 +2,7 @@ import grpc import warnings from .....exabel.api.data.v1 import namespace_service_pb2 as exabel_dot_api_dot_data_dot_v1_dot_namespace__service__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/namespaces_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/namespaces_messages_pb2.py index a1b1a744..d8cbae92 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/namespaces_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/namespaces_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/namespaces_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/namespaces_messages.proto') _sym_db = _symbol_database.Default() from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n,exabel/api/data/v1/namespaces_messages.proto\x12\x12exabel.api.data.v1\x1a\x1fgoogle/api/field_behavior.proto"6\n\tNamespace\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0A\x03\x12\x16\n\twriteable\x18\x02 \x01(\x08B\x03\xe0A\x03BK\n\x16com.exabel.api.data.v1B\x17NamespacesMessagesProtoP\x01Z\x16exabel.com/api/data/v1b\x06proto3') diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/namespaces_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/namespaces_messages_pb2_grpc.py index 130e79ec..c041e4a3 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/namespaces_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/namespaces_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_messages_pb2.py index bfc53947..9b153f58 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/relationship_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/relationship_messages.proto') _sym_db = _symbol_database.Default() from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_messages_pb2_grpc.py index dacb2847..9b3f6a8c 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_service_pb2.py index f4ec9760..d039e08d 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/relationship_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/relationship_service.proto') _sym_db = _symbol_database.Default() from .....exabel.api.data.v1 import relationship_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_relationship__messages__pb2 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_service_pb2_grpc.py index 2933f31c..018adfc9 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/relationship_service_pb2_grpc.py @@ -4,7 +4,7 @@ from .....exabel.api.data.v1 import relationship_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_relationship__messages__pb2 from .....exabel.api.data.v1 import relationship_service_pb2 as exabel_dot_api_dot_data_dot_v1_dot_relationship__service__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/search_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/search_messages_pb2.py index 29cc9040..ace7961f 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/search_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/search_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/search_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/search_messages.proto') _sym_db = _symbol_database.Default() from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 from .....protoc_gen_openapiv2.options import annotations_pb2 as protoc__gen__openapiv2_dot_options_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/search_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/search_messages_pb2_grpc.py index 9705637e..39fc0dc5 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/search_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/search_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/service_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/service_pb2.py index 461ba2c7..58cf0da7 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/service_pb2.py @@ -4,13 +4,13 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/service.proto') _sym_db = _symbol_database.Default() from .....protoc_gen_openapiv2.options import annotations_pb2 as protoc__gen__openapiv2_dot_options_dot_annotations__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n exabel/api/data/v1/service.proto\x12\x12exabel.api.data.v1\x1a.protoc_gen_openapiv2/options/annotations.protoB\xc8\x02\n\x16com.exabel.api.data.v1B\x0cServiceProtoP\x01Z\x16exabel.com/api/data/v1\x92A\x84\x02\x12P\n\x0fExabel Data API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x061.0.25\x1a\x13data.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZ\x1c\n\x1a\n\x07API key\x12\x0f\x08\x02\x1a\tx-api-key \x02b\r\n\x0b\n\x07API key\x12\x00rG\n\x1eMore about the Exabel Data API\x12%https://help.exabel.com/docs/data-apib\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n exabel/api/data/v1/service.proto\x12\x12exabel.api.data.v1\x1a.protoc_gen_openapiv2/options/annotations.protoB\xd1\x02\n\x16com.exabel.api.data.v1B\x0cServiceProtoP\x01Z\x16exabel.com/api/data/v1\x92A\x8d\x02\x12P\n\x0fExabel Data API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x061.0.25\x1a\x13data.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZ%\n#\n\x07API key\x12\x18\x08\x02\x12\x07API key\x1a\tx-api-key \x02b\r\n\x0b\n\x07API key\x12\x00rG\n\x1eMore about the Exabel Data API\x12%https://help.exabel.com/docs/data-apib\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'exabel.api.data.v1.service_pb2', _globals) if not _descriptor._USE_C_DESCRIPTORS: _globals['DESCRIPTOR']._loaded_options = None - _globals['DESCRIPTOR']._serialized_options = b'\n\x16com.exabel.api.data.v1B\x0cServiceProtoP\x01Z\x16exabel.com/api/data/v1\x92A\x84\x02\x12P\n\x0fExabel Data API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x061.0.25\x1a\x13data.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZ\x1c\n\x1a\n\x07API key\x12\x0f\x08\x02\x1a\tx-api-key \x02b\r\n\x0b\n\x07API key\x12\x00rG\n\x1eMore about the Exabel Data API\x12%https://help.exabel.com/docs/data-api' \ No newline at end of file + _globals['DESCRIPTOR']._serialized_options = b'\n\x16com.exabel.api.data.v1B\x0cServiceProtoP\x01Z\x16exabel.com/api/data/v1\x92A\x8d\x02\x12P\n\x0fExabel Data API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x061.0.25\x1a\x13data.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZ%\n#\n\x07API key\x12\x18\x08\x02\x12\x07API key\x1a\tx-api-key \x02b\r\n\x0b\n\x07API key\x12\x00rG\n\x1eMore about the Exabel Data API\x12%https://help.exabel.com/docs/data-api' \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/service_pb2_grpc.py index d65e2cca..d29701e2 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/service_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/signal_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/signal_messages_pb2.py index f3af7b32..e1bbffad 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/signal_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/signal_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/signal_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/signal_messages.proto') _sym_db = _symbol_database.Default() from .....exabel.api.data.v1 import common_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_common__messages__pb2 from .....exabel.api.math import aggregation_pb2 as exabel_dot_api_dot_math_dot_aggregation__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/signal_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/signal_messages_pb2_grpc.py index 40f8638c..b96cf000 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/signal_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/signal_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/signal_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/signal_service_pb2.py index a3779ecb..faf2bc1b 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/signal_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/signal_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/signal_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/signal_service.proto') _sym_db = _symbol_database.Default() from .....exabel.api.data.v1 import signal_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_signal__messages__pb2 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/signal_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/signal_service_pb2_grpc.py index 55804bb0..7d378a54 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/signal_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/signal_service_pb2_grpc.py @@ -4,7 +4,7 @@ from .....exabel.api.data.v1 import signal_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_signal__messages__pb2 from .....exabel.api.data.v1 import signal_service_pb2 as exabel_dot_api_dot_data_dot_v1_dot_signal__service__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_messages_pb2.py index 6c269459..89e14e32 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/time_series_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/time_series_messages.proto') _sym_db = _symbol_database.Default() from .....exabel.api.time import time_range_pb2 as exabel_dot_api_dot_time_dot_time__range__pb2 from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_messages_pb2_grpc.py index d66079b0..719b2247 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_service_pb2.py index a842d1ce..c57761e4 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/data/v1/time_series_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/data/v1/time_series_service.proto') _sym_db = _symbol_database.Default() from .....exabel.api.data.v1 import time_series_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_time__series__messages__pb2 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_service_pb2_grpc.py index fbcad2ed..2650ba7e 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/time_series_service_pb2_grpc.py @@ -4,7 +4,7 @@ from .....exabel.api.data.v1 import time_series_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_time__series__messages__pb2 from .....exabel.api.data.v1 import time_series_service_pb2 as exabel_dot_api_dot_data_dot_v1_dot_time__series__service__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/management/v1/folder_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/management/v1/folder_messages_pb2.py index 9cd3b0c8..3e2169ac 100644 --- a/exabel_data_sdk/stubs/exabel/api/management/v1/folder_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/management/v1/folder_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/management/v1/folder_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/management/v1/folder_messages.proto') _sym_db = _symbol_database.Default() from .....exabel.api.management.v1 import user_messages_pb2 as exabel_dot_api_dot_management_dot_v1_dot_user__messages__pb2 from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/management/v1/folder_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/management/v1/folder_messages_pb2_grpc.py index c6b449ce..9a38da16 100644 --- a/exabel_data_sdk/stubs/exabel/api/management/v1/folder_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/management/v1/folder_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/management/v1/library_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/management/v1/library_service_pb2.py index 4d2c4566..2cefdc02 100644 --- a/exabel_data_sdk/stubs/exabel/api/management/v1/library_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/management/v1/library_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/management/v1/library_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/management/v1/library_service.proto') _sym_db = _symbol_database.Default() from .....exabel.api.management.v1 import folder_messages_pb2 as exabel_dot_api_dot_management_dot_v1_dot_folder__messages__pb2 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/management/v1/library_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/management/v1/library_service_pb2_grpc.py index 6381cff5..e373b242 100644 --- a/exabel_data_sdk/stubs/exabel/api/management/v1/library_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/management/v1/library_service_pb2_grpc.py @@ -4,7 +4,7 @@ from .....exabel.api.management.v1 import folder_messages_pb2 as exabel_dot_api_dot_management_dot_v1_dot_folder__messages__pb2 from .....exabel.api.management.v1 import library_service_pb2 as exabel_dot_api_dot_management_dot_v1_dot_library__service__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/management/v1/service_pb2.py b/exabel_data_sdk/stubs/exabel/api/management/v1/service_pb2.py index 5a405b53..2bee77a9 100644 --- a/exabel_data_sdk/stubs/exabel/api/management/v1/service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/management/v1/service_pb2.py @@ -4,13 +4,13 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/management/v1/service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/management/v1/service.proto') _sym_db = _symbol_database.Default() from .....protoc_gen_openapiv2.options import annotations_pb2 as protoc__gen__openapiv2_dot_options_dot_annotations__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&exabel/api/management/v1/service.proto\x12\x18exabel.api.management.v1\x1a.protoc_gen_openapiv2/options/annotations.protoB\xeb\x02\n\x1ccom.exabel.api.management.v1B\x0cServiceProtoP\x01Z\x1cexabel.com/api/management/v1\x92A\x9b\x02\x12U\n\x15Exabel Management API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x051.0.0\x1a\x19management.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZ\x1c\n\x1a\n\x07API key\x12\x0f\x08\x02\x1a\tx-api-key \x02b\r\n\x0b\n\x07API key\x12\x00rS\n$More about the Exabel Management API\x12+https://help.exabel.com/docs/management-apib\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&exabel/api/management/v1/service.proto\x12\x18exabel.api.management.v1\x1a.protoc_gen_openapiv2/options/annotations.protoB\xaf\x03\n\x1ccom.exabel.api.management.v1B\x0cServiceProtoP\x01Z\x1cexabel.com/api/management/v1\x92A\xdf\x02\x12U\n\x15Exabel Management API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x051.0.0\x1a\x19management.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZR\n#\n\x07API key\x12\x18\x08\x02\x12\x07API key\x1a\tx-api-key \x02\n+\n\x06Bearer\x12!\x08\x02\x12\x0cAccess token\x1a\rauthorization \x02b\r\n\x0b\n\x07API key\x12\x00b\x0c\n\n\n\x06Bearer\x12\x00rS\n$More about the Exabel Management API\x12+https://help.exabel.com/docs/management-apib\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'exabel.api.management.v1.service_pb2', _globals) if not _descriptor._USE_C_DESCRIPTORS: _globals['DESCRIPTOR']._loaded_options = None - _globals['DESCRIPTOR']._serialized_options = b'\n\x1ccom.exabel.api.management.v1B\x0cServiceProtoP\x01Z\x1cexabel.com/api/management/v1\x92A\x9b\x02\x12U\n\x15Exabel Management API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x051.0.0\x1a\x19management.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZ\x1c\n\x1a\n\x07API key\x12\x0f\x08\x02\x1a\tx-api-key \x02b\r\n\x0b\n\x07API key\x12\x00rS\n$More about the Exabel Management API\x12+https://help.exabel.com/docs/management-api' \ No newline at end of file + _globals['DESCRIPTOR']._serialized_options = b'\n\x1ccom.exabel.api.management.v1B\x0cServiceProtoP\x01Z\x1cexabel.com/api/management/v1\x92A\xdf\x02\x12U\n\x15Exabel Management API"5\n\x06Exabel\x12\x17https://www.exabel.com/\x1a\x12support@exabel.com2\x051.0.0\x1a\x19management.api.exabel.com*\x01\x022\x10application/json:\x10application/jsonZR\n#\n\x07API key\x12\x18\x08\x02\x12\x07API key\x1a\tx-api-key \x02\n+\n\x06Bearer\x12!\x08\x02\x12\x0cAccess token\x1a\rauthorization \x02b\r\n\x0b\n\x07API key\x12\x00b\x0c\n\n\n\x06Bearer\x12\x00rS\n$More about the Exabel Management API\x12+https://help.exabel.com/docs/management-api' \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/management/v1/service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/management/v1/service_pb2_grpc.py index 927357a0..866d9460 100644 --- a/exabel_data_sdk/stubs/exabel/api/management/v1/service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/management/v1/service_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/management/v1/user_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/management/v1/user_messages_pb2.py index 60606505..8c19e082 100644 --- a/exabel_data_sdk/stubs/exabel/api/management/v1/user_messages_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/management/v1/user_messages_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/management/v1/user_messages.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/management/v1/user_messages.proto') _sym_db = _symbol_database.Default() from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n,exabel/api/management/v1/user_messages.proto\x12\x18exabel.api.management.v1\x1a\x1fgoogle/api/field_behavior.proto"9\n\x04User\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0A\x03\x12\r\n\x05email\x18\x02 \x01(\t\x12\x0f\n\x07blocked\x18\x03 \x01(\x08"_\n\x05Group\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0A\x03\x12\x14\n\x0cdisplay_name\x18\x02 \x01(\t\x12-\n\x05users\x18\x03 \x03(\x0b2\x1e.exabel.api.management.v1.UserBQ\n\x1ccom.exabel.api.management.v1B\x11UserMessagesProtoP\x01Z\x1cexabel.com/api/management/v1b\x06proto3') diff --git a/exabel_data_sdk/stubs/exabel/api/management/v1/user_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/management/v1/user_messages_pb2_grpc.py index ae5ac41d..6b68325b 100644 --- a/exabel_data_sdk/stubs/exabel/api/management/v1/user_messages_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/management/v1/user_messages_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/management/v1/user_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/management/v1/user_service_pb2.py index 096219ef..0fd05ddd 100644 --- a/exabel_data_sdk/stubs/exabel/api/management/v1/user_service_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/management/v1/user_service_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/management/v1/user_service.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/management/v1/user_service.proto') _sym_db = _symbol_database.Default() from .....exabel.api.management.v1 import user_messages_pb2 as exabel_dot_api_dot_management_dot_v1_dot_user__messages__pb2 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/management/v1/user_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/management/v1/user_service_pb2_grpc.py index 7e68204b..c052a744 100644 --- a/exabel_data_sdk/stubs/exabel/api/management/v1/user_service_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/management/v1/user_service_pb2_grpc.py @@ -2,7 +2,7 @@ import grpc import warnings from .....exabel.api.management.v1 import user_service_pb2 as exabel_dot_api_dot_management_dot_v1_dot_user__service__pb2 -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/math/aggregation_pb2.py b/exabel_data_sdk/stubs/exabel/api/math/aggregation_pb2.py index 2a9b65a8..78329e9a 100644 --- a/exabel_data_sdk/stubs/exabel/api/math/aggregation_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/math/aggregation_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/math/aggregation.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/math/aggregation.proto') _sym_db = _symbol_database.Default() DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!exabel/api/math/aggregation.proto\x12\x0fexabel.api.math*l\n\x0bAggregation\x12\x17\n\x13AGGREGATION_INVALID\x10\x00\x12\x08\n\x04MEAN\x10\x01\x12\t\n\x05FIRST\x10\x02\x12\x08\n\x04LAST\x10\x03\x12\x07\n\x03SUM\x10\x04\x12\x07\n\x03MIN\x10\x05\x12\x07\n\x03MAX\x10\x06\x12\n\n\x06MEDIAN\x10\x07B>\n\x13com.exabel.api.mathB\x10AggregationProtoP\x01Z\x13exabel.com/api/mathb\x06proto3') _globals = globals() diff --git a/exabel_data_sdk/stubs/exabel/api/math/aggregation_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/math/aggregation_pb2_grpc.py index c6891e71..b45dc394 100644 --- a/exabel_data_sdk/stubs/exabel/api/math/aggregation_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/math/aggregation_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/math/change_pb2.py b/exabel_data_sdk/stubs/exabel/api/math/change_pb2.py index 9fe542d7..6e09db34 100644 --- a/exabel_data_sdk/stubs/exabel/api/math/change_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/math/change_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/math/change.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/math/change.proto') _sym_db = _symbol_database.Default() DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1cexabel/api/math/change.proto\x12\x0fexabel.api.math*<\n\x06Change\x12\x16\n\x12CHANGE_UNSPECIFIED\x10\x00\x12\x0c\n\x08RELATIVE\x10\x01\x12\x0c\n\x08ABSOLUTE\x10\x02B9\n\x13com.exabel.api.mathB\x0bChangeProtoP\x01Z\x13exabel.com/api/mathb\x06proto3') _globals = globals() diff --git a/exabel_data_sdk/stubs/exabel/api/math/change_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/math/change_pb2_grpc.py index 6801ae4b..91064d31 100644 --- a/exabel_data_sdk/stubs/exabel/api/math/change_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/math/change_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/time/__init__.pyi b/exabel_data_sdk/stubs/exabel/api/time/__init__.pyi index 622b2730..fcffa510 100644 --- a/exabel_data_sdk/stubs/exabel/api/time/__init__.pyi +++ b/exabel_data_sdk/stubs/exabel/api/time/__init__.pyi @@ -1 +1,2 @@ +from . import date_pb2 from . import time_range_pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/time/all_pb2.py b/exabel_data_sdk/stubs/exabel/api/time/all_pb2.py index 4eb9130b..2ce8424d 100644 --- a/exabel_data_sdk/stubs/exabel/api/time/all_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/time/all_pb2.py @@ -1,4 +1,5 @@ # Generated by generate_protobuf.sh. # Contains all messages in *_pb2.py in a single module. +from .date_pb2 import * from .time_range_pb2 import * diff --git a/exabel_data_sdk/stubs/exabel/api/time/all_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/time/all_pb2_grpc.py index 148f6a21..3a92bfdc 100644 --- a/exabel_data_sdk/stubs/exabel/api/time/all_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/time/all_pb2_grpc.py @@ -1,4 +1,5 @@ # Generated by generate_protobuf.sh. # Contains all messages in *_pb2_grpc.py in a single module. +from .date_pb2_grpc import * from .time_range_pb2_grpc import * diff --git a/exabel_data_sdk/stubs/exabel/api/time/date_pb2.py b/exabel_data_sdk/stubs/exabel/api/time/date_pb2.py new file mode 100644 index 00000000..d98054e4 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/time/date_pb2.py @@ -0,0 +1,17 @@ +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/time/date.proto') +_sym_db = _symbol_database.Default() +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1aexabel/api/time/date.proto\x12\x0fexabel.api.time"0\n\x04Date\x12\x0c\n\x04year\x18\x01 \x01(\x05\x12\r\n\x05month\x18\x02 \x01(\x05\x12\x0b\n\x03day\x18\x03 \x01(\x05B7\n\x13com.exabel.api.timeB\tDateProtoP\x01Z\x13exabel.com/api/timeb\x06proto3') +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'exabel.api.time.date_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\x13com.exabel.api.timeB\tDateProtoP\x01Z\x13exabel.com/api/time' + _globals['_DATE']._serialized_start = 47 + _globals['_DATE']._serialized_end = 95 \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/time/date_pb2.pyi b/exabel_data_sdk/stubs/exabel/api/time/date_pb2.pyi new file mode 100644 index 00000000..c01719aa --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/time/date_pb2.pyi @@ -0,0 +1,30 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +Copyright (c) 2025 Exabel AS. All rights reserved.""" +import builtins +import google.protobuf.descriptor +import google.protobuf.message +import typing +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +@typing.final +class Date(google.protobuf.message.Message): + """Represents a calendar date.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + YEAR_FIELD_NUMBER: builtins.int + MONTH_FIELD_NUMBER: builtins.int + DAY_FIELD_NUMBER: builtins.int + year: builtins.int + "The date's year." + month: builtins.int + 'The month of the year; must be between 1 and 12 inclusive.' + day: builtins.int + 'The day of the month, starting at 1; the day, month and year combined must\n define a valid calendar date.\n ' + + def __init__(self, *, year: builtins.int | None=..., month: builtins.int | None=..., day: builtins.int | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['day', b'day', 'month', b'month', 'year', b'year']) -> None: + ... +global___Date = Date \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/time/date_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/time/date_pb2_grpc.py new file mode 100644 index 00000000..11fd38b1 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/time/date_pb2_grpc.py @@ -0,0 +1,13 @@ +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True +if _version_not_supported: + raise RuntimeError(f'The grpc package installed is at version {GRPC_VERSION},' + f' but the generated code in exabel/api/time/date_pb2_grpc.py depends on' + f' grpcio>={GRPC_GENERATED_VERSION}.' + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.') \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/time/time_range_pb2.py b/exabel_data_sdk/stubs/exabel/api/time/time_range_pb2.py index 1c498804..d20d2d8e 100644 --- a/exabel_data_sdk/stubs/exabel/api/time/time_range_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/time/time_range_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'exabel/api/time/time_range.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'exabel/api/time/time_range.proto') _sym_db = _symbol_database.Default() from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n exabel/api/time/time_range.proto\x12\x0fexabel.api.time\x1a\x1fgoogle/protobuf/timestamp.proto"\x91\x01\n\tTimeRange\x12-\n\tfrom_time\x18\x01 \x01(\x0b2\x1a.google.protobuf.Timestamp\x12\x14\n\x0cexclude_from\x18\x02 \x01(\x08\x12+\n\x07to_time\x18\x03 \x01(\x0b2\x1a.google.protobuf.Timestamp\x12\x12\n\ninclude_to\x18\x04 \x01(\x08B<\n\x13com.exabel.api.timeB\x0eTimeRangeProtoP\x01Z\x13exabel.com/api/timeb\x06proto3') diff --git a/exabel_data_sdk/stubs/exabel/api/time/time_range_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/time/time_range_pb2_grpc.py index 2e4cf067..bdad8aef 100644 --- a/exabel_data_sdk/stubs/exabel/api/time/time_range_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/time/time_range_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/annotations_pb2.py b/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/annotations_pb2.py index 718029c7..04b08b88 100644 --- a/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/annotations_pb2.py +++ b/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/annotations_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'protoc_gen_openapiv2/options/annotations.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'protoc_gen_openapiv2/options/annotations.proto') _sym_db = _symbol_database.Default() from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 from ...protoc_gen_openapiv2.options import openapiv2_pb2 as protoc__gen__openapiv2_dot_options_dot_openapiv2__pb2 diff --git a/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/annotations_pb2_grpc.py b/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/annotations_pb2_grpc.py index 0aba1d25..64d576f5 100644 --- a/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/annotations_pb2_grpc.py +++ b/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/annotations_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/openapiv2_pb2.py b/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/openapiv2_pb2.py index 7159163e..692223ab 100644 --- a/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/openapiv2_pb2.py +++ b/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/openapiv2_pb2.py @@ -4,7 +4,7 @@ from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 28, 1, '', 'protoc_gen_openapiv2/options/openapiv2.proto') +_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 0, '', 'protoc_gen_openapiv2/options/openapiv2.proto') _sym_db = _symbol_database.Default() from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n,protoc_gen_openapiv2/options/openapiv2.proto\x12)grpc.gateway.protoc_gen_openapiv2.options\x1a\x1cgoogle/protobuf/struct.proto"\xdd\x06\n\x07Swagger\x12\x0f\n\x07swagger\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b2/.grpc.gateway.protoc_gen_openapiv2.options.Info\x12\x0c\n\x04host\x18\x03 \x01(\t\x12\x11\n\tbase_path\x18\x04 \x01(\t\x12B\n\x07schemes\x18\x05 \x03(\x0e21.grpc.gateway.protoc_gen_openapiv2.options.Scheme\x12\x10\n\x08consumes\x18\x06 \x03(\t\x12\x10\n\x08produces\x18\x07 \x03(\t\x12T\n\tresponses\x18\n \x03(\x0b2A.grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry\x12\\\n\x14security_definitions\x18\x0b \x01(\x0b2>.grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions\x12P\n\x08security\x18\x0c \x03(\x0b2>.grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement\x12W\n\rexternal_docs\x18\x0e \x01(\x0b2@.grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation\x12V\n\nextensions\x18\x0f \x03(\x0b2B.grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry\x1ae\n\x0eResponsesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12B\n\x05value\x18\x02 \x01(\x0b23.grpc.gateway.protoc_gen_openapiv2.options.Response:\x028\x01\x1aI\n\x0fExtensionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b2\x16.google.protobuf.Value:\x028\x01J\x04\x08\x08\x10\tJ\x04\x08\t\x10\nJ\x04\x08\r\x10\x0e"\xe6\x05\n\tOperation\x12\x0c\n\x04tags\x18\x01 \x03(\t\x12\x0f\n\x07summary\x18\x02 \x01(\t\x12\x13\n\x0bdescription\x18\x03 \x01(\t\x12W\n\rexternal_docs\x18\x04 \x01(\x0b2@.grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation\x12\x14\n\x0coperation_id\x18\x05 \x01(\t\x12\x10\n\x08consumes\x18\x06 \x03(\t\x12\x10\n\x08produces\x18\x07 \x03(\t\x12V\n\tresponses\x18\t \x03(\x0b2C.grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry\x12B\n\x07schemes\x18\n \x03(\x0e21.grpc.gateway.protoc_gen_openapiv2.options.Scheme\x12\x12\n\ndeprecated\x18\x0b \x01(\x08\x12P\n\x08security\x18\x0c \x03(\x0b2>.grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement\x12X\n\nextensions\x18\r \x03(\x0b2D.grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry\x1ae\n\x0eResponsesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12B\n\x05value\x18\x02 \x01(\x0b23.grpc.gateway.protoc_gen_openapiv2.options.Response:\x028\x01\x1aI\n\x0fExtensionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b2\x16.google.protobuf.Value:\x028\x01J\x04\x08\x08\x10\t"\xab\x01\n\x06Header\x12\x13\n\x0bdescription\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0e\n\x06format\x18\x03 \x01(\t\x12\x0f\n\x07default\x18\x06 \x01(\t\x12\x0f\n\x07pattern\x18\r \x01(\tJ\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\tJ\x04\x08\t\x10\nJ\x04\x08\n\x10\x0bJ\x04\x08\x0b\x10\x0cJ\x04\x08\x0c\x10\rJ\x04\x08\x0e\x10\x0fJ\x04\x08\x0f\x10\x10J\x04\x08\x10\x10\x11J\x04\x08\x11\x10\x12J\x04\x08\x12\x10\x13"\xc2\x04\n\x08Response\x12\x13\n\x0bdescription\x18\x01 \x01(\t\x12A\n\x06schema\x18\x02 \x01(\x0b21.grpc.gateway.protoc_gen_openapiv2.options.Schema\x12Q\n\x07headers\x18\x03 \x03(\x0b2@.grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry\x12S\n\x08examples\x18\x04 \x03(\x0b2A.grpc.gateway.protoc_gen_openapiv2.options.Response.ExamplesEntry\x12W\n\nextensions\x18\x05 \x03(\x0b2C.grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry\x1aa\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12@\n\x05value\x18\x02 \x01(\x0b21.grpc.gateway.protoc_gen_openapiv2.options.Header:\x028\x01\x1a/\n\rExamplesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x028\x01\x1aI\n\x0fExtensionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b2\x16.google.protobuf.Value:\x028\x01"\xff\x02\n\x04Info\x12\r\n\x05title\x18\x01 \x01(\t\x12\x13\n\x0bdescription\x18\x02 \x01(\t\x12\x18\n\x10terms_of_service\x18\x03 \x01(\t\x12C\n\x07contact\x18\x04 \x01(\x0b22.grpc.gateway.protoc_gen_openapiv2.options.Contact\x12C\n\x07license\x18\x05 \x01(\x0b22.grpc.gateway.protoc_gen_openapiv2.options.License\x12\x0f\n\x07version\x18\x06 \x01(\t\x12S\n\nextensions\x18\x07 \x03(\x0b2?.grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry\x1aI\n\x0fExtensionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b2\x16.google.protobuf.Value:\x028\x01"3\n\x07Contact\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\r\n\x05email\x18\x03 \x01(\t"$\n\x07License\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t"9\n\x15ExternalDocumentation\x12\x13\n\x0bdescription\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t"\xee\x01\n\x06Schema\x12J\n\x0bjson_schema\x18\x01 \x01(\x0b25.grpc.gateway.protoc_gen_openapiv2.options.JSONSchema\x12\x15\n\rdiscriminator\x18\x02 \x01(\t\x12\x11\n\tread_only\x18\x03 \x01(\x08\x12W\n\rexternal_docs\x18\x05 \x01(\x0b2@.grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation\x12\x0f\n\x07example\x18\x06 \x01(\tJ\x04\x08\x04\x10\x05"\xfc\x06\n\nJSONSchema\x12\x0b\n\x03ref\x18\x03 \x01(\t\x12\r\n\x05title\x18\x05 \x01(\t\x12\x13\n\x0bdescription\x18\x06 \x01(\t\x12\x0f\n\x07default\x18\x07 \x01(\t\x12\x11\n\tread_only\x18\x08 \x01(\x08\x12\x0f\n\x07example\x18\t \x01(\t\x12\x13\n\x0bmultiple_of\x18\n \x01(\x01\x12\x0f\n\x07maximum\x18\x0b \x01(\x01\x12\x19\n\x11exclusive_maximum\x18\x0c \x01(\x08\x12\x0f\n\x07minimum\x18\r \x01(\x01\x12\x19\n\x11exclusive_minimum\x18\x0e \x01(\x08\x12\x12\n\nmax_length\x18\x0f \x01(\x04\x12\x12\n\nmin_length\x18\x10 \x01(\x04\x12\x0f\n\x07pattern\x18\x11 \x01(\t\x12\x11\n\tmax_items\x18\x14 \x01(\x04\x12\x11\n\tmin_items\x18\x15 \x01(\x04\x12\x14\n\x0cunique_items\x18\x16 \x01(\x08\x12\x16\n\x0emax_properties\x18\x18 \x01(\x04\x12\x16\n\x0emin_properties\x18\x19 \x01(\x04\x12\x10\n\x08required\x18\x1a \x03(\t\x12\r\n\x05array\x18" \x03(\t\x12Y\n\x04type\x18# \x03(\x0e2K.grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.JSONSchemaSimpleTypes\x12\x0e\n\x06format\x18$ \x01(\t\x12\x0c\n\x04enum\x18. \x03(\t\x12f\n\x13field_configuration\x18\xe9\x07 \x01(\x0b2H.grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.FieldConfiguration\x1a-\n\x12FieldConfiguration\x12\x17\n\x0fpath_param_name\x18/ \x01(\t"w\n\x15JSONSchemaSimpleTypes\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05ARRAY\x10\x01\x12\x0b\n\x07BOOLEAN\x10\x02\x12\x0b\n\x07INTEGER\x10\x03\x12\x08\n\x04NULL\x10\x04\x12\n\n\x06NUMBER\x10\x05\x12\n\n\x06OBJECT\x10\x06\x12\n\n\x06STRING\x10\x07J\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05J\x04\x08\x12\x10\x13J\x04\x08\x13\x10\x14J\x04\x08\x17\x10\x18J\x04\x08\x1b\x10\x1cJ\x04\x08\x1c\x10\x1dJ\x04\x08\x1d\x10\x1eJ\x04\x08\x1e\x10"J\x04\x08%\x10*J\x04\x08*\x10+J\x04\x08+\x10."y\n\x03Tag\x12\x13\n\x0bdescription\x18\x02 \x01(\t\x12W\n\rexternal_docs\x18\x03 \x01(\x0b2@.grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentationJ\x04\x08\x01\x10\x02"\xe1\x01\n\x13SecurityDefinitions\x12^\n\x08security\x18\x01 \x03(\x0b2L.grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry\x1aj\n\rSecurityEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b29.grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme:\x028\x01"\xa0\x06\n\x0eSecurityScheme\x12L\n\x04type\x18\x01 \x01(\x0e2>.grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Type\x12\x13\n\x0bdescription\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12H\n\x02in\x18\x04 \x01(\x0e2<.grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.In\x12L\n\x04flow\x18\x05 \x01(\x0e2>.grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Flow\x12\x19\n\x11authorization_url\x18\x06 \x01(\t\x12\x11\n\ttoken_url\x18\x07 \x01(\t\x12A\n\x06scopes\x18\x08 \x01(\x0b21.grpc.gateway.protoc_gen_openapiv2.options.Scopes\x12]\n\nextensions\x18\t \x03(\x0b2I.grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry\x1aI\n\x0fExtensionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b2\x16.google.protobuf.Value:\x028\x01"K\n\x04Type\x12\x10\n\x0cTYPE_INVALID\x10\x00\x12\x0e\n\nTYPE_BASIC\x10\x01\x12\x10\n\x0cTYPE_API_KEY\x10\x02\x12\x0f\n\x0bTYPE_OAUTH2\x10\x03"1\n\x02In\x12\x0e\n\nIN_INVALID\x10\x00\x12\x0c\n\x08IN_QUERY\x10\x01\x12\r\n\tIN_HEADER\x10\x02"j\n\x04Flow\x12\x10\n\x0cFLOW_INVALID\x10\x00\x12\x11\n\rFLOW_IMPLICIT\x10\x01\x12\x11\n\rFLOW_PASSWORD\x10\x02\x12\x14\n\x10FLOW_APPLICATION\x10\x03\x12\x14\n\x10FLOW_ACCESS_CODE\x10\x04"\xcd\x02\n\x13SecurityRequirement\x12u\n\x14security_requirement\x18\x01 \x03(\x0b2W.grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry\x1a)\n\x18SecurityRequirementValue\x12\r\n\x05scope\x18\x01 \x03(\t\x1a\x93\x01\n\x18SecurityRequirementEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12f\n\x05value\x18\x02 \x01(\x0b2W.grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementValue:\x028\x01"\x83\x01\n\x06Scopes\x12K\n\x05scope\x18\x01 \x03(\x0b2<.grpc.gateway.protoc_gen_openapiv2.options.Scopes.ScopeEntry\x1a,\n\nScopeEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x028\x01*;\n\x06Scheme\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04HTTP\x10\x01\x12\t\n\x05HTTPS\x10\x02\x12\x06\n\x02WS\x10\x03\x12\x07\n\x03WSS\x10\x04BHZFgithub.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/optionsb\x06proto3') diff --git a/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/openapiv2_pb2_grpc.py b/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/openapiv2_pb2_grpc.py index dfa2f077..bac2b65c 100644 --- a/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/openapiv2_pb2_grpc.py +++ b/exabel_data_sdk/stubs/protoc_gen_openapiv2/options/openapiv2_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.68.1' +GRPC_GENERATED_VERSION = '1.71.0' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/tests/client/api/data_classes/test_data_set.py b/exabel_data_sdk/tests/client/api/data_classes/test_data_set.py index 01bdefb6..5a56cb13 100644 --- a/exabel_data_sdk/tests/client/api/data_classes/test_data_set.py +++ b/exabel_data_sdk/tests/client/api/data_classes/test_data_set.py @@ -27,12 +27,16 @@ def test_equals(self): display_name="Revenue per store.", description="description", signals=["signals/ns.sig1", "signals/ns.sig2"], + derived_signals=["derivedSignals/123", "derivedSignals/321"], + highlighted_signals=["derivedSignals/123", "derivedSignals/321"], ) data_set_2 = DataSet( name="dataSet/customerA.MyData", display_name="Revenue per store.", description="description", signals=["signals/ns.sig2", "signals/ns.sig1"], + derived_signals=["derivedSignals/123", "derivedSignals/321"], + highlighted_signals=["derivedSignals/321", "derivedSignals/123"], ) data_set_3 = DataSet( name="dataSet/customerA.MyData", @@ -40,5 +44,14 @@ def test_equals(self): description="description", signals=["signals/ns.sig2"], ) + data_set_4 = DataSet( + name="dataSet/customerA.MyData", + display_name="Revenue per store.", + description="description", + signals=["signals/ns.sig2", "signals/ns.sig1"], + derived_signals=["derivedSignals/321", "derivedSignals/123"], + highlighted_signals=["derivedSignals/123", "derivedSignals/321"], + ) self.assertEqual(data_set_1, data_set_2) self.assertNotEqual(data_set_1, data_set_3) + self.assertNotEqual(data_set_1, data_set_4) diff --git a/exabel_data_sdk/tests/client/api/mock_relationship_api.py b/exabel_data_sdk/tests/client/api/mock_relationship_api.py index 088af59a..3af6e0a7 100644 --- a/exabel_data_sdk/tests/client/api/mock_relationship_api.py +++ b/exabel_data_sdk/tests/client/api/mock_relationship_api.py @@ -57,7 +57,12 @@ def get_relationships_from_entity( page_size: int = 1000, page_token: Optional[str] = None, ) -> PagingResult[Relationship]: - raise NotImplementedError() + # Note: This implementation ignores page_size and page_token + return self.relationships.list( + predicate=lambda r: ( + r.from_entity == from_entity and r.relationship_type == relationship_type + ) + ) def get_relationships_to_entity( self, @@ -66,7 +71,12 @@ def get_relationships_to_entity( page_size: int = 1000, page_token: Optional[str] = None, ) -> PagingResult[Relationship]: - raise NotImplementedError() + # Note: This implementation ignores page_size and page_token + return self.relationships.list( + predicate=lambda r: ( + r.to_entity == to_entity and r.relationship_type == relationship_type + ) + ) def get_relationship( self, relationship_type: str, from_entity: str, to_entity: str @@ -94,4 +104,5 @@ def list_relationships( page_size: int = 1000, page_token: Optional[str] = None, ) -> PagingResult[Relationship]: + # Note: This implementation ignores page_size and page_token return self.relationships.list(predicate=lambda r: r.relationship_type == relationship_type) diff --git a/exabel_data_sdk/tests/client/api/mock_resource_store.py b/exabel_data_sdk/tests/client/api/mock_resource_store.py index 5bdf2208..325aec64 100644 --- a/exabel_data_sdk/tests/client/api/mock_resource_store.py +++ b/exabel_data_sdk/tests/client/api/mock_resource_store.py @@ -91,8 +91,8 @@ def update( self.resources[key] = resource return resource - def delete(self, key: object): + def delete(self, key: object) -> None: """Delete the resource with the given key.""" - if key in self.resources: - del self.resources[key] - raise ValueError(f"Trying to delete non-existent resource: {key}") + if key not in self.resources: + raise ValueError(f"Trying to delete non-existent resource: {key}") + del self.resources[key] diff --git a/exabel_data_sdk/tests/resources/data/timeseries_with_missing_date.csv b/exabel_data_sdk/tests/resources/data/timeseries_with_missing_date.csv new file mode 100644 index 00000000..dcf4e776 --- /dev/null +++ b/exabel_data_sdk/tests/resources/data/timeseries_with_missing_date.csv @@ -0,0 +1,8 @@ +entity;date;signal1 +entityTypes/company/entities/company_A;2021-01-01;1 +entityTypes/company/entities/company_A;2021-01-02;2 +entityTypes/company/entities/company_A;2021-01-03;3 +entityTypes/company/entities/company_A;2021-01-04;4 +entityTypes/company/entities/company_A;2021-01-05;5 +entityTypes/company/entities/company_B;2021-01-01;4 +entityTypes/company/entities/company_B;;5 diff --git a/exabel_data_sdk/tests/resources/data/timeseries_with_missing_known_time.csv b/exabel_data_sdk/tests/resources/data/timeseries_with_missing_known_time.csv new file mode 100644 index 00000000..37398fec --- /dev/null +++ b/exabel_data_sdk/tests/resources/data/timeseries_with_missing_known_time.csv @@ -0,0 +1,5 @@ +entity;date;known_time;signal1 +entityTypes/company/entities/company_A;2021-01-01;2021-01-01;1 +entityTypes/company/entities/company_A;2021-01-02;2021-01-05;2 +entityTypes/company/entities/company_B;2021-01-01;2021-01-10;4 +entityTypes/company/entities/company_B;2021-01-03;;5 diff --git a/exabel_data_sdk/tests/scripts/test_load_time_series_from_csv.py b/exabel_data_sdk/tests/scripts/test_load_time_series_from_csv.py index d6fcd7c5..4982b248 100644 --- a/exabel_data_sdk/tests/scripts/test_load_time_series_from_csv.py +++ b/exabel_data_sdk/tests/scripts/test_load_time_series_from_csv.py @@ -1,3 +1,4 @@ +import io import unittest from functools import partial from typing import Callable @@ -501,6 +502,38 @@ def test_should_fail_with_invalid_data_points(self): with self.assertRaises(SystemExit): script.run_script(self.client, script.parse_arguments()) + def test_should_fail_with_missing_date(self): + args = common_args + [ + "--filename", + "./exabel_data_sdk/tests/resources/data/timeseries_with_missing_date.csv", + "--pit-offset", + "1", + ] + + script = LoadTimeSeriesFromFile(args) + with self.assertRaises(SystemExit): + with mock.patch("sys.stdout", new_callable=io.StringIO) as fake_stdout: + script.run_script(self.client, script.parse_arguments()) + self.assertIn( + "The 'date' column has missing values, which is not permitted.", + fake_stdout.getvalue(), + ) + + def test_should_fail_with_missing_known_time(self): + args = common_args + [ + "--filename", + "./exabel_data_sdk/tests/resources/data/timeseries_with_missing_known_time.csv", + ] + + script = LoadTimeSeriesFromFile(args) + with self.assertRaises(SystemExit): + with mock.patch("sys.stdout", new_callable=io.StringIO) as fake_stdout: + script.run_script(self.client, script.parse_arguments()) + self.assertIn( + "The 'known_time' column has missing values, which is not permitted.", + fake_stdout.getvalue(), + ) + def test_valid_no_create_library_signal(self): args = common_args + [ "--filename", diff --git a/exabel_data_sdk/tests/services/test_file_time_series_loader.py b/exabel_data_sdk/tests/services/test_file_time_series_loader.py index 0bec6b7c..85cb862a 100644 --- a/exabel_data_sdk/tests/services/test_file_time_series_loader.py +++ b/exabel_data_sdk/tests/services/test_file_time_series_loader.py @@ -346,7 +346,9 @@ def test_read_excel__empty_rows_inbetween(self): FileTimeSeriesLoader(client).load_time_series( filename="./exabel_data_sdk/tests/resources/data/with_empty_rows_1.xlsx", ) - self.assertIn("A cell in the entity column was empty.", str(context.exception)) + self.assertIn( + "The 'date' column has missing values, which is not permitted.", str(context.exception) + ) def test_read_excel__duplicate_columns(self): client: ExabelClient = ExabelMockClient()