athena-intelligence 0.1.104__tar.gz → 0.1.105__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 (46) hide show
  1. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/PKG-INFO +1 -1
  2. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/pyproject.toml +1 -1
  3. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/client.py +73 -1
  4. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/core/client_wrapper.py +1 -1
  5. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/tools/client.py +2 -0
  6. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/tools/types/tools_data_frame_request_columns_item.py +1 -1
  7. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/README.md +0 -0
  8. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/__init__.py +0 -0
  9. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/base_client.py +0 -0
  10. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/core/__init__.py +0 -0
  11. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/core/api_error.py +0 -0
  12. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/core/datetime_utils.py +0 -0
  13. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/core/file.py +0 -0
  14. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/core/http_client.py +0 -0
  15. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/core/jsonable_encoder.py +0 -0
  16. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/core/pydantic_utilities.py +0 -0
  17. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/core/query_encoder.py +0 -0
  18. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/core/remove_none_from_dict.py +0 -0
  19. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/core/request_options.py +0 -0
  20. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/environment.py +0 -0
  21. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/errors/__init__.py +0 -0
  22. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/errors/bad_request_error.py +0 -0
  23. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/errors/content_too_large_error.py +0 -0
  24. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/errors/internal_server_error.py +0 -0
  25. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/errors/not_found_error.py +0 -0
  26. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/errors/unauthorized_error.py +0 -0
  27. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/errors/unprocessable_entity_error.py +0 -0
  28. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/errors/unsupported_media_type_error.py +0 -0
  29. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/py.typed +0 -0
  30. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/query/__init__.py +0 -0
  31. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/query/client.py +0 -0
  32. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/query/types/__init__.py +0 -0
  33. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/query/types/query_execute_request_database_asset_ids.py +0 -0
  34. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/tools/__init__.py +0 -0
  35. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/tools/types/__init__.py +0 -0
  36. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/types/__init__.py +0 -0
  37. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/types/asset_not_found_error.py +0 -0
  38. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/types/data_frame_request_out.py +0 -0
  39. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/types/data_frame_request_out_columns_item.py +0 -0
  40. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/types/data_frame_request_out_data_item_item.py +0 -0
  41. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/types/data_frame_request_out_index_item.py +0 -0
  42. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/types/data_frame_unknown_format_error.py +0 -0
  43. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/types/file_too_large_error.py +0 -0
  44. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/types/parent_folder_error.py +0 -0
  45. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/types/save_asset_request_out.py +0 -0
  46. {athena_intelligence-0.1.104 → athena_intelligence-0.1.105}/src/athena/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: athena-intelligence
3
- Version: 0.1.104
3
+ Version: 0.1.105
4
4
  Summary: Athena Intelligence Python Library
5
5
  Requires-Python: >=3.8,<4.0
6
6
  Classifier: Intended Audience :: Developers
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "athena-intelligence"
3
- version = "0.1.104"
3
+ version = "0.1.105"
4
4
  description = "Athena Intelligence Python Library"
5
5
  readme = "README.md"
6
6
  authors = []
@@ -8,11 +8,13 @@ import httpx
8
8
  from typing import cast, List, Union
9
9
  from typing_extensions import TypeVar, ParamSpec
10
10
 
11
+ from . import core
11
12
  from .base_client import BaseAthena, AsyncBaseAthena
12
13
  from .environment import AthenaEnvironment
13
14
  from .tools.client import AsyncToolsClient, ToolsClient
14
15
  from .query.client import AsyncQueryClient, QueryClient
15
16
  from .types.data_frame_request_out import DataFrameRequestOut
17
+ from .types.save_asset_request_out import SaveAssetRequestOut
16
18
 
17
19
  if typing.TYPE_CHECKING:
18
20
  import pandas as pd
@@ -96,6 +98,43 @@ class WrappedToolsClient(ToolsClient):
96
98
  return _to_pandas_df(file_bytes, *args, **kwargs)
97
99
 
98
100
 
101
+ def save_asset( # type: ignore[override]
102
+ self,
103
+ asset_object: Union["pd.DataFrame", "pd.Series", core.File],
104
+ *,
105
+ parent_folder_id: Union[str, None] = None,
106
+ name: Union[str, None] = None,
107
+ **kwargs,
108
+ ) -> SaveAssetRequestOut:
109
+ """
110
+ Parameters
111
+ ----------
112
+ asset_object : pd.DataFrame | pd.Series | core.File
113
+ A pandas data frame, series, or core.File
114
+
115
+ parent_folder_id : typing.Optional[str]
116
+
117
+ request_options : typing.Optional[RequestOptions]
118
+ Request-specific configuration.
119
+
120
+ Returns
121
+ -------
122
+ SaveAssetRequestOut
123
+ Successful Response
124
+
125
+ Examples
126
+ --------
127
+ from athena.client import Athena
128
+
129
+ client = Athena(api_key="YOUR_API_KEY")
130
+ client.tools.save_asset(df)
131
+ """
132
+ asset_object = _convert_asset_object(asset_object=asset_object, name=name)
133
+ return super().save_asset(
134
+ file=asset_object, parent_folder_id=parent_folder_id, **kwargs
135
+ )
136
+
137
+
99
138
  class WrappedQueryClient(QueryClient):
