From 649b3f4fc5828803de6ed51e4d7d83822bee7916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Matheson=20Wergeland?= Date: Fri, 14 Nov 2025 12:23:06 +0100 Subject: [PATCH 1/3] Release 7.0.0 # Added - Added support for authenticating with access tokens. Set environment variable `EXABEL_ACCESS_TOKEN` or command line argument `--access-token`. - Added support for hierarchical models in [KPI Service](https://help.exabel.com/reference/kpiservice). - Added support for [Custom Calenader Service(https://help.exabel.com/reference/customcalendarservice) # Breaking changes - Renamed `exabel_data_sdk.client.api.data_classes.kpi_mapping_group.py` to `exabel_data_sdk.client.api.data_classes.kpi_mapping_group_reference`. # Deprecated - Support for username/password authentication when accessing the Export API is now deprecated. This authentication method will be removed in a future release. Use access token instead. --- VERSION | 2 +- .../api/api_client/calendar_api_client.py | 37 +++ .../api/api_client/grpc/base_grpc_client.py | 7 +- .../api_client/grpc/calendar_grpc_client.py | 48 ++++ .../api/api_client/grpc/signal_grpc_client.py | 13 ++ exabel_data_sdk/client/api/calendar_api.py | 109 +++++++++ .../client/api/data_classes/derived_signal.py | 90 ++++++-- .../client/api/data_classes/fiscal_period.py | 38 +++ ...roup.py => kpi_mapping_group_reference.py} | 10 +- .../api/data_classes/kpi_mapping_model.py | 8 +- .../data_classes/kpi_mapping_result_data.py | 19 +- .../client/api/data_classes/kpi_model.py | 7 + .../client/api/data_classes/kpi_model_data.py | 34 +-- .../client/api/data_classes/kpi_model_run.py | 55 +++++ .../client/api/data_classes/kpi_model_runs.py | 40 ++++ .../data_classes/kpi_model_weight_groups.py | 12 +- .../client/api/data_classes/model_quality.py | 31 +++ .../client/api/data_classes/model_results.py | 59 +++++ .../client/api/derived_signal_api.py | 10 +- exabel_data_sdk/client/api/export_api.py | 12 + exabel_data_sdk/client/api/kpi_api.py | 13 +- exabel_data_sdk/client/api/signal_api.py | 30 ++- exabel_data_sdk/client/client_config.py | 20 +- exabel_data_sdk/client/exabel_client.py | 13 +- exabel_data_sdk/scripts/base_script.py | 49 ++-- exabel_data_sdk/scripts/export_data.py | 37 ++- exabel_data_sdk/scripts/list_folders.py | 4 - .../services/file_loading_exception.py | 2 +- .../exabel/api/analytics/v1/__init__.pyi | 3 + .../stubs/exabel/api/analytics/v1/all_pb2.py | 3 + .../exabel/api/analytics/v1/all_pb2_grpc.py | 3 + .../api/analytics/v1/common_messages_pb2.py | 17 ++ .../api/analytics/v1/common_messages_pb2.pyi | 33 +++ .../analytics/v1/common_messages_pb2_grpc.py | 13 ++ .../v1/derived_signal_messages_pb2_grpc.py | 2 +- .../v1/derived_signal_service_pb2_grpc.py | 2 +- .../analytics/v1/item_messages_pb2_grpc.py | 2 +- .../analytics/v1/kpi_mapping_messages_pb2.py | 30 +++ .../analytics/v1/kpi_mapping_messages_pb2.pyi | 122 ++++++++++ .../v1/kpi_mapping_messages_pb2_grpc.py | 13 ++ .../analytics/v1/kpi_mapping_service_pb2.py | 50 ++++ .../analytics/v1/kpi_mapping_service_pb2.pyi | 138 +++++++++++ .../v1/kpi_mapping_service_pb2_grpc.py | 88 +++++++ .../api/analytics/v1/kpi_messages_pb2.py | 95 ++++---- .../api/analytics/v1/kpi_messages_pb2.pyi | 216 ++++++++++++++++-- .../api/analytics/v1/kpi_messages_pb2_grpc.py | 2 +- .../api/analytics/v1/kpi_service_pb2.py | 52 +++-- .../api/analytics/v1/kpi_service_pb2.pyi | 25 +- .../api/analytics/v1/kpi_service_pb2_grpc.py | 2 +- .../v1/prediction_model_messages_pb2_grpc.py | 2 +- .../v1/prediction_model_service_pb2_grpc.py | 2 +- .../api/analytics/v1/service_pb2_grpc.py | 2 +- .../api/analytics/v1/tag_messages_pb2_grpc.py | 2 +- .../api/analytics/v1/tag_service_pb2.py | 40 ++-- .../api/analytics/v1/tag_service_pb2.pyi | 4 +- .../api/analytics/v1/tag_service_pb2_grpc.py | 2 +- .../stubs/exabel/api/data/v1/__init__.pyi | 2 + .../stubs/exabel/api/data/v1/all_pb2.py | 2 + .../stubs/exabel/api/data/v1/all_pb2_grpc.py | 2 + .../api/data/v1/calendar_messages_pb2.py | 20 ++ .../api/data/v1/calendar_messages_pb2.pyi | 66 ++++++ .../api/data/v1/calendar_messages_pb2_grpc.py | 13 ++ .../api/data/v1/calendar_service_pb2.py | 52 +++++ .../api/data/v1/calendar_service_pb2.pyi | 127 ++++++++++ .../api/data/v1/calendar_service_pb2_grpc.py | 102 +++++++++ .../api/data/v1/common_messages_pb2_grpc.py | 2 +- .../api/data/v1/data_set_messages_pb2_grpc.py | 2 +- .../api/data/v1/data_set_service_pb2_grpc.py | 2 +- .../api/data/v1/entity_messages_pb2_grpc.py | 2 +- .../api/data/v1/entity_service_pb2_grpc.py | 2 +- .../data/v1/import_job_service_pb2_grpc.py | 2 +- .../api/data/v1/namespace_service_pb2_grpc.py | 2 +- .../data/v1/namespaces_messages_pb2_grpc.py | 2 +- .../data/v1/relationship_messages_pb2_grpc.py | 2 +- .../data/v1/relationship_service_pb2_grpc.py | 2 +- .../api/data/v1/search_messages_pb2_grpc.py | 2 +- .../stubs/exabel/api/data/v1/service_pb2.py | 4 +- .../exabel/api/data/v1/service_pb2_grpc.py | 2 +- .../api/data/v1/signal_messages_pb2_grpc.py | 2 +- .../api/data/v1/signal_service_pb2_grpc.py | 2 +- .../data/v1/time_series_messages_pb2_grpc.py | 2 +- .../data/v1/time_series_service_pb2_grpc.py | 2 +- .../management/v1/folder_messages_pb2_grpc.py | 2 +- .../management/v1/library_service_pb2_grpc.py | 2 +- .../api/management/v1/service_pb2_grpc.py | 2 +- .../management/v1/user_messages_pb2_grpc.py | 2 +- .../management/v1/user_service_pb2_grpc.py | 2 +- .../exabel/api/math/aggregation_pb2_grpc.py | 2 +- .../stubs/exabel/api/math/change_pb2_grpc.py | 2 +- .../stubs/exabel/api/time/date_pb2_grpc.py | 2 +- .../exabel/api/time/time_range_pb2_grpc.py | 2 +- .../options/annotations_pb2_grpc.py | 2 +- .../options/openapiv2_pb2_grpc.py | 2 +- .../api/data_classes/test_derived_signal.py | 42 +++- .../tests/scripts/test_export_data.py | 27 ++- .../test_load_time_series_from_excel.py | 2 +- 96 files changed, 2026 insertions(+), 263 deletions(-) create mode 100644 exabel_data_sdk/client/api/api_client/calendar_api_client.py create mode 100644 exabel_data_sdk/client/api/api_client/grpc/calendar_grpc_client.py create mode 100644 exabel_data_sdk/client/api/calendar_api.py create mode 100644 exabel_data_sdk/client/api/data_classes/fiscal_period.py rename exabel_data_sdk/client/api/data_classes/{kpi_mapping_group.py => kpi_mapping_group_reference.py} (66%) create mode 100644 exabel_data_sdk/client/api/data_classes/kpi_model_run.py create mode 100644 exabel_data_sdk/client/api/data_classes/kpi_model_runs.py create mode 100644 exabel_data_sdk/client/api/data_classes/model_quality.py create mode 100644 exabel_data_sdk/client/api/data_classes/model_results.py create mode 100644 exabel_data_sdk/stubs/exabel/api/analytics/v1/common_messages_pb2.py create mode 100644 exabel_data_sdk/stubs/exabel/api/analytics/v1/common_messages_pb2.pyi create mode 100644 exabel_data_sdk/stubs/exabel/api/analytics/v1/common_messages_pb2_grpc.py create mode 100644 exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.py create mode 100644 exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.pyi create mode 100644 exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2_grpc.py create mode 100644 exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2.py create mode 100644 exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2.pyi create mode 100644 exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2_grpc.py create mode 100644 exabel_data_sdk/stubs/exabel/api/data/v1/calendar_messages_pb2.py create mode 100644 exabel_data_sdk/stubs/exabel/api/data/v1/calendar_messages_pb2.pyi create mode 100644 exabel_data_sdk/stubs/exabel/api/data/v1/calendar_messages_pb2_grpc.py create mode 100644 exabel_data_sdk/stubs/exabel/api/data/v1/calendar_service_pb2.py create mode 100644 exabel_data_sdk/stubs/exabel/api/data/v1/calendar_service_pb2.pyi create mode 100644 exabel_data_sdk/stubs/exabel/api/data/v1/calendar_service_pb2_grpc.py diff --git a/VERSION b/VERSION index 798e3899..66ce77b7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.3.0 +7.0.0 diff --git a/exabel_data_sdk/client/api/api_client/calendar_api_client.py b/exabel_data_sdk/client/api/api_client/calendar_api_client.py new file mode 100644 index 00000000..dafa59e4 --- /dev/null +++ b/exabel_data_sdk/client/api/api_client/calendar_api_client.py @@ -0,0 +1,37 @@ +from abc import ABC, abstractmethod + +from exabel_data_sdk.stubs.exabel.api.data.v1.calendar_service_pb2 import ( + BatchCreateFiscalPeriodsRequest, + BatchCreateFiscalPeriodsResponse, + DeleteFiscalPeriodRequest, + ListCompaniesWithFiscalPeriodsRequest, + ListCompaniesWithFiscalPeriodsResponse, + ListFiscalPeriodsRequest, + ListFiscalPeriodsResponse, +) + + +class CalendarApiClient(ABC): + """Superclass for clients that send calendar requests to the Exabel Data API.""" + + @abstractmethod + def batch_create_fiscal_periods( + self, request: BatchCreateFiscalPeriodsRequest + ) -> BatchCreateFiscalPeriodsResponse: + """Add fiscal periods for a company.""" + + @abstractmethod + def list_company_fiscal_periods( + self, request: ListFiscalPeriodsRequest + ) -> ListFiscalPeriodsResponse: + """List the fiscal periods for a company.""" + + @abstractmethod + def delete_fiscal_periods(self, request: DeleteFiscalPeriodRequest) -> None: + """Delete fiscal periods for a company.""" + + @abstractmethod + def list_companies_with_fiscal_periods( + self, request: ListCompaniesWithFiscalPeriodsRequest + ) -> ListCompaniesWithFiscalPeriodsResponse: + """List the companies for which there are uploaded fiscal periods.""" diff --git a/exabel_data_sdk/client/api/api_client/grpc/base_grpc_client.py b/exabel_data_sdk/client/api/api_client/grpc/base_grpc_client.py index 8b93800f..9f78ece8 100644 --- a/exabel_data_sdk/client/api/api_client/grpc/base_grpc_client.py +++ b/exabel_data_sdk/client/api/api_client/grpc/base_grpc_client.py @@ -35,8 +35,11 @@ def __init__(self, config: ClientConfig, api_group: ExabelApiGroup): # Use an insecure channel. This can be used for local testing. self.channel = grpc.insecure_channel(**common_kwargs) else: - assert config.api_key is not None - self.metadata.append(("x-api-key", config.api_key)) + if config.access_token is not None: + self.metadata.append(("authorization", "Bearer " + config.access_token)) + else: + assert config.api_key is not None + self.metadata.append(("x-api-key", config.api_key)) self.channel = grpc.secure_channel( credentials=grpc.ssl_channel_credentials( root_certificates=config.root_certificates diff --git a/exabel_data_sdk/client/api/api_client/grpc/calendar_grpc_client.py b/exabel_data_sdk/client/api/api_client/grpc/calendar_grpc_client.py new file mode 100644 index 00000000..9d03e3b1 --- /dev/null +++ b/exabel_data_sdk/client/api/api_client/grpc/calendar_grpc_client.py @@ -0,0 +1,48 @@ +from exabel_data_sdk.client.api.api_client.calendar_api_client import CalendarApiClient +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.client_config import ClientConfig +from exabel_data_sdk.stubs.exabel.api.data.v1.calendar_service_pb2 import ( + BatchCreateFiscalPeriodsRequest, + BatchCreateFiscalPeriodsResponse, + DeleteFiscalPeriodRequest, + ListCompaniesWithFiscalPeriodsRequest, + ListCompaniesWithFiscalPeriodsResponse, + ListFiscalPeriodsRequest, + ListFiscalPeriodsResponse, +) +from exabel_data_sdk.stubs.exabel.api.data.v1.calendar_service_pb2_grpc import CalendarServiceStub + + +class CalendarGrpcClient(CalendarApiClient, BaseGrpcClient): + """ + Client which sends calendar requests to the Exabel Data API with gRPC. + """ + + def __init__(self, config: ClientConfig): + super().__init__(config, ExabelApiGroup.DATA_API) + self.stub = CalendarServiceStub(self.channel) + + def batch_create_fiscal_periods( + self, request: BatchCreateFiscalPeriodsRequest + ) -> BatchCreateFiscalPeriodsResponse: + return self.stub.BatchCreateFiscalPeriods( + request, metadata=self.metadata, timeout=self.config.timeout + ) + + def list_company_fiscal_periods( + self, request: ListFiscalPeriodsRequest + ) -> ListFiscalPeriodsResponse: + return self.stub.ListFiscalPeriods( + request, metadata=self.metadata, timeout=self.config.timeout + ) + + def delete_fiscal_periods(self, request: DeleteFiscalPeriodRequest) -> None: + self.stub.DeleteFiscalPeriod(request, metadata=self.metadata, timeout=self.config.timeout) + + def list_companies_with_fiscal_periods( + self, request: ListCompaniesWithFiscalPeriodsRequest + ) -> ListCompaniesWithFiscalPeriodsResponse: + return self.stub.ListCompaniesWithFiscalPeriods( + request, metadata=self.metadata, timeout=self.config.timeout + ) diff --git a/exabel_data_sdk/client/api/api_client/grpc/signal_grpc_client.py b/exabel_data_sdk/client/api/api_client/grpc/signal_grpc_client.py index a606ec25..04b92270 100644 --- a/exabel_data_sdk/client/api/api_client/grpc/signal_grpc_client.py +++ b/exabel_data_sdk/client/api/api_client/grpc/signal_grpc_client.py @@ -6,6 +6,8 @@ from exabel_data_sdk.stubs.exabel.api.data.v1.all_pb2 import ( CreateSignalRequest, DeleteSignalRequest, + FilterDerivedSignalsRequest, + FilterDerivedSignalsResponse, GetSignalRequest, ListSignalsRequest, ListSignalsResponse, @@ -63,3 +65,14 @@ def delete_signal(self, request: DeleteSignalRequest) -> None: metadata=self.metadata, timeout=self.config.timeout, ) + + @handle_grpc_error + def filter_derived_signals( + self, request: FilterDerivedSignalsRequest + ) -> FilterDerivedSignalsResponse: + """Filter derived signals by entity names.""" + return self.stub.FilterDerivedSignals( + request, + metadata=self.metadata, + timeout=self.config.timeout, + ) diff --git a/exabel_data_sdk/client/api/calendar_api.py b/exabel_data_sdk/client/api/calendar_api.py new file mode 100644 index 00000000..b68f44c4 --- /dev/null +++ b/exabel_data_sdk/client/api/calendar_api.py @@ -0,0 +1,109 @@ +from collections.abc import Sequence +from typing import Optional + +from exabel_data_sdk.client.api.api_client.grpc.calendar_grpc_client import CalendarGrpcClient +from exabel_data_sdk.client.client_config import ClientConfig +from exabel_data_sdk.stubs.exabel.api.data.v1.calendar_messages_pb2 import FiscalPeriod, Frequency +from exabel_data_sdk.stubs.exabel.api.data.v1.calendar_service_pb2 import ( + BatchCreateFiscalPeriodsRequest, + DeleteFiscalPeriodRequest, + ListCompaniesWithFiscalPeriodsRequest, + ListFiscalPeriodsRequest, +) +from exabel_data_sdk.stubs.exabel.api.time.date_pb2 import Date + + +class CalendarApi: + """API class for CRUD operations on companies’ fiscal periods.""" + + def __init__(self, config: ClientConfig): + self.client = CalendarGrpcClient(config) + + def create_fiscal_periods( + self, + company: str, + *, + quarterly: Sequence[Date] = (), + semiannual: Sequence[Date] = (), + annual: Sequence[Date] = (), + ) -> None: + """ + Create fiscal periods for a company. + + Args: + company: The resource name of the company. + quarterly: The end dates of the quarterly fiscal periods. + semiannual: The end dates of the semi-annual fiscal periods. + annual: The end dates of the annual fiscal periods. + """ + periods = self._to_fiscal_periods(quarterly=quarterly, semiannual=semiannual, annual=annual) + if not periods: + return + request = BatchCreateFiscalPeriodsRequest(parent=company, periods=periods) + self.client.batch_create_fiscal_periods(request) + + def list_fiscal_periods( + self, company: str, frequency: Optional[Frequency.ValueType] = None + ) -> Sequence[FiscalPeriod]: + """ + List the fiscal periods for a company. + + Args: + company: The resource name of the company. + frequency: The frequency of the returned fiscal periods. If not provided, the fiscal + periods for all the frequencies are returned. + """ + request = ListFiscalPeriodsRequest(parent=company, frequency=frequency) + return self.client.list_company_fiscal_periods(request).periods + + def delete_fiscal_period( + self, + company: str, + date: Date, + frequency: Frequency.ValueType, + ) -> None: + """ + Delete a previously added fiscal period for a company. + + Args: + company: The resource name of the company. + date: The end date of the fiscal period which should be deleted. + frequency: The frequency of the fiscal period which should be deleted. + """ + request = DeleteFiscalPeriodRequest( + parent=company, period=FiscalPeriod(frequency=frequency, end_date=date) + ) + self.client.delete_fiscal_periods(request) + + def delete_fiscal_periods(self, company: str) -> None: + """ + Deletes all previously added fiscal periods for a company. + + Args: + company: The resource name of the company. + """ + request = DeleteFiscalPeriodRequest(parent=company) + self.client.delete_fiscal_periods(request) + + def _to_fiscal_periods( + self, *, quarterly: Sequence[Date], semiannual: Sequence[Date], annual: Sequence[Date] + ) -> Sequence[FiscalPeriod]: + periods = [] + for dates, frequency in ( + (quarterly, Frequency.QUARTERLY), + (semiannual, Frequency.SEMIANNUAL), + (annual, Frequency.ANNUAL), + ): + periods.extend([FiscalPeriod(frequency=frequency, end_date=d) for d in dates]) + return periods + + def list_companies_with_fiscal_periods(self) -> Sequence[str]: + """ + Return a list of companies which have fiscal periods. + + Returns: + A list containing the resource names of all the companies for which the customer has + uploaded fiscal periods + """ + request = ListCompaniesWithFiscalPeriodsRequest() + return self.client.list_companies_with_fiscal_periods(request).companies diff --git a/exabel_data_sdk/client/api/data_classes/derived_signal.py b/exabel_data_sdk/client/api/data_classes/derived_signal.py index 92317546..f160e368 100644 --- a/exabel_data_sdk/client/api/data_classes/derived_signal.py +++ b/exabel_data_sdk/client/api/data_classes/derived_signal.py @@ -15,6 +15,11 @@ from exabel_data_sdk.stubs.exabel.api.analytics.v1.all_pb2 import ( DerivedSignalUnit as ProtoDerivedSignalUnit, ) +from exabel_data_sdk.stubs.exabel.api.data.v1.signal_messages_pb2 import ( + DerivedSignal as ProtoDataApiDerivedSignal, +) +from exabel_data_sdk.stubs.exabel.api.math.aggregation_pb2 import Aggregation +from exabel_data_sdk.stubs.exabel.api.math.change_pb2 import Change class DerivedSignalType(Enum): @@ -53,9 +58,11 @@ class DerivedSignalMetaData: Metadata of a derived signal. Attributes: - unit: Unit of the signal. - decimals: Number of decimals to use when displaying signal values. - signal_type: Type of the signal. + unit: Unit of the signal. + decimals: Number of decimals to use when displaying signal values. + signal_type: Type of the signal. + downsampling_method: The default downsampling method to use when resampling. + change: The method used to calculate changes in this signal. """ def __init__( @@ -63,18 +70,24 @@ def __init__( unit: DerivedSignalUnit = DerivedSignalUnit.NUMBER, decimals: Optional[int] = None, signal_type: DerivedSignalType = DerivedSignalType.DERIVED_SIGNAL, + downsampling_method: Optional[Aggregation.ValueType] = None, + change: Optional[Change.ValueType] = None, ): """ Create metadata for a derived signal. Args: - unit: Unit of the signal. - decimals: Number of decimals to use when displaying signal values. - signal_type: Type of the signal. + unit: Unit of the signal. + decimals: Number of decimals to use when displaying signal values. + signal_type: Type of the signal. + downsampling_method: The default downsampling method to use when resampling. + change: The method used to calculate changes in this signal. """ self.unit = unit self.decimals = decimals self.signal_type = signal_type + self.downsampling_method = downsampling_method + self.change = change @staticmethod def from_proto(metadata: ProtoDerivedSignalMetadata) -> "DerivedSignalMetaData": @@ -83,6 +96,12 @@ def from_proto(metadata: ProtoDerivedSignalMetadata) -> "DerivedSignalMetaData": unit=DerivedSignalUnit(metadata.unit), decimals=metadata.decimals.value if metadata.HasField("decimals") else None, signal_type=DerivedSignalType(metadata.type), + downsampling_method=( + Aggregation.ValueType(metadata.downsampling_method) + if metadata.downsampling_method + else None + ), + change=Change.ValueType(metadata.change) if metadata.change else None, ) def to_proto(self) -> ProtoDerivedSignalMetadata: @@ -91,6 +110,12 @@ def to_proto(self) -> ProtoDerivedSignalMetadata: unit=self.unit.value, decimals=Int32Value(value=self.decimals) if self.decimals is not None else None, type=self.signal_type.value, + downsampling_method=( + int(self.downsampling_method) + if self.downsampling_method + else 0 # type: ignore[arg-type] + ), + change=int(self.change) if self.change else 0, # type: ignore[arg-type] ) def __eq__(self, other: object) -> bool: @@ -100,12 +125,15 @@ def __eq__(self, other: object) -> bool: self.decimals == other.decimals and self.unit == other.unit and self.signal_type == other.signal_type + and self.downsampling_method == other.downsampling_method + and self.change == other.change ) def __repr__(self) -> str: return ( f"DerivedSignalMetaData(decimals='{self.decimals}', unit='{self.unit}', signal_type=" - f"'{self.signal_type}')" + f"'{self.signal_type}', downsampling_method='{self.downsampling_method}', " + f"change='{self.change}')" ) @@ -120,6 +148,7 @@ class DerivedSignal: label: The label of the derived signal. expression: The expression of the derived signal. description: A description of the derived signal. + display_name: The display name of the signal. metadata: Metadata of the derived signal. """ @@ -129,6 +158,7 @@ def __init__( label: str, expression: str, description: Optional[str] = None, + display_name: Optional[str] = None, metadata: DerivedSignalMetaData = DerivedSignalMetaData(), ): """ @@ -142,32 +172,65 @@ def __init__( label: The label of the derived signal. expression: The expression of the derived signal. description: A description of the derived signal. + display_name: The display name of the signal. metadata: Metadata of the derived signal. """ self.name = name self.label = label self.expression = expression self.description = description + self.display_name = display_name self.metadata = metadata @staticmethod - def from_proto(signal: ProtoDerivedSignal) -> "DerivedSignal": - """Create a DerivedSignal from the given protobuf DerivedSignal.""" + def from_analytics_api_proto(signal: ProtoDerivedSignal) -> "DerivedSignal": + """Create a DerivedSignal from the given Analytics API protobuf DerivedSignal.""" return DerivedSignal( name=signal.name, label=signal.label, expression=signal.expression, - description=signal.description, + description=signal.description if signal.description else None, + display_name=signal.display_name if signal.display_name else None, metadata=DerivedSignalMetaData.from_proto(signal.metadata), ) - def to_proto(self) -> ProtoDerivedSignal: - """Create a protobuf DerivedSignal from this DerivedSignal.""" + @staticmethod + def from_data_api_proto( + data_api_signal: ProtoDataApiDerivedSignal, + ) -> "DerivedSignal": + """ + Create a DerivedSignal from the given Data API protobuf DerivedSignal. + + Maps the compatible fields (name, label, expression, description, display_name, + downsampling_method, change). Drops Data API specific fields data_sets, + highlighted and entity_set. + """ + metadata = DerivedSignalMetaData( + downsampling_method=( + Aggregation.ValueType(data_api_signal.downsampling_method) + if data_api_signal.downsampling_method + else None + ), + change=Change.ValueType(data_api_signal.change) if data_api_signal.change else None, + ) + + return DerivedSignal( + name=data_api_signal.name, + label=data_api_signal.label, + expression=data_api_signal.expression, + description=data_api_signal.description if data_api_signal.description else None, + display_name=data_api_signal.display_name if data_api_signal.display_name else None, + metadata=metadata, + ) + + def to_analytics_api_proto(self) -> ProtoDerivedSignal: + """Create an Analytics API protobuf DerivedSignal from this DerivedSignal.""" return ProtoDerivedSignal( name=self.name, label=self.label, expression=self.expression, description=self.description, + display_name=self.display_name, metadata=self.metadata.to_proto(), ) @@ -179,6 +242,7 @@ def __eq__(self, other: object) -> bool: and self.label == other.label and self.expression == other.expression and self.description == other.description + and self.display_name == other.display_name and self.metadata == other.metadata ) @@ -186,7 +250,7 @@ def __repr__(self) -> str: return ( f"DerivedSignal(name='{self.name}', label='{self.label}', " f"expression='{self.expression}', description='{self.description}', " - f"metadata={self.metadata})" + f"display_name='{self.display_name}', metadata={self.metadata})" ) def __lt__(self, other: object) -> bool: diff --git a/exabel_data_sdk/client/api/data_classes/fiscal_period.py b/exabel_data_sdk/client/api/data_classes/fiscal_period.py new file mode 100644 index 00000000..478cc829 --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/fiscal_period.py @@ -0,0 +1,38 @@ +from dataclasses import dataclass +from typing import Optional + +import pandas as pd + +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + FiscalPeriod as ProtoFiscalPeriod, +) + + +@dataclass +class FiscalPeriod: + """ + Represents a fiscal period. + + Attributes: + period_end: The end date of the fiscal period. + label: The label of the fiscal period. + """ + + period_end: Optional[pd.Timestamp] + label: Optional[str] + + @staticmethod + def from_proto(proto: ProtoFiscalPeriod) -> "FiscalPeriod": + """Create a FiscalPeriod from the given ProtoFiscalPeriod.""" + return FiscalPeriod( + period_end=( + pd.Timestamp( + year=proto.end_date.year, + month=proto.end_date.month, + day=proto.end_date.day, + ) + if proto.HasField("end_date") + else None + ), + label=proto.label if proto.label else None, + ) 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_reference.py similarity index 66% rename from exabel_data_sdk/client/api/data_classes/kpi_mapping_group.py rename to exabel_data_sdk/client/api/data_classes/kpi_mapping_group_reference.py index 0d111650..e58c70c9 100644 --- a/exabel_data_sdk/client/api/data_classes/kpi_mapping_group.py +++ b/exabel_data_sdk/client/api/data_classes/kpi_mapping_group_reference.py @@ -1,12 +1,12 @@ from dataclasses import dataclass from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( - KpiMappingGroup as ProtoKpiMappingGroup, + KpiMappingGroupReference as ProtoKpiMappingGroupReference, ) @dataclass -class KpiMappingGroup: +class KpiMappingGroupReference: """ A KPI mapping group. @@ -21,9 +21,9 @@ class KpiMappingGroup: vendor_display_name: str @staticmethod - def from_proto(proto: ProtoKpiMappingGroup) -> "KpiMappingGroup": - """Create a KpiMappingGroup from the given protobuf KpiMappingGroup.""" - return KpiMappingGroup( + def from_proto(proto: ProtoKpiMappingGroupReference) -> "KpiMappingGroupReference": + """Create a KpiMappingGroupReference from the given protobuf KpiMappingGroupReference.""" + return KpiMappingGroupReference( 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 index c0f1cb43..6d9fbe4b 100644 --- a/exabel_data_sdk/client/api/data_classes/kpi_mapping_model.py +++ b/exabel_data_sdk/client/api/data_classes/kpi_mapping_model.py @@ -1,6 +1,8 @@ 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_mapping_group_reference import ( + KpiMappingGroupReference, +) 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, @@ -17,13 +19,13 @@ class KpiMappingModel: data: The data for the model. """ - group: KpiMappingGroup + group: KpiMappingGroupReference 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), + group=KpiMappingGroupReference.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 index cb99e566..5d62b3c9 100644 --- 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 @@ -3,10 +3,16 @@ import pandas as pd -from exabel_data_sdk.client.api.data_classes.kpi_mapping_group import KpiMappingGroup +from exabel_data_sdk.client.api.data_classes.kpi_mapping_group_reference import ( + KpiMappingGroupReference, +) +from exabel_data_sdk.client.api.data_classes.model_quality import ModelQuality from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( KpiMappingResultData as ProtoKpiMappingResultData, ) +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + ModelQuality as ProtoModelQuality, +) @dataclass @@ -19,6 +25,7 @@ class KpiMappingResultData: 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. + model_quality: The quality of the 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). @@ -31,10 +38,11 @@ class KpiMappingResultData: last_value_date: The last date with a value for the KPI mapping proxy signal. """ - source: KpiMappingGroup + source: KpiMappingGroupReference model_mape: Optional[float] model_mae: Optional[float] model_hit_rate: Optional[float] + model_quality: Optional[ModelQuality] number_of_data_points: Optional[int] mae_pop: Optional[float] mae_yoy: Optional[float] @@ -50,10 +58,15 @@ class KpiMappingResultData: def from_proto(proto: ProtoKpiMappingResultData) -> "KpiMappingResultData": """Create a KpiMappingResultData from the given protobuf KpiMappingResultData.""" return KpiMappingResultData( - source=KpiMappingGroup.from_proto(proto.source), + source=KpiMappingGroupReference.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, + model_quality=( + ModelQuality.from_proto(proto.model_quality) + if proto.model_quality != ProtoModelQuality.MODEL_QUALITY_UNSPECIFIED + else None + ), number_of_data_points=( proto.number_of_data_points if proto.HasField("number_of_data_points") 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 index 6a30b66c..dea131ff 100644 --- a/exabel_data_sdk/client/api/data_classes/kpi_model.py +++ b/exabel_data_sdk/client/api/data_classes/kpi_model.py @@ -1,6 +1,8 @@ from dataclasses import dataclass +from typing import Optional from exabel_data_sdk.client.api.data_classes.kpi_model_data import KpiModelData +from exabel_data_sdk.client.api.data_classes.kpi_model_runs import KpiModelRuns 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 @@ -16,6 +18,7 @@ class KpiModel: display_name: The display name of the model. data: The data of the model. weights: The weight groups of the model. + model_runs: The model runs information. """ name: str @@ -23,6 +26,7 @@ class KpiModel: display_name: str data: KpiModelData weights: KpiModelWeightGroups + model_runs: Optional[KpiModelRuns] @staticmethod def from_proto(proto: ProtoKpiModel) -> "KpiModel": @@ -33,4 +37,7 @@ def from_proto(proto: ProtoKpiModel) -> "KpiModel": display_name=proto.display_name, data=KpiModelData.from_proto(proto.data), weights=KpiModelWeightGroups.from_proto(proto.weights), + model_runs=( + KpiModelRuns.from_proto(proto.model_runs) if proto.HasField("model_runs") else None + ), ) 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 index 3cab4e22..db531d29 100644 --- a/exabel_data_sdk/client/api/data_classes/kpi_model_data.py +++ b/exabel_data_sdk/client/api/data_classes/kpi_model_data.py @@ -1,9 +1,9 @@ from dataclasses import dataclass -from enum import Enum from typing import Optional import pandas as pd +from exabel_data_sdk.client.api.data_classes.model_quality import ModelQuality from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( KpiModelData as ProtoKpiModelData, ) @@ -12,32 +12,6 @@ ) -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: """ @@ -58,7 +32,9 @@ class KpiModelData: 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). + error_count: Number of data points used to calcuate the MAE and MAPE. hit_rate: The hit rate. + hit_rate_count: Number of data points used to calculate 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. @@ -78,7 +54,9 @@ class KpiModelData: mape_pit: Optional[float] mae: Optional[float] mae_pit: Optional[float] + error_count: Optional[int] hit_rate: Optional[float] + hit_rate_count: Optional[int] revision_1_week: Optional[float] revision_1_month: Optional[float] date: Optional[pd.Timestamp] @@ -114,7 +92,9 @@ def from_proto(proto: ProtoKpiModelData) -> "KpiModelData": 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, + error_count=proto.error_count if proto.HasField("error_count") else None, hit_rate=proto.hit_rate if proto.HasField("hit_rate") else None, + hit_rate_count=proto.hit_rate_count if proto.HasField("hit_rate_count") 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=( diff --git a/exabel_data_sdk/client/api/data_classes/kpi_model_run.py b/exabel_data_sdk/client/api/data_classes/kpi_model_run.py new file mode 100644 index 00000000..60408562 --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/kpi_model_run.py @@ -0,0 +1,55 @@ +from dataclasses import dataclass +from datetime import datetime +from typing import Optional + +from dateutil import tz +from google.protobuf.timestamp_pb2 import Timestamp as ProtoTimestamp + +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiModelRun as ProtoKpiModelRun, +) + + +@dataclass +class KpiModelRun: + """ + Information about a single KPI model run. + + Attributes: + created_at: The time the run was created. + started_at: The time the run was started. + finished_at: The time the run finished. + error: An optional error message if the run failed. + """ + + created_at: Optional[datetime] + started_at: Optional[datetime] + finished_at: Optional[datetime] + error: Optional[str] + + @staticmethod + def from_proto(proto: ProtoKpiModelRun) -> "KpiModelRun": + """Create a KpiModelRun from the given protobuf KpiModelRun.""" + return KpiModelRun( + created_at=( + KpiModelRun._proto_timestamp_to_datetime(proto.created_at) + if proto.HasField("created_at") + else None + ), + started_at=( + KpiModelRun._proto_timestamp_to_datetime(proto.started_at) + if proto.HasField("started_at") + else None + ), + finished_at=( + KpiModelRun._proto_timestamp_to_datetime(proto.finished_at) + if proto.HasField("finished_at") + else None + ), + error=proto.error if proto.HasField("error") else None, + ) + + @staticmethod + def _proto_timestamp_to_datetime(timestamp: ProtoTimestamp) -> Optional[datetime]: + """Convert a protobuf Timestamp to a datetime object.""" + return datetime.fromtimestamp(timestamp.seconds, tz=tz.tzutc()) diff --git a/exabel_data_sdk/client/api/data_classes/kpi_model_runs.py b/exabel_data_sdk/client/api/data_classes/kpi_model_runs.py new file mode 100644 index 00000000..8d2acb7a --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/kpi_model_runs.py @@ -0,0 +1,40 @@ +from dataclasses import dataclass +from typing import Optional + +from exabel_data_sdk.client.api.data_classes.kpi_model_run import KpiModelRun +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( + KpiModelRuns as ProtoKpiModelRuns, +) + + +@dataclass +class KpiModelRuns: + """ + Information about the runs for a KPI model. + + Attributes: + initial_run: Initial run. + daily_run: Latest daily run. + pit_backtest_run: PiT backtest run. + """ + + initial_run: Optional[KpiModelRun] + daily_run: Optional[KpiModelRun] + pit_backtest_run: Optional[KpiModelRun] + + @staticmethod + def from_proto(proto: ProtoKpiModelRuns) -> "KpiModelRuns": + """Create a KpiModelRuns from the given protobuf KpiModelRuns.""" + return KpiModelRuns( + initial_run=( + KpiModelRun.from_proto(proto.initial_run) if proto.HasField("initial_run") else None + ), + daily_run=( + KpiModelRun.from_proto(proto.daily_run) if proto.HasField("daily_run") else None + ), + pit_backtest_run=( + KpiModelRun.from_proto(proto.pit_backtest_run) + if proto.HasField("pit_backtest_run") + else None + ), + ) 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 index 26592124..cc1dc684 100644 --- 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 @@ -1,7 +1,9 @@ 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.client.api.data_classes.kpi_mapping_group_reference import ( + KpiMappingGroupReference, +) from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_messages_pb2 import ( KpiModelFeatureWeight as ProtoKpiModelFeatureWeight, ) @@ -49,7 +51,7 @@ class KpiModelWeightGroup: """ display_name: str - group: Optional[KpiMappingGroup] + group: Optional[KpiMappingGroupReference] weights: Sequence[KpiModelFeatureWeight] @staticmethod @@ -57,7 +59,11 @@ 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, + group=( + KpiMappingGroupReference.from_proto(proto.group) + if proto.HasField("group") + else None + ), weights=[KpiModelFeatureWeight.from_proto(w) for w in proto.feature_weights], ) diff --git a/exabel_data_sdk/client/api/data_classes/model_quality.py b/exabel_data_sdk/client/api/data_classes/model_quality.py new file mode 100644 index 00000000..10b16e1d --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/model_quality.py @@ -0,0 +1,31 @@ +from enum import Enum + +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") diff --git a/exabel_data_sdk/client/api/data_classes/model_results.py b/exabel_data_sdk/client/api/data_classes/model_results.py new file mode 100644 index 00000000..daf6bd05 --- /dev/null +++ b/exabel_data_sdk/client/api/data_classes/model_results.py @@ -0,0 +1,59 @@ +from dataclasses import dataclass +from typing import Sequence + +from exabel_data_sdk.client.api.data_classes.company_kpi_model_result import CompanyKpiModelResult +from exabel_data_sdk.client.api.data_classes.fiscal_period import FiscalPeriod +from exabel_data_sdk.client.api.data_classes.kpi_hierarchy import KpiHierarchy +from exabel_data_sdk.stubs.exabel.api.analytics.v1.kpi_service_pb2 import ( + ListCompanyBaseModelResultsResponse, + ListCompanyHierarchicalModelResultsResponse, +) + + +@dataclass +class BaseModelResults: + """ + Base model results for a company. + + Attributes: + results: List of results. + fiscal_period: Fiscal period the results are for. + """ + + results: Sequence[CompanyKpiModelResult] + fiscal_period: FiscalPeriod + + @staticmethod + def from_proto(proto: ListCompanyBaseModelResultsResponse) -> "BaseModelResults": + """Create a BaseModelResults from the given protobuf message.""" + return BaseModelResults( + results=[CompanyKpiModelResult.from_proto(r) for r in proto.results], + fiscal_period=FiscalPeriod.from_proto(proto.period), + ) + + +@dataclass +class HierarchicalModelResults: + """ + Hierarchical model results for a company. + + Attributes: + results: List of results. + hierarchy: Hierarchy the results are for. + fiscal_period: Fiscal period the results are for. + """ + + results: Sequence[CompanyKpiModelResult] + hierarchy: KpiHierarchy + fiscal_period: FiscalPeriod + + @staticmethod + def from_proto( + proto: ListCompanyHierarchicalModelResultsResponse, + ) -> "HierarchicalModelResults": + """Create a HierarchicalModelResults from the given protobuf message.""" + return HierarchicalModelResults( + results=[CompanyKpiModelResult.from_proto(r) for r in proto.results], + hierarchy=KpiHierarchy.from_proto(proto.kpi_hierarchy), + fiscal_period=FiscalPeriod.from_proto(proto.period), + ) diff --git a/exabel_data_sdk/client/api/derived_signal_api.py b/exabel_data_sdk/client/api/derived_signal_api.py index ed43c41c..913ace8f 100644 --- a/exabel_data_sdk/client/api/derived_signal_api.py +++ b/exabel_data_sdk/client/api/derived_signal_api.py @@ -34,9 +34,9 @@ def create_derived_signal( If not provided, the signal will be put in the default analytics API folder. """ response = self.client.create_derived_signal( - CreateDerivedSignalRequest(signal=signal.to_proto(), folder=folder) + CreateDerivedSignalRequest(signal=signal.to_analytics_api_proto(), folder=folder) ) - return DerivedSignal.from_proto(response) + return DerivedSignal.from_analytics_api_proto(response) def get_derived_signal(self, name: str) -> Optional[DerivedSignal]: """ @@ -53,7 +53,7 @@ def get_derived_signal(self, name: str) -> Optional[DerivedSignal]: if error.error_type == ErrorType.NOT_FOUND: return None raise - return DerivedSignal.from_proto(response) + return DerivedSignal.from_analytics_api_proto(response) def update_derived_signal(self, signal: DerivedSignal) -> DerivedSignal: """ @@ -63,9 +63,9 @@ def update_derived_signal(self, signal: DerivedSignal) -> DerivedSignal: signal: The derived signal to update. """ response = self.client.update_derived_signal( - UpdateDerivedSignalRequest(signal=signal.to_proto()) + UpdateDerivedSignalRequest(signal=signal.to_analytics_api_proto()) ) - return DerivedSignal.from_proto(response) + return DerivedSignal.from_analytics_api_proto(response) def delete_derived_signal(self, name: str) -> None: """ diff --git a/exabel_data_sdk/client/api/export_api.py b/exabel_data_sdk/client/api/export_api.py index dae58d50..7a643bf8 100644 --- a/exabel_data_sdk/client/api/export_api.py +++ b/exabel_data_sdk/client/api/export_api.py @@ -66,6 +66,18 @@ def from_api_key(api_key: str, use_test_backend: bool = False, retries: int = 0) backend = "export.api-test.exabel.com" if use_test_backend else "export.api.exabel.com" return ExportApi(auth_headers={"x-api-key": api_key}, backend=backend, retries=retries) + @staticmethod + def from_access_token( + access_token: str, use_test_backend: bool = False, retries: int = 0 + ) -> "ExportApi": + """Create an `ExportApi` from an access token.""" + backend = "export.api-test.exabel.com" if use_test_backend else "export.api.exabel.com" + return ExportApi( + auth_headers={"authorization": f"Bearer {access_token}"}, + backend=backend, + retries=retries, + ) + def run_query_bytes(self, query: Union[str, Query], file_format: str) -> bytes: """ Run an export data query, and returns a byte string with the file in the requested format. diff --git a/exabel_data_sdk/client/api/kpi_api.py b/exabel_data_sdk/client/api/kpi_api.py index b199620c..7907a82d 100644 --- a/exabel_data_sdk/client/api/kpi_api.py +++ b/exabel_data_sdk/client/api/kpi_api.py @@ -6,11 +6,14 @@ 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.model_results import ( + BaseModelResults, + HierarchicalModelResults, +) 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 ( @@ -62,7 +65,7 @@ def list_company_base_model_results( source_filter: Optional[KpiSource] = None, fiscal_period: Union[Literal["previous", "current", "next"], pd.Timestamp] = "current", freq: Optional[Literal["FQ", "FS", "FY"]] = None, - ) -> Sequence[CompanyKpiModelResult]: + ) -> BaseModelResults: """ List base model results for a company. @@ -79,7 +82,7 @@ def list_company_base_model_results( 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] + return BaseModelResults.from_proto(response) def list_company_hierarchical_model_results( self, @@ -87,7 +90,7 @@ def list_company_hierarchical_model_results( source_filter: Optional[KpiSource] = None, fiscal_period: Union[Literal["previous", "current", "next"], pd.Timestamp] = "current", freq: Optional[Literal["FQ", "FS", "FY"]] = None, - ) -> Sequence[CompanyKpiModelResult]: + ) -> HierarchicalModelResults: """ List hierarchical model results for a company. @@ -104,7 +107,7 @@ def list_company_hierarchical_model_results( 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] + return HierarchicalModelResults.from_proto(response) def list_company_kpi_mapping_results( self, diff --git a/exabel_data_sdk/client/api/signal_api.py b/exabel_data_sdk/client/api/signal_api.py index d0e478da..3b8472b4 100644 --- a/exabel_data_sdk/client/api/signal_api.py +++ b/exabel_data_sdk/client/api/signal_api.py @@ -1,8 +1,9 @@ -from typing import Iterator, Optional +from typing import Dict, Iterator, List, Optional from google.protobuf.field_mask_pb2 import FieldMask from exabel_data_sdk.client.api.api_client.grpc.signal_grpc_client import SignalGrpcClient +from exabel_data_sdk.client.api.data_classes.derived_signal import DerivedSignal from exabel_data_sdk.client.api.data_classes.paging_result import PagingResult from exabel_data_sdk.client.api.data_classes.request_error import ErrorType, RequestError from exabel_data_sdk.client.api.data_classes.signal import Signal @@ -11,6 +12,7 @@ from exabel_data_sdk.stubs.exabel.api.data.v1.all_pb2 import ( CreateSignalRequest, DeleteSignalRequest, + FilterDerivedSignalsRequest, GetSignalRequest, ListSignalsRequest, UpdateSignalRequest, @@ -125,3 +127,29 @@ def delete_signal(self, name: str) -> None: self.client.delete_signal( DeleteSignalRequest(name=name), ) + + def filter_derived_signals(self, entity_names: List[str]) -> Dict[str, List[DerivedSignal]]: + """ + Filter derived signals by entity names. + + Gets all derived signals that apply to at least one of several entities. + + Selects from all derived data signals available to your customer (including those + created by you, in the global catalog, and from data sets you are subscribed to), + those signals that apply to at least one of the requested entities. + + Args: + entity_names: The resource names of the entities to filter on. At least one + entity must be specified. A derived signal is returned only if + at least one of the entities are included in the signal. + + Returns: + Dictionary mapping data set resource names to DerivedSignals collections. + """ + response = self.client.filter_derived_signals( + FilterDerivedSignalsRequest(entity_names=entity_names) + ) + return { + dataset_name: [DerivedSignal.from_data_api_proto(d) for d in signals.derived_signals] + for dataset_name, signals in response.derived_signals.items() + } diff --git a/exabel_data_sdk/client/client_config.py b/exabel_data_sdk/client/client_config.py index 5f467fd1..08ff8e37 100644 --- a/exabel_data_sdk/client/client_config.py +++ b/exabel_data_sdk/client/client_config.py @@ -11,6 +11,7 @@ class DefaultConfig: def __init__(self) -> None: self.api_key = os.getenv("EXABEL_API_KEY") + self.access_token = os.getenv("EXABEL_ACCESS_TOKEN") self.client_name = os.getenv("EXABEL_CLIENT_NAME", "Exabel Python SDK") self.data_api_host = os.getenv("EXABEL_DATA_API_HOST", "data.api.exabel.com") self.analytics_api_host = os.getenv("EXABEL_ANALYTICS_API_HOST", "analytics.api.exabel.com") @@ -33,6 +34,7 @@ class ClientConfig(DefaultConfig): def __init__( self, api_key: Optional[str] = None, + access_token: Optional[str] = None, client_name: Optional[str] = None, data_api_host: Optional[str] = None, analytics_api_host: Optional[str] = None, @@ -49,6 +51,7 @@ def __init__( Args: api_key: API key to use. + access_token: Access token to use. client_name: Name of this client. data_api_host: Exabel Data API host. analytics_api_host: Exabel Analytics API host. @@ -62,7 +65,10 @@ def __init__( """ super().__init__() - self.api_key = api_key or self.api_key + # Arguments take presedence over environment variables + if api_key or access_token: + self.api_key = api_key + self.access_token = access_token self.client_name = client_name or self.client_name self.data_api_host = data_api_host or self.data_api_host self.analytics_api_host = analytics_api_host or self.analytics_api_host @@ -74,5 +80,13 @@ def __init__( self.root_certificates = root_certificates or self.root_certificates self.extra_headers = extra_headers or self.extra_headers - if not self.api_key: - raise ValueError("No API key given. Use of the Exabel SDK requires an API key.") + if self.api_key and self.access_token: + raise ValueError( + "Both API key and access token given. Only one of these should be set." + ) + + if not self.api_key and not self.access_token: + raise ValueError( + "No API key or access token given. Use of the Exabel SDK requires either an " + "API key or access token." + ) diff --git a/exabel_data_sdk/client/exabel_client.py b/exabel_data_sdk/client/exabel_client.py index f8d51e4a..c3fe152b 100644 --- a/exabel_data_sdk/client/exabel_client.py +++ b/exabel_data_sdk/client/exabel_client.py @@ -1,5 +1,6 @@ from typing import Optional, Sequence, Tuple +from exabel_data_sdk.client.api.calendar_api import CalendarApi 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 @@ -23,6 +24,7 @@ class ExabelClient: def __init__( self, api_key: Optional[str] = None, + access_token: Optional[str] = None, client_name: Optional[str] = None, data_api_host: Optional[str] = None, analytics_api_host: Optional[str] = None, @@ -38,10 +40,11 @@ def __init__( Initialize a new client. Args: - api_key: API key to use. If not set, the API key must be set using the - environment variable EXABEL_API_KEY. If set to the value 'NO_KEY', - the client will use an insecure channel, typically used for local - testing. + api_key: API key to use. Only one of api_key and access_token must be + given. If set to the value 'NO_KEY', the client will use an + insecure channel, typically used for local testing. + access_token: Access token to use. Only one of api_key and access_token must be + given. client_name: Override name of this client. Default name is "Exabel Python SDK". data_api_host: Override default Exabel Data API host. analytics_api_host: Override default Exabel Analytics API host. @@ -54,6 +57,7 @@ def __init__( """ config = ClientConfig( api_key=api_key, + access_token=access_token, client_name=client_name, data_api_host=data_api_host, analytics_api_host=analytics_api_host, @@ -77,6 +81,7 @@ def __init__( self.user_api = UserApi(config) self.library_api = LibraryApi(config) self.kpi_api = KpiApi(config) + self.calendar_api = CalendarApi(config) self.namespace_api = NamespaceApi(config) self._namespace: Optional[str] = None diff --git a/exabel_data_sdk/scripts/base_script.py b/exabel_data_sdk/scripts/base_script.py index 361afc2a..670516f6 100644 --- a/exabel_data_sdk/scripts/base_script.py +++ b/exabel_data_sdk/scripts/base_script.py @@ -2,7 +2,7 @@ import argparse import os import urllib.parse -from typing import Callable, Optional, Sequence, Tuple +from typing import Optional, Sequence, Tuple from exabel_data_sdk import ExabelClient from exabel_data_sdk.scripts.command_line_script import CommandLineScript @@ -15,20 +15,24 @@ def __init__( self, argv: Sequence[str], description: str, - api_key_retriever: Optional[Callable[[argparse.Namespace], str]] = None, ): super().__init__(argv, description) - self.api_key_retriever = api_key_retriever - if api_key_retriever is None: - api_key = os.getenv("EXABEL_API_KEY") - help_text = "The API key to use" - if api_key: - help_text += " (found in EXABEL_API_KEY environment variable)" - else: - help_text += ". Can also be specified in the EXABEL_API_KEY environment variable." - group = self.parser.add_mutually_exclusive_group(required=not api_key) - group.add_argument("--api-key", type=str, help=help_text) - group.add_argument("--gcp-project-number", type=str, help=argparse.SUPPRESS) + api_key = os.getenv("EXABEL_API_KEY") + access_token = os.getenv("EXABEL_ACCESS_TOKEN") + group = self.parser.add_mutually_exclusive_group(required=not api_key and not access_token) + group.add_argument( + "--api-key", + type=str, + help="The API key to use. Can also be specified in the EXABEL_API_KEY environment " + "variable.", + ) + group.add_argument( + "--access-token", + type=str, + help="The access token to use. Can also be specified in the EXABEL_ACCESS_TOKEN " + "environment variable.", + ) + group.add_argument("--gcp-project-number", type=str, help=argparse.SUPPRESS) self.parser.add_argument( "--exabel-data-api-host", required=False, @@ -51,11 +55,21 @@ def __init__( def run(self) -> None: args = self.parse_arguments() self.setup_logging() - api_key = ( - self.api_key_retriever(args) if self.api_key_retriever is not None else args.api_key - ) + api_key = args.api_key + access_token = args.access_token + # Command line argument takes precedence over environment variables. + if not api_key and not access_token and not args.gcp_project_number: + api_key = os.getenv("EXABEL_API_KEY") + access_token = os.getenv("EXABEL_ACCESS_TOKEN") + if api_key and access_token: + raise ValueError("Only one of EXABEL_API_KEY and EXABEL_ACCESS_TOKEN can be set.") + if not api_key and not access_token: + raise ValueError( + "No authentication information. Provide an API key or access token." + ) + extra_headers = [] - if self.api_key_retriever is None and args.gcp_project_number: + if args.gcp_project_number: api_key = "NO_KEY" extra_headers = [ ("x-endpoint-api-consumer-type", "PROJECT"), @@ -76,6 +90,7 @@ def run(self) -> None: management_api_host=management_api_host, management_api_port=management_api_port, api_key=api_key, + access_token=access_token, extra_headers=extra_headers, ) self.run_script(client, args) diff --git a/exabel_data_sdk/scripts/export_data.py b/exabel_data_sdk/scripts/export_data.py index e47f55fe..eca89f32 100644 --- a/exabel_data_sdk/scripts/export_data.py +++ b/exabel_data_sdk/scripts/export_data.py @@ -46,17 +46,24 @@ def parse_arguments(self) -> argparse.Namespace: auth_group.add_argument( "--reauthenticate", action="store_true", - help="Reauthenticate the default user, for example to login to a different tenant", + help="Reauthenticate the default user, for example to login to a different tenant " + "[deprecated - use --access-token]", ) auth_group.add_argument( "--api-key", type=str, - help="Authenticate with an API key instead of an Exabel user account", + help="Authenticate using an API key", + ) + auth_group.add_argument( + "--access-token", + type=str, + help="Authenticate using an access token", ) auth_group.add_argument( "--user", type=str, - help="The Exabel user to log in as, e.g. `my_user@enterprise.com`", + help="The Exabel user to log in as, e.g. `my_user@enterprise.com` [deprecated - use " + "--access-token]", ) parser.add_argument( "--use-test-backend", @@ -72,11 +79,24 @@ def get_export_api( use_test_backend: bool = False, user: Optional[str] = None, retries: int = 0, + access_token: Optional[str] = None, ) -> ExportApi: - """Get an `ExportApi` from an API key or user authentication.""" - api_key = api_key or os.getenv("EXABEL_API_KEY") + """Get an `ExportApi` from an API key, access token, or user authentication.""" + # Command line argument takes precedence over environment variables. + if not api_key and not access_token and not user: + api_key = os.getenv("EXABEL_API_KEY") + access_token = os.getenv("EXABEL_ACCESS_TOKEN") + if api_key and access_token: + raise ValueError("Only one of EXABEL_API_KEY and EXABEL_ACCESS_TOKEN can be set.") if api_key: return ExportApi.from_api_key(api_key, use_test_backend, retries=retries) + if access_token: + return ExportApi.from_access_token(access_token, use_test_backend, retries=retries) + + sys.stderr.write( + "Username/password authentication is deprecated. Change to --access-token.\n" + ) + login = UserLogin(reauthenticate, use_test_backend, user) headers = login.get_auth_headers() return ExportApi(auth_headers=headers, backend=login.backend, retries=retries) @@ -86,7 +106,12 @@ def run(self) -> None: args = self.parse_arguments() self.setup_logging() export_api = ExportData.get_export_api( - args.api_key, args.reauthenticate, args.use_test_backend, args.user, args.retries + args.api_key, + args.reauthenticate, + args.use_test_backend, + args.user, + args.retries, + args.access_token, ) content = export_api.run_query_bytes(query=args.query, file_format=args.format) with open(args.filename, "wb") as file: diff --git a/exabel_data_sdk/scripts/list_folders.py b/exabel_data_sdk/scripts/list_folders.py index 89e1b7f4..10984c61 100644 --- a/exabel_data_sdk/scripts/list_folders.py +++ b/exabel_data_sdk/scripts/list_folders.py @@ -1,6 +1,5 @@ import argparse import sys -from typing import Sequence from exabel_data_sdk import ExabelClient from exabel_data_sdk.scripts.base_script import BaseScript @@ -11,9 +10,6 @@ class ListFolders(BaseScript): Lists all the accessible folders. """ - def __init__(self, argv: Sequence[str], description: str): - super().__init__(argv, description) - def run_script(self, client: ExabelClient, args: argparse.Namespace) -> None: folders = client.library_api.list_folders() print("Folders:") diff --git a/exabel_data_sdk/services/file_loading_exception.py b/exabel_data_sdk/services/file_loading_exception.py index 1b7f4409..e959cf83 100644 --- a/exabel_data_sdk/services/file_loading_exception.py +++ b/exabel_data_sdk/services/file_loading_exception.py @@ -11,7 +11,7 @@ def __init__( self, message: str, *, - failures: Optional[Sequence[ResourceCreationResult[ResourceT]]] = None + failures: Optional[Sequence[ResourceCreationResult[ResourceT]]] = None, ): super().__init__(message) self.message = message 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 1ea2a317..c8b1b599 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,9 @@ +from . import common_messages_pb2 from . import derived_signal_messages_pb2 from . import derived_signal_service_pb2 from . import item_messages_pb2 +from . import kpi_mapping_messages_pb2 +from . import kpi_mapping_service_pb2 from . import kpi_messages_pb2 from . import kpi_service_pb2 from . import prediction_model_messages_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 695da533..d5106c56 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 @@ -1,9 +1,12 @@ # Generated by generate_protobuf.sh. # Contains all messages in *_pb2.py in a single module. +from .common_messages_pb2 import * from .derived_signal_messages_pb2 import * from .derived_signal_service_pb2 import * from .item_messages_pb2 import * +from .kpi_mapping_messages_pb2 import * +from .kpi_mapping_service_pb2 import * from .kpi_messages_pb2 import * from .kpi_service_pb2 import * from .prediction_model_messages_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 79587bc0..ebd632cf 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 @@ -1,9 +1,12 @@ # Generated by generate_protobuf.sh. # Contains all messages in *_pb2_grpc.py in a single module. +from .common_messages_pb2_grpc import * from .derived_signal_messages_pb2_grpc import * from .derived_signal_service_pb2_grpc import * from .item_messages_pb2_grpc import * +from .kpi_mapping_messages_pb2_grpc import * +from .kpi_mapping_service_pb2_grpc import * from .kpi_messages_pb2_grpc import * from .kpi_service_pb2_grpc import * from .prediction_model_messages_pb2_grpc import * diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/common_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/common_messages_pb2.py new file mode 100644 index 00000000..9c9fba34 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/common_messages_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/analytics/v1/common_messages.proto') +_sym_db = _symbol_database.Default() +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n-exabel/api/analytics/v1/common_messages.proto\x12\x17exabel.api.analytics.v1"+\n\tEntitySet\x12\x10\n\x08entities\x18\x01 \x03(\t\x12\x0c\n\x04tags\x18\x02 \x03(\tBT\n\x1bcom.exabel.api.analytics.v1B\x16EntitySetMessagesProtoP\x01Z\x1bexabel.com/api/analytics/v1b\x06proto3') +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'exabel.api.analytics.v1.common_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\x16EntitySetMessagesProtoP\x01Z\x1bexabel.com/api/analytics/v1' + _globals['_ENTITYSET']._serialized_start = 74 + _globals['_ENTITYSET']._serialized_end = 117 \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/common_messages_pb2.pyi b/exabel_data_sdk/stubs/exabel/api/analytics/v1/common_messages_pb2.pyi new file mode 100644 index 00000000..3f6888d9 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/common_messages_pb2.pyi @@ -0,0 +1,33 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +Copyright (c) 2025 Exabel AS. All rights reserved.""" +import builtins +import collections.abc +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message +import typing +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +@typing.final +class EntitySet(google.protobuf.message.Message): + """Defines a set of entities by a combination of individual entities and/or tags.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + ENTITIES_FIELD_NUMBER: builtins.int + TAGS_FIELD_NUMBER: builtins.int + + @property + def entities(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Individual entity resource names (e.g., "entityTypes/company/entities/F_000C7F-E").""" + + @property + def tags(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Tag resource names (e.g., "tags/123").""" + + def __init__(self, *, entities: collections.abc.Iterable[builtins.str] | None=..., tags: collections.abc.Iterable[builtins.str] | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['entities', b'entities', 'tags', b'tags']) -> None: + ... +global___EntitySet = EntitySet \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/common_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/common_messages_pb2_grpc.py new file mode 100644 index 00000000..9da03ccb --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/common_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.2' +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/common_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/derived_signal_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2_grpc.py index b9cd2974..0863007c 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 e5bec74f..d065dc15 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 1631809b..0c5ac38a 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.py new file mode 100644 index 00000000..9a0af463 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.py @@ -0,0 +1,30 @@ +"""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_mapping_messages.proto') +_sym_db = _symbol_database.Default() +from .....exabel.api.analytics.v1 import common_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_common__messages__pb2 +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 kpi_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_kpi__messages__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'\n2exabel/api/analytics/v1/kpi_mapping_messages.proto\x12\x17exabel.api.analytics.v1\x1a-exabel/api/analytics/v1/common_messages.proto\x1a5exabel/api/analytics/v1/derived_signal_messages.proto\x1a*exabel/api/analytics/v1/kpi_messages.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a.protoc_gen_openapiv2/options/annotations.proto"\x9c\x03\n\x0fKpiMappingGroup\x12I\n\x04name\x18\x01 \x01(\tB;\x92A5J\x1a"kpiMappings/123/groups/4"\xca>\x16\xfa\x02\x13kpiMappingGroupName\xe0A\x05\x12\x14\n\x0cdisplay_name\x18\x02 \x01(\t\x12)\n\x03kpi\x18\x03 \x01(\x0b2\x1c.exabel.api.analytics.v1.Kpi\x12<\n\x0cproxy_signal\x18\x04 \x01(\x0b2&.exabel.api.analytics.v1.DerivedSignal\x12?\n\x04type\x18\x05 \x01(\x0e2,.exabel.api.analytics.v1.KpiMappingGroupTypeB\x03\xe0A\x05\x126\n\nentity_set\x18\x06 \x01(\x0b2".exabel.api.analytics.v1.EntitySet\x12F\n\x15proxy_resample_method\x18\x07 \x01(\x0e2\'.exabel.api.analytics.v1.ResampleMethod*]\n\x13KpiMappingGroupType\x12&\n"KPI_MAPPING_GROUP_TYPE_UNSPECIFIED\x10\x00\x12\x08\n\x04BULK\x10\x01\x12\x14\n\x10COMPANY_SPECIFIC\x10\x02*\xad\x01\n\x0eResampleMethod\x12\x1f\n\x1bRESAMPLE_METHOD_UNSPECIFIED\x10\x00\x12\x0f\n\x0bNO_RESAMPLE\x10\x01\x12\x11\n\rRESAMPLE_MEAN\x10\x02\x12\x10\n\x0cRESAMPLE_SUM\x10\x03\x12\x13\n\x0fRESAMPLE_MEDIAN\x10\x04\x12\x1c\n\x18RESAMPLE_MEAN_TIMES_DAYS\x10\x05\x12\x11\n\rRESAMPLE_LAST\x10\x06BZ\n\x1bcom.exabel.api.analytics.v1B\x1cKpiMappingGroupMessagesProtoP\x01Z\x1bexabel.com/api/analytics/v1b\x06proto3') +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'exabel.api.analytics.v1.kpi_mapping_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\x1cKpiMappingGroupMessagesProtoP\x01Z\x1bexabel.com/api/analytics/v1' + _globals['_KPIMAPPINGGROUP'].fields_by_name['name']._loaded_options = None + _globals['_KPIMAPPINGGROUP'].fields_by_name['name']._serialized_options = b'\x92A5J\x1a"kpiMappings/123/groups/4"\xca>\x16\xfa\x02\x13kpiMappingGroupName\xe0A\x05' + _globals['_KPIMAPPINGGROUP'].fields_by_name['type']._loaded_options = None + _globals['_KPIMAPPINGGROUP'].fields_by_name['type']._serialized_options = b'\xe0A\x05' + _globals['_KPIMAPPINGGROUPTYPE']._serialized_start = 721 + _globals['_KPIMAPPINGGROUPTYPE']._serialized_end = 814 + _globals['_RESAMPLEMETHOD']._serialized_start = 817 + _globals['_RESAMPLEMETHOD']._serialized_end = 990 + _globals['_KPIMAPPINGGROUP']._serialized_start = 307 + _globals['_KPIMAPPINGGROUP']._serialized_end = 719 \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.pyi b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.pyi new file mode 100644 index 00000000..f47a8d67 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.pyi @@ -0,0 +1,122 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +Copyright (c) 2025 Exabel AS. All rights reserved.""" +import builtins +from ..... import exabel +import google.protobuf.descriptor +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 _KpiMappingGroupType: + ValueType = typing.NewType('ValueType', builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _KpiMappingGroupTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_KpiMappingGroupType.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + KPI_MAPPING_GROUP_TYPE_UNSPECIFIED: _KpiMappingGroupType.ValueType + 'Unspecified.' + BULK: _KpiMappingGroupType.ValueType + 'Bulk mapping groups.' + COMPANY_SPECIFIC: _KpiMappingGroupType.ValueType + 'Company specific mapping groups.' + +class KpiMappingGroupType(_KpiMappingGroupType, metaclass=_KpiMappingGroupTypeEnumTypeWrapper): + """Specifies KPI mapping group types.""" +KPI_MAPPING_GROUP_TYPE_UNSPECIFIED: KpiMappingGroupType.ValueType +'Unspecified.' +BULK: KpiMappingGroupType.ValueType +'Bulk mapping groups.' +COMPANY_SPECIFIC: KpiMappingGroupType.ValueType +'Company specific mapping groups.' +global___KpiMappingGroupType = KpiMappingGroupType + +class _ResampleMethod: + ValueType = typing.NewType('ValueType', builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _ResampleMethodEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_ResampleMethod.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + RESAMPLE_METHOD_UNSPECIFIED: _ResampleMethod.ValueType + 'Unspecified.' + NO_RESAMPLE: _ResampleMethod.ValueType + 'No resampling.' + RESAMPLE_MEAN: _ResampleMethod.ValueType + 'Mean.' + RESAMPLE_SUM: _ResampleMethod.ValueType + 'Sum.' + RESAMPLE_MEDIAN: _ResampleMethod.ValueType + 'Median.' + RESAMPLE_MEAN_TIMES_DAYS: _ResampleMethod.ValueType + 'Mean times days.' + RESAMPLE_LAST: _ResampleMethod.ValueType + 'Last.' + +class ResampleMethod(_ResampleMethod, metaclass=_ResampleMethodEnumTypeWrapper): + """Specifies how to resample a signal.""" +RESAMPLE_METHOD_UNSPECIFIED: ResampleMethod.ValueType +'Unspecified.' +NO_RESAMPLE: ResampleMethod.ValueType +'No resampling.' +RESAMPLE_MEAN: ResampleMethod.ValueType +'Mean.' +RESAMPLE_SUM: ResampleMethod.ValueType +'Sum.' +RESAMPLE_MEDIAN: ResampleMethod.ValueType +'Median.' +RESAMPLE_MEAN_TIMES_DAYS: ResampleMethod.ValueType +'Mean times days.' +RESAMPLE_LAST: ResampleMethod.ValueType +'Last.' +global___ResampleMethod = ResampleMethod + +@typing.final +class KpiMappingGroup(google.protobuf.message.Message): + """A KPI mapping group.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + NAME_FIELD_NUMBER: builtins.int + DISPLAY_NAME_FIELD_NUMBER: builtins.int + KPI_FIELD_NUMBER: builtins.int + PROXY_SIGNAL_FIELD_NUMBER: builtins.int + TYPE_FIELD_NUMBER: builtins.int + ENTITY_SET_FIELD_NUMBER: builtins.int + PROXY_RESAMPLE_METHOD_FIELD_NUMBER: builtins.int + name: builtins.str + 'Resource name. E.g "kpiMappings/123/groups/4".' + display_name: builtins.str + 'Display name.' + type: global___KpiMappingGroupType.ValueType + 'Type of KPI mapping group.' + proxy_resample_method: global___ResampleMethod.ValueType + 'Specifies how to resample the proxy signal.' + + @property + def kpi(self) -> exabel.api.analytics.v1.kpi_messages_pb2.Kpi: + """The KPI for the group.""" + + @property + def proxy_signal(self) -> exabel.api.analytics.v1.derived_signal_messages_pb2.DerivedSignal: + """Proxy signal.""" + + @property + def entity_set(self) -> exabel.api.analytics.v1.common_messages_pb2.EntitySet: + """The entities for which this group defines KPI mappings. + All the entities must be companies. + """ + + def __init__(self, *, name: builtins.str | None=..., display_name: builtins.str | None=..., kpi: exabel.api.analytics.v1.kpi_messages_pb2.Kpi | None=..., proxy_signal: exabel.api.analytics.v1.derived_signal_messages_pb2.DerivedSignal | None=..., type: global___KpiMappingGroupType.ValueType | None=..., entity_set: exabel.api.analytics.v1.common_messages_pb2.EntitySet | None=..., proxy_resample_method: global___ResampleMethod.ValueType | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['entity_set', b'entity_set', 'kpi', b'kpi', 'proxy_signal', b'proxy_signal']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['display_name', b'display_name', 'entity_set', b'entity_set', 'kpi', b'kpi', 'name', b'name', 'proxy_resample_method', b'proxy_resample_method', 'proxy_signal', b'proxy_signal', 'type', b'type']) -> None: + ... +global___KpiMappingGroup = KpiMappingGroup \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2_grpc.py new file mode 100644 index 00000000..28ff0b12 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_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.2' +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_mapping_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_mapping_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2.py new file mode 100644 index 00000000..616d61d2 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2.py @@ -0,0 +1,50 @@ +"""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_mapping_service.proto') +_sym_db = _symbol_database.Default() +from .....exabel.api.analytics.v1 import kpi_mapping_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__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 google.protobuf import field_mask_pb2 as google_dot_protobuf_dot_field__mask__pb2 +from .....protoc_gen_openapiv2.options import annotations_pb2 as protoc__gen__openapiv2_dot_options_dot_annotations__pb2 +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n1exabel/api/analytics/v1/kpi_mapping_service.proto\x12\x17exabel.api.analytics.v1\x1a2exabel/api/analytics/v1/kpi_mapping_messages.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a google/protobuf/field_mask.proto\x1a.protoc_gen_openapiv2/options/annotations.proto"\x94\x01\n\x1cCreateKpiMappingGroupRequest\x12*\n\x06parent\x18\x01 \x01(\tB\x1a\x92A\x14\xca>\x11\xfa\x02\x0ekpiMappingName\xe0A\x02\x12H\n\x11kpi_mapping_group\x18\x02 \x01(\x0b2(.exabel.api.analytics.v1.KpiMappingGroupB\x03\xe0A\x02"J\n\x19GetKpiMappingGroupRequest\x12-\n\x04name\x18\x01 \x01(\tB\x1f\x92A\x19\xca>\x16\xfa\x02\x13kpiMappingGroupName\xe0A\x02"\xcd\x01\n\x1bListKpiMappingGroupsRequest\x12*\n\x06parent\x18\x01 \x01(\tB\x1a\x92A\x14\xca>\x11\xfa\x02\x0ekpiMappingName\xe0A\x02\x12:\n\x04type\x18\x02 \x01(\x0e2,.exabel.api.analytics.v1.KpiMappingGroupType\x12\x11\n\tcompanies\x18\x03 \x03(\t\x12\x11\n\tpage_size\x18\x04 \x01(\x05\x12\x12\n\npage_token\x18\x05 \x01(\t\x12\x0c\n\x04skip\x18\x06 \x01(\x05"\x85\x01\n\x1cListKpiMappingGroupsResponse\x128\n\x06groups\x18\x01 \x03(\x0b2(.exabel.api.analytics.v1.KpiMappingGroup\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\x12\x12\n\ntotal_size\x18\x03 \x01(\x05"\x99\x01\n\x1cUpdateKpiMappingGroupRequest\x12H\n\x11kpi_mapping_group\x18\x01 \x01(\x0b2(.exabel.api.analytics.v1.KpiMappingGroupB\x03\xe0A\x02\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b2\x1a.google.protobuf.FieldMask2\xd8\x06\n\x11KpiMappingService\x12\xd3\x01\n\x15CreateKpiMappingGroup\x125.exabel.api.analytics.v1.CreateKpiMappingGroupRequest\x1a(.exabel.api.analytics.v1.KpiMappingGroup"Y\x92A\x1a\x12\x18Create KPI mapping group\x82\xd3\xe4\x93\x026"!/v1/{parent=kpiMappings/*}/groups:\x11kpi_mapping_group\x12\xb7\x01\n\x12GetKpiMappingGroup\x122.exabel.api.analytics.v1.GetKpiMappingGroupRequest\x1a(.exabel.api.analytics.v1.KpiMappingGroup"C\x92A\x17\x12\x15Get KPI mapping group\x82\xd3\xe4\x93\x02#\x12!/v1/{name=kpiMappings/*/groups/*}\x12\xca\x01\n\x14ListKpiMappingGroups\x124.exabel.api.analytics.v1.ListKpiMappingGroupsRequest\x1a5.exabel.api.analytics.v1.ListKpiMappingGroupsResponse"E\x92A\x19\x12\x17List KPI mapping groups\x82\xd3\xe4\x93\x02#\x12!/v1/{parent=kpiMappings/*}/groups\x12\xe5\x01\n\x15UpdateKpiMappingGroup\x125.exabel.api.analytics.v1.UpdateKpiMappingGroupRequest\x1a(.exabel.api.analytics.v1.KpiMappingGroup"k\x92A\x1a\x12\x18Update KPI mapping group\x82\xd3\xe4\x93\x02H23/v1/{kpi_mapping_group.name=kpiMappings/*/groups/*}:\x11kpi_mapping_groupBY\n\x1bcom.exabel.api.analytics.v1B\x1bKpiMappingGroupServiceProtoP\x01Z\x1bexabel.com/api/analytics/v1b\x06proto3') +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'exabel.api.analytics.v1.kpi_mapping_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\x1bKpiMappingGroupServiceProtoP\x01Z\x1bexabel.com/api/analytics/v1' + _globals['_CREATEKPIMAPPINGGROUPREQUEST'].fields_by_name['parent']._loaded_options = None + _globals['_CREATEKPIMAPPINGGROUPREQUEST'].fields_by_name['parent']._serialized_options = b'\x92A\x14\xca>\x11\xfa\x02\x0ekpiMappingName\xe0A\x02' + _globals['_CREATEKPIMAPPINGGROUPREQUEST'].fields_by_name['kpi_mapping_group']._loaded_options = None + _globals['_CREATEKPIMAPPINGGROUPREQUEST'].fields_by_name['kpi_mapping_group']._serialized_options = b'\xe0A\x02' + _globals['_GETKPIMAPPINGGROUPREQUEST'].fields_by_name['name']._loaded_options = None + _globals['_GETKPIMAPPINGGROUPREQUEST'].fields_by_name['name']._serialized_options = b'\x92A\x19\xca>\x16\xfa\x02\x13kpiMappingGroupName\xe0A\x02' + _globals['_LISTKPIMAPPINGGROUPSREQUEST'].fields_by_name['parent']._loaded_options = None + _globals['_LISTKPIMAPPINGGROUPSREQUEST'].fields_by_name['parent']._serialized_options = b'\x92A\x14\xca>\x11\xfa\x02\x0ekpiMappingName\xe0A\x02' + _globals['_UPDATEKPIMAPPINGGROUPREQUEST'].fields_by_name['kpi_mapping_group']._loaded_options = None + _globals['_UPDATEKPIMAPPINGGROUPREQUEST'].fields_by_name['kpi_mapping_group']._serialized_options = b'\xe0A\x02' + _globals['_KPIMAPPINGSERVICE'].methods_by_name['CreateKpiMappingGroup']._loaded_options = None + _globals['_KPIMAPPINGSERVICE'].methods_by_name['CreateKpiMappingGroup']._serialized_options = b'\x92A\x1a\x12\x18Create KPI mapping group\x82\xd3\xe4\x93\x026"!/v1/{parent=kpiMappings/*}/groups:\x11kpi_mapping_group' + _globals['_KPIMAPPINGSERVICE'].methods_by_name['GetKpiMappingGroup']._loaded_options = None + _globals['_KPIMAPPINGSERVICE'].methods_by_name['GetKpiMappingGroup']._serialized_options = b'\x92A\x17\x12\x15Get KPI mapping group\x82\xd3\xe4\x93\x02#\x12!/v1/{name=kpiMappings/*/groups/*}' + _globals['_KPIMAPPINGSERVICE'].methods_by_name['ListKpiMappingGroups']._loaded_options = None + _globals['_KPIMAPPINGSERVICE'].methods_by_name['ListKpiMappingGroups']._serialized_options = b'\x92A\x19\x12\x17List KPI mapping groups\x82\xd3\xe4\x93\x02#\x12!/v1/{parent=kpiMappings/*}/groups' + _globals['_KPIMAPPINGSERVICE'].methods_by_name['UpdateKpiMappingGroup']._loaded_options = None + _globals['_KPIMAPPINGSERVICE'].methods_by_name['UpdateKpiMappingGroup']._serialized_options = b'\x92A\x1a\x12\x18Update KPI mapping group\x82\xd3\xe4\x93\x02H23/v1/{kpi_mapping_group.name=kpiMappings/*/groups/*}:\x11kpi_mapping_group' + _globals['_CREATEKPIMAPPINGGROUPREQUEST']._serialized_start = 276 + _globals['_CREATEKPIMAPPINGGROUPREQUEST']._serialized_end = 424 + _globals['_GETKPIMAPPINGGROUPREQUEST']._serialized_start = 426 + _globals['_GETKPIMAPPINGGROUPREQUEST']._serialized_end = 500 + _globals['_LISTKPIMAPPINGGROUPSREQUEST']._serialized_start = 503 + _globals['_LISTKPIMAPPINGGROUPSREQUEST']._serialized_end = 708 + _globals['_LISTKPIMAPPINGGROUPSRESPONSE']._serialized_start = 711 + _globals['_LISTKPIMAPPINGGROUPSRESPONSE']._serialized_end = 844 + _globals['_UPDATEKPIMAPPINGGROUPREQUEST']._serialized_start = 847 + _globals['_UPDATEKPIMAPPINGGROUPREQUEST']._serialized_end = 1000 + _globals['_KPIMAPPINGSERVICE']._serialized_start = 1003 + _globals['_KPIMAPPINGSERVICE']._serialized_end = 1859 \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2.pyi b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2.pyi new file mode 100644 index 00000000..3a5935e6 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2.pyi @@ -0,0 +1,138 @@ +""" +@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.field_mask_pb2 +import google.protobuf.internal.containers +import google.protobuf.message +import typing +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +@typing.final +class CreateKpiMappingGroupRequest(google.protobuf.message.Message): + """Request message to CreateKpiMappingGroup.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + PARENT_FIELD_NUMBER: builtins.int + KPI_MAPPING_GROUP_FIELD_NUMBER: builtins.int + parent: builtins.str + 'Resource name of the Kpi mapping which the group should be added to.' + + @property + def kpi_mapping_group(self) -> exabel.api.analytics.v1.kpi_mapping_messages_pb2.KpiMappingGroup: + """KpiMappingGroup to create. The name field in the Kpi mapping group is ignored and may be left empty.""" + + def __init__(self, *, parent: builtins.str | None=..., kpi_mapping_group: exabel.api.analytics.v1.kpi_mapping_messages_pb2.KpiMappingGroup | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['kpi_mapping_group', b'kpi_mapping_group']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['kpi_mapping_group', b'kpi_mapping_group', 'parent', b'parent']) -> None: + ... +global___CreateKpiMappingGroupRequest = CreateKpiMappingGroupRequest + +@typing.final +class GetKpiMappingGroupRequest(google.protobuf.message.Message): + """Request message to GetKpiMappingGroup.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + NAME_FIELD_NUMBER: builtins.int + name: builtins.str + 'Resource name of Kpi mapping group to retrieve.' + + def __init__(self, *, name: builtins.str | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['name', b'name']) -> None: + ... +global___GetKpiMappingGroupRequest = GetKpiMappingGroupRequest + +@typing.final +class ListKpiMappingGroupsRequest(google.protobuf.message.Message): + """Request message to ListKpiMappingGroups.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + PARENT_FIELD_NUMBER: builtins.int + TYPE_FIELD_NUMBER: builtins.int + COMPANIES_FIELD_NUMBER: builtins.int + PAGE_SIZE_FIELD_NUMBER: builtins.int + PAGE_TOKEN_FIELD_NUMBER: builtins.int + SKIP_FIELD_NUMBER: builtins.int + parent: builtins.str + 'Resource name of Kpi mapping to list groups for.' + type: exabel.api.analytics.v1.kpi_mapping_messages_pb2.KpiMappingGroupType.ValueType + 'KPI mapping group types to list.' + page_size: builtins.int + 'The page size. Default is 100 and max is 1000.' + page_token: builtins.str + 'A page token, received from the previous call to list Kpi mapping groups.' + skip: builtins.int + 'Number of KPI mapping groups to skip relative to page_token. Negative value is allowed.\n Skipping past end of list will return no groups.\n Skipping past start of list will return groups from start of list.\n ' + + @property + def companies(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Companies to retrieve groups for. If no companies are specified, results for all companies are + returned. Only supported for type=COMPANY_SPECIFIC. + Example: `"entityTypes/company/entities/F_67890-E"`. + """ + + def __init__(self, *, parent: builtins.str | None=..., type: exabel.api.analytics.v1.kpi_mapping_messages_pb2.KpiMappingGroupType.ValueType | None=..., companies: collections.abc.Iterable[builtins.str] | None=..., page_size: builtins.int | None=..., page_token: builtins.str | None=..., skip: builtins.int | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['companies', b'companies', 'page_size', b'page_size', 'page_token', b'page_token', 'parent', b'parent', 'skip', b'skip', 'type', b'type']) -> None: + ... +global___ListKpiMappingGroupsRequest = ListKpiMappingGroupsRequest + +@typing.final +class ListKpiMappingGroupsResponse(google.protobuf.message.Message): + """Response message to ListKpiMappingGroups.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + GROUPS_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 query.\n The end of the list is reached when the token is empty.\n ' + total_size: builtins.int + 'Total number of KPI mapping groups for this request.' + + @property + def groups(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[exabel.api.analytics.v1.kpi_mapping_messages_pb2.KpiMappingGroup]: + """List of KPI mappings groups.""" + + def __init__(self, *, groups: collections.abc.Iterable[exabel.api.analytics.v1.kpi_mapping_messages_pb2.KpiMappingGroup] | None=..., next_page_token: builtins.str | None=..., total_size: builtins.int | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['groups', b'groups', 'next_page_token', b'next_page_token', 'total_size', b'total_size']) -> None: + ... +global___ListKpiMappingGroupsResponse = ListKpiMappingGroupsResponse + +@typing.final +class UpdateKpiMappingGroupRequest(google.protobuf.message.Message): + """Request message to UpdateKpiMappingGroup.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + KPI_MAPPING_GROUP_FIELD_NUMBER: builtins.int + UPDATE_MASK_FIELD_NUMBER: builtins.int + + @property + def kpi_mapping_group(self) -> exabel.api.analytics.v1.kpi_mapping_messages_pb2.KpiMappingGroup: + """KpiMappingGroup to update.""" + + @property + def update_mask(self) -> google.protobuf.field_mask_pb2.FieldMask: + """Use this to update only selected fields. For example, specify `display_name` to update only + the display name. + + For REST requests, this is a comma-separated string. + """ + + def __init__(self, *, kpi_mapping_group: exabel.api.analytics.v1.kpi_mapping_messages_pb2.KpiMappingGroup | None=..., update_mask: google.protobuf.field_mask_pb2.FieldMask | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['kpi_mapping_group', b'kpi_mapping_group', 'update_mask', b'update_mask']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['kpi_mapping_group', b'kpi_mapping_group', 'update_mask', b'update_mask']) -> None: + ... +global___UpdateKpiMappingGroupRequest = UpdateKpiMappingGroupRequest \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2_grpc.py new file mode 100644 index 00000000..c8adc98b --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2_grpc.py @@ -0,0 +1,88 @@ +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings +from .....exabel.api.analytics.v1 import kpi_mapping_messages_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__messages__pb2 +from .....exabel.api.analytics.v1 import kpi_mapping_service_pb2 as exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2 +GRPC_GENERATED_VERSION = '1.71.2' +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_mapping_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 KpiMappingServiceStub(object): + """Service for managing KPI mapping groups. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.CreateKpiMappingGroup = channel.unary_unary('/exabel.api.analytics.v1.KpiMappingService/CreateKpiMappingGroup', request_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.CreateKpiMappingGroupRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__messages__pb2.KpiMappingGroup.FromString, _registered_method=True) + self.GetKpiMappingGroup = channel.unary_unary('/exabel.api.analytics.v1.KpiMappingService/GetKpiMappingGroup', request_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.GetKpiMappingGroupRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__messages__pb2.KpiMappingGroup.FromString, _registered_method=True) + self.ListKpiMappingGroups = channel.unary_unary('/exabel.api.analytics.v1.KpiMappingService/ListKpiMappingGroups', request_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.ListKpiMappingGroupsRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.ListKpiMappingGroupsResponse.FromString, _registered_method=True) + self.UpdateKpiMappingGroup = channel.unary_unary('/exabel.api.analytics.v1.KpiMappingService/UpdateKpiMappingGroup', request_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.UpdateKpiMappingGroupRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__messages__pb2.KpiMappingGroup.FromString, _registered_method=True) + +class KpiMappingServiceServicer(object): + """Service for managing KPI mapping groups. + """ + + def CreateKpiMappingGroup(self, request, context): + """Create a KPI mapping group. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetKpiMappingGroup(self, request, context): + """Retrieve a KPI mapping group. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListKpiMappingGroups(self, request, context): + """List KPI mapping groups for a KPI mapping. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def UpdateKpiMappingGroup(self, request, context): + """Update a KPI mapping group. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + +def add_KpiMappingServiceServicer_to_server(servicer, server): + rpc_method_handlers = {'CreateKpiMappingGroup': grpc.unary_unary_rpc_method_handler(servicer.CreateKpiMappingGroup, request_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.CreateKpiMappingGroupRequest.FromString, response_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__messages__pb2.KpiMappingGroup.SerializeToString), 'GetKpiMappingGroup': grpc.unary_unary_rpc_method_handler(servicer.GetKpiMappingGroup, request_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.GetKpiMappingGroupRequest.FromString, response_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__messages__pb2.KpiMappingGroup.SerializeToString), 'ListKpiMappingGroups': grpc.unary_unary_rpc_method_handler(servicer.ListKpiMappingGroups, request_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.ListKpiMappingGroupsRequest.FromString, response_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.ListKpiMappingGroupsResponse.SerializeToString), 'UpdateKpiMappingGroup': grpc.unary_unary_rpc_method_handler(servicer.UpdateKpiMappingGroup, request_deserializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.UpdateKpiMappingGroupRequest.FromString, response_serializer=exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__messages__pb2.KpiMappingGroup.SerializeToString)} + generic_handler = grpc.method_handlers_generic_handler('exabel.api.analytics.v1.KpiMappingService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('exabel.api.analytics.v1.KpiMappingService', rpc_method_handlers) + +class KpiMappingService(object): + """Service for managing KPI mapping groups. + """ + + @staticmethod + def CreateKpiMappingGroup(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.KpiMappingService/CreateKpiMappingGroup', exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.CreateKpiMappingGroupRequest.SerializeToString, exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__messages__pb2.KpiMappingGroup.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata, _registered_method=True) + + @staticmethod + def GetKpiMappingGroup(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.KpiMappingService/GetKpiMappingGroup', exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.GetKpiMappingGroupRequest.SerializeToString, exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__messages__pb2.KpiMappingGroup.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata, _registered_method=True) + + @staticmethod + def ListKpiMappingGroups(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.KpiMappingService/ListKpiMappingGroups', exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.ListKpiMappingGroupsRequest.SerializeToString, exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.ListKpiMappingGroupsResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata, _registered_method=True) + + @staticmethod + def UpdateKpiMappingGroup(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.KpiMappingService/UpdateKpiMappingGroup', exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__service__pb2.UpdateKpiMappingGroupRequest.SerializeToString, exabel_dot_api_dot_analytics_dot_v1_dot_kpi__mapping__messages__pb2.KpiMappingGroup.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/kpi_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_messages_pb2.py index d6b8c57f..7775a129 100644 --- 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 @@ -7,50 +7,63 @@ _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') +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__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\x1a\x1fgoogle/protobuf/timestamp.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"\x8b\x07\n\x14KpiMappingResultData\x12A\n\x06source\x18\x01 \x01(\x0b21.exabel.api.analytics.v1.KpiMappingGroupReference\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\rmodel_quality\x18\x0f \x01(\x0e2%.exabel.api.analytics.v1.ModelQuality\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"[\n\x18KpiMappingGroupReference\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"\xc6\x02\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\x129\n\nmodel_runs\x18\x06 \x01(\x0b2%.exabel.api.analytics.v1.KpiModelRuns\x12Z\n\x1dhierarchical_model_kpi_source\x18\x07 \x01(\x0b23.exabel.api.analytics.v1.HierarchicalModelKpiSource"\xed\x01\n\x1aHierarchicalModelKpiSource\x12`\n\x04type\x18\x01 \x01(\x0e2R.exabel.api.analytics.v1.HierarchicalModelKpiSource.HierarchicalModelKpiSourceType\x12\r\n\x05model\x18\x02 \x01(\t"^\n\x1eHierarchicalModelKpiSourceType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\t\n\x05MODEL\x10\x01\x12\r\n\tCONSENSUS\x10\x02\x12\x11\n\rFREE_VARIABLE\x10\x03"\xc2\x01\n\x0cKpiModelRuns\x129\n\x0binitial_run\x18\x01 \x01(\x0b2$.exabel.api.analytics.v1.KpiModelRun\x127\n\tdaily_run\x18\x02 \x01(\x0b2$.exabel.api.analytics.v1.KpiModelRun\x12>\n\x10pit_backtest_run\x18\x03 \x01(\x0b2$.exabel.api.analytics.v1.KpiModelRun"\xbc\x01\n\x0bKpiModelRun\x12.\n\ncreated_at\x18\x01 \x01(\x0b2\x1a.google.protobuf.Timestamp\x12.\n\nstarted_at\x18\x02 \x01(\x0b2\x1a.google.protobuf.Timestamp\x12/\n\x0bfinished_at\x18\x03 \x01(\x0b2\x1a.google.protobuf.Timestamp\x12\x12\n\x05error\x18\x04 \x01(\tH\x00\x88\x01\x01B\x08\n\x06_error"\x93\x01\n\x0fKpiMappingModel\x12A\n\x06source\x18\x01 \x01(\x0b21.exabel.api.analytics.v1.KpiMappingGroupReference\x12=\n\x0ekpi_model_data\x18\x02 \x01(\x0b2%.exabel.api.analytics.v1.KpiModelData"\x8a\x07\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\x18\n\x0berror_count\x18\x13 \x01(\x05H\r\x88\x01\x01\x12\x15\n\x08hit_rate\x18\x0f \x01(\x01H\x0e\x88\x01\x01\x12\x1b\n\x0ehit_rate_count\x18\x14 \x01(\x05H\x0f\x88\x01\x01\x12\x1c\n\x0frevision_1_week\x18\x10 \x01(\x01H\x10\x88\x01\x01\x12\x1d\n\x10revision_1_month\x18\x11 \x01(\x01H\x11\x88\x01\x01\x12\'\n\x04date\x18\x12 \x01(\x0b2\x15.exabel.api.time.DateB\x02\x18\x01\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\x0e\n\x0c_error_countB\x0b\n\t_hit_rateB\x11\n\x0f_hit_rate_countB\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"\xb6\x01\n\x13KpiModelWeightGroup\x12\x14\n\x0cdisplay_name\x18\x01 \x01(\t\x12@\n\x05group\x18\x02 \x01(\x0b21.exabel.api.analytics.v1.KpiMappingGroupReference\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"U\n\x0cFiscalPeriod\x12\'\n\x08end_date\x18\x01 \x01(\x0b2\x15.exabel.api.time.Date\x12\x12\n\x05label\x18\x02 \x01(\tH\x00\x88\x01\x01B\x08\n\x06_label"\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*x\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\x12\x19\n\x15KPI_SOURCE_CUSTOM_KPI\x10\x03*\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 + _globals['_KPIMODELDATA'].fields_by_name['date']._loaded_options = None + _globals['_KPIMODELDATA'].fields_by_name['date']._serialized_options = b'\x18\x01' + _globals['_KPISOURCE']._serialized_start = 4828 + _globals['_KPISOURCE']._serialized_end = 4948 + _globals['_MODELQUALITY']._serialized_start = 4951 + _globals['_MODELQUALITY']._serialized_end = 5098 + _globals['_RELATIVEFISCALPERIODSELECTOR']._serialized_start = 5100 + _globals['_RELATIVEFISCALPERIODSELECTOR']._serialized_end = 5216 + _globals['_COMPANYKPIMAPPINGRESULTS']._serialized_start = 133 + _globals['_COMPANYKPIMAPPINGRESULTS']._serialized_end = 287 + _globals['_COMPANY']._serialized_start = 289 + _globals['_COMPANY']._serialized_end = 360 + _globals['_SINGLECOMPANYKPIMAPPINGRESULTS']._serialized_start = 363 + _globals['_SINGLECOMPANYKPIMAPPINGRESULTS']._serialized_end = 499 + _globals['_KPI']._serialized_start = 502 + _globals['_KPI']._serialized_end = 637 + _globals['_KPIMAPPINGRESULTDATA']._serialized_start = 640 + _globals['_KPIMAPPINGRESULTDATA']._serialized_end = 1547 + _globals['_KPIMAPPINGGROUPREFERENCE']._serialized_start = 1549 + _globals['_KPIMAPPINGGROUPREFERENCE']._serialized_end = 1640 + _globals['_COMPANYKPIMODELRESULT']._serialized_start = 1643 + _globals['_COMPANYKPIMODELRESULT']._serialized_end = 1846 + _globals['_KPIMODEL']._serialized_start = 1849 + _globals['_KPIMODEL']._serialized_end = 2175 + _globals['_HIERARCHICALMODELKPISOURCE']._serialized_start = 2178 + _globals['_HIERARCHICALMODELKPISOURCE']._serialized_end = 2415 + _globals['_HIERARCHICALMODELKPISOURCE_HIERARCHICALMODELKPISOURCETYPE']._serialized_start = 2321 + _globals['_HIERARCHICALMODELKPISOURCE_HIERARCHICALMODELKPISOURCETYPE']._serialized_end = 2415 + _globals['_KPIMODELRUNS']._serialized_start = 2418 + _globals['_KPIMODELRUNS']._serialized_end = 2612 + _globals['_KPIMODELRUN']._serialized_start = 2615 + _globals['_KPIMODELRUN']._serialized_end = 2803 + _globals['_KPIMAPPINGMODEL']._serialized_start = 2806 + _globals['_KPIMAPPINGMODEL']._serialized_end = 2953 + _globals['_KPIMODELDATA']._serialized_start = 2956 + _globals['_KPIMODELDATA']._serialized_end = 3862 + _globals['_KPIMODELWEIGHTGROUPS']._serialized_start = 3864 + _globals['_KPIMODELWEIGHTGROUPS']._serialized_end = 3980 + _globals['_KPIMODELWEIGHTGROUP']._serialized_start = 3983 + _globals['_KPIMODELWEIGHTGROUP']._serialized_end = 4165 + _globals['_KPIMODELFEATUREWEIGHT']._serialized_start = 4167 + _globals['_KPIMODELFEATUREWEIGHT']._serialized_end = 4244 + _globals['_FISCALPERIOD']._serialized_start = 4246 + _globals['_FISCALPERIOD']._serialized_end = 4331 + _globals['_FISCALPERIODSELECTOR']._serialized_start = 4334 + _globals['_FISCALPERIODSELECTOR']._serialized_end = 4495 + _globals['_KPIHIERARCHY']._serialized_start = 4497 + _globals['_KPIHIERARCHY']._serialized_end = 4597 + _globals['_KPIBREAKDOWN']._serialized_start = 4599 + _globals['_KPIBREAKDOWN']._serialized_end = 4670 + _globals['_KPIBREAKDOWNNODE']._serialized_start = 4673 + _globals['_KPIBREAKDOWNNODE']._serialized_end = 4826 \ 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 index 95d2275e..2a55c6b4 100644 --- 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 @@ -9,6 +9,7 @@ import google.protobuf.descriptor import google.protobuf.internal.containers import google.protobuf.internal.enum_type_wrapper import google.protobuf.message +import google.protobuf.timestamp_pb2 import sys import typing if sys.version_info >= (3, 10): @@ -29,6 +30,8 @@ class _KpiSourceEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._Enum 'Visible Alpha.' KPI_SOURCE_FACTSET: _KpiSource.ValueType 'FactSet.' + KPI_SOURCE_CUSTOM_KPI: _KpiSource.ValueType + 'Custom KPI.' class KpiSource(_KpiSource, metaclass=_KpiSourceEnumTypeWrapper): """KPI source.""" @@ -38,6 +41,8 @@ KPI_SOURCE_VISIBLE_ALPHA: KpiSource.ValueType 'Visible Alpha.' KPI_SOURCE_FACTSET: KpiSource.ValueType 'FactSet.' +KPI_SOURCE_CUSTOM_KPI: KpiSource.ValueType +'Custom KPI.' global___KpiSource = KpiSource class _ModelQuality: @@ -179,9 +184,9 @@ class Kpi(google.protobuf.message.Message): 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 ' + '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 - `CUSTOM_KPI`: Custom 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 ' + '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 - `CUSTOM_KPI`: Custom KPI id. For example, `1234`.\n ' display_name: builtins.str 'The display name of the KPI.' freq: builtins.str @@ -219,6 +224,7 @@ class KpiMappingResultData(google.protobuf.message.Message): MODEL_MAPE_FIELD_NUMBER: builtins.int MODEL_MAE_FIELD_NUMBER: builtins.int MODEL_HIT_RATE_FIELD_NUMBER: builtins.int + MODEL_QUALITY_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 @@ -235,6 +241,8 @@ class KpiMappingResultData(google.protobuf.message.Message): 'Mean absolute error for a model built using this proxy.' model_hit_rate: builtins.float 'Hit rate for a model built using this proxy.' + model_quality: global___ModelQuality.ValueType + 'Model quality 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 @@ -255,20 +263,20 @@ class KpiMappingResultData(google.protobuf.message.Message): 'Year-over-year P-value.' @property - def source(self) -> global___KpiMappingGroup: + def source(self) -> global___KpiMappingGroupReference: """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 __init__(self, *, source: global___KpiMappingGroupReference | None=..., model_mape: builtins.float | None=..., model_mae: builtins.float | None=..., model_hit_rate: builtins.float | None=..., model_quality: global___ModelQuality.ValueType | 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: + 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', 'model_quality', b'model_quality', '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 @@ -321,8 +329,8 @@ class KpiMappingResultData(google.protobuf.message.Message): global___KpiMappingResultData = KpiMappingResultData @typing.final -class KpiMappingGroup(google.protobuf.message.Message): - """KPI mapping group.""" +class KpiMappingGroupReference(google.protobuf.message.Message): + """KPI mapping group minimal set of fields.""" DESCRIPTOR: google.protobuf.descriptor.Descriptor NAME_FIELD_NUMBER: builtins.int DISPLAY_NAME_FIELD_NUMBER: builtins.int @@ -339,7 +347,7 @@ class KpiMappingGroup(google.protobuf.message.Message): 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 +global___KpiMappingGroupReference = KpiMappingGroupReference @typing.final class CompanyKpiModelResult(google.protobuf.message.Message): @@ -384,6 +392,8 @@ class KpiModel(google.protobuf.message.Message): DISPLAY_NAME_FIELD_NUMBER: builtins.int DATA_FIELD_NUMBER: builtins.int WEIGHTS_FIELD_NUMBER: builtins.int + MODEL_RUNS_FIELD_NUMBER: builtins.int + HIERARCHICAL_MODEL_KPI_SOURCE_FIELD_NUMBER: builtins.int name: builtins.str 'Resource name.' id: builtins.int @@ -399,16 +409,146 @@ class KpiModel(google.protobuf.message.Message): 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: + @property + def model_runs(self) -> global___KpiModelRuns: + """Model runs.""" + + @property + def hierarchical_model_kpi_source(self) -> global___HierarchicalModelKpiSource: + """Hierarchical model KPI source data. + This field specifies what was used as input for the KPI in the hierarchical model. + The field is only set for hierarchical models. + """ + + def __init__(self, *, name: builtins.str | None=..., id: builtins.int | None=..., display_name: builtins.str | None=..., data: global___KpiModelData | None=..., weights: global___KpiModelWeightGroups | None=..., model_runs: global___KpiModelRuns | None=..., hierarchical_model_kpi_source: global___HierarchicalModelKpiSource | None=...) -> None: ... - def HasField(self, field_name: typing.Literal['data', b'data', 'weights', b'weights']) -> builtins.bool: + def HasField(self, field_name: typing.Literal['data', b'data', 'hierarchical_model_kpi_source', b'hierarchical_model_kpi_source', 'model_runs', b'model_runs', '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: + def ClearField(self, field_name: typing.Literal['data', b'data', 'display_name', b'display_name', 'hierarchical_model_kpi_source', b'hierarchical_model_kpi_source', 'id', b'id', 'model_runs', b'model_runs', 'name', b'name', 'weights', b'weights']) -> None: ... global___KpiModel = KpiModel +@typing.final +class HierarchicalModelKpiSource(google.protobuf.message.Message): + """Hierarchical model KPI source data.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class _HierarchicalModelKpiSourceType: + ValueType = typing.NewType('ValueType', builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _HierarchicalModelKpiSourceTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[HierarchicalModelKpiSource._HierarchicalModelKpiSourceType.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + UNSPECIFIED: HierarchicalModelKpiSource._HierarchicalModelKpiSourceType.ValueType + 'Unspecified.' + MODEL: HierarchicalModelKpiSource._HierarchicalModelKpiSourceType.ValueType + 'Model.' + CONSENSUS: HierarchicalModelKpiSource._HierarchicalModelKpiSourceType.ValueType + 'Consensus.' + FREE_VARIABLE: HierarchicalModelKpiSource._HierarchicalModelKpiSourceType.ValueType + 'Free variable.' + + class HierarchicalModelKpiSourceType(_HierarchicalModelKpiSourceType, metaclass=_HierarchicalModelKpiSourceTypeEnumTypeWrapper): + """Hierarchical model KPI source types.""" + UNSPECIFIED: HierarchicalModelKpiSource.HierarchicalModelKpiSourceType.ValueType + 'Unspecified.' + MODEL: HierarchicalModelKpiSource.HierarchicalModelKpiSourceType.ValueType + 'Model.' + CONSENSUS: HierarchicalModelKpiSource.HierarchicalModelKpiSourceType.ValueType + 'Consensus.' + FREE_VARIABLE: HierarchicalModelKpiSource.HierarchicalModelKpiSourceType.ValueType + 'Free variable.' + TYPE_FIELD_NUMBER: builtins.int + MODEL_FIELD_NUMBER: builtins.int + type: global___HierarchicalModelKpiSource.HierarchicalModelKpiSourceType.ValueType + 'The type of the hierarchical model KPI source.' + model: builtins.str + 'Optional model resource name.\n Only set if the type is MODEL.\n ' + + def __init__(self, *, type: global___HierarchicalModelKpiSource.HierarchicalModelKpiSourceType.ValueType | None=..., model: builtins.str | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['model', b'model', 'type', b'type']) -> None: + ... +global___HierarchicalModelKpiSource = HierarchicalModelKpiSource + +@typing.final +class KpiModelRuns(google.protobuf.message.Message): + """Information about the runs for this model.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + INITIAL_RUN_FIELD_NUMBER: builtins.int + DAILY_RUN_FIELD_NUMBER: builtins.int + PIT_BACKTEST_RUN_FIELD_NUMBER: builtins.int + + @property + def initial_run(self) -> global___KpiModelRun: + """Initial run. + The initial run performs backtesting and the initial prediction. + It runs when the model is first created. + """ + + @property + def daily_run(self) -> global___KpiModelRun: + """Latest daily run. + The daily run updates the model prediction based on the latest available data. + """ + + @property + def pit_backtest_run(self) -> global___KpiModelRun: + """Point-in-time backtest run. + This run performs point-in-time backtesting of the model. + The point-in-time backtests can be used to estimate the model error based on when we are in a quarter. + It runs when the model is first created. + """ + + def __init__(self, *, initial_run: global___KpiModelRun | None=..., daily_run: global___KpiModelRun | None=..., pit_backtest_run: global___KpiModelRun | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['daily_run', b'daily_run', 'initial_run', b'initial_run', 'pit_backtest_run', b'pit_backtest_run']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['daily_run', b'daily_run', 'initial_run', b'initial_run', 'pit_backtest_run', b'pit_backtest_run']) -> None: + ... +global___KpiModelRuns = KpiModelRuns + +@typing.final +class KpiModelRun(google.protobuf.message.Message): + """Information about a single KPI model run.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + CREATED_AT_FIELD_NUMBER: builtins.int + STARTED_AT_FIELD_NUMBER: builtins.int + FINISHED_AT_FIELD_NUMBER: builtins.int + ERROR_FIELD_NUMBER: builtins.int + error: builtins.str + 'An optional error message if the run failed.' + + @property + def created_at(self) -> google.protobuf.timestamp_pb2.Timestamp: + """The time the run was created.""" + + @property + def started_at(self) -> google.protobuf.timestamp_pb2.Timestamp: + """The time the run was started.""" + + @property + def finished_at(self) -> google.protobuf.timestamp_pb2.Timestamp: + """The time the run finished.""" + + def __init__(self, *, created_at: google.protobuf.timestamp_pb2.Timestamp | None=..., started_at: google.protobuf.timestamp_pb2.Timestamp | None=..., finished_at: google.protobuf.timestamp_pb2.Timestamp | None=..., error: builtins.str | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['_error', b'_error', 'created_at', b'created_at', 'error', b'error', 'finished_at', b'finished_at', 'started_at', b'started_at']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['_error', b'_error', 'created_at', b'created_at', 'error', b'error', 'finished_at', b'finished_at', 'started_at', b'started_at']) -> None: + ... + + def WhichOneof(self, oneof_group: typing.Literal['_error', b'_error']) -> typing.Literal['error'] | None: + ... +global___KpiModelRun = KpiModelRun + @typing.final class KpiMappingModel(google.protobuf.message.Message): """Single-predictor KPI mapping model.""" @@ -417,14 +557,14 @@ class KpiMappingModel(google.protobuf.message.Message): KPI_MODEL_DATA_FIELD_NUMBER: builtins.int @property - def source(self) -> global___KpiMappingGroup: + def source(self) -> global___KpiMappingGroupReference: """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 __init__(self, *, source: global___KpiMappingGroupReference | 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: @@ -452,7 +592,9 @@ class KpiModelData(google.protobuf.message.Message): MAPE_PIT_FIELD_NUMBER: builtins.int MAE_FIELD_NUMBER: builtins.int MAE_PIT_FIELD_NUMBER: builtins.int + ERROR_COUNT_FIELD_NUMBER: builtins.int HIT_RATE_FIELD_NUMBER: builtins.int + HIT_RATE_COUNT_FIELD_NUMBER: builtins.int REVISION_1_WEEK_FIELD_NUMBER: builtins.int REVISION_1_MONTH_FIELD_NUMBER: builtins.int DATE_FIELD_NUMBER: builtins.int @@ -485,8 +627,12 @@ class KpiModelData(google.protobuf.message.Message): 'Mean absolute error.' mae_pit: builtins.float 'Point-in-time mean absolute error.' + error_count: builtins.int + 'The number of data points used to calculate the MAPE and MAE metrics.\n Note that his may be different from the number of data points available, as we\n may choose to only use the most recent data points.\n ' hit_rate: builtins.float 'Hit rate.' + hit_rate_count: builtins.int + 'The number of data points included in the hit rate calculation.\n If the difference between the consensus and prediction is below a certain threshold,\n a data point may not be included in the calculation.\n ' 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 @@ -498,13 +644,13 @@ class KpiModelData(google.protobuf.message.Message): 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 __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=..., error_count: builtins.int | None=..., hit_rate: builtins.float | None=..., hit_rate_count: builtins.int | 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 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', '_error_count', b'_error_count', '_hit_rate', b'_hit_rate', '_hit_rate_count', b'_hit_rate_count', '_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_count', b'error_count', 'hit_rate', b'hit_rate', 'hit_rate_count', b'hit_rate_count', '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: + 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', '_error_count', b'_error_count', '_hit_rate', b'_hit_rate', '_hit_rate_count', b'_hit_rate_count', '_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', 'error_count', b'error_count', 'hit_rate', b'hit_rate', 'hit_rate_count', b'hit_rate_count', '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 @@ -531,10 +677,18 @@ class KpiModelData(google.protobuf.message.Message): 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['_error_count', b'_error_count']) -> typing.Literal['error_count'] | 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['_hit_rate_count', b'_hit_rate_count']) -> typing.Literal['hit_rate_count'] | None: + ... + @typing.overload def WhichOneof(self, oneof_group: typing.Literal['_mae', b'_mae']) -> typing.Literal['mae'] | None: ... @@ -603,7 +757,7 @@ class KpiModelWeightGroup(google.protobuf.message.Message): "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: + def group(self) -> global___KpiMappingGroupReference: """The KPI mapping group from which the predictor originates. Only set when the predictor originates from a KPI mapping group. """ @@ -612,7 +766,7 @@ class KpiModelWeightGroup(google.protobuf.message.Message): 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 __init__(self, *, display_name: builtins.str | None=..., group: global___KpiMappingGroupReference | None=..., feature_weights: collections.abc.Iterable[global___KpiModelFeatureWeight] | None=...) -> None: ... def HasField(self, field_name: typing.Literal['group', b'group']) -> builtins.bool: @@ -646,6 +800,32 @@ class KpiModelFeatureWeight(google.protobuf.message.Message): ... global___KpiModelFeatureWeight = KpiModelFeatureWeight +@typing.final +class FiscalPeriod(google.protobuf.message.Message): + """Represents a fiscal period.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + END_DATE_FIELD_NUMBER: builtins.int + LABEL_FIELD_NUMBER: builtins.int + label: builtins.str + 'The fiscal period label. Examples: 1Q-2003, 2H-1997, FY-2029.' + + @property + def end_date(self) -> exabel.api.time.date_pb2.Date: + """The last date of the fiscal period.""" + + def __init__(self, *, end_date: exabel.api.time.date_pb2.Date | None=..., label: builtins.str | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['_label', b'_label', 'end_date', b'end_date', 'label', b'label']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['_label', b'_label', 'end_date', b'end_date', 'label', b'label']) -> None: + ... + + def WhichOneof(self, oneof_group: typing.Literal['_label', b'_label']) -> typing.Literal['label'] | None: + ... +global___FiscalPeriod = FiscalPeriod + @typing.final class FiscalPeriodSelector(google.protobuf.message.Message): """Selector for a fiscal period.""" 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 index 8a110202..4fae9255 100644 --- 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 @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 index 9666b4cb..8c5931fa 100644 --- 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 @@ -10,7 +10,7 @@ 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\x12>\n\tpage_size\x18\x02 \x01(\x05B+\x92A(2&Maximum number of companies to return.\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"\x9d\x01\n#ListCompanyBaseModelResultsResponse\x12?\n\x07results\x18\x01 \x03(\x0b2..exabel.api.analytics.v1.CompanyKpiModelResult\x125\n\x06period\x18\x02 \x01(\x0b2%.exabel.api.analytics.v1.FiscalPeriod"\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"\xe3\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\x125\n\x06period\x18\x03 \x01(\x0b2%.exabel.api.analytics.v1.FiscalPeriod"~\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\x03\xe0A\x02"f\n$ListCompanyKpiMappingResultsResponse\x12>\n\x07results\x18\x01 \x03(\x0b2-.exabel.api.analytics.v1.KpiMappingResultData"|\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\x03\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['_LISTKPIMAPPINGRESULTSREQUEST'].fields_by_name['page_size']._loaded_options = None + _globals['_LISTKPIMAPPINGRESULTSREQUEST'].fields_by_name['page_size']._serialized_options = b'\x92A(2&Maximum number of companies to return.' _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 @@ -26,11 +28,11 @@ _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['_LISTCOMPANYKPIMAPPINGRESULTSREQUEST'].fields_by_name['kpi']._serialized_options = b'\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['_LISTCOMPANYKPIMODELRESULTSREQUEST'].fields_by_name['kpi']._serialized_options = b'\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 @@ -41,25 +43,25 @@ _globals['_KPISERVICE'].methods_by_name['ListCompanyKpiMappingResults']._serialized_options = b'\x92A"\x12 List company KPI mapping results\x82\xd3\xe4\x93\x02?\x12=/v1/{parent=entityTypes/company/entities/*}/kpiMappingResults' _globals['_KPISERVICE'].methods_by_name['ListCompanyKpiModelResults']._loaded_options = None _globals['_KPISERVICE'].methods_by_name['ListCompanyKpiModelResults']._serialized_options = b'\x92A \x12\x1eList company KPI model results\x82\xd3\xe4\x93\x02=\x12;/v1/{parent=entityTypes/company/entities/*}/kpiModelResults' - _globals['_LISTKPIMAPPINGRESULTSREQUEST']._serialized_start = 225 - _globals['_LISTKPIMAPPINGRESULTSREQUEST']._serialized_end = 338 - _globals['_LISTKPIMAPPINGRESULTSRESPONSE']._serialized_start = 341 - _globals['_LISTKPIMAPPINGRESULTSRESPONSE']._serialized_end = 485 - _globals['_LISTCOMPANYBASEMODELRESULTSREQUEST']._serialized_start = 488 - _globals['_LISTCOMPANYBASEMODELRESULTSREQUEST']._serialized_end = 684 - _globals['_LISTCOMPANYBASEMODELRESULTSRESPONSE']._serialized_start = 686 - _globals['_LISTCOMPANYBASEMODELRESULTSRESPONSE']._serialized_end = 788 - _globals['_LISTCOMPANYHIERARCHICALMODELRESULTSREQUEST']._serialized_start = 791 - _globals['_LISTCOMPANYHIERARCHICALMODELRESULTSREQUEST']._serialized_end = 995 - _globals['_LISTCOMPANYHIERARCHICALMODELRESULTSRESPONSE']._serialized_start = 998 - _globals['_LISTCOMPANYHIERARCHICALMODELRESULTSRESPONSE']._serialized_end = 1170 - _globals['_LISTCOMPANYKPIMAPPINGRESULTSREQUEST']._serialized_start = 1173 - _globals['_LISTCOMPANYKPIMAPPINGRESULTSREQUEST']._serialized_end = 1311 - _globals['_LISTCOMPANYKPIMAPPINGRESULTSRESPONSE']._serialized_start = 1313 - _globals['_LISTCOMPANYKPIMAPPINGRESULTSRESPONSE']._serialized_end = 1415 - _globals['_LISTCOMPANYKPIMODELRESULTSREQUEST']._serialized_start = 1418 - _globals['_LISTCOMPANYKPIMODELRESULTSREQUEST']._serialized_end = 1554 - _globals['_LISTCOMPANYKPIMODELRESULTSRESPONSE']._serialized_start = 1557 - _globals['_LISTCOMPANYKPIMODELRESULTSRESPONSE']._serialized_end = 1841 - _globals['_KPISERVICE']._serialized_start = 1844 - _globals['_KPISERVICE']._serialized_end = 3150 \ No newline at end of file + _globals['_LISTKPIMAPPINGRESULTSREQUEST']._serialized_start = 226 + _globals['_LISTKPIMAPPINGRESULTSREQUEST']._serialized_end = 384 + _globals['_LISTKPIMAPPINGRESULTSRESPONSE']._serialized_start = 387 + _globals['_LISTKPIMAPPINGRESULTSRESPONSE']._serialized_end = 531 + _globals['_LISTCOMPANYBASEMODELRESULTSREQUEST']._serialized_start = 534 + _globals['_LISTCOMPANYBASEMODELRESULTSREQUEST']._serialized_end = 730 + _globals['_LISTCOMPANYBASEMODELRESULTSRESPONSE']._serialized_start = 733 + _globals['_LISTCOMPANYBASEMODELRESULTSRESPONSE']._serialized_end = 890 + _globals['_LISTCOMPANYHIERARCHICALMODELRESULTSREQUEST']._serialized_start = 893 + _globals['_LISTCOMPANYHIERARCHICALMODELRESULTSREQUEST']._serialized_end = 1097 + _globals['_LISTCOMPANYHIERARCHICALMODELRESULTSRESPONSE']._serialized_start = 1100 + _globals['_LISTCOMPANYHIERARCHICALMODELRESULTSRESPONSE']._serialized_end = 1327 + _globals['_LISTCOMPANYKPIMAPPINGRESULTSREQUEST']._serialized_start = 1329 + _globals['_LISTCOMPANYKPIMAPPINGRESULTSREQUEST']._serialized_end = 1455 + _globals['_LISTCOMPANYKPIMAPPINGRESULTSRESPONSE']._serialized_start = 1457 + _globals['_LISTCOMPANYKPIMAPPINGRESULTSRESPONSE']._serialized_end = 1559 + _globals['_LISTCOMPANYKPIMODELRESULTSREQUEST']._serialized_start = 1561 + _globals['_LISTCOMPANYKPIMODELRESULTSREQUEST']._serialized_end = 1685 + _globals['_LISTCOMPANYKPIMODELRESULTSRESPONSE']._serialized_start = 1688 + _globals['_LISTCOMPANYKPIMODELRESULTSRESPONSE']._serialized_end = 1972 + _globals['_KPISERVICE']._serialized_start = 1975 + _globals['_KPISERVICE']._serialized_end = 3281 \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_service_pb2.pyi b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_service_pb2.pyi index 9aecebce..4df8700b 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_service_pb2.pyi +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/kpi_service_pb2.pyi @@ -21,7 +21,7 @@ class ListKpiMappingResultsRequest(google.protobuf.message.Message): parent: builtins.str 'Resource name of the KPI mapping to list results of.\n Example: `kpiMappings/123`.\n ' page_size: builtins.int - 'Maximum number of entities to return. Defaults to 20, and the maximum allowed value is 100.' + 'Maximum number of companies to return. Defaults to 20, and the maximum allowed value is 100.' page_token: builtins.str 'Token for a specific page of results, as returned from a previous list request with the same\n query parameters.\n ' @@ -90,15 +90,23 @@ class ListCompanyBaseModelResultsResponse(google.protobuf.message.Message): """Response from ListCompanyBaseModelResults.""" DESCRIPTOR: google.protobuf.descriptor.Descriptor RESULTS_FIELD_NUMBER: builtins.int + PERIOD_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: + @property + def period(self) -> exabel.api.analytics.v1.kpi_messages_pb2.FiscalPeriod: + """Fiscal period representing the period the results are for.""" + + def __init__(self, *, results: collections.abc.Iterable[exabel.api.analytics.v1.kpi_messages_pb2.CompanyKpiModelResult] | None=..., period: exabel.api.analytics.v1.kpi_messages_pb2.FiscalPeriod | None=...) -> None: ... - def ClearField(self, field_name: typing.Literal['results', b'results']) -> None: + def HasField(self, field_name: typing.Literal['period', b'period']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['period', b'period', 'results', b'results']) -> None: ... global___ListCompanyBaseModelResultsResponse = ListCompanyBaseModelResultsResponse @@ -138,6 +146,7 @@ class ListCompanyHierarchicalModelResultsResponse(google.protobuf.message.Messag DESCRIPTOR: google.protobuf.descriptor.Descriptor RESULTS_FIELD_NUMBER: builtins.int KPI_HIERARCHY_FIELD_NUMBER: builtins.int + PERIOD_FIELD_NUMBER: builtins.int @property def results(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[exabel.api.analytics.v1.kpi_messages_pb2.CompanyKpiModelResult]: @@ -147,13 +156,17 @@ class ListCompanyHierarchicalModelResultsResponse(google.protobuf.message.Messag 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: + @property + def period(self) -> exabel.api.analytics.v1.kpi_messages_pb2.FiscalPeriod: + """Fiscal period representing the period the results are for.""" + + 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=..., period: exabel.api.analytics.v1.kpi_messages_pb2.FiscalPeriod | None=...) -> None: ... - def HasField(self, field_name: typing.Literal['kpi_hierarchy', b'kpi_hierarchy']) -> builtins.bool: + def HasField(self, field_name: typing.Literal['kpi_hierarchy', b'kpi_hierarchy', 'period', b'period']) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal['kpi_hierarchy', b'kpi_hierarchy', 'results', b'results']) -> None: + def ClearField(self, field_name: typing.Literal['kpi_hierarchy', b'kpi_hierarchy', 'period', b'period', 'results', b'results']) -> None: ... global___ListCompanyHierarchicalModelResultsResponse = ListCompanyHierarchicalModelResultsResponse 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 index 8f37671b..b23d19bf 100644 --- 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 @@ -2,7 +2,7 @@ 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_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 ebdb8a7a..b901142a 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 7ae1de91..e0566a5f 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 86710262..3fd1dbd1 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 62123476..91d0f7dc 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' 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 6f124c58..d4e47e2c 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 @@ -12,7 +12,7 @@ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 from google.protobuf import field_mask_pb2 as google_dot_protobuf_dot_field__mask__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/tag_service.proto\x12\x17exabel.api.analytics.v1\x1a*exabel/api/analytics/v1/tag_messages.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a google/protobuf/field_mask.proto\x1a.protoc_gen_openapiv2/options/annotations.proto"R\n\x10CreateTagRequest\x12.\n\x03tag\x18\x01 \x01(\x0b2\x1c.exabel.api.analytics.v1.TagB\x03\xe0A\x02\x12\x0e\n\x06folder\x18\x02 \x01(\t"2\n\rGetTagRequest\x12!\n\x04name\x18\x01 \x01(\tB\x13\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02"s\n\x10UpdateTagRequest\x12.\n\x03tag\x18\x01 \x01(\x0b2\x1c.exabel.api.analytics.v1.TagB\x03\xe0A\x02\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b2\x1a.google.protobuf.FieldMask"5\n\x10DeleteTagRequest\x12!\n\x04name\x18\x01 \x01(\tB\x13\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02"8\n\x0fListTagsRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x12\n\npage_token\x18\x02 \x01(\t"k\n\x10ListTagsResponse\x12*\n\x04tags\x18\x01 \x03(\x0b2\x1c.exabel.api.analytics.v1.Tag\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\x12\x12\n\ntotal_size\x18\x03 \x01(\x05"M\n\x12AddEntitiesRequest\x12!\n\x04name\x18\x01 \x01(\tB\x13\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02\x12\x14\n\x0centity_names\x18\x02 \x03(\t"\x15\n\x13AddEntitiesResponse"P\n\x15RemoveEntitiesRequest\x12!\n\x04name\x18\x01 \x01(\tB\x13\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02\x12\x14\n\x0centity_names\x18\x02 \x03(\t"\x18\n\x16RemoveEntitiesResponse"d\n\x16ListTagEntitiesRequest\x12#\n\x06parent\x18\x01 \x01(\tB\x13\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t"\\\n\x17ListTagEntitiesResponse\x12\x14\n\x0centity_names\x18\x01 \x03(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\x12\x12\n\ntotal_size\x18\x03 \x01(\x052\xa5\t\n\nTagService\x12z\n\tCreateTag\x12).exabel.api.analytics.v1.CreateTagRequest\x1a\x1c.exabel.api.analytics.v1.Tag"$\x92A\x0c\x12\nCreate tag\x82\xd3\xe4\x93\x02\x0f"\x08/v1/tags:\x03tag\x12u\n\x06GetTag\x12&.exabel.api.analytics.v1.GetTagRequest\x1a\x1c.exabel.api.analytics.v1.Tag"%\x92A\t\x12\x07Get tag\x82\xd3\xe4\x93\x02\x13\x12\x11/v1/{name=tags/*}\x12\x87\x01\n\tUpdateTag\x12).exabel.api.analytics.v1.UpdateTagRequest\x1a\x1c.exabel.api.analytics.v1.Tag"1\x92A\x0c\x12\nUpdate tag\x82\xd3\xe4\x93\x02\x1c2\x15/v1/{tag.name=tags/*}:\x03tag\x12x\n\tDeleteTag\x12).exabel.api.analytics.v1.DeleteTagRequest\x1a\x16.google.protobuf.Empty"(\x92A\x0c\x12\nDelete tag\x82\xd3\xe4\x93\x02\x13*\x11/v1/{name=tags/*}\x12\x7f\n\x08ListTags\x12(.exabel.api.analytics.v1.ListTagsRequest\x1a).exabel.api.analytics.v1.ListTagsResponse"\x1e\x92A\x0b\x12\tList tags\x82\xd3\xe4\x93\x02\n\x12\x08/v1/tags\x12\xaa\x01\n\x0bAddEntities\x12+.exabel.api.analytics.v1.AddEntitiesRequest\x1a,.exabel.api.analytics.v1.AddEntitiesResponse"@\x92A\x15\x12\x13Add entities to tag\x82\xd3\xe4\x93\x02""\x1d/v1/{name=tags/*}:addEntities:\x01*\x12\xbb\x01\n\x0eRemoveEntities\x12..exabel.api.analytics.v1.RemoveEntitiesRequest\x1a/.exabel.api.analytics.v1.RemoveEntitiesResponse"H\x92A\x1a\x12\x18Remove entities from tag\x82\xd3\xe4\x93\x02%" /v1/{name=tags/*}:removeEntities:\x01*\x12\xb3\x01\n\x0fListTagEntities\x12/.exabel.api.analytics.v1.ListTagEntitiesRequest\x1a0.exabel.api.analytics.v1.ListTagEntitiesResponse"=\x92A\x16\x12\x14List entities in tag\x82\xd3\xe4\x93\x02\x1e\x12\x1c/v1/{parent=tags/*}/entitiesBM\n\x1bcom.exabel.api.analytics.v1B\x0fTagServiceProtoP\x01Z\x1bexabel.com/api/analytics/v1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n)exabel/api/analytics/v1/tag_service.proto\x12\x17exabel.api.analytics.v1\x1a*exabel/api/analytics/v1/tag_messages.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a google/protobuf/field_mask.proto\x1a.protoc_gen_openapiv2/options/annotations.proto"R\n\x10CreateTagRequest\x12.\n\x03tag\x18\x01 \x01(\x0b2\x1c.exabel.api.analytics.v1.TagB\x03\xe0A\x02\x12\x0e\n\x06folder\x18\x02 \x01(\t"2\n\rGetTagRequest\x12!\n\x04name\x18\x01 \x01(\tB\x13\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02"s\n\x10UpdateTagRequest\x12.\n\x03tag\x18\x01 \x01(\x0b2\x1c.exabel.api.analytics.v1.TagB\x03\xe0A\x02\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b2\x1a.google.protobuf.FieldMask"5\n\x10DeleteTagRequest\x12!\n\x04name\x18\x01 \x01(\tB\x13\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02"`\n\x0fListTagsRequest\x129\n\tpage_size\x18\x01 \x01(\x05B&\x92A#2!Maximum number of tags to return.\x12\x12\n\npage_token\x18\x02 \x01(\t"k\n\x10ListTagsResponse\x12*\n\x04tags\x18\x01 \x03(\x0b2\x1c.exabel.api.analytics.v1.Tag\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\x12\x12\n\ntotal_size\x18\x03 \x01(\x05"M\n\x12AddEntitiesRequest\x12!\n\x04name\x18\x01 \x01(\tB\x13\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02\x12\x14\n\x0centity_names\x18\x02 \x03(\t"\x15\n\x13AddEntitiesResponse"P\n\x15RemoveEntitiesRequest\x12!\n\x04name\x18\x01 \x01(\tB\x13\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02\x12\x14\n\x0centity_names\x18\x02 \x03(\t"\x18\n\x16RemoveEntitiesResponse"\x90\x01\n\x16ListTagEntitiesRequest\x12#\n\x06parent\x18\x01 \x01(\tB\x13\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02\x12=\n\tpage_size\x18\x02 \x01(\x05B*\x92A\'2%Maximum number of entities to return.\x12\x12\n\npage_token\x18\x03 \x01(\t"\\\n\x17ListTagEntitiesResponse\x12\x14\n\x0centity_names\x18\x01 \x03(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\x12\x12\n\ntotal_size\x18\x03 \x01(\x052\xa5\t\n\nTagService\x12z\n\tCreateTag\x12).exabel.api.analytics.v1.CreateTagRequest\x1a\x1c.exabel.api.analytics.v1.Tag"$\x92A\x0c\x12\nCreate tag\x82\xd3\xe4\x93\x02\x0f"\x08/v1/tags:\x03tag\x12u\n\x06GetTag\x12&.exabel.api.analytics.v1.GetTagRequest\x1a\x1c.exabel.api.analytics.v1.Tag"%\x92A\t\x12\x07Get tag\x82\xd3\xe4\x93\x02\x13\x12\x11/v1/{name=tags/*}\x12\x87\x01\n\tUpdateTag\x12).exabel.api.analytics.v1.UpdateTagRequest\x1a\x1c.exabel.api.analytics.v1.Tag"1\x92A\x0c\x12\nUpdate tag\x82\xd3\xe4\x93\x02\x1c2\x15/v1/{tag.name=tags/*}:\x03tag\x12x\n\tDeleteTag\x12).exabel.api.analytics.v1.DeleteTagRequest\x1a\x16.google.protobuf.Empty"(\x92A\x0c\x12\nDelete tag\x82\xd3\xe4\x93\x02\x13*\x11/v1/{name=tags/*}\x12\x7f\n\x08ListTags\x12(.exabel.api.analytics.v1.ListTagsRequest\x1a).exabel.api.analytics.v1.ListTagsResponse"\x1e\x92A\x0b\x12\tList tags\x82\xd3\xe4\x93\x02\n\x12\x08/v1/tags\x12\xaa\x01\n\x0bAddEntities\x12+.exabel.api.analytics.v1.AddEntitiesRequest\x1a,.exabel.api.analytics.v1.AddEntitiesResponse"@\x92A\x15\x12\x13Add entities to tag\x82\xd3\xe4\x93\x02""\x1d/v1/{name=tags/*}:addEntities:\x01*\x12\xbb\x01\n\x0eRemoveEntities\x12..exabel.api.analytics.v1.RemoveEntitiesRequest\x1a/.exabel.api.analytics.v1.RemoveEntitiesResponse"H\x92A\x1a\x12\x18Remove entities from tag\x82\xd3\xe4\x93\x02%" /v1/{name=tags/*}:removeEntities:\x01*\x12\xb3\x01\n\x0fListTagEntities\x12/.exabel.api.analytics.v1.ListTagEntitiesRequest\x1a0.exabel.api.analytics.v1.ListTagEntitiesResponse"=\x92A\x16\x12\x14List entities in tag\x82\xd3\xe4\x93\x02\x1e\x12\x1c/v1/{parent=tags/*}/entitiesBM\n\x1bcom.exabel.api.analytics.v1B\x0fTagServiceProtoP\x01Z\x1bexabel.com/api/analytics/v1b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'exabel.api.analytics.v1.tag_service_pb2', _globals) @@ -27,12 +27,16 @@ _globals['_UPDATETAGREQUEST'].fields_by_name['tag']._serialized_options = b'\xe0A\x02' _globals['_DELETETAGREQUEST'].fields_by_name['name']._loaded_options = None _globals['_DELETETAGREQUEST'].fields_by_name['name']._serialized_options = b'\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02' + _globals['_LISTTAGSREQUEST'].fields_by_name['page_size']._loaded_options = None + _globals['_LISTTAGSREQUEST'].fields_by_name['page_size']._serialized_options = b'\x92A#2!Maximum number of tags to return.' _globals['_ADDENTITIESREQUEST'].fields_by_name['name']._loaded_options = None _globals['_ADDENTITIESREQUEST'].fields_by_name['name']._serialized_options = b'\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02' _globals['_REMOVEENTITIESREQUEST'].fields_by_name['name']._loaded_options = None _globals['_REMOVEENTITIESREQUEST'].fields_by_name['name']._serialized_options = b'\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02' _globals['_LISTTAGENTITIESREQUEST'].fields_by_name['parent']._loaded_options = None _globals['_LISTTAGENTITIESREQUEST'].fields_by_name['parent']._serialized_options = b'\x92A\r\xca>\n\xfa\x02\x07tagName\xe0A\x02' + _globals['_LISTTAGENTITIESREQUEST'].fields_by_name['page_size']._loaded_options = None + _globals['_LISTTAGENTITIESREQUEST'].fields_by_name['page_size']._serialized_options = b"\x92A'2%Maximum number of entities to return." _globals['_TAGSERVICE'].methods_by_name['CreateTag']._loaded_options = None _globals['_TAGSERVICE'].methods_by_name['CreateTag']._serialized_options = b'\x92A\x0c\x12\nCreate tag\x82\xd3\xe4\x93\x02\x0f"\x08/v1/tags:\x03tag' _globals['_TAGSERVICE'].methods_by_name['GetTag']._loaded_options = None @@ -58,20 +62,20 @@ _globals['_DELETETAGREQUEST']._serialized_start = 541 _globals['_DELETETAGREQUEST']._serialized_end = 594 _globals['_LISTTAGSREQUEST']._serialized_start = 596 - _globals['_LISTTAGSREQUEST']._serialized_end = 652 - _globals['_LISTTAGSRESPONSE']._serialized_start = 654 - _globals['_LISTTAGSRESPONSE']._serialized_end = 761 - _globals['_ADDENTITIESREQUEST']._serialized_start = 763 - _globals['_ADDENTITIESREQUEST']._serialized_end = 840 - _globals['_ADDENTITIESRESPONSE']._serialized_start = 842 - _globals['_ADDENTITIESRESPONSE']._serialized_end = 863 - _globals['_REMOVEENTITIESREQUEST']._serialized_start = 865 - _globals['_REMOVEENTITIESREQUEST']._serialized_end = 945 - _globals['_REMOVEENTITIESRESPONSE']._serialized_start = 947 - _globals['_REMOVEENTITIESRESPONSE']._serialized_end = 971 - _globals['_LISTTAGENTITIESREQUEST']._serialized_start = 973 - _globals['_LISTTAGENTITIESREQUEST']._serialized_end = 1073 - _globals['_LISTTAGENTITIESRESPONSE']._serialized_start = 1075 - _globals['_LISTTAGENTITIESRESPONSE']._serialized_end = 1167 - _globals['_TAGSERVICE']._serialized_start = 1170 - _globals['_TAGSERVICE']._serialized_end = 2359 \ No newline at end of file + _globals['_LISTTAGSREQUEST']._serialized_end = 692 + _globals['_LISTTAGSRESPONSE']._serialized_start = 694 + _globals['_LISTTAGSRESPONSE']._serialized_end = 801 + _globals['_ADDENTITIESREQUEST']._serialized_start = 803 + _globals['_ADDENTITIESREQUEST']._serialized_end = 880 + _globals['_ADDENTITIESRESPONSE']._serialized_start = 882 + _globals['_ADDENTITIESRESPONSE']._serialized_end = 903 + _globals['_REMOVEENTITIESREQUEST']._serialized_start = 905 + _globals['_REMOVEENTITIESREQUEST']._serialized_end = 985 + _globals['_REMOVEENTITIESRESPONSE']._serialized_start = 987 + _globals['_REMOVEENTITIESRESPONSE']._serialized_end = 1011 + _globals['_LISTTAGENTITIESREQUEST']._serialized_start = 1014 + _globals['_LISTTAGENTITIESREQUEST']._serialized_end = 1158 + _globals['_LISTTAGENTITIESRESPONSE']._serialized_start = 1160 + _globals['_LISTTAGENTITIESRESPONSE']._serialized_end = 1252 + _globals['_TAGSERVICE']._serialized_start = 1255 + _globals['_TAGSERVICE']._serialized_end = 2444 \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2.pyi b/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2.pyi index 33852b6f..fb652c72 100644 --- a/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2.pyi +++ b/exabel_data_sdk/stubs/exabel/api/analytics/v1/tag_service_pb2.pyi @@ -101,7 +101,7 @@ class ListTagsRequest(google.protobuf.message.Message): PAGE_SIZE_FIELD_NUMBER: builtins.int PAGE_TOKEN_FIELD_NUMBER: builtins.int page_size: builtins.int - 'Maximum number of results to return. Default is 20 and max is 1000.' + 'Maximum number of tags to return. Default is 20 and max is 1000.' page_token: builtins.str 'Token for a specific page of results, as returned from a previous list request with the same\n query parameters.\n ' @@ -205,7 +205,7 @@ class ListTagEntitiesRequest(google.protobuf.message.Message): parent: builtins.str 'The parent tag to list entities for\n Example: `tags/user:abc123`.\n ' page_size: builtins.int - 'Maximum number of results to return. Default is 20 and max is 1000.' + 'Maximum number of entities to return. Default is 20 and max is 1000.' page_token: builtins.str 'Token for a specific page of results, as returned from a previous list request with the same\n query parameters.\n ' 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 1614010e..3d793c7d 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/__init__.pyi b/exabel_data_sdk/stubs/exabel/api/data/v1/__init__.pyi index ec728938..1cae8f00 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/__init__.pyi +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/__init__.pyi @@ -1,3 +1,5 @@ +from . import calendar_messages_pb2 +from . import calendar_service_pb2 from . import common_messages_pb2 from . import data_set_messages_pb2 from . import data_set_service_pb2 diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/all_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/all_pb2.py index 29bafaed..5a3af2a7 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/all_pb2.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/all_pb2.py @@ -1,6 +1,8 @@ # Generated by generate_protobuf.sh. # Contains all messages in *_pb2.py in a single module. +from .calendar_messages_pb2 import * +from .calendar_service_pb2 import * from .common_messages_pb2 import * from .data_set_messages_pb2 import * from .data_set_service_pb2 import * diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/all_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/all_pb2_grpc.py index 1c294e94..c00932eb 100644 --- a/exabel_data_sdk/stubs/exabel/api/data/v1/all_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/all_pb2_grpc.py @@ -1,6 +1,8 @@ # Generated by generate_protobuf.sh. # Contains all messages in *_pb2_grpc.py in a single module. +from .calendar_messages_pb2_grpc import * +from .calendar_service_pb2_grpc import * from .common_messages_pb2_grpc import * from .data_set_messages_pb2_grpc import * from .data_set_service_pb2_grpc import * diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_messages_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_messages_pb2.py new file mode 100644 index 00000000..8ecbc0e9 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_messages_pb2.py @@ -0,0 +1,20 @@ +"""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/data/v1/calendar_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/data/v1/calendar_messages.proto\x12\x12exabel.api.data.v1\x1a\x1aexabel/api/time/date.proto"i\n\x0cFiscalPeriod\x120\n\tfrequency\x18\x01 \x01(\x0e2\x1d.exabel.api.data.v1.Frequency\x12\'\n\x08end_date\x18\x02 \x01(\x0b2\x15.exabel.api.time.Date*Q\n\tFrequency\x12\x19\n\x15FREQUENCY_UNSPECIFIED\x10\x00\x12\r\n\tQUARTERLY\x10\x01\x12\x0e\n\nSEMIANNUAL\x10\x02\x12\n\n\x06ANNUAL\x10\x03BI\n\x16com.exabel.api.data.v1B\x15CalendarMessagesProtoP\x01Z\x16exabel.com/api/data/v1b\x06proto3') +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'exabel.api.data.v1.calendar_messages_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\x16com.exabel.api.data.v1B\x15CalendarMessagesProtoP\x01Z\x16exabel.com/api/data/v1' + _globals['_FREQUENCY']._serialized_start = 201 + _globals['_FREQUENCY']._serialized_end = 282 + _globals['_FISCALPERIOD']._serialized_start = 94 + _globals['_FISCALPERIOD']._serialized_end = 199 \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_messages_pb2.pyi b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_messages_pb2.pyi new file mode 100644 index 00000000..56bfa8de --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_messages_pb2.pyi @@ -0,0 +1,66 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +Copyright (c) 2019-2025 Exabel AS. All rights reserved.""" +import builtins +from ..... import exabel +import google.protobuf.descriptor +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 _Frequency: + ValueType = typing.NewType('ValueType', builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _FrequencyEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_Frequency.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + FREQUENCY_UNSPECIFIED: _Frequency.ValueType + 'The frequency of the fiscal period is unspecified.' + QUARTERLY: _Frequency.ValueType + 'The fiscal period is quarterly.' + SEMIANNUAL: _Frequency.ValueType + 'The fiscal period is semi-annual.' + ANNUAL: _Frequency.ValueType + 'The fiscal periods is annual.' + +class Frequency(_Frequency, metaclass=_FrequencyEnumTypeWrapper): + """The frequency of a fiscal period.""" +FREQUENCY_UNSPECIFIED: Frequency.ValueType +'The frequency of the fiscal period is unspecified.' +QUARTERLY: Frequency.ValueType +'The fiscal period is quarterly.' +SEMIANNUAL: Frequency.ValueType +'The fiscal period is semi-annual.' +ANNUAL: Frequency.ValueType +'The fiscal periods is annual.' +global___Frequency = Frequency + +@typing.final +class FiscalPeriod(google.protobuf.message.Message): + """A fiscal period of a company.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + FREQUENCY_FIELD_NUMBER: builtins.int + END_DATE_FIELD_NUMBER: builtins.int + frequency: global___Frequency.ValueType + 'The frequency of the fiscal period.' + + @property + def end_date(self) -> exabel.api.time.date_pb2.Date: + """The last date in the fiscal period.""" + + def __init__(self, *, frequency: global___Frequency.ValueType | None=..., end_date: exabel.api.time.date_pb2.Date | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['end_date', b'end_date']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['end_date', b'end_date', 'frequency', b'frequency']) -> None: + ... +global___FiscalPeriod = FiscalPeriod \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_messages_pb2_grpc.py new file mode 100644 index 00000000..7dc6609e --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_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.2' +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/data/v1/calendar_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/data/v1/calendar_service_pb2.py b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_service_pb2.py new file mode 100644 index 00000000..1fc00915 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_service_pb2.py @@ -0,0 +1,52 @@ +"""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/data/v1/calendar_service.proto') +_sym_db = _symbol_database.Default() +from .....exabel.api.data.v1 import calendar_messages_pb2 as exabel_dot_api_dot_data_dot_v1_dot_calendar__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 google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__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/data/v1/calendar_service.proto\x12\x12exabel.api.data.v1\x1a*exabel/api/data/v1/calendar_messages.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a.protoc_gen_openapiv2/options/annotations.proto"\x82\x01\n\x1fBatchCreateFiscalPeriodsRequest\x12\'\n\x06parent\x18\x01 \x01(\tB\x17\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02\x126\n\x07periods\x18\x02 \x03(\x0b2 .exabel.api.data.v1.FiscalPeriodB\x03\xe0A\x02""\n BatchCreateFiscalPeriodsResponse"v\n\x19DeleteFiscalPeriodRequest\x12\'\n\x06parent\x18\x01 \x01(\tB\x17\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02\x120\n\x06period\x18\x02 \x01(\x0b2 .exabel.api.data.v1.FiscalPeriod"u\n\x18ListFiscalPeriodsRequest\x12\'\n\x06parent\x18\x01 \x01(\tB\x17\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02\x120\n\tfrequency\x18\x02 \x01(\x0e2\x1d.exabel.api.data.v1.Frequency"N\n\x19ListFiscalPeriodsResponse\x121\n\x07periods\x18\x01 \x03(\x0b2 .exabel.api.data.v1.FiscalPeriod"\'\n%ListCompaniesWithFiscalPeriodsRequest";\n&ListCompaniesWithFiscalPeriodsResponse\x12\x11\n\tcompanies\x18\x01 \x03(\t2\x99\x07\n\x0fCalendarService\x12\xf8\x01\n\x18BatchCreateFiscalPeriods\x123.exabel.api.data.v1.BatchCreateFiscalPeriodsRequest\x1a4.exabel.api.data.v1.BatchCreateFiscalPeriodsResponse"q\x92A\x1e\x12\x1cCreate custom fiscal periods\x82\xd3\xe4\x93\x02J"E/v1/{parent=entityTypes/company/entities/*}/fiscalPeriods:batchCreate:\x01*\x12\xd2\x01\n\x11ListFiscalPeriods\x12,.exabel.api.data.v1.ListFiscalPeriodsRequest\x1a-.exabel.api.data.v1.ListFiscalPeriodsResponse"`\x92A\x1c\x12\x1aList custom fiscal periods\x82\xd3\xe4\x93\x02;\x129/v1/{parent=entityTypes/company/entities/*}/fiscalPeriods\x12\xbf\x01\n\x12DeleteFiscalPeriod\x12-.exabel.api.data.v1.DeleteFiscalPeriodRequest\x1a\x16.google.protobuf.Empty"b\x92A\x1e\x12\x1cDelete custom fiscal periods\x82\xd3\xe4\x93\x02;*9/v1/{parent=entityTypes/company/entities/*}/fiscalPeriods\x12\xf3\x01\n\x1eListCompaniesWithFiscalPeriods\x129.exabel.api.data.v1.ListCompaniesWithFiscalPeriodsRequest\x1a:.exabel.api.data.v1.ListCompaniesWithFiscalPeriodsResponse"Z\x92A+\x12)List companies with custom fiscal periods\x82\xd3\xe4\x93\x02&\x12$/v1/companiesWithCustomFiscalPeriodsBH\n\x16com.exabel.api.data.v1B\x14CalendarServiceProtoP\x01Z\x16exabel.com/api/data/v1b\x06proto3') +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'exabel.api.data.v1.calendar_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\x14CalendarServiceProtoP\x01Z\x16exabel.com/api/data/v1' + _globals['_BATCHCREATEFISCALPERIODSREQUEST'].fields_by_name['parent']._loaded_options = None + _globals['_BATCHCREATEFISCALPERIODSREQUEST'].fields_by_name['parent']._serialized_options = b'\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02' + _globals['_BATCHCREATEFISCALPERIODSREQUEST'].fields_by_name['periods']._loaded_options = None + _globals['_BATCHCREATEFISCALPERIODSREQUEST'].fields_by_name['periods']._serialized_options = b'\xe0A\x02' + _globals['_DELETEFISCALPERIODREQUEST'].fields_by_name['parent']._loaded_options = None + _globals['_DELETEFISCALPERIODREQUEST'].fields_by_name['parent']._serialized_options = b'\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02' + _globals['_LISTFISCALPERIODSREQUEST'].fields_by_name['parent']._loaded_options = None + _globals['_LISTFISCALPERIODSREQUEST'].fields_by_name['parent']._serialized_options = b'\x92A\x11\xca>\x0e\xfa\x02\x0bcompanyName\xe0A\x02' + _globals['_CALENDARSERVICE'].methods_by_name['BatchCreateFiscalPeriods']._loaded_options = None + _globals['_CALENDARSERVICE'].methods_by_name['BatchCreateFiscalPeriods']._serialized_options = b'\x92A\x1e\x12\x1cCreate custom fiscal periods\x82\xd3\xe4\x93\x02J"E/v1/{parent=entityTypes/company/entities/*}/fiscalPeriods:batchCreate:\x01*' + _globals['_CALENDARSERVICE'].methods_by_name['ListFiscalPeriods']._loaded_options = None + _globals['_CALENDARSERVICE'].methods_by_name['ListFiscalPeriods']._serialized_options = b'\x92A\x1c\x12\x1aList custom fiscal periods\x82\xd3\xe4\x93\x02;\x129/v1/{parent=entityTypes/company/entities/*}/fiscalPeriods' + _globals['_CALENDARSERVICE'].methods_by_name['DeleteFiscalPeriod']._loaded_options = None + _globals['_CALENDARSERVICE'].methods_by_name['DeleteFiscalPeriod']._serialized_options = b'\x92A\x1e\x12\x1cDelete custom fiscal periods\x82\xd3\xe4\x93\x02;*9/v1/{parent=entityTypes/company/entities/*}/fiscalPeriods' + _globals['_CALENDARSERVICE'].methods_by_name['ListCompaniesWithFiscalPeriods']._loaded_options = None + _globals['_CALENDARSERVICE'].methods_by_name['ListCompaniesWithFiscalPeriods']._serialized_options = b'\x92A+\x12)List companies with custom fiscal periods\x82\xd3\xe4\x93\x02&\x12$/v1/companiesWithCustomFiscalPeriods' + _globals['_BATCHCREATEFISCALPERIODSREQUEST']._serialized_start = 250 + _globals['_BATCHCREATEFISCALPERIODSREQUEST']._serialized_end = 380 + _globals['_BATCHCREATEFISCALPERIODSRESPONSE']._serialized_start = 382 + _globals['_BATCHCREATEFISCALPERIODSRESPONSE']._serialized_end = 416 + _globals['_DELETEFISCALPERIODREQUEST']._serialized_start = 418 + _globals['_DELETEFISCALPERIODREQUEST']._serialized_end = 536 + _globals['_LISTFISCALPERIODSREQUEST']._serialized_start = 538 + _globals['_LISTFISCALPERIODSREQUEST']._serialized_end = 655 + _globals['_LISTFISCALPERIODSRESPONSE']._serialized_start = 657 + _globals['_LISTFISCALPERIODSRESPONSE']._serialized_end = 735 + _globals['_LISTCOMPANIESWITHFISCALPERIODSREQUEST']._serialized_start = 737 + _globals['_LISTCOMPANIESWITHFISCALPERIODSREQUEST']._serialized_end = 776 + _globals['_LISTCOMPANIESWITHFISCALPERIODSRESPONSE']._serialized_start = 778 + _globals['_LISTCOMPANIESWITHFISCALPERIODSRESPONSE']._serialized_end = 837 + _globals['_CALENDARSERVICE']._serialized_start = 840 + _globals['_CALENDARSERVICE']._serialized_end = 1761 \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_service_pb2.pyi b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_service_pb2.pyi new file mode 100644 index 00000000..8473c351 --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_service_pb2.pyi @@ -0,0 +1,127 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +Copyright (c) 2019-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.message +import typing +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +@typing.final +class BatchCreateFiscalPeriodsRequest(google.protobuf.message.Message): + """A request to create multiple custom fiscal periods for a company.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + PARENT_FIELD_NUMBER: builtins.int + PERIODS_FIELD_NUMBER: builtins.int + parent: builtins.str + 'The resource name of the company.' + + @property + def periods(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[exabel.api.data.v1.calendar_messages_pb2.FiscalPeriod]: + """The custom fiscal periods to add.""" + + def __init__(self, *, parent: builtins.str | None=..., periods: collections.abc.Iterable[exabel.api.data.v1.calendar_messages_pb2.FiscalPeriod] | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['parent', b'parent', 'periods', b'periods']) -> None: + ... +global___BatchCreateFiscalPeriodsRequest = BatchCreateFiscalPeriodsRequest + +@typing.final +class BatchCreateFiscalPeriodsResponse(google.protobuf.message.Message): + """The response to a request to create custom fiscal periods.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__(self) -> None: + ... +global___BatchCreateFiscalPeriodsResponse = BatchCreateFiscalPeriodsResponse + +@typing.final +class DeleteFiscalPeriodRequest(google.protobuf.message.Message): + """A request to delete a fiscal period for a company.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + PARENT_FIELD_NUMBER: builtins.int + PERIOD_FIELD_NUMBER: builtins.int + parent: builtins.str + 'The resource name of the company.' + + @property + def period(self) -> exabel.api.data.v1.calendar_messages_pb2.FiscalPeriod: + """The custom fiscal periods to delete. If not set, will delete all custom fiscal periods + for the given company. + """ + + def __init__(self, *, parent: builtins.str | None=..., period: exabel.api.data.v1.calendar_messages_pb2.FiscalPeriod | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['period', b'period']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['parent', b'parent', 'period', b'period']) -> None: + ... +global___DeleteFiscalPeriodRequest = DeleteFiscalPeriodRequest + +@typing.final +class ListFiscalPeriodsRequest(google.protobuf.message.Message): + """A request to list the custom fiscal periods for a company.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + PARENT_FIELD_NUMBER: builtins.int + FREQUENCY_FIELD_NUMBER: builtins.int + parent: builtins.str + 'The resource name of the company.' + frequency: exabel.api.data.v1.calendar_messages_pb2.Frequency.ValueType + 'Optionally, a frequency.\n If a frequency is provided, only the custom fiscal periods of that frequency are returned.\n Otherwise, all the custom fiscal periods for the company are returned.\n ' + + def __init__(self, *, parent: builtins.str | None=..., frequency: exabel.api.data.v1.calendar_messages_pb2.Frequency.ValueType | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['frequency', b'frequency', 'parent', b'parent']) -> None: + ... +global___ListFiscalPeriodsRequest = ListFiscalPeriodsRequest + +@typing.final +class ListFiscalPeriodsResponse(google.protobuf.message.Message): + """The response to a request to list custom fiscal periods.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + PERIODS_FIELD_NUMBER: builtins.int + + @property + def periods(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[exabel.api.data.v1.calendar_messages_pb2.FiscalPeriod]: + """The fiscal periods of the requested company.""" + + def __init__(self, *, periods: collections.abc.Iterable[exabel.api.data.v1.calendar_messages_pb2.FiscalPeriod] | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['periods', b'periods']) -> None: + ... +global___ListFiscalPeriodsResponse = ListFiscalPeriodsResponse + +@typing.final +class ListCompaniesWithFiscalPeriodsRequest(google.protobuf.message.Message): + """A request to list all the companies for which custom fiscal periods have been uploaded.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__(self) -> None: + ... +global___ListCompaniesWithFiscalPeriodsRequest = ListCompaniesWithFiscalPeriodsRequest + +@typing.final +class ListCompaniesWithFiscalPeriodsResponse(google.protobuf.message.Message): + """The response to a request to list companies with custom fiscal periods.""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + COMPANIES_FIELD_NUMBER: builtins.int + + @property + def companies(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """A list of resource names of the companies that have custom fiscal periods.""" + + def __init__(self, *, companies: collections.abc.Iterable[builtins.str] | None=...) -> None: + ... + + def ClearField(self, field_name: typing.Literal['companies', b'companies']) -> None: + ... +global___ListCompaniesWithFiscalPeriodsResponse = ListCompaniesWithFiscalPeriodsResponse \ No newline at end of file diff --git a/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_service_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_service_pb2_grpc.py new file mode 100644 index 00000000..5a1e00da --- /dev/null +++ b/exabel_data_sdk/stubs/exabel/api/data/v1/calendar_service_pb2_grpc.py @@ -0,0 +1,102 @@ +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings +from .....exabel.api.data.v1 import calendar_service_pb2 as exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 +GRPC_GENERATED_VERSION = '1.71.2' +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/data/v1/calendar_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 CalendarServiceStub(object): + """Service for managing custom fiscal calendar data. + + Custom fiscal calendar data will supplement calendar data provided by Exabel. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.BatchCreateFiscalPeriods = channel.unary_unary('/exabel.api.data.v1.CalendarService/BatchCreateFiscalPeriods', request_serializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.BatchCreateFiscalPeriodsRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.BatchCreateFiscalPeriodsResponse.FromString, _registered_method=True) + self.ListFiscalPeriods = channel.unary_unary('/exabel.api.data.v1.CalendarService/ListFiscalPeriods', request_serializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListFiscalPeriodsRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListFiscalPeriodsResponse.FromString, _registered_method=True) + self.DeleteFiscalPeriod = channel.unary_unary('/exabel.api.data.v1.CalendarService/DeleteFiscalPeriod', request_serializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.DeleteFiscalPeriodRequest.SerializeToString, response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, _registered_method=True) + self.ListCompaniesWithFiscalPeriods = channel.unary_unary('/exabel.api.data.v1.CalendarService/ListCompaniesWithFiscalPeriods', request_serializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListCompaniesWithFiscalPeriodsRequest.SerializeToString, response_deserializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListCompaniesWithFiscalPeriodsResponse.FromString, _registered_method=True) + +class CalendarServiceServicer(object): + """Service for managing custom fiscal calendar data. + + Custom fiscal calendar data will supplement calendar data provided by Exabel. + """ + + def BatchCreateFiscalPeriods(self, request, context): + """Creates multiple custom fiscal periods for a company. + + Creates multiple custom fiscal periods for a given company. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListFiscalPeriods(self, request, context): + """Lists the custom fiscal periods for a company. + + Lists the custom fiscal periods for a given company. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteFiscalPeriod(self, request, context): + """Deletes one or all fiscal period for a company. + + Deletes one or all fiscal period for a given company. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListCompaniesWithFiscalPeriods(self, request, context): + """Lists all the companies with custom fiscal periods. + + Lists all the companies for which there are custom fiscal periods. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + +def add_CalendarServiceServicer_to_server(servicer, server): + rpc_method_handlers = {'BatchCreateFiscalPeriods': grpc.unary_unary_rpc_method_handler(servicer.BatchCreateFiscalPeriods, request_deserializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.BatchCreateFiscalPeriodsRequest.FromString, response_serializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.BatchCreateFiscalPeriodsResponse.SerializeToString), 'ListFiscalPeriods': grpc.unary_unary_rpc_method_handler(servicer.ListFiscalPeriods, request_deserializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListFiscalPeriodsRequest.FromString, response_serializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListFiscalPeriodsResponse.SerializeToString), 'DeleteFiscalPeriod': grpc.unary_unary_rpc_method_handler(servicer.DeleteFiscalPeriod, request_deserializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.DeleteFiscalPeriodRequest.FromString, response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString), 'ListCompaniesWithFiscalPeriods': grpc.unary_unary_rpc_method_handler(servicer.ListCompaniesWithFiscalPeriods, request_deserializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListCompaniesWithFiscalPeriodsRequest.FromString, response_serializer=exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListCompaniesWithFiscalPeriodsResponse.SerializeToString)} + generic_handler = grpc.method_handlers_generic_handler('exabel.api.data.v1.CalendarService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('exabel.api.data.v1.CalendarService', rpc_method_handlers) + +class CalendarService(object): + """Service for managing custom fiscal calendar data. + + Custom fiscal calendar data will supplement calendar data provided by Exabel. + """ + + @staticmethod + def BatchCreateFiscalPeriods(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.data.v1.CalendarService/BatchCreateFiscalPeriods', exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.BatchCreateFiscalPeriodsRequest.SerializeToString, exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.BatchCreateFiscalPeriodsResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata, _registered_method=True) + + @staticmethod + def ListFiscalPeriods(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.data.v1.CalendarService/ListFiscalPeriods', exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListFiscalPeriodsRequest.SerializeToString, exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListFiscalPeriodsResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata, _registered_method=True) + + @staticmethod + def DeleteFiscalPeriod(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.data.v1.CalendarService/DeleteFiscalPeriod', exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.DeleteFiscalPeriodRequest.SerializeToString, google_dot_protobuf_dot_empty__pb2.Empty.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata, _registered_method=True) + + @staticmethod + def ListCompaniesWithFiscalPeriods(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.data.v1.CalendarService/ListCompaniesWithFiscalPeriods', exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListCompaniesWithFiscalPeriodsRequest.SerializeToString, exabel_dot_api_dot_data_dot_v1_dot_calendar__service__pb2.ListCompaniesWithFiscalPeriodsResponse.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/data/v1/common_messages_pb2_grpc.py b/exabel_data_sdk/stubs/exabel/api/data/v1/common_messages_pb2_grpc.py index 3f5bb684..fde02d10 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 f18417e5..ca3714b7 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 a3f28fcd..449d4b4e 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 dff9a5c3..b47dc26e 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 d5c47488..880fb044 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 e137ca03..5841cd50 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 82cb15e9..8e9543b4 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 c041e4a3..676e81f1 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 9b3f6a8c..728ca193 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 018adfc9..db0d04cf 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 39fc0dc5..ac84b7ab 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' 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 58cf0da7..384f2799 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 @@ -7,10 +7,10 @@ _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\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') +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\x8c\x03\n\x16com.exabel.api.data.v1B\x0cServiceProtoP\x01Z\x16exabel.com/api/data/v1\x92A\xc8\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/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\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\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 + _globals['DESCRIPTOR']._serialized_options = b'\n\x16com.exabel.api.data.v1B\x0cServiceProtoP\x01Z\x16exabel.com/api/data/v1\x92A\xc8\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/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\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 d29701e2..696c927f 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 b96cf000..b90a3e1f 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 7d378a54..7562a30b 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 719b2247..bf3de6a8 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 2650ba7e..060b1d19 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 9a38da16..ce569f7d 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 e373b242..9e7f9acf 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 866d9460..cdb58725 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 6b68325b..375f5f8c 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 c052a744..c0452f1d 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 b45dc394..9ca437c1 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 91064d31..0c6a2935 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 index 11fd38b1..cc392831 100644 --- a/exabel_data_sdk/stubs/exabel/api/time/date_pb2_grpc.py +++ b/exabel_data_sdk/stubs/exabel/api/time/date_pb2_grpc.py @@ -1,7 +1,7 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc import warnings -GRPC_GENERATED_VERSION = '1.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 bdad8aef..ea9efaf6 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 64d576f5..31d1976f 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: 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 bac2b65c..722accaf 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.71.0' +GRPC_GENERATED_VERSION = '1.71.2' GRPC_VERSION = grpc.__version__ _version_not_supported = False try: diff --git a/exabel_data_sdk/tests/client/api/data_classes/test_derived_signal.py b/exabel_data_sdk/tests/client/api/data_classes/test_derived_signal.py index 1a6f32f7..d3311ead 100644 --- a/exabel_data_sdk/tests/client/api/data_classes/test_derived_signal.py +++ b/exabel_data_sdk/tests/client/api/data_classes/test_derived_signal.py @@ -5,15 +5,43 @@ DerivedSignalMetaData, DerivedSignalUnit, ) +from exabel_data_sdk.stubs.exabel.api.data.v1.signal_messages_pb2 import ( + DerivedSignal as ProtoDataApiDerivedSignal, +) +from exabel_data_sdk.stubs.exabel.api.math.aggregation_pb2 import Aggregation +from exabel_data_sdk.stubs.exabel.api.math.change_pb2 import Change class TestDerivedSignal(unittest.TestCase): - def test_proto_conversion(self): + def test_from_analytics_api_proto(self): derived_signal = DerivedSignal( - name="derivedSignals/123", - label="test_signal", - expression="close_price + 1", - description="price plus one", - metadata=DerivedSignalMetaData(unit=DerivedSignalUnit.RATIO_DIFFERENCE, decimals=2), + name="derivedSignals/456", + label="enhanced_signal", + expression="va_actual(123)", + description="enhanced signal with full metadata", + display_name="Enhanced Signal", + metadata=DerivedSignalMetaData( + unit=DerivedSignalUnit.NUMBER, + decimals=3, + downsampling_method=Aggregation.MEAN, + change=Change.RELATIVE, + ), + ) + converted = DerivedSignal.from_analytics_api_proto(derived_signal.to_analytics_api_proto()) + self.assertEqual(derived_signal, converted) + self.assertEqual(converted.metadata.downsampling_method, Aggregation.MEAN) + self.assertEqual(converted.metadata.change, Change.RELATIVE) + + def test_from_data_api_proto(self): + data_api_signal = ProtoDataApiDerivedSignal( + name="derivedSignals/456", + label="enum_signal", + expression="va_actual(123)", + description="signal with enums", + display_name="Enum Signal", + downsampling_method=Aggregation.MEAN, + change=Change.RELATIVE, ) - self.assertEqual(derived_signal, DerivedSignal.from_proto(derived_signal.to_proto())) + signal = DerivedSignal.from_data_api_proto(data_api_signal) + self.assertEqual(signal.metadata.downsampling_method, Aggregation.MEAN) + self.assertEqual(signal.metadata.change, Change.RELATIVE) diff --git a/exabel_data_sdk/tests/scripts/test_export_data.py b/exabel_data_sdk/tests/scripts/test_export_data.py index 873733bf..4de348d9 100644 --- a/exabel_data_sdk/tests/scripts/test_export_data.py +++ b/exabel_data_sdk/tests/scripts/test_export_data.py @@ -30,6 +30,12 @@ def test_args__api_key(self): self._assert_common_args(args) self.assertEqual(args.api_key, "api-key") + def test_args__access_token(self): + script = ExportData(self.common_args + ["--access-token", "access-token"]) + args = script.parse_arguments() + self._assert_common_args(args) + self.assertEqual(args.access_token, "access-token") + def test_args__reauthenticate(self): script = ExportData(self.common_args + ["--reauthenticate"]) args = script.parse_arguments() @@ -56,10 +62,25 @@ def test_args__both_api_key_and_reauthenticate_should_fail(self): with self.assertRaises(SystemExit): script.parse_arguments() + def test_args__both_api_key_and_access_token_should_fail(self): + script = ExportData( + self.common_args + ["--api-key", "api-key", "--access-token", "access-token"] + ) + with self.assertRaises(SystemExit): + script.parse_arguments() + @mock.patch("exabel_data_sdk.client.api.export_api.ExportApi.from_api_key") - def test_get_export_api(self, from_api_key_mock): + def test_get_export_api_from_api_key(self, from_api_key_mock): """Factory method ExportApi.use_api_key should be called is api-key not None.""" - ExportData.get_export_api("api-key", retries=2) + ExportData.get_export_api(api_key="api-key", retries=2) from_api_key_mock.assert_called_with("api-key", False, retries=2) - ExportData.get_export_api("api-key", use_test_backend=True) + ExportData.get_export_api(api_key="api-key", use_test_backend=True) from_api_key_mock.assert_called_with("api-key", True, retries=0) + + @mock.patch("exabel_data_sdk.client.api.export_api.ExportApi.from_access_token") + def test_get_export_api_from_access_token(self, from_access_token_mock): + """Factory method ExportApi.use_api_key should be called is api-key not None.""" + ExportData.get_export_api(access_token="access-token", retries=2) + from_access_token_mock.assert_called_with("access-token", False, retries=2) + ExportData.get_export_api(access_token="access-token", use_test_backend=True) + from_access_token_mock.assert_called_with("access-token", True, retries=0) diff --git a/exabel_data_sdk/tests/scripts/test_load_time_series_from_excel.py b/exabel_data_sdk/tests/scripts/test_load_time_series_from_excel.py index d8ee8c42..f3a6ee72 100644 --- a/exabel_data_sdk/tests/scripts/test_load_time_series_from_excel.py +++ b/exabel_data_sdk/tests/scripts/test_load_time_series_from_excel.py @@ -26,7 +26,7 @@ def check_import( *expected_calls, pit_from_file: bool = False, entity_type: Optional[str] = None, - identifier_type: Optional[str] = None + identifier_type: Optional[str] = None, ): """Check that the file can be imported and that it produces the given time series.""" args = common_args + [ From 0441c985c1fcb45c0e704f24a3c79cdc052a8b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Matheson=20Wergeland?= Date: Fri, 14 Nov 2025 12:56:05 +0100 Subject: [PATCH 2/3] Set python-version-file --- .github/workflows/build_test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 82b263e1..e7d07cbc 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -11,7 +11,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 - + with: + python-version-file: '.python-version' - name: Install dependencies and build package run: | pip install pipenv wheel From d4f813b3ee112db4f80157a7669df2b124154950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Matheson=20Wergeland?= Date: Mon, 17 Nov 2025 10:29:43 +0100 Subject: [PATCH 3/3] Bump Python versions - Removed support for Python 3.9 (EOL) - Added support for Python 3.14 --- .github/workflows/build_test.yml | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/test_installability.yml | 2 +- .python-version | 2 +- Pipfile | 2 +- Pipfile.lock | 1473 +++++++++++---------- README.md | 2 +- exabel_data_sdk/client/api/bulk_import.py | 5 +- exabel_data_sdk/client/api/bulk_insert.py | 5 +- pyproject.toml | 2 +- setup.py | 4 +- 11 files changed, 771 insertions(+), 730 deletions(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index e7d07cbc..67cab0b9 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -30,7 +30,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] fail-fast: true steps: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 86e92b99..e9dc98dc 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -39,7 +39,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] fail-fast: true steps: diff --git a/.github/workflows/test_installability.yml b/.github/workflows/test_installability.yml index 5456e911..cdb99c55 100644 --- a/.github/workflows/test_installability.yml +++ b/.github/workflows/test_installability.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] fail-fast: true steps: diff --git a/.python-version b/.python-version index 94329086..eae0123d 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.9.20 +3.10.19 diff --git a/Pipfile b/Pipfile index 805b95c3..23ade548 100644 --- a/Pipfile +++ b/Pipfile @@ -33,4 +33,4 @@ wheel = "*" [dev-packages] [requires] -python_version = "3.9" +python_version = "3.10" diff --git a/Pipfile.lock b/Pipfile.lock index 4dce6c5a..0340d86d 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "a6e5e9c170b3b73d622e32ec57e8f8fcbca4cfc34f5f3708ecbbaeb76979d3c4" + "sha256": "aeab4f58bd92c16471515a579901deb2a48f6f01371e2f79523c1abe159fe068" }, "pipfile-spec": 6, "requires": { - "python_version": "3.9" + "python_version": "3.10" }, "sources": [ { @@ -25,11 +25,11 @@ }, "astroid": { "hashes": [ - "sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce", - "sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec" + "sha256:ac8fb7ca1c08eb9afec91ccc23edbd8ac73bb22cbdd7da1d488d9fb8d6579070", + "sha256:d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b" ], - "markers": "python_full_version >= '3.9.0'", - "version": "==3.3.11" + "markers": "python_full_version >= '3.10.0'", + "version": "==4.0.2" }, "backports.tarfile": { "hashes": [ @@ -41,64 +41,68 @@ }, "black": { "hashes": [ - "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", - "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", - "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", - "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", - "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", - "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", - "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", - "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", - "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", - "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", - "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", - "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", - "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0", - "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", - "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", - "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", - "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355", - "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", - "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e", - "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", - "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", - "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f" + "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b", + "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37", + "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0", + "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170", + "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc", + "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd", + "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", + "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", + "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", + "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e", + "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", + "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a", + "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc", + "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993", + "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2", + "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", + "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06", + "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", + "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", + "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170", + "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc", + "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", + "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", + "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e", + "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c", + "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==25.1.0" + "version": "==25.11.0" }, "boto3": { "hashes": [ - "sha256:ab5798a03582d09c0de132d080c9aee53d5647b6461261a5b7621170ec80d92b", - "sha256:d1d9998fc2b9619fc796c859d263ac81793d783e79331be62931b353dd1b68b9" + "sha256:41fc8844b37ae27b24bcabf8369769df246cc12c09453988d0696ad06d6aa9ef", + "sha256:484e46bf394b03a7c31b34f90945ebe1390cb1e2ac61980d128a9079beac87d4" ], "markers": "python_version >= '3.9'", - "version": "==1.40.14" + "version": "==1.40.74" }, "botocore": { "hashes": [ - "sha256:06c852be83543c8d45e18a530abcad31659db8b16bcb66fd371c930d38017e7c", - "sha256:1810494c8c4190f20f9e17f2da4f7ee91eda863f429c6d690ea17ec41a8f83c4" + "sha256:57de0b9ffeada06015b3c7e5186c77d0692b210d9e5efa294f3214df97e2f8ee", + "sha256:f39f5763e35e75f0bd91212b7b36120b1536203e8003cd952ef527db79702b15" ], "markers": "python_version >= '3.9'", - "version": "==1.40.14" + "version": "==1.40.74" }, "cachetools": { "hashes": [ - "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", - "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a" + "sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace", + "sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6" ], - "markers": "python_version >= '3.7'", - "version": "==5.5.2" + "markers": "python_version >= '3.9'", + "version": "==6.2.2" }, "certifi": { "hashes": [ - "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", - "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5" + "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", + "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316" ], "markers": "python_version >= '3.7'", - "version": "==2025.8.3" + "version": "==2025.11.12" }, "cffi": { "hashes": [ @@ -175,139 +179,190 @@ }, "charset-normalizer": { "hashes": [ - "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", - "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", - "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", - "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", - "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", - "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", - "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c", - "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", - "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", - "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", - "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", - "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", - "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", - "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", - "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", - "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", - "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", - "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", - "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4", - "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", - "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", - "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", - "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", - "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", - "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", - "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", - "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b", - "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", - "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", - "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", - "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", - "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", - "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", - "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", - "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", - "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", - "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a", - "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40", - "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", - "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", - "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", - "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", - "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", - "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", - "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", - "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", - "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", - "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", - "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9", - "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", - "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", - "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", - "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b", - "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", - "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942", - "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", - "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", - "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b", - "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", - "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669", - "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", - "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", - "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", - "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", - "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", - "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", - "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", - "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", - "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", - "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", - "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f", - "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb", - "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", - "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557", - "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", - "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", - "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", - "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", - "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9" + "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", + "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", + "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", + "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", + "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc", + "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", + "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63", + "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d", + "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", + "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", + "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", + "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505", + "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", + "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af", + "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", + "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318", + "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", + "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", + "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", + "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", + "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576", + "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", + "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1", + "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", + "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1", + "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", + "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", + "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", + "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88", + "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", + "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", + "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", + "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a", + "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", + "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", + "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", + "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", + "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", + "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7", + "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", + "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", + "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", + "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", + "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", + "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", + "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2", + "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", + "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", + "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", + "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", + "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf", + "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6", + "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", + "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", + "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa", + "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", + "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", + "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", + "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", + "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", + "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", + "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", + "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", + "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", + "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", + "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", + "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", + "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", + "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", + "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", + "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3", + "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9", + "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", + "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", + "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", + "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", + "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50", + "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf", + "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", + "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", + "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac", + "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", + "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", + "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c", + "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", + "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", + "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e", + "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4", + "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84", + "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", + "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", + "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", + "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", + "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", + "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", + "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", + "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", + "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", + "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074", + "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3", + "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", + "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", + "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", + "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d", + "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", + "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", + "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", + "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", + "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966", + "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", + "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3", + "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", + "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608" ], "markers": "python_version >= '3.7'", - "version": "==3.4.3" + "version": "==3.4.4" }, "click": { "hashes": [ - "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", - "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" + "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", + "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6" ], - "markers": "python_version >= '3.7'", - "version": "==8.1.8" + "markers": "python_version >= '3.10'", + "version": "==8.3.1" }, "cryptography": { "hashes": [ - "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5", - "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74", - "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394", - "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301", - "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08", - "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3", - "sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b", - "sha256:2384f2ab18d9be88a6e4f8972923405e2dbb8d3e16c6b43f15ca491d7831bd18", - "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402", - "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3", - "sha256:31a2b9a10530a1cb04ffd6aa1cd4d3be9ed49f7d77a4dafe198f3b382f41545c", - "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0", - "sha256:3b5bf5267e98661b9b888a9250d05b063220dfa917a8203744454573c7eb79db", - "sha256:3de77e4df42ac8d4e4d6cdb342d989803ad37707cf8f3fbf7b088c9cbdd46427", - "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f", - "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3", - "sha256:599c8d7df950aa68baa7e98f7b73f4f414c9f02d0e8104a30c0182a07732638b", - "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9", - "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5", - "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719", - "sha256:629127cfdcdc6806dfe234734d7cb8ac54edaf572148274fa377a7d3405b0043", - "sha256:705bb7c7ecc3d79a50f236adda12ca331c8e7ecfbea51edd931ce5a7a7c4f012", - "sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02", - "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2", - "sha256:826b46dae41a1155a0c0e66fafba43d0ede1dc16570b95e40c4d83bfcf0a451d", - "sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec", - "sha256:cc4d66f5dc4dc37b89cfef1bd5044387f7a1f6f0abb490815628501909332d5d", - "sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159", - "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453", - "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf", - "sha256:e5b3dda1b00fb41da3af4c5ef3f922a200e33ee5ba0f0bc9ecf0b0c173958385", - "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9", - "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016", - "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05", - "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42", - "sha256:f68f833a9d445cc49f01097d95c83a850795921b3f7cc6488731e69bde3288da", - "sha256:fc022c1fa5acff6def2fc6d7819bbbd31ccddfe67d075331a65d9cfb28a20983" - ], - "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", - "version": "==45.0.6" + "sha256:07a1be54f995ce14740bf8bbe1cc35f7a37760f992f73cf9f98a2a60b9b97419", + "sha256:0f58183453032727a65e6605240e7a3824fd1d6a7e75d2b537e280286ab79a52", + "sha256:16b5ac72a965ec9d1e34d9417dbce235d45fa04dac28634384e3ce40dfc66495", + "sha256:1b4fba84166d906a22027f0d958e42f3a4dbbb19c28ea71f0fb7812380b04e3c", + "sha256:1d2073313324226fd846e6b5fc340ed02d43fd7478f584741bd6b791c33c9fee", + "sha256:249c41f2bbfa026615e7bdca47e4a66135baa81b08509ab240a2e666f6af5966", + "sha256:274f8b2eb3616709f437326185eb563eb4e5813d01ebe2029b61bfe7d9995fbb", + "sha256:2fc30be952dd4334801d345d134c9ef0e9ccbaa8c3e1bc18925cbc4247b3e29c", + "sha256:32670ca085150ff36b438c17f2dfc54146fe4a074ebf0a76d72fb1b419a974bc", + "sha256:35aa1a44bd3e0efc3ef09cf924b3a0e2a57eda84074556f4506af2d294076685", + "sha256:3738f50215211cee1974193a1809348d33893696ce119968932ea117bcbc9b1d", + "sha256:378eff89b040cbce6169528f130ee75dceeb97eef396a801daec03b696434f06", + "sha256:399ef4c9be67f3902e5ca1d80e64b04498f8b56c19e1bc8d0825050ea5290410", + "sha256:40ee4ce3c34acaa5bc347615ec452c74ae8ff7db973a98c97c62293120f668c6", + "sha256:4bc257c2d5d865ed37d0bd7c500baa71f939a7952c424f28632298d80ccd5ec1", + "sha256:4f70cbade61a16f5e238c4b0eb4e258d177a2fcb59aa0aae1236594f7b0ae338", + "sha256:523153480d7575a169933f083eb47b1edd5fef45d87b026737de74ffeb300f69", + "sha256:6460866a92143a24e3ed68eaeb6e98d0cedd85d7d9a8ab1fc293ec91850b1b38", + "sha256:65e9117ebed5b16b28154ed36b164c20021f3a480e9cbb4b4a2a59b95e74c25d", + "sha256:6c39fd5cd9b7526afa69d64b5e5645a06e1b904f342584b3885254400b63f1b3", + "sha256:6d8945bc120dcd90ae39aa841afddaeafc5f2e832809dc54fb906e3db829dfdc", + "sha256:75d2ddde8f1766ab2db48ed7f2aa3797aeb491ea8dfe9b4c074201aec00f5c16", + "sha256:77e3bd53c9c189cea361bc18ceb173959f8b2dd8f8d984ae118e9ac641410252", + "sha256:7f3f88df0c9b248dcc2e76124f9140621aca187ccc396b87bc363f890acf3a30", + "sha256:80a548a5862d6912a45557a101092cd6c64ae1475b82cef50ee305d14a75f598", + "sha256:834af45296083d892e23430e3b11df77e2ac5c042caede1da29c9bf59016f4d2", + "sha256:83af84ebe7b6e9b6de05050c79f8cc0173c864ce747b53abce6a11e940efdc0d", + "sha256:88c09da8a94ac27798f6b62de6968ac78bb94805b5d272dbcfd5fdc8c566999f", + "sha256:8e8b222eb54e3e7d3743a7c2b1f7fa7df7a9add790307bb34327c88ec85fe087", + "sha256:91585fc9e696abd7b3e48a463a20dda1a5c0eeeca4ba60fa4205a79527694390", + "sha256:99f64a6d15f19f3afd78720ad2978f6d8d4c68cd4eb600fab82ab1a7c2071dca", + "sha256:9aa85222f03fdb30defabc7a9e1e3d4ec76eb74ea9fe1504b2800844f9c98440", + "sha256:ab3a14cecc741c8c03ad0ad46dfbf18de25218551931a23bca2731d46c706d83", + "sha256:b8e7db4ce0b7297e88f3d02e6ee9a39382e0efaf1e8974ad353120a2b5a57ef7", + "sha256:bbaa5eef3c19c66613317dc61e211b48d5f550db009c45e1c28b59d5a9b7812a", + "sha256:be7479f9504bfb46628544ec7cb4637fe6af8b70445d4455fbb9c395ad9b7290", + "sha256:bf1961037309ee0bdf874ccba9820b1c2f720c2016895c44d8eb2316226c1ad5", + "sha256:c1f6ccd6f2eef3b2eb52837f0463e853501e45a916b3fc42e5d93cf244a4b97b", + "sha256:c3648d6a5878fd1c9a22b1d43fa75efc069d5f54de12df95c638ae7ba88701d0", + "sha256:c39f0947d50f74b1b3523cec3931315072646286fb462995eb998f8136779319", + "sha256:c3cd09b1490c1509bf3892bde9cef729795fae4a2fee0621f19be3321beca7e4", + "sha256:c457ad3f151d5fb380be99425b286167b358f76d97ad18b188b68097193ed95a", + "sha256:c9c4121f9a41cc3d02164541d986f59be31548ad355a5c96ac50703003c50fb7", + "sha256:d14eaf1569d6252280516bedaffdd65267428cdbc3a8c2d6de63753cf0863d5e", + "sha256:d1eccae15d5c28c74b2bea228775c63ac5b6c36eedb574e002440c0bc28750d3", + "sha256:d349af4d76a93562f1dce4d983a4a34d01cb22b48635b0d2a0b8372cdb4a8136", + "sha256:d5c0cbb2fb522f7e39b59a5482a1c9c5923b7c506cfe96a1b8e7368c31617ac0", + "sha256:da7f93551d39d462263b6b5c9056c49f780b9200bf9fc2656d7c88c7bdb9b363", + "sha256:df932ac70388be034b2e046e34d636245d5eeb8140db24a6b4c2268cd2073270", + "sha256:f09a3a108223e319168b7557810596631a8cb864657b0c16ed7a6017f0be9433", + "sha256:f85e6a7d42ad60024fa1347b1d4ef82c4df517a4deb7f829d301f1a92ded038c", + "sha256:f9aaf2a91302e1490c068d2f3af7df4137ac2b36600f5bd26e53d9ec320412d3", + "sha256:f9f85d9cf88e3ba2b2b6da3c2310d1cf75bdf04a5bc1a2e972603054f82c4dd5", + "sha256:fe9ff1139b2b1f59a5a0b538bbd950f8660a39624bbe10cf3640d17574f973bb" + ], + "markers": "python_version >= '3.8' and python_full_version not in '3.9.0, 3.9.1'", + "version": "==46.0.0" }, "dill": { "hashes": [ @@ -319,11 +374,11 @@ }, "docutils": { "hashes": [ - "sha256:4ed966a0e96a0477d852f7af31bdcb3adc049fbb35ccba358c2ea8a03287615e", - "sha256:ba9d57750e92331ebe7c08a1bbf7a7f8143b86c476acd51528b042216a6aad0f" + "sha256:21486ae730e4ca9f622677b1412b879af1791efcfba517e4c6f60be543fc8cdd", + "sha256:bd772e4aca73aff037958d44f2be5229ded4c09927fcf8690c577b66234d6ceb" ], "markers": "python_version >= '3.9'", - "version": "==0.22" + "version": "==0.22.3" }, "et-xmlfile": { "hashes": [ @@ -335,56 +390,56 @@ }, "filelock": { "hashes": [ - "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", - "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d" + "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", + "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4" ], - "markers": "python_version >= '3.9'", - "version": "==3.19.1" + "markers": "python_version >= '3.10'", + "version": "==3.20.0" }, "fsspec": { "hashes": [ - "sha256:786120687ffa54b8283d942929540d8bc5ccfa820deb555a2b5d0ed2b737bf58", - "sha256:8b012e39f63c7d5f10474de957f3ab793b47b45ae7d39f2fb735f8bbe25c0e21" + "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d", + "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59" ], "markers": "python_version >= '3.9'", - "version": "==2025.7.0" + "version": "==2025.10.0" }, "google-api-core": { "extras": [ "grpc" ], "hashes": [ - "sha256:8a2a56c1fef82987a524371f99f3bd0143702fecc670c72e600c1cda6bf8dbb7", - "sha256:d2aaa0b13c78c61cb3f4282c464c046e45fbd75755683c9c525e6e8f7ed0a5e8" + "sha256:2b405df02d68e68ce0fbc138559e6036559e685159d148ae5861013dc201baf8", + "sha256:4021b0f8ceb77a6fb4de6fde4502cecab45062e66ff4f2895169e0b35bc9466c" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==2.25.1" + "version": "==2.28.1" }, "google-auth": { "hashes": [ - "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca", - "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77" + "sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483", + "sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16" ], "markers": "python_version >= '3.7'", - "version": "==2.40.3" + "version": "==2.43.0" }, "google-cloud-bigquery": { "hashes": [ - "sha256:0cfbad09999907600fd0618794491db10000d98911ec7768ac6041cb9a0257dd", - "sha256:519d7a16be2119dca1ea8871e6dd45f971a8382c337cbe045319543b9e743bdd" + "sha256:8afcb7116f5eac849097a344eb8bfda78b7cfaae128e60e019193dd483873520", + "sha256:e06e93ff7b245b239945ef59cb59616057598d369edac457ebf292bd61984da6" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==3.36.0" + "version": "==3.38.0" }, "google-cloud-core": { "hashes": [ - "sha256:1fab62d7102844b278fe6dead3af32408b1df3eb06f5c7e8634cbd40edc4da53", - "sha256:5130f9f4c14b4fafdff75c79448f9495cfade0d8775facf1b09c3bf67e027f6e" + "sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc", + "sha256:7c1b7ef5c92311717bd05301aa1a91ffbc565673d3b0b4163a52d8413a186963" ], "markers": "python_version >= '3.7'", - "version": "==2.4.3" + "version": "==2.5.0" }, "google-crc32c": { "hashes": [ @@ -436,138 +491,88 @@ }, "googleapis-common-protos": { "hashes": [ - "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", - "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8" + "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038", + "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==1.70.0" - }, - "greenlet": { - "hashes": [ - "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", - "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", - "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", - "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", - "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433", - "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58", - "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", - "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", - "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", - "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", - "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", - "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", - "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d", - "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", - "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", - "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", - "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", - "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", - "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633", - "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", - "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa", - "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31", - "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9", - "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b", - "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4", - "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", - "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c", - "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98", - "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f", - "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c", - "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590", - "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", - "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", - "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9", - "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5", - "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", - "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", - "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", - "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c", - "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594", - "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", - "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d", - "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", - "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", - "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b", - "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df", - "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", - "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", - "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb", - "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", - "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", - "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", - "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c", - "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968" - ], - "markers": "python_version >= '3.9'", - "version": "==3.2.4" + "version": "==1.72.0" }, "grpcio": { "hashes": [ - "sha256:0f87bddd6e27fc776aacf7ebfec367b6d49cad0455123951e4488ea99d9b9b8f", - "sha256:136b53c91ac1d02c8c24201bfdeb56f8b3ac3278668cbb8e0ba49c88069e1bdc", - "sha256:1733969040989f7acc3d94c22f55b4a9501a30f6aaacdbccfaba0a3ffb255ab7", - "sha256:176d60a5168d7948539def20b2a3adcce67d72454d9ae05969a2e73f3a0feee7", - "sha256:1a2b06afe2e50ebfd46247ac3ba60cac523f54ec7792ae9ba6073c12daf26f0a", - "sha256:1bf949792cee20d2078323a9b02bacbbae002b9e3b9e2433f2741c15bdeba1c4", - "sha256:22b834cef33429ca6cc28303c9c327ba9a3fafecbf62fae17e9a7b7163cc43ac", - "sha256:2918948864fec2a11721d91568effffbe0a02b23ecd57f281391d986847982f6", - "sha256:2bc2d7d8d184e2362b53905cb1708c84cb16354771c04b490485fa07ce3a1d89", - "sha256:2f609a39f62a6f6f05c7512746798282546358a37ea93c1fcbadf8b2fed162e3", - "sha256:3601274bc0523f6dc07666c0e01682c94472402ac2fd1226fd96e079863bfa49", - "sha256:3b03d8f2a07f0fea8c8f74deb59f8352b770e3900d143b3d1475effcb08eec20", - "sha256:3d14e3c4d65e19d8430a4e28ceb71ace4728776fd6c3ce34016947474479683f", - "sha256:42f8fee287427b94be63d916c90399ed310ed10aadbf9e2e5538b3e497d269bc", - "sha256:4bc5fca10aaf74779081e16c2bcc3d5ec643ffd528d9e7b1c9039000ead73bae", - "sha256:4e4181bfc24413d1e3a37a0b7889bea68d973d4b45dd2bc68bb766c140718f82", - "sha256:55b453812fa7c7ce2f5c88be3018fb4a490519b6ce80788d5913f3f9d7da8c7b", - "sha256:566b9395b90cc3d0d0c6404bc8572c7c18786ede549cdb540ae27b58afe0fb91", - "sha256:5f251c355167b2360537cf17bea2cf0197995e551ab9da6a0a59b3da5e8704f9", - "sha256:60d2d48b0580e70d2e1954d0d19fa3c2e60dd7cbed826aca104fff518310d1c5", - "sha256:64229c1e9cea079420527fa8ac45d80fc1e8d3f94deaa35643c381fa8d98f362", - "sha256:655726919b75ab3c34cdad39da5c530ac6fa32696fb23119e36b64adcfca174a", - "sha256:662456c4513e298db6d7bd9c3b8df6f75f8752f0ba01fb653e252ed4a59b5a5d", - "sha256:68c8ebcca945efff9d86d8d6d7bfb0841cf0071024417e2d7f45c5e46b5b08eb", - "sha256:69e1a8180868a2576f02356565f16635b99088da7df3d45aaa7e24e73a054e31", - "sha256:6bab67d15ad617aff094c382c882e0177637da73cbc5532d52c07b4ee887a87b", - "sha256:7d95d71ff35291bab3f1c52f52f474c632db26ea12700c2ff0ea0532cb0b5854", - "sha256:80d1f4fbb35b0742d3e3d3bb654b7381cd5f015f8497279a1e9c21ba623e01b1", - "sha256:834988b6c34515545b3edd13e902c1acdd9f2465d386ea5143fb558f153a7176", - "sha256:8533e6e9c5bd630ca98062e3a1326249e6ada07d05acf191a77bc33f8948f3d8", - "sha256:85bd5cdf4ed7b2d6438871adf6afff9af7096486fcf51818a81b77ef4dd30907", - "sha256:86ad489db097141a907c559988c29718719aa3e13370d40e20506f11b4de0d11", - "sha256:885912559974df35d92219e2dc98f51a16a48395f37b92865ad45186f294096c", - "sha256:8efe72fde5500f47aca1ef59495cb59c885afe04ac89dd11d810f2de87d935d4", - "sha256:8f7b5882fb50632ab1e48cb3122d6df55b9afabc265582808036b6e51b9fd6b7", - "sha256:9e7c4389771855a92934b2846bd807fc25a3dfa820fd912fe6bd8136026b2707", - "sha256:9e912d3c993a29df6c627459af58975b2e5c897d93287939b9d5065f000249b5", - "sha256:a8f0302f9ac4e9923f98d8e243939a6fb627cd048f5cd38595c97e38020dffce", - "sha256:b6a73b2ba83e663b2480a90b82fdae6a7aa6427f62bf43b29912c0cfd1aa2bfa", - "sha256:c14e803037e572c177ba54a3e090d6eb12efd795d49327c5ee2b3bddb836bf01", - "sha256:c3d7bd6e3929fd2ea7fbc3f562e4987229ead70c9ae5f01501a46701e08f1ad9", - "sha256:c98e0b7434a7fa4e3e63f250456eaef52499fba5ae661c58cc5b5477d11e7182", - "sha256:cce634b10aeab37010449124814b05a62fb5f18928ca878f1bf4750d1f0c815b", - "sha256:e154d230dc1bbbd78ad2fdc3039fa50ad7ffcf438e4eb2fa30bce223a70c7486", - "sha256:e1ea6176d7dfd5b941ea01c2ec34de9531ba494d541fe2057c904e601879f249", - "sha256:e759f9e8bc908aaae0412642afe5416c9f983a80499448fcc7fab8692ae044c3", - "sha256:e8978003816c7b9eabe217f88c78bc26adc8f9304bf6a594b02e5a49b2ef9c11", - "sha256:ecde9ab49f58433abe02f9ed076c7b5be839cf0153883a6d23995937a82392fa", - "sha256:f6ec94f0e50eb8fa1744a731088b966427575e40c2944a980049798b127a687e", - "sha256:fd3c71aeee838299c5887230b8a1822795325ddfea635edd82954c1eaa831e24", - "sha256:fe0f540750a13fd8e5da4b3eaba91a785eea8dca5ccd2bc2ffe978caa403090e" + "sha256:035d90bc79eaa4bed83f524331d55e35820725c9fbb00ffa1904d5550ed7ede3", + "sha256:04bbe1bfe3a68bbfd4e52402ab7d4eb59d72d02647ae2042204326cf4bbad280", + "sha256:063065249d9e7e0782d03d2bca50787f53bd0fb89a67de9a7b521c4a01f1989b", + "sha256:06c3d6b076e7b593905d04fdba6a0525711b3466f43b3400266f04ff735de0cd", + "sha256:08caea849a9d3c71a542827d6df9d5a69067b0a1efbea8a855633ff5d9571465", + "sha256:0aaa82d0813fd4c8e589fac9b65d7dd88702555f702fb10417f96e2a2a6d4c0f", + "sha256:0b7604868b38c1bfd5cf72d768aedd7db41d78cb6a4a18585e33fb0f9f2363fd", + "sha256:0c37db8606c258e2ee0c56b78c62fc9dee0e901b5dbdcf816c2dd4ad652b8b0c", + "sha256:1c9b93f79f48b03ada57ea24725d83a30284a012ec27eab2cf7e50a550cbbbcc", + "sha256:2107b0c024d1b35f4083f11245c0e23846ae64d02f40b2b226684840260ed054", + "sha256:2229ae655ec4e8999599469559e97630185fdd53ae1e8997d147b7c9b2b72cba", + "sha256:25a18e9810fbc7e7f03ec2516addc116a957f8cbb8cbc95ccc80faa072743d03", + "sha256:26ef06c73eb53267c2b319f43e6634c7556ea37672029241a056629af27c10e2", + "sha256:2e1743fbd7f5fa713a1b0a8ac8ebabf0ec980b5d8809ec358d488e273b9cf02a", + "sha256:32483fe2aab2c3794101c2a159070584e5db11d0aa091b2c0ea9c4fc43d0d749", + "sha256:3bf0f392c0b806905ed174dcd8bdd5e418a40d5567a05615a030a5aeddea692d", + "sha256:3e2a27c89eb9ac3d81ec8835e12414d73536c6e620355d65102503064a4ed6eb", + "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde", + "sha256:4215d3a102bd95e2e11b5395c78562967959824156af11fa93d18fdd18050990", + "sha256:45d59a649a82df5718fd9527ce775fd66d1af35e6d31abdcdc906a49c6822958", + "sha256:45e0111e73f43f735d70786557dc38141185072d7ff8dc1829d6a77ac1471468", + "sha256:479496325ce554792dba6548fae3df31a72cef7bad71ca2e12b0e58f9b336bfc", + "sha256:490fa6d203992c47c7b9e4a9d39003a0c2bcc1c9aa3c058730884bbbb0ee9f09", + "sha256:49ce47231818806067aea3324d4bf13825b658ad662d3b25fada0bdad9b8a6af", + "sha256:4baf3cbe2f0be3289eb68ac8ae771156971848bb8aaff60bad42005539431980", + "sha256:522175aba7af9113c48ec10cc471b9b9bd4f6ceb36aeb4544a8e2c80ed9d252d", + "sha256:5e8571632780e08526f118f74170ad8d50fb0a48c23a746bef2a6ebade3abd6f", + "sha256:615ba64c208aaceb5ec83bfdce7728b80bfeb8be97562944836a7a0a9647d882", + "sha256:61f69297cba3950a524f61c7c8ee12e55c486cb5f7db47ff9dcee33da6f0d3ae", + "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc", + "sha256:6a15c17af8839b6801d554263c546c69c4d7718ad4321e3166175b37eaacca77", + "sha256:747fa73efa9b8b1488a95d0ba1039c8e2dca0f741612d80415b1e1c560febf4e", + "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73", + "sha256:81fd9652b37b36f16138611c7e884eb82e0cec137c40d3ef7c3f9b3ed00f6ed8", + "sha256:83d57312a58dcfe2a3a0f9d1389b299438909a02db60e2f2ea2ae2d8034909d3", + "sha256:8843114c0cfce61b40ad48df65abcfc00d4dba82eae8718fab5352390848c5da", + "sha256:8cc3309d8e08fd79089e13ed4819d0af72aa935dd8f435a195fd152796752ff2", + "sha256:8ebe63ee5f8fa4296b1b8cfc743f870d10e902ca18afc65c68cf46fd39bb0783", + "sha256:8eddfb4d203a237da6f3cc8a540dad0517d274b5a1e9e636fd8d2c79b5c1d397", + "sha256:922fa70ba549fce362d2e2871ab542082d66e2aaf0c19480ea453905b01f384e", + "sha256:931091142fd8cc14edccc0845a79248bc155425eee9a98b2db2ea4f00a235a42", + "sha256:971fd5a1d6e62e00d945423a567e42eb1fa678ba89072832185ca836a94daaa6", + "sha256:980a846182ce88c4f2f7e2c22c56aefd515daeb36149d1c897f83cf57999e0b6", + "sha256:9d9adda641db7207e800a7f089068f6f645959f2df27e870ee81d44701dd9db3", + "sha256:9f8f757bebaaea112c00dba718fc0d3260052ce714e25804a03f93f5d1c6cc11", + "sha256:a6ae758eb08088d36812dd5d9af7a9859c05b1e0f714470ea243694b49278e7b", + "sha256:a8c2cf1209497cf659a667d7dea88985e834c24b7c3b605e6254cbb5076d985c", + "sha256:acab0277c40eff7143c2323190ea57b9ee5fd353d8190ee9652369fae735668a", + "sha256:b331680e46239e090f5b3cead313cc772f6caa7d0fc8de349337563125361a4a", + "sha256:c088e7a90b6017307f423efbb9d1ba97a22aa2170876223f9709e9d1de0b5347", + "sha256:d099566accf23d21037f18a2a63d323075bebace807742e4b0ac210971d4dd70", + "sha256:d388087771c837cdb6515539f43b9d4bf0b0f23593a24054ac16f7a960be16f4", + "sha256:dcfe41187da8992c5f40aa8c5ec086fa3672834d2be57a32384c08d5a05b4c00", + "sha256:e6d1db20594d9daba22f90da738b1a0441a7427552cc6e2e3d1297aeddc00378", + "sha256:ebea5cc3aa8ea72e04df9913492f9a96d9348db876f9dda3ad729cfedf7ac416", + "sha256:ebebf83299b0cb1721a8859ea98f3a77811e35dce7609c5c963b9ad90728f886", + "sha256:f0e34c2079d47ae9f6188211db9e777c619a21d4faba6977774e8fa43b085e48", + "sha256:f92f88e6c033db65a5ae3d97905c8fea9c725b63e28d5a75cb73b49bda5024d8", + "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8", + "sha256:fd5ef5932f6475c436c4a55e4336ebbe47bd3272be04964a03d316bbf4afbcbc", + "sha256:ff8a59ea85a1f2191a0ffcc61298c571bc566332f82e5f5be1b83c9d8e668a62" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==1.74.0" + "version": "==1.76.0" }, "grpcio-status": { "hashes": [ - "sha256:52cdbd759a6760fc8f668098a03f208f493dd5c76bf8e02598bbbaf1f6fc2876", - "sha256:c58c1b24aa454e30f1fc6a7e0dbbc194c54a408143971a94b5f4e40bb5831432" + "sha256:25fcbfec74c15d1a1cb5da3fab8ee9672852dc16a5a9eeb5baf7d7a9952943cd", + "sha256:380568794055a8efbbd8871162df92012e0228a5f6dffaf57f2a00c534103b18" ], "markers": "python_version >= '3.9'", - "version": "==1.74.0" + "version": "==1.76.0" }, "id": { "hashes": [ @@ -579,11 +584,11 @@ }, "idna": { "hashes": [ - "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", - "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" + "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", + "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902" ], - "markers": "python_version >= '3.6'", - "version": "==3.10" + "markers": "python_version >= '3.8'", + "version": "==3.11" }, "importlib-metadata": { "hashes": [ @@ -595,12 +600,12 @@ }, "isort": { "hashes": [ - "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", - "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615" + "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1", + "sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187" ], "index": "pypi", - "markers": "python_full_version >= '3.9.0'", - "version": "==6.0.1" + "markers": "python_full_version >= '3.10.0'", + "version": "==7.0.0" }, "jaraco.classes": { "hashes": [ @@ -636,19 +641,19 @@ }, "keyring": { "hashes": [ - "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66", - "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd" + "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", + "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b" ], "markers": "python_version >= '3.9'", - "version": "==25.6.0" + "version": "==25.7.0" }, "markdown-it-py": { "hashes": [ - "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", - "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" + "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", + "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3" ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" + "markers": "python_version >= '3.10'", + "version": "==4.0.0" }, "mccabe": { "hashes": [ @@ -668,56 +673,56 @@ }, "more-itertools": { "hashes": [ - "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3", - "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e" + "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", + "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd" ], "markers": "python_version >= '3.9'", - "version": "==10.7.0" + "version": "==10.8.0" }, "mypy": { "hashes": [ - "sha256:03b6d0ed2b188e35ee6d5c36b5580cffd6da23319991c49ab5556c023ccf1341", - "sha256:064e2ff508e5464b4bd807a7c1625bc5047c5022b85c70f030680e18f37273a5", - "sha256:099b9a5da47de9e2cb5165e581f158e854d9e19d2e96b6698c0d64de911dd849", - "sha256:15a83369400454c41ed3a118e0cc58bd8123921a602f385cb6d6ea5df050c733", - "sha256:15d54056f7fe7a826d897789f53dd6377ec2ea8ba6f776dc83c2902b899fee81", - "sha256:1b16708a66d38abb1e6b5702f5c2c87e133289da36f6a1d15f6a5221085c6403", - "sha256:209a58fed9987eccc20f2ca94afe7257a8f46eb5df1fb69958650973230f91e6", - "sha256:25e01ec741ab5bb3eec8ba9cdb0f769230368a22c959c4937360efb89b7e9f01", - "sha256:397fba5d7616a5bc60b45c7ed204717eaddc38f826e3645402c426057ead9a91", - "sha256:3fbe6d5555bf608c47203baa3e72dbc6ec9965b3d7c318aa9a4ca76f465bd972", - "sha256:43808d9476c36b927fbcd0b0255ce75efe1b68a080154a38ae68a7e62de8f0f8", - "sha256:55b918670f692fc9fba55c3298d8a3beae295c5cded0a55dccdc5bbead814acd", - "sha256:5d1092694f166a7e56c805caaf794e0585cabdbf1df36911c414e4e9abb62ae9", - "sha256:62761474061feef6f720149d7ba876122007ddc64adff5ba6f374fda35a018a0", - "sha256:665afab0963a4b39dff7c1fa563cc8b11ecff7910206db4b2e64dd1ba25aed19", - "sha256:69e83ea6553a3ba79c08c6e15dbd9bfa912ec1e493bf75489ef93beb65209aeb", - "sha256:70401bbabd2fa1aa7c43bb358f54037baf0586f41e83b0ae67dd0534fc64edfd", - "sha256:79d44f9bfb004941ebb0abe8eff6504223a9c1ac51ef967d1263c6572bbebc99", - "sha256:80ef5c058b7bce08c83cac668158cb7edea692e458d21098c7d3bce35a5d43e7", - "sha256:89e972c0035e9e05823907ad5398c5a73b9f47a002b22359b177d40bdaee7056", - "sha256:93378d3203a5c0800c6b6d850ad2f19f7a3cdf1a3701d3416dbf128805c6a6a7", - "sha256:9a2b7d9180aed171f033c9f2fc6c204c1245cf60b0cb61cf2e7acc24eea78e0a", - "sha256:9d6b20b97d373f41617bd0708fd46aa656059af57f2ef72aa8c7d6a2b73b74ed", - "sha256:a76906f26bd8d51ea9504966a9c25419f2e668f012e0bdf3da4ea1526c534d94", - "sha256:a9f52c0351c21fe24c21d8c0eb1f62967b262d6729393397b6f443c3b773c3b9", - "sha256:ad37544be07c5d7fba814eb370e006df58fed8ad1ef33ed1649cb1889ba6ff58", - "sha256:b01586eed696ec905e61bd2568f48740f7ac4a45b3a468e6423a03d3788a51a8", - "sha256:c1fdf4abb29ed1cb091cf432979e162c208a5ac676ce35010373ff29247bcad5", - "sha256:c49562d3d908fd49ed0938e5423daed8d407774a479b595b143a3d7f87cdae6a", - "sha256:c4a580f8a70c69e4a75587bd925d298434057fe2a428faaf927ffe6e4b9a98df", - "sha256:c837b896b37cd103570d776bda106eabb8737aa6dd4f248451aecf53030cdbeb", - "sha256:d7598cf74c3e16539d4e2f0b8d8c318e00041553d83d4861f87c7a72e95ac24d", - "sha256:dd86bb649299f09d987a2eebb4d52d10603224500792e1bee18303bbcc1ce390", - "sha256:e79311f2d904ccb59787477b7bd5d26f3347789c06fcd7656fa500875290264b", - "sha256:e92bdc656b7757c438660f775f872a669b8ff374edc4d18277d86b63edba6b8b", - "sha256:fa6ffadfbe6994d724c5a1bb6123a7d27dd68fc9c059561cd33b664a79578e14", - "sha256:feb8cc32d319edd5859da2cc084493b3e2ce5e49a946377663cc90f6c15fb259", - "sha256:ff2933428516ab63f961644bc49bc4cbe42bbffb2cd3b71cc7277c07d16b1a8b" + "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", + "sha256:030c52d0ea8144e721e49b1f68391e39553d7451f0c3f8a7565b59e19fcb608b", + "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", + "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", + "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", + "sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86", + "sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d", + "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", + "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", + "sha256:22f27105f1525ec024b5c630c0b9f36d5c1cc4d447d61fe51ff4bd60633f47ac", + "sha256:25a9c8fb67b00599f839cf472713f54249a62efd53a54b565eb61956a7e3296b", + "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", + "sha256:3ca30b50a51e7ba93b00422e486cbb124f1c56a535e20eff7b2d6ab72b3b2e37", + "sha256:448acd386266989ef11662ce3c8011fd2a7b632e0ec7d61a98edd8e27472225b", + "sha256:592ec214750bc00741af1f80cbf96b5013d81486b7bb24cb052382c19e40b428", + "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", + "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", + "sha256:664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8", + "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", + "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", + "sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341", + "sha256:7a780ca61fc239e4865968ebc5240bb3bf610ef59ac398de9a7421b54e4a207e", + "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", + "sha256:7fb95f97199ea11769ebe3638c29b550b5221e997c63b14ef93d2e971606ebed", + "sha256:807d9315ab9d464125aa9fcf6d84fde6e1dc67da0b6f80e7405506b8ac72bc7f", + "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", + "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", + "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", + "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", + "sha256:aa5e07ac1a60a253445797e42b8b2963c9675563a94f11291ab40718b016a7a0", + "sha256:c1eab0cf6294dafe397c261a75f96dc2c31bffe3b944faa24db5def4e2b0f77c", + "sha256:c2b9c7e284ee20e7598d6f42e13ca40b4928e6957ed6813d1ab6348aa3f47133", + "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", + "sha256:d6985ed057513e344e43a26cc1cd815c7a94602fb6a3130a34798625bc2f07b6", + "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", + "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", + "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", + "sha256:f9e171c465ad3901dc652643ee4bffa8e9fef4d7d0eece23b428908c77a76a66" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==1.17.1" + "version": "==1.18.2" }, "mypy-extensions": { "hashes": [ @@ -729,86 +734,96 @@ }, "nh3": { "hashes": [ - "sha256:0649464ac8eee018644aacbc103874ccbfac80e3035643c3acaab4287e36e7f5", - "sha256:16f8670201f7e8e0e05ed1a590eb84bfa51b01a69dd5caf1d3ea57733de6a52f", - "sha256:1adeb1062a1c2974bc75b8d1ecb014c5fd4daf2df646bbe2831f7c23659793f9", - "sha256:37d3003d98dedca6cd762bf88f2e70b67f05100f6b949ffe540e189cc06887f9", - "sha256:389d93d59b8214d51c400fb5b07866c2a4f79e4e14b071ad66c92184fec3a392", - "sha256:3f1b4f8a264a0c86ea01da0d0c390fe295ea0bcacc52c2103aca286f6884f518", - "sha256:423201bbdf3164a9e09aa01e540adbb94c9962cc177d5b1cbb385f5e1e79216e", - "sha256:634e34e6162e0408e14fb61d5e69dbaea32f59e847cfcfa41b66100a6b796f62", - "sha256:6d68fa277b4a3cf04e5c4b84dd0c6149ff7d56c12b3e3fab304c525b850f613d", - "sha256:7275fdffaab10cc5801bf026e3c089d8de40a997afc9e41b981f7ac48c5aa7d5", - "sha256:7852f038a054e0096dac12b8141191e02e93e0b4608c4b993ec7d4ffafea4e49", - "sha256:7c915060a2c8131bef6a29f78debc29ba40859b6dbe2362ef9e5fd44f11487c2", - "sha256:80fe20171c6da69c7978ecba33b638e951b85fb92059259edd285ff108b82a6d", - "sha256:a537ece1bf513e5a88d8cff8a872e12fe8d0f42ef71dd15a5e7520fecd191bbb", - "sha256:af5aa8127f62bbf03d68f67a956627b1bd0469703a35b3dad28d0c1195e6c7fb", - "sha256:b0612ccf5de8a480cf08f047b08f9d3fecc12e63d2ee91769cb19d7290614c23", - "sha256:ba0caa8aa184196daa6e574d997a33867d6d10234018012d35f86d46024a2a95", - "sha256:bae63772408fd63ad836ec569a7c8f444dd32863d0c67f6e0b25ebbd606afa95", - "sha256:c7a32a7f0d89f7d30cb8f4a84bdbd56d1eb88b78a2434534f62c71dac538c450", - "sha256:ce5e7185599f89b0e391e2f29cc12dc2e206167380cea49b33beda4891be2fe1", - "sha256:d8ba24cb31525492ea71b6aac11a4adac91d828aadeff7c4586541bf5dc34d2f", - "sha256:d97d3efd61404af7e5721a0e74d81cdbfc6e5f97e11e731bb6d090e30a7b62b2", - "sha256:e90883f9f85288f423c77b3f5a6f4486375636f25f793165112679a7b6363b35", - "sha256:e9e6a7e4d38f7e8dda9edd1433af5170c597336c1a74b4693c5cb75ab2b30f2a", - "sha256:ec6cfdd2e0399cb79ba4dcffb2332b94d9696c52272ff9d48a630c5dca5e325a", - "sha256:f416c35efee3e6a6c9ab7716d9e57aa0a49981be915963a82697952cba1353e1" + "sha256:019ecbd007536b67fdf76fab411b648fb64e2257ca3262ec80c3425c24028c80", + "sha256:03d617e5c8aa7331bd2659c654e021caf9bba704b109e7b2b28b039a00949fe5", + "sha256:0dca4365db62b2d71ff1620ee4f800c4729849906c5dd504ee1a7b2389558e31", + "sha256:0fe7ee035dd7b2290715baf29cb27167dddd2ff70ea7d052c958dbd80d323c99", + "sha256:13398e676a14d6233f372c75f52d5ae74f98210172991f7a3142a736bd92b131", + "sha256:169db03df90da63286e0560ea0efa9b6f3b59844a9735514a1d47e6bb2c8c61b", + "sha256:1710f3901cd6440ca92494ba2eb6dc260f829fa8d9196b659fa10de825610ce0", + "sha256:1f9ba555a797dbdcd844b89523f29cdc90973d8bd2e836ea6b962cf567cadd93", + "sha256:2ab70e8c6c7d2ce953d2a58102eefa90c2d0a5ed7aa40c7e29a487bc5e613131", + "sha256:2c9850041b77a9147d6bbd6dbbf13eeec7009eb60b44e83f07fcb2910075bf9b", + "sha256:403c11563e50b915d0efdb622866d1d9e4506bce590ef7da57789bf71dd148b5", + "sha256:45c953e57028c31d473d6b648552d9cab1efe20a42ad139d78e11d8f42a36130", + "sha256:562da3dca7a17f9077593214a9781a94b8d76de4f158f8c895e62f09573945fe", + "sha256:6d66f41672eb4060cf87c037f760bdbc6847852ca9ef8e9c5a5da18f090abf87", + "sha256:7064ccf5ace75825bd7bf57859daaaf16ed28660c1c6b306b649a9eda4b54b1e", + "sha256:72d67c25a84579f4a432c065e8b4274e53b7cf1df8f792cf846abfe2c3090866", + "sha256:7bb18403f02b655a1bbe4e3a4696c2ae1d6ae8f5991f7cacb684b1ae27e6c9f7", + "sha256:91e9b001101fb4500a2aafe3e7c92928d85242d38bf5ac0aba0b7480da0a4cd6", + "sha256:a40202fd58e49129764f025bbaae77028e420f1d5b3c8e6f6fd3a6490d513868", + "sha256:c8745454cdd28bbbc90861b80a0111a195b0e3961b9fa2e672be89eb199fa5d8", + "sha256:cf5964d54edd405e68583114a7cba929468bcd7db5e676ae38ee954de1cfc104", + "sha256:d18957a90806d943d141cc5e4a0fefa1d77cf0d7a156878bf9a66eed52c9cc7d", + "sha256:dce4248edc427c9b79261f3e6e2b3ecbdd9b88c267012168b4a7b3fc6fd41d13", + "sha256:f2f55c4d2d5a207e74eefe4d828067bbb01300e06e2a7436142f915c5928de07", + "sha256:f394759a06df8b685a4ebfb1874fb67a9cbfd58c64fc5ed587a663c0e63ec376", + "sha256:f97f8b25cb2681d25e2338148159447e4d689aafdccfcf19e61ff7db3905768a" ], "markers": "python_version >= '3.8'", - "version": "==0.3.0" + "version": "==0.3.2" }, "numpy": { "hashes": [ - "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", - "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", - "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", - "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", - "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", - "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", - "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", - "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", - "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", - "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", - "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", - "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", - "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", - "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", - "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", - "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", - "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", - "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", - "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", - "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", - "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", - "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", - "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", - "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", - "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", - "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", - "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", - "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", - "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", - "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", - "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", - "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", - "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", - "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", - "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", - "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", - "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", - "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", - "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", - "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", - "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", - "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", - "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", - "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", - "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.2" + "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", + "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", + "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", + "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", + "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", + "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", + "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", + "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", + "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", + "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", + "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", + "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", + "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", + "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", + "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", + "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", + "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", + "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", + "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", + "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", + "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", + "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", + "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", + "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", + "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", + "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", + "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", + "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", + "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", + "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", + "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", + "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", + "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", + "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", + "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", + "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", + "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", + "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", + "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", + "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", + "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", + "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", + "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", + "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", + "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", + "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", + "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", + "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", + "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", + "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", + "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", + "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", + "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", + "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", + "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8" + ], + "markers": "python_version >= '3.10'", + "version": "==2.2.6" }, "openpyxl": { "hashes": [ @@ -829,52 +844,65 @@ }, "pandas": { "hashes": [ - "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a", - "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175", - "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e", - "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2", - "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6", - "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b", - "sha256:1333e9c299adcbb68ee89a9bb568fc3f20f9cbb419f1dd5225071e6cddb2a743", - "sha256:13bd629c653856f00c53dc495191baa59bcafbbf54860a46ecc50d3a88421a96", - "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b", - "sha256:1d81573b3f7db40d020983f78721e9bfc425f411e616ef019a10ebf597aedb2e", - "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811", - "sha256:21bb612d148bb5860b7eb2c10faacf1a810799245afd342cf297d7551513fbb6", - "sha256:220cc5c35ffaa764dd5bb17cf42df283b5cb7fdf49e10a7b053a06c9cb48ee2b", - "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9", - "sha256:36d627906fd44b5fd63c943264e11e96e923f8de77d6016dc2f667b9ad193438", - "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9", - "sha256:42c05e15111221384019897df20c6fe893b2f697d03c811ee67ec9e0bb5a3424", - "sha256:45178cf09d1858a1509dc73ec261bf5b25a625a389b65be2e47b559905f0ab6a", - "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a", - "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b", - "sha256:52bc29a946304c360561974c6542d1dd628ddafa69134a7131fdfd6a5d7a1a35", - "sha256:76972bcbd7de8e91ad5f0ca884a9f2c477a2125354af624e022c49e5bd0dfff4", - "sha256:77cefe00e1b210f9c76c697fedd8fdb8d3dd86563e9c8adc9fa72b90f5e9e4c2", - "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012", - "sha256:88080a0ff8a55eac9c84e3ff3c7665b3b5476c6fbc484775ca1910ce1c3e0b87", - "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae", - "sha256:9467697b8083f9667b212633ad6aa4ab32436dcbaf4cd57325debb0ddef2012f", - "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9", - "sha256:a9d7ec92d71a420185dec44909c32e9a362248c4ae2238234b76d5be37f208cc", - "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb", - "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2", - "sha256:b62d586eb25cb8cb70a5746a378fc3194cb7f11ea77170d59f889f5dfe3cec7a", - "sha256:b98bdd7c456a05eef7cd21fd6b29e3ca243591fe531c62be94a2cc987efb5ac2", - "sha256:c253828cb08f47488d60f43c5fc95114c771bbfff085da54bfc79cb4f9e3a372", - "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57", - "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9", - "sha256:cc03acc273c5515ab69f898df99d9d4f12c4d70dbfc24c3acc6203751d0804cf", - "sha256:d25c20a03e8870f6339bcf67281b946bd20b86f1a544ebbebb87e66a8d642cba", - "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370", - "sha256:d4a558c7620340a0931828d8065688b3cc5b4c8eb674bcaf33d18ff4a6870b4a", - "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4", - "sha256:e190b738675a73b581736cc8ec71ae113d6c3768d0bd18bffa5b9a0927b0b6ea" + "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", + "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", + "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", + "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", + "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73", + "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", + "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", + "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", + "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", + "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", + "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", + "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", + "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", + "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", + "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", + "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", + "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9", + "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", + "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", + "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", + "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", + "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", + "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", + "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", + "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", + "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", + "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff", + "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", + "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", + "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", + "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", + "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", + "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", + "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8", + "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", + "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", + "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", + "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", + "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", + "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29", + "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", + "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", + "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2", + "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", + "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa", + "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", + "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", + "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", + "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", + "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", + "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", + "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", + "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", + "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", + "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==2.3.2" + "version": "==2.3.3" }, "pathspec": { "hashes": [ @@ -886,11 +914,11 @@ }, "platformdirs": { "hashes": [ - "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", - "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" + "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", + "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3" ], - "markers": "python_version >= '3.9'", - "version": "==4.3.8" + "markers": "python_version >= '3.10'", + "version": "==4.5.0" }, "proto-plus": { "hashes": [ @@ -902,69 +930,77 @@ }, "protobuf": { "hashes": [ - "sha256:15eba1b86f193a407607112ceb9ea0ba9569aed24f93333fe9a497cf2fda37d3", - "sha256:501fe6372fd1c8ea2a30b4d9be8f87955a64d6be9c88a973996cef5ef6f0abf1", - "sha256:75a2aab2bd1aeb1f5dc7c5f33bcb11d82ea8c055c9becbb41c26a8c43fd7092c", - "sha256:7db8ed09024f115ac877a1427557b838705359f047b2ff2f2b2364892d19dacb", - "sha256:84f9e3c1ff6fb0308dbacb0950d8aa90694b0d0ee68e75719cb044b7078fe741", - "sha256:a81439049127067fc49ec1d36e25c6ee1d1a2b7be930675f919258d03c04e7d2", - "sha256:a8bdbb2f009cfc22a36d031f22a625a38b615b5e19e558a7b756b3279723e68e", - "sha256:ba377e5b67b908c8f3072a57b63e2c6a4cbd18aea4ed98d2584350dbf46f2783", - "sha256:d52691e5bee6c860fff9a1c86ad26a13afbeb4b168cd4445c922b7e2cf85aaf0" + "sha256:023af8449482fa884d88b4563d85e83accab54138ae098924a985bcbb734a213", + "sha256:0f4cf01222c0d959c2b399142deb526de420be8236f22c71356e2a544e153c53", + "sha256:8fd7d5e0eb08cd5b87fd3df49bc193f5cfd778701f47e11d127d0afc6c39f1d1", + "sha256:923aa6d27a92bf44394f6abf7ea0500f38769d4b07f4be41cb52bd8b1123b9ed", + "sha256:97f65757e8d09870de6fd973aeddb92f85435607235d20b2dfed93405d00c85b", + "sha256:d595a9fd694fdeb061a62fbe10eb039cc1e444df81ec9bb70c7fc59ebcb1eafa", + "sha256:df051de4fd7e5e4371334e234c62ba43763f15ab605579e04c7008c05735cd82", + "sha256:f8adba2e44cde2d7618996b3fc02341f03f5bc3f2748be72dc7b063319276178", + "sha256:f8d3fdbc966aaab1d05046d0240dd94d40f2a8c62856d41eaa141ff64a79de6b", + "sha256:fe34575f2bdde76ac429ec7b570235bf0c788883e70aee90068e9981806f2490" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==6.32.0" + "version": "==6.33.1" }, "pyarrow": { "hashes": [ - "sha256:067c66ca29aaedae08218569a114e413b26e742171f526e828e1064fcdec13f4", - "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", - "sha256:0c4e75d13eb76295a49e0ea056eb18dbd87d81450bfeb8afa19a7e5a75ae2ad7", - "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", - "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", - "sha256:203003786c9fd253ebcafa44b03c06983c9c8d06c3145e37f1b76a1f317aeae1", - "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", - "sha256:26bfd95f6bff443ceae63c65dc7e048670b7e98bc892210acba7e4995d3d4b51", - "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", - "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", - "sha256:3b4d97e297741796fead24867a8dabf86c87e4584ccc03167e4a811f50fdf74d", - "sha256:40ebfcb54a4f11bcde86bc586cbd0272bac0d516cfa539c799c2453768477569", - "sha256:479ee41399fcddc46159a551705b89c05f11e8b8cb8e968f7fec64f62d91985e", - "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", - "sha256:555ca6935b2cbca2c0e932bedd853e9bc523098c39636de9ad4693b5b1df86d6", - "sha256:585e7224f21124dd57836b1530ac8f2df2afc43c861d7bf3d58a4870c42ae36c", - "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", - "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", - "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", - "sha256:689f448066781856237eca8d1975b98cace19b8dd2ab6145bf49475478bcaa10", - "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", - "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", - "sha256:7be45519b830f7c24b21d630a31d48bcebfd5d4d7f9d3bdb49da9cdf6d764edb", - "sha256:898afce396b80fdda05e3086b4256f8677c671f7b1d27a6976fa011d3fd0a86e", - "sha256:8d58d8497814274d3d20214fbb24abcad2f7e351474357d552a8d53bce70c70e", - "sha256:9b0b14b49ac10654332a805aedfc0147fb3469cbf8ea951b3d040dab12372594", - "sha256:9d9f8bcb4c3be7738add259738abdeddc363de1b80e3310e04067aa1ca596634", - "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", - "sha256:a7f6524e3747e35f80744537c78e7302cd41deee8baa668d56d55f77d9c464b3", - "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", - "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", - "sha256:bd04ec08f7f8bd113c55868bd3fc442a9db67c27af098c5f814a3091e71cc61a", - "sha256:c077f48aab61738c237802836fc3844f85409a46015635198761b0d6a688f87b", - "sha256:cdc4c17afda4dab2a9c0b79148a43a7f4e1094916b3e18d8975bfd6d6d52241f", - "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", - "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", - "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", - "sha256:e563271e2c5ff4d4a4cbeb2c83d5cf0d4938b891518e676025f7268c6fe5fe26", - "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", - "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", - "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", - "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", - "sha256:fee33b0ca46f4c85443d6c450357101e47d53e6c3f008d658c27a2d020d44c79" + "sha256:001ea83a58024818826a9e3f89bf9310a114f7e26dfe404a4c32686f97bd7901", + "sha256:00626d9dc0f5ef3a75fe63fd68b9c7c8302d2b5bbc7f74ecaedba83447a24f84", + "sha256:0c34fe18094686194f204a3b1787a27456897d8a2d62caf84b61e8dfbc0252ae", + "sha256:12fe549c9b10ac98c91cf791d2945e878875d95508e1a5d14091a7aaa66d9cf8", + "sha256:1a812a5b727bc09c3d7ea072c4eebf657c2f7066155506ba31ebf4792f88f016", + "sha256:252be4a05f9d9185bb8c18e83764ebcfea7185076c07a7a662253af3a8c07941", + "sha256:334f900ff08ce0423407af97e6c26ad5d4e3b0763645559ece6fbf3747d6a8f5", + "sha256:35ad0f0378c9359b3f297299c3309778bb03b8612f987399a0333a560b43862d", + "sha256:3d600dc583260d845c7d8a6db540339dd883081925da2bd1c5cb808f720b3cd9", + "sha256:3e294c5eadfb93d78b0763e859a0c16d4051fc1c5231ae8956d61cb0b5666f5a", + "sha256:3e739edd001b04f654b166204fc7a9de896cf6007eaff33409ee9e50ceaff754", + "sha256:44729980b6c50a5f2bfcc2668d36c569ce17f8b17bccaf470c4313dcbbf13c9d", + "sha256:44d2d26cda26d18f7af7db71453b7b783788322d756e81730acb98f24eb90ace", + "sha256:4c19236ae2402a8663a2c8f21f1870a03cc57f0bef7e4b6eb3238cc82944de80", + "sha256:69763ab2445f632d90b504a815a2a033f74332997052b721002298ed6de40f2e", + "sha256:6dda1ddac033d27421c20d7a7943eec60be44e0db4e079f33cc5af3b8280ccde", + "sha256:6f9762274496c244d951c819348afbcf212714902742225f649cf02823a6a10f", + "sha256:710624ab925dc2b05a6229d47f6f0dac1c1155e6ed559be7109f684eba048a48", + "sha256:7388ac685cab5b279a41dfe0a6ccd99e4dbf322edfb63e02fc0443bf24134e91", + "sha256:77718810bd3066158db1e95a63c160ad7ce08c6b0710bc656055033e39cdad88", + "sha256:7a820d8ae11facf32585507c11f04e3f38343c1e784c9b5a8b1da5c930547fe2", + "sha256:8382ad21458075c2e66a82a29d650f963ce51c7708c7c0ff313a8c206c4fd5e8", + "sha256:84378110dd9a6c06323b41b56e129c504d157d1a983ce8f5443761eb5256bafc", + "sha256:854794239111d2b88b40b6ef92aa478024d1e5074f364033e73e21e3f76b25e0", + "sha256:92843c305330aa94a36e706c16209cd4df274693e777ca47112617db7d0ef3d7", + "sha256:9bddc2cade6561f6820d4cd73f99a0243532ad506bc510a75a5a65a522b2d74d", + "sha256:a4893d31e5ef780b6edcaf63122df0f8d321088bb0dee4c8c06eccb1ca28d145", + "sha256:a9d9ffdc2ab696f6b15b4d1f7cec6658e1d788124418cb30030afbae31c64746", + "sha256:ac93252226cf288753d8b46280f4edf3433bf9508b6977f8dd8526b521a1bbb9", + "sha256:b41f37cabfe2463232684de44bad753d6be08a7a072f6a83447eeaf0e4d2a215", + "sha256:b883fe6fd85adad7932b3271c38ac289c65b7337c2c132e9569f9d3940620730", + "sha256:b9d71701ce97c95480fecb0039ec5bb889e75f110da72005743451339262f4ce", + "sha256:ba95112d15fd4f1105fb2402c4eab9068f0554435e9b7085924bcfaac2cc306f", + "sha256:bba208d9c7decf9961998edf5c65e3ea4355d5818dd6cd0f6809bec1afb951cc", + "sha256:bd0d42297ace400d8febe55f13fdf46e86754842b860c978dfec16f081e5c653", + "sha256:bea79263d55c24a32b0d79c00a1c58bb2ee5f0757ed95656b01c0fb310c5af3d", + "sha256:c064e28361c05d72eed8e744c9605cbd6d2bb7481a511c74071fd9b24bc65d7d", + "sha256:c3200cb41cdbc65156e5f8c908d739b0dfed57e890329413da2748d1a2cd1a4e", + "sha256:c6c791b09c57ed76a18b03f2631753a4960eefbbca80f846da8baefc6491fcfe", + "sha256:c6ec3675d98915bf1ec8b3c7986422682f7232ea76cad276f4c8abd5b7319b70", + "sha256:ce20fe000754f477c8a9125543f1936ea5b8867c5406757c224d745ed033e691", + "sha256:cedb9dd9358e4ea1d9bce3665ce0797f6adf97ff142c8e25b46ba9cdd508e9b6", + "sha256:e0a15757fccb38c410947df156f9749ae4a3c89b2393741a50521f39a8cf202a", + "sha256:e6e95176209257803a8b3d0394f21604e796dadb643d2f7ca21b66c9c0b30c9a", + "sha256:e70ff90c64419709d38c8932ea9fe1cc98415c4f87ea8da81719e43f02534bc9", + "sha256:ec1a15968a9d80da01e1d30349b2b0d7cc91e96588ee324ce1b5228175043e95", + "sha256:ec5d40dd494882704fb876c16fa7261a69791e784ae34e6b5992e977bd2e238c", + "sha256:f633074f36dbc33d5c05b5dc75371e5660f1dbf9c8b1d95669def05e5425989c", + "sha256:f7fe3dbe871294ba70d789be16b6e7e52b418311e166e0e3cba9522f0f437fb1", + "sha256:f963ba8c3b0199f9d6b794c90ec77545e05eadc83973897a4523c9e8d84e9340" ], "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==21.0.0" + "markers": "python_version >= '3.10'", + "version": "==22.0.0" }, "pyasn1": { "hashes": [ @@ -984,20 +1020,20 @@ }, "pyathena": { "hashes": [ - "sha256:8e54baaa3386dacc93a6c63f8cd92994e50b8833d747772659231ae4ef4418f7", - "sha256:ecead301a04dd8223ce958b5d84ecbd028ef24a4e536ca08dfd0e7e36134ba80" + "sha256:b85ece213fac1c8332337b1e0e87e0ed70420168e05779f213c35e9318e71e3f", + "sha256:bf7d12f89fcc84e2b882549e0f0b2b661edd3404cbd7d04eefcef8651ca3e92f" ], "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==3.17.1" + "markers": "python_version >= '3.10'", + "version": "==3.21.1" }, "pycparser": { "hashes": [ - "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", - "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" + "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", + "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934" ], "markers": "python_version >= '3.8'", - "version": "==2.22" + "version": "==2.23" }, "pygments": { "hashes": [ @@ -1017,20 +1053,20 @@ }, "pylint": { "hashes": [ - "sha256:26698de19941363037e2937d3db9ed94fb3303fdadf7d98847875345a8bb6b05", - "sha256:7ef94aa692a600e82fabdd17102b73fc226758218c97473c7ad67bd4cb905d83" + "sha256:896d09afb0e78bbf2e030cd1f3d8dc92771a51f7e46828cbc3948a89cd03433a", + "sha256:a427fe76e0e5355e9fb9b604fd106c419cafb395886ba7f3cebebb03f30e081d" ], "index": "pypi", - "markers": "python_full_version >= '3.9.0'", - "version": "==3.3.8" + "markers": "python_full_version >= '3.10.0'", + "version": "==4.0.3" }, "pyopenssl": { "hashes": [ - "sha256:2b11f239acc47ac2e5aca04fd7fa829800aeee22a2eb30d744572a157bd8a1ab", - "sha256:8d031884482e0c67ee92bf9a4d8cceb08d92aba7136432ffb0703c5280fc205b" + "sha256:1fda6fc034d5e3d179d39e59c1895c9faeaf40a79de5fc4cbbfbe0d36f4a77b6", + "sha256:c981cb0a3fd84e8602d7afc209522773b94c1c2446a3c710a75b06fe1beae329" ], "markers": "python_version >= '3.7'", - "version": "==25.1.0" + "version": "==25.3.0" }, "python-dateutil": { "hashes": [ @@ -1040,6 +1076,14 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, + "pytokens": { + "hashes": [ + "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a", + "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3" + ], + "markers": "python_version >= '3.8'", + "version": "==0.3.0" + }, "pytz": { "hashes": [ "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", @@ -1082,11 +1126,11 @@ }, "rich": { "hashes": [ - "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", - "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8" + "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", + "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd" ], "markers": "python_full_version >= '3.8.0'", - "version": "==14.1.0" + "version": "==14.2.0" }, "rsa": { "hashes": [ @@ -1098,11 +1142,11 @@ }, "s3transfer": { "hashes": [ - "sha256:a981aa7429be23fe6dfc13e80e4020057cbab622b08c0315288758d67cabc724", - "sha256:c3fdba22ba1bd367922f27ec8032d6a1cf5f10c934fb5d68cf60fd5a23d936cf" + "sha256:ea3b790c7077558ed1f02a3072fb3cb992bbbd253392f4b6e9e8976941c7d456", + "sha256:eff12264e7c8b4985074ccce27a3b38a485bb7f7422cc8046fee9be4983e4125" ], "markers": "python_version >= '3.9'", - "version": "==0.13.1" + "version": "==0.14.0" }, "setuptools": { "hashes": [ @@ -1123,45 +1167,45 @@ }, "snowflake-connector-python": { "hashes": [ - "sha256:0708de0f64e3c6789fdf0d75f22c55eb0215b60b125a5d7d18e48a1d5b2e7def", - "sha256:07195dcde0a8265bc26f404e124ff514b47c16964e1a84625ab53d3ea52359db", - "sha256:1691f5f7ff508b1fefc491f0fb85524165681bb29242f508731515057a1b4f9d", - "sha256:1a668e5e9ae04ec0ab0f7cdd450ef3757283f37856655ae7e971ee645a25b4b3", - "sha256:360f21c576847636c3560a2607c5388f9e57e607a3558f5f5a188a71c82108e1", - "sha256:3be73a65f5fdb8f074eef129c7828134aac9b429afab18f142ecc0f7260668b8", - "sha256:4934a4f552876592696ab8def7e2d33163f99bb059bac4b90b5cfce165aa6499", - "sha256:53ad13df88b2dd568e8f9c2944386c8446482152141dff83f27e680ceffa1b10", - "sha256:54dfeba63d8ccef4182951ab2dc605cc7cb2a811e68e98f1146281f4721e3af0", - "sha256:58c273b610ba25d6386134238c27290ea9ed468443da4061d80050288dc7b01d", - "sha256:63a57cb67d14c7da6b91b8db0db3a92dfa5cf5082c388006d2f9f480c2df0234", - "sha256:70f7cf3dcfcceea99d4b9d4fb8ef67788790832cbeceb222fbdf5595da52103b", - "sha256:89d5001de2b708ba3941cf1a2a33e391ba3c11b4f5176bf89ee0c76590eb0900", - "sha256:9e05c9d55b234c8a903d96397b9eb4accbddf7d2fcfac2e27239f0f49d16f475", - "sha256:a601dfe86ab4b7900b68fa1cfadcc674b23f6f6b4a1c57c3202e57761de6b183", - "sha256:b6b5956b59f3c379c72a008a9d413e878188979c003e2aced0e1eebf27ca4cc0", - "sha256:c526f18487fc1e7d4f6b294198079cceefa47a77084c9d2a87a2e617fceb999d", - "sha256:c6e737d8b66f0bdbb698f8e1a394f191eadcd16b9145abc08fdf8959a77d6a70", - "sha256:c6f59c47e43bf889fd5a2ead8ffeacd447cd792d711f010c91b23b4804c67f6b", - "sha256:d06d9c4ade7fb8f9d1e237cab9c5d38408785d3d2ddfe94001bbef9bb076203f", - "sha256:d8a97d7dc4abf194ca540564f75b4b4a79004a553767001e1d70fae49bb7bf4f", - "sha256:e21a68c5fb04a16f48fd5146ab7a72d17b2d3d09c9b537f64fffa99316abd670", - "sha256:ed2c183058245a63125ac1ebb20062e41c0cc5b0ab6cde5df1250e1c332d3da1", - "sha256:ed6a05c55238d076ad186e27889a72fe888f02e9c8c341127f828439cbf1e42f", - "sha256:f3620f33f6a453775fb527d32308ffdf167cc426a81fc1dfdadd4cd657dc6ac9", - "sha256:fc3d216fa04f3f9126207d71aa150f219367fc44759caabec4d2d96687242135" + "sha256:0af10b207af3d2de2b130e89018d49a60f2e5cfe841f3bf459e58f2e1c4c4506", + "sha256:1841b60dc376639493dfc520cf39ad4f4da1f30286bba57e878d57414263d628", + "sha256:1afbd9e21180d2b4a76500ac2978b11865fdb3230609f2a9d80ba459fc27f2e4", + "sha256:1fb9fc9d8c2c7d209ba89282d367a32e75b0688afd4a3f02409e24f153c1a32e", + "sha256:283366b35df88cd0c71caf0215ba80370ddef4dd37d2adf43b24208c747231ee", + "sha256:2e4c285cc6a7f6431cff98c8f235a0fe9da2262462dd3dfc2b97120574a95cf9", + "sha256:32b1abfea32561d817b0a2f80b06d936cb32712af06bf7b848a428bfd857a10a", + "sha256:3fee7035f865088f948510b094101c8a0e5b22501891f2115f7fb1cb555de76a", + "sha256:41a46eb9824574c5f8068e3ed5c02a2dc0a733ed08ee81fa1fb3dd0ebe921728", + "sha256:4c068c8d3cd0c9736cb0679a9f544d34327e64415303bbfe07ec8ce3c5dae800", + "sha256:4ed2d593f1983939d5d8d88b212d86fd4f14f0ceefc1df9882b4a18534adbde9", + "sha256:51eb789a09dc6c62119cfabd044fba1a6b8378206f05a1e83ddb2e9cb49acc0b", + "sha256:5d89f608fde2fb0597ca5e020c4ac602027dc67f11b61b4d1e5448163bae4edc", + "sha256:65d37263dd288abb649820b7e34af96dc6b2d2115bf5521a2526245f81ddb0cb", + "sha256:7116cfa410d517328fd25fabffb54845b88667586718578c4333ce034fead1ba", + "sha256:783a9ab206563d7b52fdcdd7a72af62de811d3381ca64132fd3445537b4d041b", + "sha256:7a5fcb9a25a9b77b6cd86dfc6a6324b9910e15a493a916983229011ce3509b5f", + "sha256:8d3e96e1d09b07edca6c1f6ca675b6fdd05a4a7e428e4cdf6fb697d87b9f60fc", + "sha256:94e041e347b5151b66d19d6cfc3b3172dac1f51e44bbf7cf58f3989427dd464a", + "sha256:a8c570edff5a4888840dbe1e9e65c5e4d77d55c5c800cd359fe0903a769201e0", + "sha256:aeeb181a156333480f60b5f8ddbb3d087e288b4509adbef7993236defe4d7570", + "sha256:b211b4240596a225b895261a4ced2633e0262e82e2e32f6fb8dfc7d4bfedf8ca", + "sha256:b99f261c82be92224ac20c8c12bdf26ce3ed5dfd8a3df8a97f15a1e11c46ad27", + "sha256:bd1de3038b6d7059ca59f93e105aba2a673151c693cc4292f72f38bfaf147df2", + "sha256:cfa6b234f53ec624149e21156d0a98e43408d194f2e65bcfaf30acefd35a581e", + "sha256:e17a9e806823d3a0e578cf9349f6a93810a582b3132903ea9e1683854d08da00" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==3.17.2" + "version": "==3.18.0" }, "snowflake-sqlalchemy": { "hashes": [ - "sha256:afb0d058da752342e08d747fb8384207a34e1a402130f7febdc454c50e1ddb7c", - "sha256:ce472b90755e9f7cc1ff4943e27ff4732bcf860e812249bea7491090b85d2b91" + "sha256:4ae5e5b458596ab2f0380c79b049978681a0490791add478d3c953613417d086", + "sha256:e6cf9f6309a9c3f4b3fd6e8808b2fb04886da123f4d58d96323a491732a5d496" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.7.6" + "version": "==1.7.7" }, "sortedcontainers": { "hashes": [ @@ -1172,76 +1216,76 @@ }, "sqlalchemy": { "hashes": [ - "sha256:022e436a1cb39b13756cf93b48ecce7aa95382b9cfacceb80a7d263129dfd019", - "sha256:03d73ab2a37d9e40dec4984d1813d7878e01dbdc742448d44a7341b7a9f408c7", - "sha256:07097c0a1886c150ef2adba2ff7437e84d40c0f7dcb44a2c2b9c905ccfc6361c", - "sha256:11b9503fa6f8721bef9b8567730f664c5a5153d25e247aadc69247c4bc605227", - "sha256:11f43c39b4b2ec755573952bbcc58d976779d482f6f832d7f33a8d869ae891bf", - "sha256:13194276e69bb2af56198fef7909d48fd34820de01d9c92711a5fa45497cc7ed", - "sha256:136063a68644eca9339d02e6693932116f6a8591ac013b0014479a1de664e40a", - "sha256:14111d22c29efad445cd5021a70a8b42f7d9152d8ba7f73304c4d82460946aaa", - "sha256:1681c21dd2ccee222c2fe0bef671d1aef7c504087c9c4e800371cfcc8ac966fc", - "sha256:1a113da919c25f7f641ffbd07fbc9077abd4b3b75097c888ab818f962707eb48", - "sha256:1c6d85327ca688dbae7e2b06d7d84cfe4f3fffa5b5f9e21bb6ce9d0e1a0e0e0a", - "sha256:20d81fc2736509d7a2bd33292e489b056cbae543661bb7de7ce9f1c0cd6e7f24", - "sha256:21b27b56eb2f82653168cefe6cb8e970cdaf4f3a6cb2c5e3c3c1cf3158968ff9", - "sha256:21ba7a08a4253c5825d1db389d4299f64a100ef9800e4624c8bf70d8f136e6ed", - "sha256:227119ce0a89e762ecd882dc661e0aa677a690c914e358f0dd8932a2e8b2765b", - "sha256:25b9fc27650ff5a2c9d490c13c14906b918b0de1f8fcbb4c992712d8caf40e83", - "sha256:334f41fa28de9f9be4b78445e68530da3c5fa054c907176460c81494f4ae1f5e", - "sha256:413391b2239db55be14fa4223034d7e13325a1812c8396ecd4f2c08696d5ccad", - "sha256:4286a1139f14b7d70141c67a8ae1582fc2b69105f1b09d9573494eb4bb4b2687", - "sha256:44337823462291f17f994d64282a71c51d738fc9ef561bf265f1d0fd9116a782", - "sha256:46293c39252f93ea0910aababa8752ad628bcce3a10d3f260648dd472256983f", - "sha256:4bf0edb24c128b7be0c61cd17eef432e4bef507013292415f3fb7023f02b7d4b", - "sha256:4d3d9b904ad4a6b175a2de0738248822f5ac410f52c2fd389ada0b5262d6a1e3", - "sha256:4e6aeb2e0932f32950cf56a8b4813cb15ff792fc0c9b3752eaf067cfe298496a", - "sha256:4fb1a8c5438e0c5ea51afe9c6564f951525795cf432bed0c028c1cb081276685", - "sha256:529064085be2f4d8a6e5fab12d36ad44f1909a18848fcfbdb59cc6d4bbe48efe", - "sha256:52d9b73b8fb3e9da34c2b31e6d99d60f5f99fd8c1225c9dad24aeb74a91e1d29", - "sha256:5cda6b51faff2639296e276591808c1726c4a77929cfaa0f514f30a5f6156921", - "sha256:5d79f9fdc9584ec83d1b3c75e9f4595c49017f5594fee1a2217117647225d738", - "sha256:61f964a05356f4bca4112e6334ed7c208174511bd56e6b8fc86dad4d024d4185", - "sha256:6772e3ca8a43a65a37c88e2f3e2adfd511b0b1da37ef11ed78dea16aeae85bd9", - "sha256:6e2bf13d9256398d037fef09fd8bf9b0bf77876e22647d10761d35593b9ac547", - "sha256:70322986c0c699dca241418fcf18e637a4369e0ec50540a2b907b184c8bca069", - "sha256:788bfcef6787a7764169cfe9859fe425bf44559619e1d9f56f5bddf2ebf6f417", - "sha256:7f1ac7828857fcedb0361b48b9ac4821469f7694089d15550bbcf9ab22564a1d", - "sha256:87accdbba88f33efa7b592dc2e8b2a9c2cdbca73db2f9d5c510790428c09c154", - "sha256:8cee08f15d9e238ede42e9bbc1d6e7158d0ca4f176e4eab21f88ac819ae3bd7b", - "sha256:971ba928fcde01869361f504fcff3b7143b47d30de188b11c6357c0505824197", - "sha256:9c2e02f06c68092b875d5cbe4824238ab93a7fa35d9c38052c033f7ca45daa18", - "sha256:9c5a9da957c56e43d72126a3f5845603da00e0293720b03bde0aacffcf2dc04f", - "sha256:9df7126fd9db49e3a5a3999442cc67e9ee8971f3cb9644250107d7296cb2a164", - "sha256:b3edaec7e8b6dc5cd94523c6df4f294014df67097c8217a89929c99975811414", - "sha256:b535d35dea8bbb8195e7e2b40059e2253acb2b7579b73c1b432a35363694641d", - "sha256:bcf0724a62a5670e5718957e05c56ec2d6850267ea859f8ad2481838f889b42c", - "sha256:c00e7845d2f692ebfc7d5e4ec1a3fd87698e4337d09e58d6749a16aedfdf8612", - "sha256:c379e37b08c6c527181a397212346be39319fb64323741d23e46abd97a400d34", - "sha256:c5d1730b25d9a07727d20ad74bc1039bbbb0a6ca24e6769861c1aa5bf2c4c4a8", - "sha256:c5e73ba0d76eefc82ec0219d2301cb33bfe5205ed7a2602523111e2e56ccbd20", - "sha256:c697575d0e2b0a5f0433f679bda22f63873821d991e95a90e9e52aae517b2e32", - "sha256:cdeff998cb294896a34e5b2f00e383e7c5c4ef3b4bfa375d9104723f15186443", - "sha256:ceb5c832cc30663aeaf5e39657712f4c4241ad1f638d487ef7216258f6d41fe7", - "sha256:d34c0f6dbefd2e816e8f341d0df7d4763d382e3f452423e752ffd1e213da2512", - "sha256:db691fa174e8f7036afefe3061bc40ac2b770718be2862bfb03aabae09051aca", - "sha256:e7a903b5b45b0d9fa03ac6a331e1c1d6b7e0ab41c63b6217b3d10357b83c8b00", - "sha256:e7c08f57f75a2bb62d7ee80a89686a5e5669f199235c6d1dac75cd59374091c3", - "sha256:f42f23e152e4545157fa367b2435a1ace7571cab016ca26038867eb7df2c3631", - "sha256:fe2b3b4927d0bc03d02ad883f402d5de201dbc8894ac87d2e981e7d87430e60d" + "sha256:0765e318ee9179b3718c4fd7ba35c434f4dd20332fbc6857a5e8df17719c24d7", + "sha256:0ae7454e1ab1d780aee69fd2aae7d6b8670a581d8847f2d1e0f7ddfbf47e5a22", + "sha256:0b1af8392eb27b372ddb783b317dea0f650241cea5bd29199b22235299ca2e45", + "sha256:0fe3917059c7ab2ee3f35e77757062b1bea10a0b6ca633c58391e3f3c6c488dd", + "sha256:119dc41e7a7defcefc57189cfa0e61b1bf9c228211aba432b53fb71ef367fda1", + "sha256:11bac86b0deada30b6b5f93382712ff0e911fe8d31cb9bf46e6b149ae175eff0", + "sha256:15f3326f7f0b2bfe406ee562e17f43f36e16167af99c4c0df61db668de20002d", + "sha256:17835885016b9e4d0135720160db3095dc78c583e7b902b6be799fb21035e749", + "sha256:19de7ca1246fbef9f9d1bff8f1ab25641569df226364a0e40457dc5457c54b05", + "sha256:1df4763760d1de0dfc8192cc96d8aa293eb1a44f8f7a5fbe74caf1b551905c5e", + "sha256:1e77faf6ff919aa8cd63f1c4e561cac1d9a454a191bb864d5dd5e545935e5a40", + "sha256:22be14009339b8bc16d6b9dc8780bacaba3402aa7581658e246114abbd2236e3", + "sha256:253e2f29843fb303eca6b2fc645aca91fa7aa0aa70b38b6950da92d44ff267f3", + "sha256:2b61188657e3a2b9ac4e8f04d6cf8e51046e28175f79464c67f2fd35bceb0976", + "sha256:2bf4bb6b3d6228fcf3a71b50231199fb94d2dd2611b66d33be0578ea3e6c2726", + "sha256:2e7b5b079055e02d06a4308d0481658e4f06bc7ef211567edc8f7d5dce52018d", + "sha256:2f19644f27c76f07e10603580a47278abb2a70311136a7f8fd27dc2e096b9013", + "sha256:2fc44e5965ea46909a416fff0af48a219faefd5773ab79e5f8a5fcd5d62b2667", + "sha256:2fcc4901a86ed81dc76703f3b93ff881e08761c63263c46991081fd7f034b165", + "sha256:3255d821ee91bdf824795e936642bbf43a4c7cedf5d1aed8d24524e66843aa74", + "sha256:329aa42d1be9929603f406186630135be1e7a42569540577ba2c69952b7cf399", + "sha256:357bade0e46064f88f2c3a99808233e67b0051cdddf82992379559322dfeb183", + "sha256:3caef1ff89b1caefc28f0368b3bde21a7e3e630c2eddac16abd9e47bd27cc36a", + "sha256:3cf6872a23601672d61a68f390e44703442639a12ee9dd5a88bbce52a695e46e", + "sha256:3fe166c7d00912e8c10d3a9a0ce105569a31a3d0db1a6e82c4e0f4bf16d5eca9", + "sha256:471733aabb2e4848d609141a9e9d56a427c0a038f4abf65dd19d7a21fd563632", + "sha256:4848395d932e93c1595e59a8672aa7400e8922c39bb9b0668ed99ac6fa867822", + "sha256:48bf7d383a35e668b984c805470518b635d48b95a3c57cb03f37eaa3551b5f9f", + "sha256:4c26ef74ba842d61635b0152763d057c8d48215d5be9bb8b7604116a059e9985", + "sha256:4d18cd0e9a0f37c9f4088e50e3839fcb69a380a0ec957408e0b57cff08ee0a26", + "sha256:585c0c852a891450edbb1eaca8648408a3cc125f18cf433941fa6babcc359e29", + "sha256:70e03833faca7166e6a9927fbee7c27e6ecde436774cd0b24bbcc96353bce06b", + "sha256:72fea91746b5890f9e5e0997f16cbf3d53550580d76355ba2d998311b17b2250", + "sha256:78e6c137ba35476adb5432103ae1534f2f5295605201d946a4198a0dea4b38e7", + "sha256:7a8694107eb4308a13b425ca8c0e67112f8134c846b6e1f722698708741215d5", + "sha256:7c77f3080674fc529b1bd99489378c7f63fcb4ba7f8322b79732e0258f0ea3ce", + "sha256:7cbcb47fd66ab294703e1644f78971f6f2f1126424d2b300678f419aa73c7b6e", + "sha256:846541e58b9a81cce7dee8329f352c318de25aa2f2bbe1e31587eb1f057448b4", + "sha256:8e0e4e66fd80f277a8c3de016a81a554e76ccf6b8d881ee0b53200305a8433f6", + "sha256:9919e77403a483ab81e3423151e8ffc9dd992c20d2603bf17e4a8161111e55f5", + "sha256:9b94843a102efa9ac68a7a30cd46df3ff1ed9c658100d30a725d10d9c60a2f44", + "sha256:9e9018544ab07614d591a26c1bd4293ddf40752cc435caf69196740516af7100", + "sha256:b87e7b91a5d5973dda5f00cd61ef72ad75a1db73a386b62877d4875a8840959c", + "sha256:c1c80faaee1a6c3428cecf40d16a2365bcf56c424c92c2b6f0f9ad204b899e9e", + "sha256:c3678a0fb72c8a6a29422b2732fe423db3ce119c34421b5f9955873eb9b62c1e", + "sha256:cbe4f85f50c656d753890f39468fcd8190c5f08282caf19219f684225bfd5fd2", + "sha256:cc2856d24afa44295735e72f3c75d6ee7fdd4336d8d3a8f3d44de7aa6b766df2", + "sha256:d733dec0614bb8f4bcb7c8af88172b974f685a31dc3a65cca0527e3120de5606", + "sha256:dc8b3850d2a601ca2320d081874033684e246d28e1c5e89db0864077cfc8f5a9", + "sha256:de4387a354ff230bc979b46b2207af841dc8bf29847b6c7dbe60af186d97aefa", + "sha256:e998cf7c29473bd077704cea3577d23123094311f59bdc4af551923b168332b1", + "sha256:ebac3f0b5732014a126b43c2b7567f2f0e0afea7d9119a3378bde46d3dcad88e", + "sha256:ee51625c2d51f8baadf2829fae817ad0b66b140573939dd69284d2ba3553ae73", + "sha256:f4a172b31785e2f00780eccab00bc240ccdbfdb8345f1e6063175b3ff12ad1b0", + "sha256:f7027414f2b88992877573ab780c19ecb54d3a536bef3397933573d6b5068be4", + "sha256:f9480c0740aabd8cb29c329b422fb65358049840b34aba0adf63162371d2a96e", + "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==2.0.43" + "version": "==2.0.44" }, "sqlalchemy-bigquery": { "hashes": [ - "sha256:13bce11fc7af40705dd142fe0fa6f01126ff62ff26d5e514c858ec7351076764", - "sha256:5066b6557c1fa7f67bb284897db56ba51e36543386ce95f0e92c7fde75bbbcf4" + "sha256:0fe7634cd954f3e74f5e2db6d159f9e5ee87a47fbe8d52eac3cd3bb3dadb3a77", + "sha256:fe937a0d1f4cf7219fcf5d4995c6718805b38d4df43e29398dec5dc7b6d1987e" ], "index": "pypi", - "markers": "python_version < '3.14' and python_version >= '3.8'", - "version": "==1.15.0" + "markers": "python_version < '3.15' and python_version >= '3.8'", + "version": "==1.16.0" }, "tenacity": { "hashes": [ @@ -1253,41 +1297,51 @@ }, "tomli": { "hashes": [ - "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", - "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", - "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", - "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", - "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", - "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", - "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", - "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", - "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", - "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", - "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", - "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", - "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", - "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", - "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", - "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", - "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", - "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", - "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", - "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", - "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", - "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", - "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", - "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", - "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", - "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", - "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", - "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", - "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", - "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", - "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", - "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7" + "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", + "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", + "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", + "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", + "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", + "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", + "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", + "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", + "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", + "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", + "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", + "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", + "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", + "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", + "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", + "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", + "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", + "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", + "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", + "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", + "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", + "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", + "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", + "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", + "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", + "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", + "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", + "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", + "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", + "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", + "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", + "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", + "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", + "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", + "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", + "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", + "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", + "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", + "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", + "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", + "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", + "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876" ], "markers": "python_version >= '3.8'", - "version": "==2.2.1" + "version": "==2.3.0" }, "tomlkit": { "hashes": [ @@ -1308,54 +1362,47 @@ }, "twine": { "hashes": [ - "sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384", - "sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd" + "sha256:418ebf08ccda9a8caaebe414433b0ba5e25eb5e4a927667122fbe8f829f985d8", + "sha256:e5ed0d2fd70c9959770dce51c8f39c8945c574e18173a7b81802dab51b4b75cf" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==6.1.0" + "markers": "python_version >= '3.9'", + "version": "==6.2.0" }, "types-protobuf": { "hashes": [ - "sha256:7afc2d3f569d281dd22f339179577243be60bf7d1dfb4bc13d0109859fb1f1be", - "sha256:b04f2998edf0d81bd8600bbd5db0b2adf547837eef6362ba364925cee21a33b4" + "sha256:641002611ff87dd9fedc38a39a29cacb9907ae5ce61489b53e99ca2074bef764", + "sha256:a15109d38f7cfefd2539ef86d3f93a6a41c7cad53924f8aa1a51eaddbb72a660" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==6.30.2.20250809" + "version": "==6.32.1.20251105" }, "types-python-dateutil": { "hashes": [ - "sha256:69cbf8d15ef7a75c3801d65d63466e46ac25a0baa678d89d0a137fc31a608cc1", - "sha256:768890cac4f2d7fd9e0feb6f3217fce2abbfdfc0cadd38d11fba325a815e4b9f" + "sha256:8a47f2c3920f52a994056b8786309b43143faa5a64d4cbb2722d6addabdf1a58", + "sha256:9cf9c1c582019753b8639a081deefd7e044b9fa36bd8217f565c6c4e36ee0624" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==2.9.0.20250809" + "version": "==2.9.0.20251115" }, "types-requests": { "hashes": [ - "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9", - "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0" + "sha256:78c9c1fffebbe0fa487a418e0fa5252017e9c60d1a2da394077f1780f655d7e1", + "sha256:abd6d4f9ce3a9383f269775a9835a4c24e5cd6b9f647d64f88aa4613c33def5d" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==2.31.0.6" - }, - "types-urllib3": { - "hashes": [ - "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f", - "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e" - ], - "version": "==1.26.25.14" + "markers": "python_version >= '3.9'", + "version": "==2.32.4.20250913" }, "typing-extensions": { "hashes": [ - "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", - "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76" + "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", + "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" ], "markers": "python_version >= '3.9'", - "version": "==4.14.1" + "version": "==4.15.0" }, "tzdata": { "hashes": [ @@ -1367,11 +1414,11 @@ }, "urllib3": { "hashes": [ - "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", - "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32" + "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", + "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.20" + "markers": "python_version >= '3.9'", + "version": "==2.5.0" }, "wheel": { "hashes": [ diff --git a/README.md b/README.md index 133d64d8..1baff41f 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pip install exabel-data-sdk or download from [PyPI](https://pypi.org/project/exabel-data-sdk/). -The SDK requires Python 3.9 or later. +The SDK requires Python 3.10 or later. ### Installation with SQL data source support diff --git a/exabel_data_sdk/client/api/bulk_import.py b/exabel_data_sdk/client/api/bulk_import.py index 3bcb0a18..fa5e59d2 100644 --- a/exabel_data_sdk/client/api/bulk_import.py +++ b/exabel_data_sdk/client/api/bulk_import.py @@ -276,10 +276,7 @@ def _bulk_import( results, resource_batch, import_func, - # Python 3.9 added support for the shutdown argument 'cancel_futures'. - # We should set this argument to True once we have moved to this python - # version. - lambda: executor.shutdown(wait=False), + lambda: executor.shutdown(wait=False, cancel_futures=True), ) if results.abort: raise BulkInsertFailedError() diff --git a/exabel_data_sdk/client/api/bulk_insert.py b/exabel_data_sdk/client/api/bulk_insert.py index 0121c9e7..73469869 100644 --- a/exabel_data_sdk/client/api/bulk_insert.py +++ b/exabel_data_sdk/client/api/bulk_insert.py @@ -98,10 +98,7 @@ def _bulk_insert( results, resource, insert_func, - # Python 3.9 added support for the shutdown argument 'cancel_futures'. - # We should set this argument to True once we have moved to this python - # version. - lambda: executor.shutdown(wait=False), + lambda: executor.shutdown(wait=False, cancel_futures=True), ) if results.abort: raise BulkInsertFailedError() diff --git a/pyproject.toml b/pyproject.toml index 1e5be1f8..7121e0e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,7 +84,7 @@ line_length = 100 ensure_newline_before_comments = true [tool.mypy] -python_version = "3.9" +python_version = "3.10" # Searching for installed packages in mypy apparently does not play well with pipenv. ignore_missing_imports = true check_untyped_defs = true diff --git a/setup.py b/setup.py index 2398c02b..177bab9e 100644 --- a/setup.py +++ b/setup.py @@ -57,15 +57,15 @@ "tqdm", ], extras_require=extras, - python_requires=">=3.9", + python_requires=">=3.10", classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Financial and Insurance Industry", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ],