exabel 8.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- exabel-8.0.0/LICENSE +21 -0
- exabel-8.0.0/PKG-INFO +111 -0
- exabel-8.0.0/README.md +69 -0
- exabel-8.0.0/exabel/__init__.py +1 -0
- exabel-8.0.0/exabel/client/__init__.py +0 -0
- exabel-8.0.0/exabel/client/api/__init__.py +0 -0
- exabel-8.0.0/exabel/client/api/api_client/__init__.py +0 -0
- exabel-8.0.0/exabel/client/api/api_client/calendar_api_client.py +43 -0
- exabel-8.0.0/exabel/client/api/api_client/data_set_api_client.py +37 -0
- exabel-8.0.0/exabel/client/api/api_client/derived_signal_api_client.py +31 -0
- exabel-8.0.0/exabel/client/api/api_client/entity_api_client.py +75 -0
- exabel-8.0.0/exabel/client/api/api_client/exabel_api_group.py +38 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/__init__.py +0 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/base_grpc_client.py +85 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/calendar_grpc_client.py +61 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/data_set_grpc_client.py +45 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/derived_signal_grpc_client.py +47 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/entity_grpc_client.py +91 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/holiday_grpc_client.py +63 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/kpi_grpc_client.py +71 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/library_grpc_client.py +82 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/namespace_grpc_client.py +26 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/prediction_model_grpc_client.py +28 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/relationship_grpc_client.py +92 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/signal_grpc_client.py +78 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/tag_grpc_client.py +67 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/time_series_grpc_client.py +75 -0
- exabel-8.0.0/exabel/client/api/api_client/grpc/user_grpc_client.py +30 -0
- exabel-8.0.0/exabel/client/api/api_client/holiday_api_client.py +43 -0
- exabel-8.0.0/exabel/client/api/api_client/kpi_api_client.py +58 -0
- exabel-8.0.0/exabel/client/api/api_client/library_api_client.py +72 -0
- exabel-8.0.0/exabel/client/api/api_client/namespace_api_client.py +16 -0
- exabel-8.0.0/exabel/client/api/api_client/prediction_model_api_client.py +16 -0
- exabel-8.0.0/exabel/client/api/api_client/relationship_api_client.py +66 -0
- exabel-8.0.0/exabel/client/api/api_client/signal_api_client.py +37 -0
- exabel-8.0.0/exabel/client/api/api_client/tag_api_client.py +55 -0
- exabel-8.0.0/exabel/client/api/api_client/time_series_api_client.py +51 -0
- exabel-8.0.0/exabel/client/api/api_client/user_api_client.py +22 -0
- exabel-8.0.0/exabel/client/api/bulk_import.py +266 -0
- exabel-8.0.0/exabel/client/api/bulk_insert.py +165 -0
- exabel-8.0.0/exabel/client/api/calendar_api.py +143 -0
- exabel-8.0.0/exabel/client/api/data_classes/__init__.py +0 -0
- exabel-8.0.0/exabel/client/api/data_classes/company.py +28 -0
- exabel-8.0.0/exabel/client/api/data_classes/company_kpi_mapping_results.py +59 -0
- exabel-8.0.0/exabel/client/api/data_classes/company_kpi_model_result.py +38 -0
- exabel-8.0.0/exabel/client/api/data_classes/company_kpi_models.py +44 -0
- exabel-8.0.0/exabel/client/api/data_classes/data_set.py +101 -0
- exabel-8.0.0/exabel/client/api/data_classes/derived_signal.py +258 -0
- exabel-8.0.0/exabel/client/api/data_classes/entity.py +86 -0
- exabel-8.0.0/exabel/client/api/data_classes/entity_type.py +67 -0
- exabel-8.0.0/exabel/client/api/data_classes/fiscal_period.py +48 -0
- exabel-8.0.0/exabel/client/api/data_classes/folder.py +79 -0
- exabel-8.0.0/exabel/client/api/data_classes/folder_accessor.py +47 -0
- exabel-8.0.0/exabel/client/api/data_classes/folder_item.py +156 -0
- exabel-8.0.0/exabel/client/api/data_classes/group.py +57 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi.py +60 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi_hierarchy.py +81 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi_mapping_group_reference.py +30 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi_mapping_model.py +31 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi_mapping_result_data.py +107 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi_model.py +42 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi_model_data.py +105 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi_model_run.py +54 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi_model_runs.py +39 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi_model_weight_groups.py +90 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi_screen_results.py +38 -0
- exabel-8.0.0/exabel/client/api/data_classes/kpi_source.py +23 -0
- exabel-8.0.0/exabel/client/api/data_classes/model_quality.py +31 -0
- exabel-8.0.0/exabel/client/api/data_classes/model_results.py +59 -0
- exabel-8.0.0/exabel/client/api/data_classes/namespace.py +33 -0
- exabel-8.0.0/exabel/client/api/data_classes/paging_result.py +42 -0
- exabel-8.0.0/exabel/client/api/data_classes/prediction_model_run.py +126 -0
- exabel-8.0.0/exabel/client/api/data_classes/relationship.py +79 -0
- exabel-8.0.0/exabel/client/api/data_classes/relationship_type.py +73 -0
- exabel-8.0.0/exabel/client/api/data_classes/request_error.py +91 -0
- exabel-8.0.0/exabel/client/api/data_classes/signal.py +52 -0
- exabel-8.0.0/exabel/client/api/data_classes/tag.py +105 -0
- exabel-8.0.0/exabel/client/api/data_classes/time_series.py +271 -0
- exabel-8.0.0/exabel/client/api/data_classes/user.py +49 -0
- exabel-8.0.0/exabel/client/api/data_set_api.py +93 -0
- exabel-8.0.0/exabel/client/api/derived_signal_api.py +75 -0
- exabel-8.0.0/exabel/client/api/entity_api.py +308 -0
- exabel-8.0.0/exabel/client/api/error_handler.py +105 -0
- exabel-8.0.0/exabel/client/api/export_api.py +291 -0
- exabel-8.0.0/exabel/client/api/holiday_api.py +122 -0
- exabel-8.0.0/exabel/client/api/kpi_api.py +215 -0
- exabel-8.0.0/exabel/client/api/library_api.py +195 -0
- exabel-8.0.0/exabel/client/api/namespace_api.py +42 -0
- exabel-8.0.0/exabel/client/api/pageable_resource.py +44 -0
- exabel-8.0.0/exabel/client/api/prediction_model_api.py +29 -0
- exabel-8.0.0/exabel/client/api/proto_utils.py +22 -0
- exabel-8.0.0/exabel/client/api/relationship_api.py +401 -0
- exabel-8.0.0/exabel/client/api/resource_creation_result.py +262 -0
- exabel-8.0.0/exabel/client/api/search_service.py +234 -0
- exabel-8.0.0/exabel/client/api/signal_api.py +155 -0
- exabel-8.0.0/exabel/client/api/tag_api.py +146 -0
- exabel-8.0.0/exabel/client/api/time_series_api.py +686 -0
- exabel-8.0.0/exabel/client/api/user_api.py +33 -0
- exabel-8.0.0/exabel/client/client_config.py +104 -0
- exabel-8.0.0/exabel/client/exabel_client.py +109 -0
- exabel-8.0.0/exabel/examples/__init__.py +0 -0
- exabel-8.0.0/exabel/examples/create_time_series_example.py +96 -0
- exabel-8.0.0/exabel/examples/get_company_example.py +103 -0
- exabel-8.0.0/exabel/query/__init__.py +0 -0
- exabel-8.0.0/exabel/query/column.py +53 -0
- exabel-8.0.0/exabel/query/dashboard.py +41 -0
- exabel-8.0.0/exabel/query/literal.py +25 -0
- exabel-8.0.0/exabel/query/predicate.py +53 -0
- exabel-8.0.0/exabel/query/query.py +30 -0
- exabel-8.0.0/exabel/query/signals.py +84 -0
- exabel-8.0.0/exabel/query/table.py +9 -0
- exabel-8.0.0/exabel/scripts/__init__.py +0 -0
- exabel-8.0.0/exabel/scripts/actions.py +57 -0
- exabel-8.0.0/exabel/scripts/base_script.py +124 -0
- exabel-8.0.0/exabel/scripts/check_company_identifiers_in_csv.py +128 -0
- exabel-8.0.0/exabel/scripts/command_line_script.py +31 -0
- exabel-8.0.0/exabel/scripts/create_data_set.py +70 -0
- exabel-8.0.0/exabel/scripts/create_derived_signal.py +79 -0
- exabel-8.0.0/exabel/scripts/create_entity.py +54 -0
- exabel-8.0.0/exabel/scripts/create_entity_mapping_from_csv.py +238 -0
- exabel-8.0.0/exabel/scripts/create_entity_type.py +66 -0
- exabel-8.0.0/exabel/scripts/create_folder.py +31 -0
- exabel-8.0.0/exabel/scripts/create_prediction_model_run.py +39 -0
- exabel-8.0.0/exabel/scripts/create_relationship.py +58 -0
- exabel-8.0.0/exabel/scripts/create_relationship_type.py +61 -0
- exabel-8.0.0/exabel/scripts/create_signal.py +56 -0
- exabel-8.0.0/exabel/scripts/csv_script.py +108 -0
- exabel-8.0.0/exabel/scripts/csv_script_with_entity_mapping.py +49 -0
- exabel-8.0.0/exabel/scripts/delete_data_set.py +30 -0
- exabel-8.0.0/exabel/scripts/delete_entities.py +96 -0
- exabel-8.0.0/exabel/scripts/delete_entity.py +48 -0
- exabel-8.0.0/exabel/scripts/delete_entity_type.py +30 -0
- exabel-8.0.0/exabel/scripts/delete_folder.py +31 -0
- exabel-8.0.0/exabel/scripts/delete_relationship.py +47 -0
- exabel-8.0.0/exabel/scripts/delete_relationship_type.py +31 -0
- exabel-8.0.0/exabel/scripts/delete_signal.py +30 -0
- exabel-8.0.0/exabel/scripts/delete_time_series.py +110 -0
- exabel-8.0.0/exabel/scripts/delete_time_series_point.py +55 -0
- exabel-8.0.0/exabel/scripts/delete_time_series_points.py +118 -0
- exabel-8.0.0/exabel/scripts/delete_time_series_points_from_file.py +108 -0
- exabel-8.0.0/exabel/scripts/export_data.py +49 -0
- exabel-8.0.0/exabel/scripts/export_signals.py +125 -0
- exabel-8.0.0/exabel/scripts/file_utils.py +44 -0
- exabel-8.0.0/exabel/scripts/get_data_set.py +34 -0
- exabel-8.0.0/exabel/scripts/get_entity.py +33 -0
- exabel-8.0.0/exabel/scripts/get_entity_type.py +30 -0
- exabel-8.0.0/exabel/scripts/get_folder.py +32 -0
- exabel-8.0.0/exabel/scripts/get_relationship.py +56 -0
- exabel-8.0.0/exabel/scripts/get_relationship_type.py +33 -0
- exabel-8.0.0/exabel/scripts/get_signal.py +31 -0
- exabel-8.0.0/exabel/scripts/get_time_series.py +80 -0
- exabel-8.0.0/exabel/scripts/list_data_sets.py +26 -0
- exabel-8.0.0/exabel/scripts/list_entities.py +94 -0
- exabel-8.0.0/exabel/scripts/list_entity_types.py +24 -0
- exabel-8.0.0/exabel/scripts/list_folder_accessors.py +34 -0
- exabel-8.0.0/exabel/scripts/list_folders.py +21 -0
- exabel-8.0.0/exabel/scripts/list_groups.py +20 -0
- exabel-8.0.0/exabel/scripts/list_items.py +39 -0
- exabel-8.0.0/exabel/scripts/list_relationship_types.py +33 -0
- exabel-8.0.0/exabel/scripts/list_relationships.py +81 -0
- exabel-8.0.0/exabel/scripts/list_signals.py +53 -0
- exabel-8.0.0/exabel/scripts/list_time_series.py +182 -0
- exabel-8.0.0/exabel/scripts/list_users.py +20 -0
- exabel-8.0.0/exabel/scripts/load_entities_from_csv.py +140 -0
- exabel-8.0.0/exabel/scripts/load_relationships_from_csv.py +203 -0
- exabel-8.0.0/exabel/scripts/load_signals_from_csv.py +75 -0
- exabel-8.0.0/exabel/scripts/load_time_series_from_csv.py +10 -0
- exabel-8.0.0/exabel/scripts/load_time_series_from_file.py +188 -0
- exabel-8.0.0/exabel/scripts/load_time_series_metadata_from_file.py +122 -0
- exabel-8.0.0/exabel/scripts/move_items.py +41 -0
- exabel-8.0.0/exabel/scripts/search_entities.py +109 -0
- exabel-8.0.0/exabel/scripts/share_folder.py +44 -0
- exabel-8.0.0/exabel/scripts/sql/__init__.py +0 -0
- exabel-8.0.0/exabel/scripts/sql/read_athena.py +58 -0
- exabel-8.0.0/exabel/scripts/sql/read_bigquery.py +49 -0
- exabel-8.0.0/exabel/scripts/sql/read_snowflake.py +96 -0
- exabel-8.0.0/exabel/scripts/sql/sql_script.py +52 -0
- exabel-8.0.0/exabel/scripts/unshare_folder.py +35 -0
- exabel-8.0.0/exabel/scripts/update_data_set.py +115 -0
- exabel-8.0.0/exabel/scripts/update_entity_type.py +74 -0
- exabel-8.0.0/exabel/scripts/update_folder.py +39 -0
- exabel-8.0.0/exabel/scripts/update_relationship_type.py +78 -0
- exabel-8.0.0/exabel/scripts/upsert_time_series_unit.py +79 -0
- exabel-8.0.0/exabel/scripts/utils.py +119 -0
- exabel-8.0.0/exabel/services/__init__.py +0 -0
- exabel-8.0.0/exabel/services/csv_entity_loader.py +269 -0
- exabel-8.0.0/exabel/services/csv_exception.py +5 -0
- exabel-8.0.0/exabel/services/csv_loading_constants.py +9 -0
- exabel-8.0.0/exabel/services/csv_loading_result.py +5 -0
- exabel-8.0.0/exabel/services/csv_reader.py +83 -0
- exabel-8.0.0/exabel/services/csv_relationship_loader.py +546 -0
- exabel-8.0.0/exabel/services/csv_time_series_loader.py +86 -0
- exabel-8.0.0/exabel/services/csv_writer.py +32 -0
- exabel-8.0.0/exabel/services/entity_mapping_file_reader.py +89 -0
- exabel-8.0.0/exabel/services/excel_writer.py +16 -0
- exabel-8.0.0/exabel/services/feather_reader.py +45 -0
- exabel-8.0.0/exabel/services/feather_writer.py +28 -0
- exabel-8.0.0/exabel/services/file_constants.py +12 -0
- exabel-8.0.0/exabel/services/file_loading_exception.py +18 -0
- exabel-8.0.0/exabel/services/file_loading_result.py +118 -0
- exabel-8.0.0/exabel/services/file_time_series_loader.py +898 -0
- exabel-8.0.0/exabel/services/file_time_series_parser.py +1152 -0
- exabel-8.0.0/exabel/services/file_writer.py +26 -0
- exabel-8.0.0/exabel/services/file_writer_provider.py +33 -0
- exabel-8.0.0/exabel/services/sql/__init__.py +0 -0
- exabel-8.0.0/exabel/services/sql/athena_reader_configuration.py +98 -0
- exabel-8.0.0/exabel/services/sql/bigquery_reader_configuration.py +75 -0
- exabel-8.0.0/exabel/services/sql/exceptions.py +6 -0
- exabel-8.0.0/exabel/services/sql/snowflake_reader.py +74 -0
- exabel-8.0.0/exabel/services/sql/snowflake_reader_configuration.py +70 -0
- exabel-8.0.0/exabel/services/sql/sql_reader.py +65 -0
- exabel-8.0.0/exabel/services/sql/sql_reader_configuration.py +35 -0
- exabel-8.0.0/exabel/services/sql/sqlalchemy_reader.py +61 -0
- exabel-8.0.0/exabel/stubs/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/__init__.pyi +2 -0
- exabel-8.0.0/exabel/stubs/exabel/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/exabel/__init__.pyi +1 -0
- exabel-8.0.0/exabel/stubs/exabel/api/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/exabel/api/__init__.pyi +5 -0
- exabel-8.0.0/exabel/stubs/exabel/api/all_pb2.py +3 -0
- exabel-8.0.0/exabel/stubs/exabel/api/all_pb2_grpc.py +3 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/__init__.pyi +1 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/all_pb2.py +3 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/all_pb2_grpc.py +3 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/__init__.pyi +13 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/all_pb2.py +16 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/all_pb2_grpc.py +16 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/common_messages_pb2.py +37 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/common_messages_pb2.pyi +39 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/common_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2.py +59 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2.pyi +205 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_service_pb2.py +67 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_service_pb2.pyi +109 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_service_pb2_grpc.py +273 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/item_messages_pb2.py +49 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/item_messages_pb2.pyi +54 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/item_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.py +59 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.pyi +236 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2.py +70 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2.pyi +166 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2_grpc.py +234 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_messages_pb2.py +91 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_messages_pb2.pyi +1078 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_service_pb2.py +101 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_service_pb2.pyi +372 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_service_pb2_grpc.py +356 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2.py +45 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2.pyi +92 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_service_pb2.py +49 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_service_pb2.pyi +40 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_service_pb2_grpc.py +126 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/service_pb2.py +36 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/service_pb2.pyi +8 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/service_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_messages_pb2.py +50 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_messages_pb2.pyi +56 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_service_pb2.py +101 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_service_pb2.pyi +305 -0
- exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_service_pb2_grpc.py +436 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/__init__.pyi +1 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/all_pb2.py +3 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/all_pb2_grpc.py +3 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/__init__.pyi +20 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/all_pb2.py +23 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/all_pb2_grpc.py +23 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_messages_pb2.py +47 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_messages_pb2.pyi +87 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_service_pb2.py +81 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_service_pb2.pyi +215 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_service_pb2_grpc.py +286 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/common_messages_pb2.py +37 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/common_messages_pb2.pyi +50 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/common_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_messages_pb2.py +55 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_messages_pb2.pyi +75 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_service_pb2.py +73 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_service_pb2.pyi +145 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_service_pb2_grpc.py +313 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_messages_pb2.py +60 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_messages_pb2.pyi +98 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_service_pb2.py +126 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_service_pb2.pyi +451 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_service_pb2_grpc.py +651 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_messages_pb2.py +40 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_messages_pb2.pyi +89 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_service_pb2.py +72 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_service_pb2.pyi +147 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_service_pb2_grpc.py +291 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/import_job_service_pb2.py +48 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/import_job_service_pb2.pyi +41 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/import_job_service_pb2_grpc.py +118 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespace_service_pb2.py +46 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespace_service_pb2.pyi +49 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespace_service_pb2_grpc.py +117 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespaces_messages_pb2.py +42 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespaces_messages_pb2.pyi +35 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespaces_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_messages_pb2.py +58 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_messages_pb2.pyi +109 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_service_pb2.py +113 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_service_pb2.pyi +356 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_service_pb2_grpc.py +531 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/search_messages_pb2.py +47 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/search_messages_pb2.pyi +98 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/search_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/service_pb2.py +36 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/service_pb2.pyi +8 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/service_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_messages_pb2.py +74 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_messages_pb2.pyi +159 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_service_pb2.py +95 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_service_pb2.pyi +311 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_service_pb2_grpc.py +433 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_messages_pb2.py +78 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_messages_pb2.pyi +309 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_service_pb2.py +133 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_service_pb2.pyi +538 -0
- exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_service_pb2_grpc.py +448 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/__init__.pyi +1 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/all_pb2.py +3 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/all_pb2_grpc.py +3 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/__init__.pyi +5 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/all_pb2.py +8 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/all_pb2_grpc.py +8 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/folder_messages_pb2.py +65 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/folder_messages_pb2.pyi +222 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/folder_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/library_service_pb2.py +127 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/library_service_pb2.pyi +377 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/library_service_pb2_grpc.py +596 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/service_pb2.py +36 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/service_pb2.pyi +8 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/service_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_messages_pb2.py +44 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_messages_pb2.pyi +71 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_messages_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_service_pb2.py +52 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_service_pb2.pyi +79 -0
- exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_service_pb2_grpc.py +155 -0
- exabel-8.0.0/exabel/stubs/exabel/api/math/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/exabel/api/math/__init__.pyi +2 -0
- exabel-8.0.0/exabel/stubs/exabel/api/math/aggregation_pb2.py +37 -0
- exabel-8.0.0/exabel/stubs/exabel/api/math/aggregation_pb2.pyi +61 -0
- exabel-8.0.0/exabel/stubs/exabel/api/math/aggregation_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/math/all_pb2.py +5 -0
- exabel-8.0.0/exabel/stubs/exabel/api/math/all_pb2_grpc.py +5 -0
- exabel-8.0.0/exabel/stubs/exabel/api/math/change_pb2.py +37 -0
- exabel-8.0.0/exabel/stubs/exabel/api/math/change_pb2.pyi +41 -0
- exabel-8.0.0/exabel/stubs/exabel/api/math/change_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/time/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/exabel/api/time/__init__.pyi +2 -0
- exabel-8.0.0/exabel/stubs/exabel/api/time/all_pb2.py +5 -0
- exabel-8.0.0/exabel/stubs/exabel/api/time/all_pb2_grpc.py +5 -0
- exabel-8.0.0/exabel/stubs/exabel/api/time/date_pb2.py +37 -0
- exabel-8.0.0/exabel/stubs/exabel/api/time/date_pb2.pyi +39 -0
- exabel-8.0.0/exabel/stubs/exabel/api/time/date_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/exabel/api/time/time_range_pb2.py +38 -0
- exabel-8.0.0/exabel/stubs/exabel/api/time/time_range_pb2.pyi +49 -0
- exabel-8.0.0/exabel/stubs/exabel/api/time/time_range_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/__init__.pyi +1 -0
- exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/__init__.py +0 -0
- exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/__init__.pyi +2 -0
- exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/annotations_pb2.py +37 -0
- exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/annotations_pb2.pyi +49 -0
- exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/annotations_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/openapiv2_pb2.py +128 -0
- exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/openapiv2_pb2.pyi +1342 -0
- exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/openapiv2_pb2_grpc.py +24 -0
- exabel-8.0.0/exabel/util/__init__.py +0 -0
- exabel-8.0.0/exabel/util/batcher.py +16 -0
- exabel-8.0.0/exabel/util/case_insensitive_column.py +14 -0
- exabel-8.0.0/exabel/util/deprecate_arguments.py +146 -0
- exabel-8.0.0/exabel/util/exceptions.py +14 -0
- exabel-8.0.0/exabel/util/handle_missing_imports.py +47 -0
- exabel-8.0.0/exabel/util/import_.py +51 -0
- exabel-8.0.0/exabel/util/logging_thread_pool_executor.py +40 -0
- exabel-8.0.0/exabel/util/parse_property_columns.py +32 -0
- exabel-8.0.0/exabel/util/resource_name_normalization.py +420 -0
- exabel-8.0.0/exabel/util/type_converter.py +23 -0
- exabel-8.0.0/exabel/util/warnings.py +2 -0
- exabel-8.0.0/pyproject.toml +215 -0
exabel-8.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021 Exabel
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
exabel-8.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: exabel
|
|
3
|
+
Version: 8.0.0
|
|
4
|
+
Summary: Python SDK for the Exabel Data API
|
|
5
|
+
Author: Exabel
|
|
6
|
+
Author-email: Exabel <support@exabel.com>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
10
|
+
Classifier: Intended Audience :: Financial and Insurance Industry
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Requires-Dist: google-api-core>1.31.3
|
|
19
|
+
Requires-Dist: googleapis-common-protos>=1.56.0
|
|
20
|
+
Requires-Dist: grpcio
|
|
21
|
+
Requires-Dist: openpyxl
|
|
22
|
+
Requires-Dist: pandas
|
|
23
|
+
Requires-Dist: protobuf>=6
|
|
24
|
+
Requires-Dist: requests
|
|
25
|
+
Requires-Dist: tqdm
|
|
26
|
+
Requires-Dist: pyathena ; extra == 'athena'
|
|
27
|
+
Requires-Dist: pyarrow ; extra == 'athena'
|
|
28
|
+
Requires-Dist: sqlalchemy ; extra == 'athena'
|
|
29
|
+
Requires-Dist: google-cloud-bigquery ; extra == 'bigquery'
|
|
30
|
+
Requires-Dist: sqlalchemy-bigquery ; extra == 'bigquery'
|
|
31
|
+
Requires-Dist: snowflake-connector-python[pandas] ; extra == 'snowflake'
|
|
32
|
+
Requires-Dist: snowflake-sqlalchemy ; extra == 'snowflake'
|
|
33
|
+
Requires-Python: >=3.10
|
|
34
|
+
Project-URL: Homepage, https://github.com/Exabel/python-sdk
|
|
35
|
+
Project-URL: Documentation, https://help.exabel.com
|
|
36
|
+
Project-URL: Source, https://github.com/Exabel/python-sdk
|
|
37
|
+
Project-URL: Changelog, https://github.com/Exabel/python-sdk/releases
|
|
38
|
+
Provides-Extra: athena
|
|
39
|
+
Provides-Extra: bigquery
|
|
40
|
+
Provides-Extra: snowflake
|
|
41
|
+
Description-Content-Type: text/markdown
|
|
42
|
+
|
|
43
|
+
# Exabel Python SDK
|
|
44
|
+
|
|
45
|
+
A Python SDK which provides easy access to Exabel APIs.
|
|
46
|
+
|
|
47
|
+
## Installation
|
|
48
|
+
|
|
49
|
+
```shell
|
|
50
|
+
pip install exabel
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
or download from [PyPI](https://pypi.org/project/exabel/).
|
|
54
|
+
|
|
55
|
+
The SDK requires Python 3.10 or later.
|
|
56
|
+
|
|
57
|
+
### Installation with SQL data source support
|
|
58
|
+
|
|
59
|
+
For installation with support for exporting data from a various SQL based data sources, add the data source as a pip extra in brackets after the package name:
|
|
60
|
+
|
|
61
|
+
```shell
|
|
62
|
+
# Install the Exabel Python SDK with Snowflake support:
|
|
63
|
+
pip install exabel[snowflake]
|
|
64
|
+
|
|
65
|
+
# Or install multiple data sources at the same time:
|
|
66
|
+
pip install exabel[snowflake,bigquery,athena]
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Supported data sources are:
|
|
70
|
+
|
|
71
|
+
* Snowflake: `snowflake`
|
|
72
|
+
* Google BigQuery: `bigquery`
|
|
73
|
+
* AWS Athena: `athena`
|
|
74
|
+
|
|
75
|
+
## Getting started
|
|
76
|
+
|
|
77
|
+
To use the SDK against the Data API, Analytics API or Management API, you need an API key provided by Exabel.
|
|
78
|
+
|
|
79
|
+
The Exabel Export API can be used by authenticating with username and password.
|
|
80
|
+
The first time you run the script a web browser window is opened where you are asked to provide username and password. The script stores an access token in ``~/.exabel``, so you will not be asked again
|
|
81
|
+
until the token expires.
|
|
82
|
+
|
|
83
|
+
[Export API Developer guide](https://help.exabel.com/docs/exporting-via-exabel-sdk)
|
|
84
|
+
|
|
85
|
+
[Examples of usage](https://github.com/Exabel/python-sdk/tree/main/exabel/examples).
|
|
86
|
+
|
|
87
|
+
## Exabel API documentation
|
|
88
|
+
|
|
89
|
+
### Data API
|
|
90
|
+
|
|
91
|
+
The Exabel Data API can be used to upload custom data to the Exabel platform. Custom data may include entities, relationships and time series.
|
|
92
|
+
|
|
93
|
+
[Data API Developer guide](https://help.exabel.com/docs/data-api)
|
|
94
|
+
|
|
95
|
+
### Export API
|
|
96
|
+
|
|
97
|
+
The Exabel Export API can be used to export dashboards and signals from the Exabel Platform.
|
|
98
|
+
|
|
99
|
+
[Export API Developer guide](https://help.exabel.com/docs/exporting-via-exabel-sdk)
|
|
100
|
+
|
|
101
|
+
### Analytics API
|
|
102
|
+
|
|
103
|
+
The Exabel Analytics API can be used to manage derived signals and prediction models on the Exabel Platform.
|
|
104
|
+
|
|
105
|
+
[Analytics API Developer guide](https://help.exabel.com/docs/analytics-api)
|
|
106
|
+
|
|
107
|
+
### Management API
|
|
108
|
+
|
|
109
|
+
The Exabel Management API can be used to manage the library on the Exabel Platform.
|
|
110
|
+
|
|
111
|
+
[Management API Developer guide](https://help.exabel.com/docs/management-api)
|
exabel-8.0.0/README.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Exabel Python SDK
|
|
2
|
+
|
|
3
|
+
A Python SDK which provides easy access to Exabel APIs.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```shell
|
|
8
|
+
pip install exabel
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
or download from [PyPI](https://pypi.org/project/exabel/).
|
|
12
|
+
|
|
13
|
+
The SDK requires Python 3.10 or later.
|
|
14
|
+
|
|
15
|
+
### Installation with SQL data source support
|
|
16
|
+
|
|
17
|
+
For installation with support for exporting data from a various SQL based data sources, add the data source as a pip extra in brackets after the package name:
|
|
18
|
+
|
|
19
|
+
```shell
|
|
20
|
+
# Install the Exabel Python SDK with Snowflake support:
|
|
21
|
+
pip install exabel[snowflake]
|
|
22
|
+
|
|
23
|
+
# Or install multiple data sources at the same time:
|
|
24
|
+
pip install exabel[snowflake,bigquery,athena]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Supported data sources are:
|
|
28
|
+
|
|
29
|
+
* Snowflake: `snowflake`
|
|
30
|
+
* Google BigQuery: `bigquery`
|
|
31
|
+
* AWS Athena: `athena`
|
|
32
|
+
|
|
33
|
+
## Getting started
|
|
34
|
+
|
|
35
|
+
To use the SDK against the Data API, Analytics API or Management API, you need an API key provided by Exabel.
|
|
36
|
+
|
|
37
|
+
The Exabel Export API can be used by authenticating with username and password.
|
|
38
|
+
The first time you run the script a web browser window is opened where you are asked to provide username and password. The script stores an access token in ``~/.exabel``, so you will not be asked again
|
|
39
|
+
until the token expires.
|
|
40
|
+
|
|
41
|
+
[Export API Developer guide](https://help.exabel.com/docs/exporting-via-exabel-sdk)
|
|
42
|
+
|
|
43
|
+
[Examples of usage](https://github.com/Exabel/python-sdk/tree/main/exabel/examples).
|
|
44
|
+
|
|
45
|
+
## Exabel API documentation
|
|
46
|
+
|
|
47
|
+
### Data API
|
|
48
|
+
|
|
49
|
+
The Exabel Data API can be used to upload custom data to the Exabel platform. Custom data may include entities, relationships and time series.
|
|
50
|
+
|
|
51
|
+
[Data API Developer guide](https://help.exabel.com/docs/data-api)
|
|
52
|
+
|
|
53
|
+
### Export API
|
|
54
|
+
|
|
55
|
+
The Exabel Export API can be used to export dashboards and signals from the Exabel Platform.
|
|
56
|
+
|
|
57
|
+
[Export API Developer guide](https://help.exabel.com/docs/exporting-via-exabel-sdk)
|
|
58
|
+
|
|
59
|
+
### Analytics API
|
|
60
|
+
|
|
61
|
+
The Exabel Analytics API can be used to manage derived signals and prediction models on the Exabel Platform.
|
|
62
|
+
|
|
63
|
+
[Analytics API Developer guide](https://help.exabel.com/docs/analytics-api)
|
|
64
|
+
|
|
65
|
+
### Management API
|
|
66
|
+
|
|
67
|
+
The Exabel Management API can be used to manage the library on the Exabel Platform.
|
|
68
|
+
|
|
69
|
+
[Management API Developer guide](https://help.exabel.com/docs/management-api)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .client.exabel_client import ExabelClient
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
|
|
3
|
+
from exabel.stubs.exabel.api.data.v1.calendar_service_pb2 import (
|
|
4
|
+
BatchCreateFiscalPeriodsRequest,
|
|
5
|
+
BatchCreateFiscalPeriodsResponse,
|
|
6
|
+
CompanyCalendar,
|
|
7
|
+
DeleteFiscalPeriodRequest,
|
|
8
|
+
GetCompanyCalendarRequest,
|
|
9
|
+
ListCompaniesWithFiscalPeriodsRequest,
|
|
10
|
+
ListCompaniesWithFiscalPeriodsResponse,
|
|
11
|
+
ListFiscalPeriodsRequest,
|
|
12
|
+
ListFiscalPeriodsResponse,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CalendarApiClient(ABC):
|
|
17
|
+
"""Superclass for clients that send calendar requests to the Exabel Data API."""
|
|
18
|
+
|
|
19
|
+
@abstractmethod
|
|
20
|
+
def get_company_calendar(self, request: GetCompanyCalendarRequest) -> CompanyCalendar:
|
|
21
|
+
"""Get the fiscal calendar for a company."""
|
|
22
|
+
|
|
23
|
+
@abstractmethod
|
|
24
|
+
def batch_create_fiscal_periods(
|
|
25
|
+
self, request: BatchCreateFiscalPeriodsRequest
|
|
26
|
+
) -> BatchCreateFiscalPeriodsResponse:
|
|
27
|
+
"""Add fiscal periods for a company."""
|
|
28
|
+
|
|
29
|
+
@abstractmethod
|
|
30
|
+
def list_company_fiscal_periods(
|
|
31
|
+
self, request: ListFiscalPeriodsRequest
|
|
32
|
+
) -> ListFiscalPeriodsResponse:
|
|
33
|
+
"""List the fiscal periods for a company."""
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def delete_fiscal_periods(self, request: DeleteFiscalPeriodRequest) -> None:
|
|
37
|
+
"""Delete fiscal periods for a company."""
|
|
38
|
+
|
|
39
|
+
@abstractmethod
|
|
40
|
+
def list_companies_with_fiscal_periods(
|
|
41
|
+
self, request: ListCompaniesWithFiscalPeriodsRequest
|
|
42
|
+
) -> ListCompaniesWithFiscalPeriodsResponse:
|
|
43
|
+
"""List the companies for which there are uploaded fiscal periods."""
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
|
|
3
|
+
from exabel.stubs.exabel.api.data.v1.all_pb2 import (
|
|
4
|
+
CreateDataSetRequest,
|
|
5
|
+
DataSet,
|
|
6
|
+
DeleteDataSetRequest,
|
|
7
|
+
GetDataSetRequest,
|
|
8
|
+
ListDataSetsRequest,
|
|
9
|
+
ListDataSetsResponse,
|
|
10
|
+
UpdateDataSetRequest,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class DataSetApiClient(ABC):
|
|
15
|
+
"""
|
|
16
|
+
Superclass for clients that send data set requests to the Exabel Data API.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
@abstractmethod
|
|
20
|
+
def list_data_sets(self, request: ListDataSetsRequest) -> ListDataSetsResponse:
|
|
21
|
+
"""List all data sets."""
|
|
22
|
+
|
|
23
|
+
@abstractmethod
|
|
24
|
+
def get_data_set(self, request: GetDataSetRequest) -> DataSet:
|
|
25
|
+
"""Get a data set."""
|
|
26
|
+
|
|
27
|
+
@abstractmethod
|
|
28
|
+
def create_data_set(self, request: CreateDataSetRequest) -> DataSet:
|
|
29
|
+
"""Create a data set."""
|
|
30
|
+
|
|
31
|
+
@abstractmethod
|
|
32
|
+
def update_data_set(self, request: UpdateDataSetRequest) -> DataSet:
|
|
33
|
+
"""Update a data set."""
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def delete_data_set(self, request: DeleteDataSetRequest) -> None:
|
|
37
|
+
"""Delete a data set."""
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
|
|
3
|
+
from exabel.stubs.exabel.api.analytics.v1.all_pb2 import (
|
|
4
|
+
CreateDerivedSignalRequest,
|
|
5
|
+
DeleteDerivedSignalRequest,
|
|
6
|
+
DerivedSignal,
|
|
7
|
+
GetDerivedSignalRequest,
|
|
8
|
+
UpdateDerivedSignalRequest,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DerivedSignalApiClient(ABC):
|
|
13
|
+
"""
|
|
14
|
+
Superclass for clients that send derived signal requests to the Exabel Analytics API.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
@abstractmethod
|
|
18
|
+
def create_derived_signal(self, request: CreateDerivedSignalRequest) -> DerivedSignal:
|
|
19
|
+
"""Create a derived signal."""
|
|
20
|
+
|
|
21
|
+
@abstractmethod
|
|
22
|
+
def get_derived_signal(self, request: GetDerivedSignalRequest) -> DerivedSignal:
|
|
23
|
+
"""Get a derived signal."""
|
|
24
|
+
|
|
25
|
+
@abstractmethod
|
|
26
|
+
def update_derived_signal(self, request: UpdateDerivedSignalRequest) -> DerivedSignal:
|
|
27
|
+
"""Update a derived signal."""
|
|
28
|
+
|
|
29
|
+
@abstractmethod
|
|
30
|
+
def delete_derived_signal(self, request: DeleteDerivedSignalRequest) -> None:
|
|
31
|
+
"""Delete a derived signal."""
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
|
|
3
|
+
from exabel.stubs.exabel.api.data.v1.all_pb2 import (
|
|
4
|
+
CreateEntityRequest,
|
|
5
|
+
CreateEntityTypeRequest,
|
|
6
|
+
DeleteEntitiesRequest,
|
|
7
|
+
DeleteEntityRequest,
|
|
8
|
+
DeleteEntityTypeRequest,
|
|
9
|
+
Entity,
|
|
10
|
+
EntityType,
|
|
11
|
+
GetEntityRequest,
|
|
12
|
+
GetEntityTypeRequest,
|
|
13
|
+
ListEntitiesRequest,
|
|
14
|
+
ListEntitiesResponse,
|
|
15
|
+
ListEntityTypesRequest,
|
|
16
|
+
ListEntityTypesResponse,
|
|
17
|
+
SearchEntitiesRequest,
|
|
18
|
+
SearchEntitiesResponse,
|
|
19
|
+
UpdateEntityRequest,
|
|
20
|
+
UpdateEntityTypeRequest,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class EntityApiClient(ABC):
|
|
25
|
+
"""
|
|
26
|
+
Superclass for clients that send entity requests to the Exabel Data API.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
@abstractmethod
|
|
30
|
+
def list_entity_types(self, request: ListEntityTypesRequest) -> ListEntityTypesResponse:
|
|
31
|
+
"""List all known entity types."""
|
|
32
|
+
|
|
33
|
+
@abstractmethod
|
|
34
|
+
def get_entity_type(self, request: GetEntityTypeRequest) -> EntityType:
|
|
35
|
+
"""Get an entity type."""
|
|
36
|
+
|
|
37
|
+
@abstractmethod
|
|
38
|
+
def create_entity_type(self, request: CreateEntityTypeRequest) -> EntityType:
|
|
39
|
+
"""Create an entity type."""
|
|
40
|
+
|
|
41
|
+
@abstractmethod
|
|
42
|
+
def update_entity_type(self, request: UpdateEntityTypeRequest) -> EntityType:
|
|
43
|
+
"""Update an entity type."""
|
|
44
|
+
|
|
45
|
+
@abstractmethod
|
|
46
|
+
def delete_entity_type(self, request: DeleteEntityTypeRequest) -> None:
|
|
47
|
+
"""Delete an entity type."""
|
|
48
|
+
|
|
49
|
+
@abstractmethod
|
|
50
|
+
def list_entities(self, request: ListEntitiesRequest) -> ListEntitiesResponse:
|
|
51
|
+
"""List all entities of a given entity type."""
|
|
52
|
+
|
|
53
|
+
@abstractmethod
|
|
54
|
+
def get_entity(self, request: GetEntityRequest) -> Entity:
|
|
55
|
+
"""Get an entity."""
|
|
56
|
+
|
|
57
|
+
@abstractmethod
|
|
58
|
+
def create_entity(self, request: CreateEntityRequest) -> Entity:
|
|
59
|
+
"""Create an entity."""
|
|
60
|
+
|
|
61
|
+
@abstractmethod
|
|
62
|
+
def update_entity(self, request: UpdateEntityRequest) -> Entity:
|
|
63
|
+
"""Update an entity."""
|
|
64
|
+
|
|
65
|
+
@abstractmethod
|
|
66
|
+
def delete_entity(self, request: DeleteEntityRequest) -> None:
|
|
67
|
+
"""Delete an entity."""
|
|
68
|
+
|
|
69
|
+
@abstractmethod
|
|
70
|
+
def delete_entities(self, request: DeleteEntitiesRequest) -> None:
|
|
71
|
+
"""Delete all entities of a given entity type."""
|
|
72
|
+
|
|
73
|
+
@abstractmethod
|
|
74
|
+
def search_entities(self, request: SearchEntitiesRequest) -> SearchEntitiesResponse:
|
|
75
|
+
"""Search for entities."""
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from enum import Enum, auto
|
|
2
|
+
|
|
3
|
+
from exabel.client.client_config import ClientConfig
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ExabelApiGroup(Enum):
|
|
7
|
+
"""
|
|
8
|
+
Exabel API groups.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# Data API.
|
|
12
|
+
DATA_API = auto()
|
|
13
|
+
|
|
14
|
+
# Analytics API.
|
|
15
|
+
ANALYTICS_API = auto()
|
|
16
|
+
|
|
17
|
+
# Management API.
|
|
18
|
+
MANAGEMENT_API = auto()
|
|
19
|
+
|
|
20
|
+
def get_host(self, config: ClientConfig) -> str:
|
|
21
|
+
"""Return the API host for this API group."""
|
|
22
|
+
if self == ExabelApiGroup.DATA_API:
|
|
23
|
+
return config.data_api_host
|
|
24
|
+
if self == ExabelApiGroup.ANALYTICS_API:
|
|
25
|
+
return config.analytics_api_host
|
|
26
|
+
if self == ExabelApiGroup.MANAGEMENT_API:
|
|
27
|
+
return config.management_api_host
|
|
28
|
+
raise ValueError(f"Unknown ExabelApiGroup: {self.name}")
|
|
29
|
+
|
|
30
|
+
def get_port(self, config: ClientConfig) -> int:
|
|
31
|
+
"""Return the API port for this API group."""
|
|
32
|
+
if self == ExabelApiGroup.DATA_API:
|
|
33
|
+
return config.data_api_port
|
|
34
|
+
if self == ExabelApiGroup.ANALYTICS_API:
|
|
35
|
+
return config.analytics_api_port
|
|
36
|
+
if self == ExabelApiGroup.MANAGEMENT_API:
|
|
37
|
+
return config.management_api_port
|
|
38
|
+
raise ValueError(f"Unknown ExabelApiGroup: {self.name}")
|
|
File without changes
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
import grpc
|
|
4
|
+
|
|
5
|
+
from exabel.client.api.api_client.exabel_api_group import ExabelApiGroup
|
|
6
|
+
from exabel.client.client_config import ClientConfig
|
|
7
|
+
|
|
8
|
+
SIXTEEN_MEGABYTES_IN_BYTES = 16 * 1024 * 1024
|
|
9
|
+
|
|
10
|
+
# Retry parameters
|
|
11
|
+
DEFAULT_MAX_ATTEMPTS = 5
|
|
12
|
+
DEFAULT_INITIAL_BACKOFF_SECONDS = 0.1
|
|
13
|
+
DEFAULT_MAX_BACKOFF_SECONDS = 5
|
|
14
|
+
DEFAULT_BACKOFF_MULTIPLIER = 2
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class BaseGrpcClient:
|
|
18
|
+
"""
|
|
19
|
+
Base class for clients that access the Exabel API with gRPC.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, config: ClientConfig, api_group: ExabelApiGroup):
|
|
23
|
+
self.config = config
|
|
24
|
+
self.metadata = [("x-client-name", config.client_name)]
|
|
25
|
+
common_kwargs = {
|
|
26
|
+
"target": f"{api_group.get_host(config)}:{api_group.get_port(config)}",
|
|
27
|
+
# When importing time series, we may receive a large amount of precondition failure
|
|
28
|
+
# violations in the trailing metadata, therefore we increase the maximum metadata size.
|
|
29
|
+
"options": (
|
|
30
|
+
("grpc.max_metadata_size", SIXTEEN_MEGABYTES_IN_BYTES),
|
|
31
|
+
("grpc.service_config", self._get_service_config()),
|
|
32
|
+
),
|
|
33
|
+
}
|
|
34
|
+
if config.api_key == "NO_KEY":
|
|
35
|
+
# Use an insecure channel. This can be used for local testing.
|
|
36
|
+
self.channel = grpc.insecure_channel(**common_kwargs)
|
|
37
|
+
else:
|
|
38
|
+
if config.access_token is not None:
|
|
39
|
+
self.metadata.append(("authorization", "Bearer " + config.access_token))
|
|
40
|
+
else:
|
|
41
|
+
assert config.api_key is not None
|
|
42
|
+
self.metadata.append(("x-api-key", config.api_key))
|
|
43
|
+
self.channel = grpc.secure_channel(
|
|
44
|
+
credentials=grpc.ssl_channel_credentials(
|
|
45
|
+
root_certificates=config.root_certificates
|
|
46
|
+
),
|
|
47
|
+
**common_kwargs,
|
|
48
|
+
)
|
|
49
|
+
for header in self.config.extra_headers:
|
|
50
|
+
self.metadata.append(header)
|
|
51
|
+
|
|
52
|
+
def _get_service_config(
|
|
53
|
+
self,
|
|
54
|
+
max_attempts: int = DEFAULT_MAX_ATTEMPTS,
|
|
55
|
+
initial_backoff: float = DEFAULT_INITIAL_BACKOFF_SECONDS,
|
|
56
|
+
max_backoff: float = DEFAULT_MAX_BACKOFF_SECONDS,
|
|
57
|
+
backoff_multiplier: int = DEFAULT_BACKOFF_MULTIPLIER,
|
|
58
|
+
) -> str:
|
|
59
|
+
"""
|
|
60
|
+
Returns a JSON string to use for grpc.service_config option when creating a grpc channel
|
|
61
|
+
"""
|
|
62
|
+
return json.dumps(
|
|
63
|
+
{
|
|
64
|
+
"methodConfig": [
|
|
65
|
+
{
|
|
66
|
+
"name": [{}],
|
|
67
|
+
"retryPolicy": {
|
|
68
|
+
"maxAttempts": max_attempts,
|
|
69
|
+
"initialBackoff": f"{initial_backoff}s",
|
|
70
|
+
"maxBackoff": f"{max_backoff}s",
|
|
71
|
+
"backoffMultiplier": backoff_multiplier,
|
|
72
|
+
"retryableStatusCodes": [
|
|
73
|
+
"CANCELLED",
|
|
74
|
+
"UNKNOWN",
|
|
75
|
+
"DEADLINE_EXCEEDED",
|
|
76
|
+
"RESOURCE_EXHAUSTED",
|
|
77
|
+
"ABORTED",
|
|
78
|
+
"INTERNAL",
|
|
79
|
+
"UNAVAILABLE",
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from exabel.client.api.api_client.calendar_api_client import CalendarApiClient
|
|
2
|
+
from exabel.client.api.api_client.exabel_api_group import ExabelApiGroup
|
|
3
|
+
from exabel.client.api.api_client.grpc.base_grpc_client import BaseGrpcClient
|
|
4
|
+
from exabel.client.api.error_handler import handle_grpc_error
|
|
5
|
+
from exabel.client.client_config import ClientConfig
|
|
6
|
+
from exabel.stubs.exabel.api.data.v1.calendar_service_pb2 import (
|
|
7
|
+
BatchCreateFiscalPeriodsRequest,
|
|
8
|
+
BatchCreateFiscalPeriodsResponse,
|
|
9
|
+
CompanyCalendar,
|
|
10
|
+
DeleteFiscalPeriodRequest,
|
|
11
|
+
GetCompanyCalendarRequest,
|
|
12
|
+
ListCompaniesWithFiscalPeriodsRequest,
|
|
13
|
+
ListCompaniesWithFiscalPeriodsResponse,
|
|
14
|
+
ListFiscalPeriodsRequest,
|
|
15
|
+
ListFiscalPeriodsResponse,
|
|
16
|
+
)
|
|
17
|
+
from exabel.stubs.exabel.api.data.v1.calendar_service_pb2_grpc import CalendarServiceStub
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CalendarGrpcClient(CalendarApiClient, BaseGrpcClient):
|
|
21
|
+
"""
|
|
22
|
+
Client which sends calendar requests to the Exabel Data API with gRPC.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self, config: ClientConfig):
|
|
26
|
+
super().__init__(config, ExabelApiGroup.DATA_API)
|
|
27
|
+
self.stub = CalendarServiceStub(self.channel)
|
|
28
|
+
|
|
29
|
+
@handle_grpc_error
|
|
30
|
+
def get_company_calendar(self, request: GetCompanyCalendarRequest) -> CompanyCalendar:
|
|
31
|
+
return self.stub.GetCompanyCalendar(
|
|
32
|
+
request, metadata=self.metadata, timeout=self.config.timeout
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
@handle_grpc_error
|
|
36
|
+
def batch_create_fiscal_periods(
|
|
37
|
+
self, request: BatchCreateFiscalPeriodsRequest
|
|
38
|
+
) -> BatchCreateFiscalPeriodsResponse:
|
|
39
|
+
return self.stub.BatchCreateFiscalPeriods(
|
|
40
|
+
request, metadata=self.metadata, timeout=self.config.timeout
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
@handle_grpc_error
|
|
44
|
+
def list_company_fiscal_periods(
|
|
45
|
+
self, request: ListFiscalPeriodsRequest
|
|
46
|
+
) -> ListFiscalPeriodsResponse:
|
|
47
|
+
return self.stub.ListFiscalPeriods(
|
|
48
|
+
request, metadata=self.metadata, timeout=self.config.timeout
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
@handle_grpc_error
|
|
52
|
+
def delete_fiscal_periods(self, request: DeleteFiscalPeriodRequest) -> None:
|
|
53
|
+
self.stub.DeleteFiscalPeriod(request, metadata=self.metadata, timeout=self.config.timeout)
|
|
54
|
+
|
|
55
|
+
@handle_grpc_error
|
|
56
|
+
def list_companies_with_fiscal_periods(
|
|
57
|
+
self, request: ListCompaniesWithFiscalPeriodsRequest
|
|
58
|
+
) -> ListCompaniesWithFiscalPeriodsResponse:
|
|
59
|
+
return self.stub.ListCompaniesWithFiscalPeriods(
|
|
60
|
+
request, metadata=self.metadata, timeout=self.config.timeout
|
|
61
|
+
)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from exabel.client.api.api_client.data_set_api_client import DataSetApiClient
|
|
2
|
+
from exabel.client.api.api_client.exabel_api_group import ExabelApiGroup
|
|
3
|
+
from exabel.client.api.api_client.grpc.base_grpc_client import BaseGrpcClient
|
|
4
|
+
from exabel.client.api.error_handler import handle_grpc_error
|
|
5
|
+
from exabel.client.client_config import ClientConfig
|
|
6
|
+
from exabel.stubs.exabel.api.data.v1.all_pb2 import (
|
|
7
|
+
CreateDataSetRequest,
|
|
8
|
+
DataSet,
|
|
9
|
+
DeleteDataSetRequest,
|
|
10
|
+
GetDataSetRequest,
|
|
11
|
+
ListDataSetsRequest,
|
|
12
|
+
ListDataSetsResponse,
|
|
13
|
+
UpdateDataSetRequest,
|
|
14
|
+
)
|
|
15
|
+
from exabel.stubs.exabel.api.data.v1.all_pb2_grpc import DataSetServiceStub
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class DataSetGrpcClient(DataSetApiClient, BaseGrpcClient):
|
|
19
|
+
"""
|
|
20
|
+
Client which sends data set requests to the Exabel Data API with gRPC.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(self, config: ClientConfig):
|
|
24
|
+
super().__init__(config, ExabelApiGroup.DATA_API)
|
|
25
|
+
self.stub = DataSetServiceStub(self.channel)
|
|
26
|
+
|
|
27
|
+
@handle_grpc_error
|
|
28
|
+
def list_data_sets(self, request: ListDataSetsRequest) -> ListDataSetsResponse:
|
|
29
|
+
return self.stub.ListDataSets(request, metadata=self.metadata, timeout=self.config.timeout)
|
|
30
|
+
|
|
31
|
+
@handle_grpc_error
|
|
32
|
+
def get_data_set(self, request: GetDataSetRequest) -> DataSet:
|
|
33
|
+
return self.stub.GetDataSet(request, metadata=self.metadata, timeout=self.config.timeout)
|
|
34
|
+
|
|
35
|
+
@handle_grpc_error
|
|
36
|
+
def create_data_set(self, request: CreateDataSetRequest) -> DataSet:
|
|
37
|
+
return self.stub.CreateDataSet(request, metadata=self.metadata, timeout=self.config.timeout)
|
|
38
|
+
|
|
39
|
+
@handle_grpc_error
|
|
40
|
+
def update_data_set(self, request: UpdateDataSetRequest) -> DataSet:
|
|
41
|
+
return self.stub.UpdateDataSet(request, metadata=self.metadata, timeout=self.config.timeout)
|
|
42
|
+
|
|
43
|
+
@handle_grpc_error
|
|
44
|
+
def delete_data_set(self, request: DeleteDataSetRequest) -> None:
|
|
45
|
+
return self.stub.DeleteDataSet(request, metadata=self.metadata, timeout=self.config.timeout)
|