100
139
 
101
140
  @_inherit_signature_and_doc(QueryClient.execute, {'DataFrameRequestOut': 'pd.DataFrame'})
@@ -148,6 +187,20 @@ class WrappedAsyncToolsClient(AsyncToolsClient):
148
187
  file_bytes = await self.get_file(asset_id)
149
188
  return _to_pandas_df(file_bytes, *args, **kwargs)
150
189
 
190
+ @_add_docs_for_async_variant(WrappedToolsClient.save_asset)
191
+ async def save_asset(
192
+ self,
193
+ asset_object: Union["pd.DataFrame", "pd.Series", core.File],
194
+ *,
195
+ parent_folder_id: Union[str, None] = None,
196
+ name: Union[str, None] = None,
197
+ **kwargs,
198
+ ) -> SaveAssetRequestOut:
199
+ asset_object = _convert_asset_object(asset_object=asset_object, name=name)
200
+ return await super().save_asset(
201
+ file=asset_object, parent_folder_id=parent_folder_id, **kwargs
202
+ )
203
+
151
204
 
152
205
  class WrappedAsyncQueryClient(AsyncQueryClient):
153
206
 
@@ -333,9 +386,28 @@ def _to_pandas_df(bytes_io: io.BytesIO, *args, **kwargs):
333
386
 
334
387
  if media_type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
335
388
  return pd.read_excel(bytes_io, *args, engine='openpyxl', **kwargs)
389
+ elif media_type == 'application/vnd.apache.parquet':
390
+ return pd.read_parquet(bytes_io, *args, **kwargs)
336
391
  elif media_type == 'application/vnd.ms-excel':
337
392
  return pd.read_excel(bytes_io, *args, **kwargs)
338
- elif media_type == 'text/csv':
393
+ elif media_type in {'text/csv', 'application/csv'}:
339
394
  return pd.read_csv(bytes_io, *args, **kwargs)
340
395
  else:
341
396
  raise Exception("Unknown media type")
397
+
398
+
399
+ def _convert_asset_object(
400
+ asset_object: Union["pd.DataFrame", "pd.Series", core.File],
401
+ name: Union[str, None] = None,
402
+ ) -> core.File:
403
+ import pandas as pd
404
+
405
+ if isinstance(asset_object, pd.Series):
406
+ asset_object = asset_object.to_frame()
407
+ if isinstance(asset_object, pd.DataFrame):
408
+ return (
409
+ name or "Uploaded data frame",
410
+ asset_object.to_parquet(path=None),
411
+ "application/vnd.apache.parquet",
412
+ )
413
+ return asset_object # type: ignore[return-value]
@@ -17,7 +17,7 @@ class BaseClientWrapper:
17
17
  headers: typing.Dict[str, str] = {
18
18
  "X-Fern-Language": "Python",
19
19
  "X-Fern-SDK-Name": "athena-intelligence",
20
- "X-Fern-SDK-Version": "0.1.104",
20
+ "X-Fern-SDK-Version": "0.1.105",
21
21
  }
22
22
  headers["X-API-KEY"] = self.api_key
23
23
  return headers
@@ -179,6 +179,7 @@ class ToolsClient:
179
179
  See core.File for more documentation
180
180
 
181
181
  parent_folder_id : typing.Optional[str]
182
+ Identifier of the folder into which the asset should be saved
182
183
 
183
184
  request_options : typing.Optional[RequestOptions]
184
185
  Request-specific configuration.
@@ -373,6 +374,7 @@ class AsyncToolsClient:
373
374
  See core.File for more documentation
374
375
 
375
376
  parent_folder_id : typing.Optional[str]
377
+ Identifier of the folder into which the asset should be saved
376
378
 
377
379
  request_options : typing.Optional[RequestOptions]
378
380
  Request-specific configuration.
@@ -2,4 +2,4 @@
2
2
 
3
3
  import typing
4
4
 
5
- ToolsDataFrameRequestColumnsItem = typing.Union[str, int]
5
+ ToolsDataFrameRequestColumnsItem = typing.Union[int, str]