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.
Files changed (402) hide show
  1. exabel-8.0.0/LICENSE +21 -0
  2. exabel-8.0.0/PKG-INFO +111 -0
  3. exabel-8.0.0/README.md +69 -0
  4. exabel-8.0.0/exabel/__init__.py +1 -0
  5. exabel-8.0.0/exabel/client/__init__.py +0 -0
  6. exabel-8.0.0/exabel/client/api/__init__.py +0 -0
  7. exabel-8.0.0/exabel/client/api/api_client/__init__.py +0 -0
  8. exabel-8.0.0/exabel/client/api/api_client/calendar_api_client.py +43 -0
  9. exabel-8.0.0/exabel/client/api/api_client/data_set_api_client.py +37 -0
  10. exabel-8.0.0/exabel/client/api/api_client/derived_signal_api_client.py +31 -0
  11. exabel-8.0.0/exabel/client/api/api_client/entity_api_client.py +75 -0
  12. exabel-8.0.0/exabel/client/api/api_client/exabel_api_group.py +38 -0
  13. exabel-8.0.0/exabel/client/api/api_client/grpc/__init__.py +0 -0
  14. exabel-8.0.0/exabel/client/api/api_client/grpc/base_grpc_client.py +85 -0
  15. exabel-8.0.0/exabel/client/api/api_client/grpc/calendar_grpc_client.py +61 -0
  16. exabel-8.0.0/exabel/client/api/api_client/grpc/data_set_grpc_client.py +45 -0
  17. exabel-8.0.0/exabel/client/api/api_client/grpc/derived_signal_grpc_client.py +47 -0
  18. exabel-8.0.0/exabel/client/api/api_client/grpc/entity_grpc_client.py +91 -0
  19. exabel-8.0.0/exabel/client/api/api_client/grpc/holiday_grpc_client.py +63 -0
  20. exabel-8.0.0/exabel/client/api/api_client/grpc/kpi_grpc_client.py +71 -0
  21. exabel-8.0.0/exabel/client/api/api_client/grpc/library_grpc_client.py +82 -0
  22. exabel-8.0.0/exabel/client/api/api_client/grpc/namespace_grpc_client.py +26 -0
  23. exabel-8.0.0/exabel/client/api/api_client/grpc/prediction_model_grpc_client.py +28 -0
  24. exabel-8.0.0/exabel/client/api/api_client/grpc/relationship_grpc_client.py +92 -0
  25. exabel-8.0.0/exabel/client/api/api_client/grpc/signal_grpc_client.py +78 -0
  26. exabel-8.0.0/exabel/client/api/api_client/grpc/tag_grpc_client.py +67 -0
  27. exabel-8.0.0/exabel/client/api/api_client/grpc/time_series_grpc_client.py +75 -0
  28. exabel-8.0.0/exabel/client/api/api_client/grpc/user_grpc_client.py +30 -0
  29. exabel-8.0.0/exabel/client/api/api_client/holiday_api_client.py +43 -0
  30. exabel-8.0.0/exabel/client/api/api_client/kpi_api_client.py +58 -0
  31. exabel-8.0.0/exabel/client/api/api_client/library_api_client.py +72 -0
  32. exabel-8.0.0/exabel/client/api/api_client/namespace_api_client.py +16 -0
  33. exabel-8.0.0/exabel/client/api/api_client/prediction_model_api_client.py +16 -0
  34. exabel-8.0.0/exabel/client/api/api_client/relationship_api_client.py +66 -0
  35. exabel-8.0.0/exabel/client/api/api_client/signal_api_client.py +37 -0
  36. exabel-8.0.0/exabel/client/api/api_client/tag_api_client.py +55 -0
  37. exabel-8.0.0/exabel/client/api/api_client/time_series_api_client.py +51 -0
  38. exabel-8.0.0/exabel/client/api/api_client/user_api_client.py +22 -0
  39. exabel-8.0.0/exabel/client/api/bulk_import.py +266 -0
  40. exabel-8.0.0/exabel/client/api/bulk_insert.py +165 -0
  41. exabel-8.0.0/exabel/client/api/calendar_api.py +143 -0
  42. exabel-8.0.0/exabel/client/api/data_classes/__init__.py +0 -0
  43. exabel-8.0.0/exabel/client/api/data_classes/company.py +28 -0
  44. exabel-8.0.0/exabel/client/api/data_classes/company_kpi_mapping_results.py +59 -0
  45. exabel-8.0.0/exabel/client/api/data_classes/company_kpi_model_result.py +38 -0
  46. exabel-8.0.0/exabel/client/api/data_classes/company_kpi_models.py +44 -0
  47. exabel-8.0.0/exabel/client/api/data_classes/data_set.py +101 -0
  48. exabel-8.0.0/exabel/client/api/data_classes/derived_signal.py +258 -0
  49. exabel-8.0.0/exabel/client/api/data_classes/entity.py +86 -0
  50. exabel-8.0.0/exabel/client/api/data_classes/entity_type.py +67 -0
  51. exabel-8.0.0/exabel/client/api/data_classes/fiscal_period.py +48 -0
  52. exabel-8.0.0/exabel/client/api/data_classes/folder.py +79 -0
  53. exabel-8.0.0/exabel/client/api/data_classes/folder_accessor.py +47 -0
  54. exabel-8.0.0/exabel/client/api/data_classes/folder_item.py +156 -0
  55. exabel-8.0.0/exabel/client/api/data_classes/group.py +57 -0
  56. exabel-8.0.0/exabel/client/api/data_classes/kpi.py +60 -0
  57. exabel-8.0.0/exabel/client/api/data_classes/kpi_hierarchy.py +81 -0
  58. exabel-8.0.0/exabel/client/api/data_classes/kpi_mapping_group_reference.py +30 -0
  59. exabel-8.0.0/exabel/client/api/data_classes/kpi_mapping_model.py +31 -0
  60. exabel-8.0.0/exabel/client/api/data_classes/kpi_mapping_result_data.py +107 -0
  61. exabel-8.0.0/exabel/client/api/data_classes/kpi_model.py +42 -0
  62. exabel-8.0.0/exabel/client/api/data_classes/kpi_model_data.py +105 -0
  63. exabel-8.0.0/exabel/client/api/data_classes/kpi_model_run.py +54 -0
  64. exabel-8.0.0/exabel/client/api/data_classes/kpi_model_runs.py +39 -0
  65. exabel-8.0.0/exabel/client/api/data_classes/kpi_model_weight_groups.py +90 -0
  66. exabel-8.0.0/exabel/client/api/data_classes/kpi_screen_results.py +38 -0
  67. exabel-8.0.0/exabel/client/api/data_classes/kpi_source.py +23 -0
  68. exabel-8.0.0/exabel/client/api/data_classes/model_quality.py +31 -0
  69. exabel-8.0.0/exabel/client/api/data_classes/model_results.py +59 -0
  70. exabel-8.0.0/exabel/client/api/data_classes/namespace.py +33 -0
  71. exabel-8.0.0/exabel/client/api/data_classes/paging_result.py +42 -0
  72. exabel-8.0.0/exabel/client/api/data_classes/prediction_model_run.py +126 -0
  73. exabel-8.0.0/exabel/client/api/data_classes/relationship.py +79 -0
  74. exabel-8.0.0/exabel/client/api/data_classes/relationship_type.py +73 -0
  75. exabel-8.0.0/exabel/client/api/data_classes/request_error.py +91 -0
  76. exabel-8.0.0/exabel/client/api/data_classes/signal.py +52 -0
  77. exabel-8.0.0/exabel/client/api/data_classes/tag.py +105 -0
  78. exabel-8.0.0/exabel/client/api/data_classes/time_series.py +271 -0
  79. exabel-8.0.0/exabel/client/api/data_classes/user.py +49 -0
  80. exabel-8.0.0/exabel/client/api/data_set_api.py +93 -0
  81. exabel-8.0.0/exabel/client/api/derived_signal_api.py +75 -0
  82. exabel-8.0.0/exabel/client/api/entity_api.py +308 -0
  83. exabel-8.0.0/exabel/client/api/error_handler.py +105 -0
  84. exabel-8.0.0/exabel/client/api/export_api.py +291 -0
  85. exabel-8.0.0/exabel/client/api/holiday_api.py +122 -0
  86. exabel-8.0.0/exabel/client/api/kpi_api.py +215 -0
  87. exabel-8.0.0/exabel/client/api/library_api.py +195 -0
  88. exabel-8.0.0/exabel/client/api/namespace_api.py +42 -0
  89. exabel-8.0.0/exabel/client/api/pageable_resource.py +44 -0
  90. exabel-8.0.0/exabel/client/api/prediction_model_api.py +29 -0
  91. exabel-8.0.0/exabel/client/api/proto_utils.py +22 -0
  92. exabel-8.0.0/exabel/client/api/relationship_api.py +401 -0
  93. exabel-8.0.0/exabel/client/api/resource_creation_result.py +262 -0
  94. exabel-8.0.0/exabel/client/api/search_service.py +234 -0
  95. exabel-8.0.0/exabel/client/api/signal_api.py +155 -0
  96. exabel-8.0.0/exabel/client/api/tag_api.py +146 -0
  97. exabel-8.0.0/exabel/client/api/time_series_api.py +686 -0
  98. exabel-8.0.0/exabel/client/api/user_api.py +33 -0
  99. exabel-8.0.0/exabel/client/client_config.py +104 -0
  100. exabel-8.0.0/exabel/client/exabel_client.py +109 -0
  101. exabel-8.0.0/exabel/examples/__init__.py +0 -0
  102. exabel-8.0.0/exabel/examples/create_time_series_example.py +96 -0
  103. exabel-8.0.0/exabel/examples/get_company_example.py +103 -0
  104. exabel-8.0.0/exabel/query/__init__.py +0 -0
  105. exabel-8.0.0/exabel/query/column.py +53 -0
  106. exabel-8.0.0/exabel/query/dashboard.py +41 -0
  107. exabel-8.0.0/exabel/query/literal.py +25 -0
  108. exabel-8.0.0/exabel/query/predicate.py +53 -0
  109. exabel-8.0.0/exabel/query/query.py +30 -0
  110. exabel-8.0.0/exabel/query/signals.py +84 -0
  111. exabel-8.0.0/exabel/query/table.py +9 -0
  112. exabel-8.0.0/exabel/scripts/__init__.py +0 -0
  113. exabel-8.0.0/exabel/scripts/actions.py +57 -0
  114. exabel-8.0.0/exabel/scripts/base_script.py +124 -0
  115. exabel-8.0.0/exabel/scripts/check_company_identifiers_in_csv.py +128 -0
  116. exabel-8.0.0/exabel/scripts/command_line_script.py +31 -0
  117. exabel-8.0.0/exabel/scripts/create_data_set.py +70 -0
  118. exabel-8.0.0/exabel/scripts/create_derived_signal.py +79 -0
  119. exabel-8.0.0/exabel/scripts/create_entity.py +54 -0
  120. exabel-8.0.0/exabel/scripts/create_entity_mapping_from_csv.py +238 -0
  121. exabel-8.0.0/exabel/scripts/create_entity_type.py +66 -0
  122. exabel-8.0.0/exabel/scripts/create_folder.py +31 -0
  123. exabel-8.0.0/exabel/scripts/create_prediction_model_run.py +39 -0
  124. exabel-8.0.0/exabel/scripts/create_relationship.py +58 -0
  125. exabel-8.0.0/exabel/scripts/create_relationship_type.py +61 -0
  126. exabel-8.0.0/exabel/scripts/create_signal.py +56 -0
  127. exabel-8.0.0/exabel/scripts/csv_script.py +108 -0
  128. exabel-8.0.0/exabel/scripts/csv_script_with_entity_mapping.py +49 -0
  129. exabel-8.0.0/exabel/scripts/delete_data_set.py +30 -0
  130. exabel-8.0.0/exabel/scripts/delete_entities.py +96 -0
  131. exabel-8.0.0/exabel/scripts/delete_entity.py +48 -0
  132. exabel-8.0.0/exabel/scripts/delete_entity_type.py +30 -0
  133. exabel-8.0.0/exabel/scripts/delete_folder.py +31 -0
  134. exabel-8.0.0/exabel/scripts/delete_relationship.py +47 -0
  135. exabel-8.0.0/exabel/scripts/delete_relationship_type.py +31 -0
  136. exabel-8.0.0/exabel/scripts/delete_signal.py +30 -0
  137. exabel-8.0.0/exabel/scripts/delete_time_series.py +110 -0
  138. exabel-8.0.0/exabel/scripts/delete_time_series_point.py +55 -0
  139. exabel-8.0.0/exabel/scripts/delete_time_series_points.py +118 -0
  140. exabel-8.0.0/exabel/scripts/delete_time_series_points_from_file.py +108 -0
  141. exabel-8.0.0/exabel/scripts/export_data.py +49 -0
  142. exabel-8.0.0/exabel/scripts/export_signals.py +125 -0
  143. exabel-8.0.0/exabel/scripts/file_utils.py +44 -0
  144. exabel-8.0.0/exabel/scripts/get_data_set.py +34 -0
  145. exabel-8.0.0/exabel/scripts/get_entity.py +33 -0
  146. exabel-8.0.0/exabel/scripts/get_entity_type.py +30 -0
  147. exabel-8.0.0/exabel/scripts/get_folder.py +32 -0
  148. exabel-8.0.0/exabel/scripts/get_relationship.py +56 -0
  149. exabel-8.0.0/exabel/scripts/get_relationship_type.py +33 -0
  150. exabel-8.0.0/exabel/scripts/get_signal.py +31 -0
  151. exabel-8.0.0/exabel/scripts/get_time_series.py +80 -0
  152. exabel-8.0.0/exabel/scripts/list_data_sets.py +26 -0
  153. exabel-8.0.0/exabel/scripts/list_entities.py +94 -0
  154. exabel-8.0.0/exabel/scripts/list_entity_types.py +24 -0
  155. exabel-8.0.0/exabel/scripts/list_folder_accessors.py +34 -0
  156. exabel-8.0.0/exabel/scripts/list_folders.py +21 -0
  157. exabel-8.0.0/exabel/scripts/list_groups.py +20 -0
  158. exabel-8.0.0/exabel/scripts/list_items.py +39 -0
  159. exabel-8.0.0/exabel/scripts/list_relationship_types.py +33 -0
  160. exabel-8.0.0/exabel/scripts/list_relationships.py +81 -0
  161. exabel-8.0.0/exabel/scripts/list_signals.py +53 -0
  162. exabel-8.0.0/exabel/scripts/list_time_series.py +182 -0
  163. exabel-8.0.0/exabel/scripts/list_users.py +20 -0
  164. exabel-8.0.0/exabel/scripts/load_entities_from_csv.py +140 -0
  165. exabel-8.0.0/exabel/scripts/load_relationships_from_csv.py +203 -0
  166. exabel-8.0.0/exabel/scripts/load_signals_from_csv.py +75 -0
  167. exabel-8.0.0/exabel/scripts/load_time_series_from_csv.py +10 -0
  168. exabel-8.0.0/exabel/scripts/load_time_series_from_file.py +188 -0
  169. exabel-8.0.0/exabel/scripts/load_time_series_metadata_from_file.py +122 -0
  170. exabel-8.0.0/exabel/scripts/move_items.py +41 -0
  171. exabel-8.0.0/exabel/scripts/search_entities.py +109 -0
  172. exabel-8.0.0/exabel/scripts/share_folder.py +44 -0
  173. exabel-8.0.0/exabel/scripts/sql/__init__.py +0 -0
  174. exabel-8.0.0/exabel/scripts/sql/read_athena.py +58 -0
  175. exabel-8.0.0/exabel/scripts/sql/read_bigquery.py +49 -0
  176. exabel-8.0.0/exabel/scripts/sql/read_snowflake.py +96 -0
  177. exabel-8.0.0/exabel/scripts/sql/sql_script.py +52 -0
  178. exabel-8.0.0/exabel/scripts/unshare_folder.py +35 -0
  179. exabel-8.0.0/exabel/scripts/update_data_set.py +115 -0
  180. exabel-8.0.0/exabel/scripts/update_entity_type.py +74 -0
  181. exabel-8.0.0/exabel/scripts/update_folder.py +39 -0
  182. exabel-8.0.0/exabel/scripts/update_relationship_type.py +78 -0
  183. exabel-8.0.0/exabel/scripts/upsert_time_series_unit.py +79 -0
  184. exabel-8.0.0/exabel/scripts/utils.py +119 -0
  185. exabel-8.0.0/exabel/services/__init__.py +0 -0
  186. exabel-8.0.0/exabel/services/csv_entity_loader.py +269 -0
  187. exabel-8.0.0/exabel/services/csv_exception.py +5 -0
  188. exabel-8.0.0/exabel/services/csv_loading_constants.py +9 -0
  189. exabel-8.0.0/exabel/services/csv_loading_result.py +5 -0
  190. exabel-8.0.0/exabel/services/csv_reader.py +83 -0
  191. exabel-8.0.0/exabel/services/csv_relationship_loader.py +546 -0
  192. exabel-8.0.0/exabel/services/csv_time_series_loader.py +86 -0
  193. exabel-8.0.0/exabel/services/csv_writer.py +32 -0
  194. exabel-8.0.0/exabel/services/entity_mapping_file_reader.py +89 -0
  195. exabel-8.0.0/exabel/services/excel_writer.py +16 -0
  196. exabel-8.0.0/exabel/services/feather_reader.py +45 -0
  197. exabel-8.0.0/exabel/services/feather_writer.py +28 -0
  198. exabel-8.0.0/exabel/services/file_constants.py +12 -0
  199. exabel-8.0.0/exabel/services/file_loading_exception.py +18 -0
  200. exabel-8.0.0/exabel/services/file_loading_result.py +118 -0
  201. exabel-8.0.0/exabel/services/file_time_series_loader.py +898 -0
  202. exabel-8.0.0/exabel/services/file_time_series_parser.py +1152 -0
  203. exabel-8.0.0/exabel/services/file_writer.py +26 -0
  204. exabel-8.0.0/exabel/services/file_writer_provider.py +33 -0
  205. exabel-8.0.0/exabel/services/sql/__init__.py +0 -0
  206. exabel-8.0.0/exabel/services/sql/athena_reader_configuration.py +98 -0
  207. exabel-8.0.0/exabel/services/sql/bigquery_reader_configuration.py +75 -0
  208. exabel-8.0.0/exabel/services/sql/exceptions.py +6 -0
  209. exabel-8.0.0/exabel/services/sql/snowflake_reader.py +74 -0
  210. exabel-8.0.0/exabel/services/sql/snowflake_reader_configuration.py +70 -0
  211. exabel-8.0.0/exabel/services/sql/sql_reader.py +65 -0
  212. exabel-8.0.0/exabel/services/sql/sql_reader_configuration.py +35 -0
  213. exabel-8.0.0/exabel/services/sql/sqlalchemy_reader.py +61 -0
  214. exabel-8.0.0/exabel/stubs/__init__.py +0 -0
  215. exabel-8.0.0/exabel/stubs/__init__.pyi +2 -0
  216. exabel-8.0.0/exabel/stubs/exabel/__init__.py +0 -0
  217. exabel-8.0.0/exabel/stubs/exabel/__init__.pyi +1 -0
  218. exabel-8.0.0/exabel/stubs/exabel/api/__init__.py +0 -0
  219. exabel-8.0.0/exabel/stubs/exabel/api/__init__.pyi +5 -0
  220. exabel-8.0.0/exabel/stubs/exabel/api/all_pb2.py +3 -0
  221. exabel-8.0.0/exabel/stubs/exabel/api/all_pb2_grpc.py +3 -0
  222. exabel-8.0.0/exabel/stubs/exabel/api/analytics/__init__.py +0 -0
  223. exabel-8.0.0/exabel/stubs/exabel/api/analytics/__init__.pyi +1 -0
  224. exabel-8.0.0/exabel/stubs/exabel/api/analytics/all_pb2.py +3 -0
  225. exabel-8.0.0/exabel/stubs/exabel/api/analytics/all_pb2_grpc.py +3 -0
  226. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/__init__.py +0 -0
  227. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/__init__.pyi +13 -0
  228. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/all_pb2.py +16 -0
  229. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/all_pb2_grpc.py +16 -0
  230. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/common_messages_pb2.py +37 -0
  231. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/common_messages_pb2.pyi +39 -0
  232. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/common_messages_pb2_grpc.py +24 -0
  233. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2.py +59 -0
  234. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2.pyi +205 -0
  235. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_messages_pb2_grpc.py +24 -0
  236. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_service_pb2.py +67 -0
  237. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_service_pb2.pyi +109 -0
  238. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/derived_signal_service_pb2_grpc.py +273 -0
  239. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/item_messages_pb2.py +49 -0
  240. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/item_messages_pb2.pyi +54 -0
  241. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/item_messages_pb2_grpc.py +24 -0
  242. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.py +59 -0
  243. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2.pyi +236 -0
  244. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_messages_pb2_grpc.py +24 -0
  245. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2.py +70 -0
  246. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2.pyi +166 -0
  247. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_mapping_service_pb2_grpc.py +234 -0
  248. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_messages_pb2.py +91 -0
  249. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_messages_pb2.pyi +1078 -0
  250. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_messages_pb2_grpc.py +24 -0
  251. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_service_pb2.py +101 -0
  252. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_service_pb2.pyi +372 -0
  253. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/kpi_service_pb2_grpc.py +356 -0
  254. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2.py +45 -0
  255. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2.pyi +92 -0
  256. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_messages_pb2_grpc.py +24 -0
  257. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_service_pb2.py +49 -0
  258. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_service_pb2.pyi +40 -0
  259. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/prediction_model_service_pb2_grpc.py +126 -0
  260. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/service_pb2.py +36 -0
  261. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/service_pb2.pyi +8 -0
  262. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/service_pb2_grpc.py +24 -0
  263. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_messages_pb2.py +50 -0
  264. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_messages_pb2.pyi +56 -0
  265. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_messages_pb2_grpc.py +24 -0
  266. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_service_pb2.py +101 -0
  267. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_service_pb2.pyi +305 -0
  268. exabel-8.0.0/exabel/stubs/exabel/api/analytics/v1/tag_service_pb2_grpc.py +436 -0
  269. exabel-8.0.0/exabel/stubs/exabel/api/data/__init__.py +0 -0
  270. exabel-8.0.0/exabel/stubs/exabel/api/data/__init__.pyi +1 -0
  271. exabel-8.0.0/exabel/stubs/exabel/api/data/all_pb2.py +3 -0
  272. exabel-8.0.0/exabel/stubs/exabel/api/data/all_pb2_grpc.py +3 -0
  273. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/__init__.py +0 -0
  274. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/__init__.pyi +20 -0
  275. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/all_pb2.py +23 -0
  276. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/all_pb2_grpc.py +23 -0
  277. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_messages_pb2.py +47 -0
  278. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_messages_pb2.pyi +87 -0
  279. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_messages_pb2_grpc.py +24 -0
  280. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_service_pb2.py +81 -0
  281. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_service_pb2.pyi +215 -0
  282. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/calendar_service_pb2_grpc.py +286 -0
  283. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/common_messages_pb2.py +37 -0
  284. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/common_messages_pb2.pyi +50 -0
  285. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/common_messages_pb2_grpc.py +24 -0
  286. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_messages_pb2.py +55 -0
  287. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_messages_pb2.pyi +75 -0
  288. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_messages_pb2_grpc.py +24 -0
  289. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_service_pb2.py +73 -0
  290. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_service_pb2.pyi +145 -0
  291. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/data_set_service_pb2_grpc.py +313 -0
  292. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_messages_pb2.py +60 -0
  293. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_messages_pb2.pyi +98 -0
  294. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_messages_pb2_grpc.py +24 -0
  295. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_service_pb2.py +126 -0
  296. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_service_pb2.pyi +451 -0
  297. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/entity_service_pb2_grpc.py +651 -0
  298. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_messages_pb2.py +40 -0
  299. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_messages_pb2.pyi +89 -0
  300. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_messages_pb2_grpc.py +24 -0
  301. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_service_pb2.py +72 -0
  302. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_service_pb2.pyi +147 -0
  303. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/holiday_service_pb2_grpc.py +291 -0
  304. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/import_job_service_pb2.py +48 -0
  305. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/import_job_service_pb2.pyi +41 -0
  306. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/import_job_service_pb2_grpc.py +118 -0
  307. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespace_service_pb2.py +46 -0
  308. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespace_service_pb2.pyi +49 -0
  309. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespace_service_pb2_grpc.py +117 -0
  310. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespaces_messages_pb2.py +42 -0
  311. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespaces_messages_pb2.pyi +35 -0
  312. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/namespaces_messages_pb2_grpc.py +24 -0
  313. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_messages_pb2.py +58 -0
  314. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_messages_pb2.pyi +109 -0
  315. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_messages_pb2_grpc.py +24 -0
  316. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_service_pb2.py +113 -0
  317. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_service_pb2.pyi +356 -0
  318. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/relationship_service_pb2_grpc.py +531 -0
  319. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/search_messages_pb2.py +47 -0
  320. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/search_messages_pb2.pyi +98 -0
  321. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/search_messages_pb2_grpc.py +24 -0
  322. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/service_pb2.py +36 -0
  323. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/service_pb2.pyi +8 -0
  324. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/service_pb2_grpc.py +24 -0
  325. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_messages_pb2.py +74 -0
  326. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_messages_pb2.pyi +159 -0
  327. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_messages_pb2_grpc.py +24 -0
  328. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_service_pb2.py +95 -0
  329. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_service_pb2.pyi +311 -0
  330. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/signal_service_pb2_grpc.py +433 -0
  331. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_messages_pb2.py +78 -0
  332. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_messages_pb2.pyi +309 -0
  333. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_messages_pb2_grpc.py +24 -0
  334. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_service_pb2.py +133 -0
  335. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_service_pb2.pyi +538 -0
  336. exabel-8.0.0/exabel/stubs/exabel/api/data/v1/time_series_service_pb2_grpc.py +448 -0
  337. exabel-8.0.0/exabel/stubs/exabel/api/management/__init__.py +0 -0
  338. exabel-8.0.0/exabel/stubs/exabel/api/management/__init__.pyi +1 -0
  339. exabel-8.0.0/exabel/stubs/exabel/api/management/all_pb2.py +3 -0
  340. exabel-8.0.0/exabel/stubs/exabel/api/management/all_pb2_grpc.py +3 -0
  341. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/__init__.py +0 -0
  342. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/__init__.pyi +5 -0
  343. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/all_pb2.py +8 -0
  344. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/all_pb2_grpc.py +8 -0
  345. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/folder_messages_pb2.py +65 -0
  346. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/folder_messages_pb2.pyi +222 -0
  347. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/folder_messages_pb2_grpc.py +24 -0
  348. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/library_service_pb2.py +127 -0
  349. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/library_service_pb2.pyi +377 -0
  350. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/library_service_pb2_grpc.py +596 -0
  351. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/service_pb2.py +36 -0
  352. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/service_pb2.pyi +8 -0
  353. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/service_pb2_grpc.py +24 -0
  354. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_messages_pb2.py +44 -0
  355. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_messages_pb2.pyi +71 -0
  356. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_messages_pb2_grpc.py +24 -0
  357. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_service_pb2.py +52 -0
  358. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_service_pb2.pyi +79 -0
  359. exabel-8.0.0/exabel/stubs/exabel/api/management/v1/user_service_pb2_grpc.py +155 -0
  360. exabel-8.0.0/exabel/stubs/exabel/api/math/__init__.py +0 -0
  361. exabel-8.0.0/exabel/stubs/exabel/api/math/__init__.pyi +2 -0
  362. exabel-8.0.0/exabel/stubs/exabel/api/math/aggregation_pb2.py +37 -0
  363. exabel-8.0.0/exabel/stubs/exabel/api/math/aggregation_pb2.pyi +61 -0
  364. exabel-8.0.0/exabel/stubs/exabel/api/math/aggregation_pb2_grpc.py +24 -0
  365. exabel-8.0.0/exabel/stubs/exabel/api/math/all_pb2.py +5 -0
  366. exabel-8.0.0/exabel/stubs/exabel/api/math/all_pb2_grpc.py +5 -0
  367. exabel-8.0.0/exabel/stubs/exabel/api/math/change_pb2.py +37 -0
  368. exabel-8.0.0/exabel/stubs/exabel/api/math/change_pb2.pyi +41 -0
  369. exabel-8.0.0/exabel/stubs/exabel/api/math/change_pb2_grpc.py +24 -0
  370. exabel-8.0.0/exabel/stubs/exabel/api/time/__init__.py +0 -0
  371. exabel-8.0.0/exabel/stubs/exabel/api/time/__init__.pyi +2 -0
  372. exabel-8.0.0/exabel/stubs/exabel/api/time/all_pb2.py +5 -0
  373. exabel-8.0.0/exabel/stubs/exabel/api/time/all_pb2_grpc.py +5 -0
  374. exabel-8.0.0/exabel/stubs/exabel/api/time/date_pb2.py +37 -0
  375. exabel-8.0.0/exabel/stubs/exabel/api/time/date_pb2.pyi +39 -0
  376. exabel-8.0.0/exabel/stubs/exabel/api/time/date_pb2_grpc.py +24 -0
  377. exabel-8.0.0/exabel/stubs/exabel/api/time/time_range_pb2.py +38 -0
  378. exabel-8.0.0/exabel/stubs/exabel/api/time/time_range_pb2.pyi +49 -0
  379. exabel-8.0.0/exabel/stubs/exabel/api/time/time_range_pb2_grpc.py +24 -0
  380. exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/__init__.py +0 -0
  381. exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/__init__.pyi +1 -0
  382. exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/__init__.py +0 -0
  383. exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/__init__.pyi +2 -0
  384. exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/annotations_pb2.py +37 -0
  385. exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/annotations_pb2.pyi +49 -0
  386. exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/annotations_pb2_grpc.py +24 -0
  387. exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/openapiv2_pb2.py +128 -0
  388. exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/openapiv2_pb2.pyi +1342 -0
  389. exabel-8.0.0/exabel/stubs/protoc_gen_openapiv2/options/openapiv2_pb2_grpc.py +24 -0
  390. exabel-8.0.0/exabel/util/__init__.py +0 -0
  391. exabel-8.0.0/exabel/util/batcher.py +16 -0
  392. exabel-8.0.0/exabel/util/case_insensitive_column.py +14 -0
  393. exabel-8.0.0/exabel/util/deprecate_arguments.py +146 -0
  394. exabel-8.0.0/exabel/util/exceptions.py +14 -0
  395. exabel-8.0.0/exabel/util/handle_missing_imports.py +47 -0
  396. exabel-8.0.0/exabel/util/import_.py +51 -0
  397. exabel-8.0.0/exabel/util/logging_thread_pool_executor.py +40 -0
  398. exabel-8.0.0/exabel/util/parse_property_columns.py +32 -0
  399. exabel-8.0.0/exabel/util/resource_name_normalization.py +420 -0
  400. exabel-8.0.0/exabel/util/type_converter.py +23 -0
  401. exabel-8.0.0/exabel/util/warnings.py +2 -0
  402. 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}")
@@ -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)