anaplan-sdk 0.3.0__py3-none-any.whl → 0.3.1__py3-none-any.whl

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.
@@ -1,6 +1,3 @@
1
- from asyncio import gather
2
- from itertools import chain
3
- from math import ceil
4
1
  from typing import Literal
5
2
 
6
3
  import httpx
@@ -25,63 +22,21 @@ class _AsyncAuditClient(_AsyncBaseClient):
25
22
  """
26
23
  return [
27
24
  User.model_validate(e)
28
- for e in (await self._get("https://api.anaplan.com/2/0/users")).get("users")
25
+ for e in await self._get_paginated("https://api.anaplan.com/2/0/users", "users")
29
26
  ]
30
27
 
31
28
  async def get_events(self, days_into_past: int = 30, event_type: Event = "all") -> list:
32
29
  """
33
30
  Get audit events from Anaplan Audit API.
34
31
  :param days_into_past: The nuber of days into the past to get events for. The API provides
35
- data for up to 30 days.
32
+ data for up to 30 days.
36
33
  :param event_type: The type of events to get.
37
34
  :return: A list of audit events.
38
35
  """
39
- total = await self._get_total(days_into_past, event_type)
40
- if total == 0:
41
- return []
42
- if total <= 10_000:
43
- return await self._get_result_page(days_into_past, event_type)
44
-
45
36
  return list(
46
- chain.from_iterable(
47
- await gather(
48
- *(
49
- self._get_result_page(
50
- days_into_past, event_type, self._limit, n * self._limit
51
- )
52
- for n in range(ceil(total / self._limit))
53
- )
54
- )
55
- )
56
- )
57
-
58
- async def _get_total(self, days_into_past: int = 60, event_type: Event = "all") -> int:
59
- return ( # noqa
60
- await self._get(
37
+ await self._get_paginated(
61
38
  self._url,
62
- params={
63
- "limit": 0,
64
- "type": event_type,
65
- "intervalInHours": days_into_past * 24,
66
- },
39
+ "response",
40
+ params={"type": event_type, "intervalInHours": days_into_past * 24},
67
41
  )
68
- )["meta"]["paging"]["totalSize"] # noqa
69
-
70
- async def _get_result_page(
71
- self,
72
- days_into_past: int = 60,
73
- event_type: Event = "all",
74
- limit: int = 10_000,
75
- offset: int = 0,
76
- ) -> list:
77
- return (
78
- await self._get(
79
- self._url,
80
- params={
81
- "intervalInHours": days_into_past * 24,
82
- "limit": limit,
83
- "offset": offset,
84
- "type": event_type,
85
- },
86
- )
87
- ).get("response", [])
42
+ )
@@ -191,9 +191,11 @@ class AsyncClient(_AsyncBaseClient):
191
191
  """
192
192
  return [
193
193
  Workspace.model_validate(e)
194
- for e in (
195
- await self._get("https://api.anaplan.com/2/0/workspaces?tenantDetails=true")
196
- ).get("workspaces", [])
194
+ for e in await self._get_paginated(
195
+ "https://api.anaplan.com/2/0/workspaces",
196
+ "workspaces",
197
+ params={"tenantDetails": "true"},
198
+ )
197
199
  ]
198
200
 
199
201
  async def list_models(self) -> list[Model]:
@@ -203,8 +205,8 @@ class AsyncClient(_AsyncBaseClient):
203
205
  """
204
206
  return [
205
207
  Model.model_validate(e)
206
- for e in (await self._get("https://api.anaplan.com/2/0/models?modelDetails=true")).get(
207
- "models", []
208
+ for e in await self._get_paginated(
209
+ "https://api.anaplan.com/2/0/models", "models", params={"modelDetails": "true"}
208
210
  )
209
211
  ]
210
212
 
@@ -214,7 +216,7 @@ class AsyncClient(_AsyncBaseClient):
214
216
  :return: The List of Files.
215
217
  """
216
218
  return [
217
- File.model_validate(e) for e in (await self._get(f"{self._url}/files")).get("files", [])
219
+ File.model_validate(e) for e in await self._get_paginated(f"{self._url}/files", "files")
218
220
  ]
219
221
 
220
222
  async def list_actions(self) -> list[Action]:
@@ -226,7 +228,7 @@ class AsyncClient(_AsyncBaseClient):
226
228
  """
227
229
  return [
228
230
  Action.model_validate(e)
229
- for e in (await self._get(f"{self._url}/actions")).get("actions", [])
231
+ for e in await self._get_paginated(f"{self._url}/actions", "actions")
230
232
  ]
231
233
 
232
234
  async def list_processes(self) -> list[Process]:
@@ -236,7 +238,7 @@ class AsyncClient(_AsyncBaseClient):
236
238
  """
237
239
  return [
238
240
  Process.model_validate(e)
239
- for e in (await self._get(f"{self._url}/processes")).get("processes", [])
241
+ for e in await self._get_paginated(f"{self._url}/processes", "processes")
240
242
  ]
241
243
 
242
244
  async def list_imports(self) -> list[Import]:
@@ -246,7 +248,7 @@ class AsyncClient(_AsyncBaseClient):
246
248
  """
247
249
  return [
248
250
  Import.model_validate(e)
249
- for e in (await self._get(f"{self._url}/imports")).get("imports", [])
251
+ for e in await self._get_paginated(f"{self._url}/imports", "imports")
250
252
  ]
251
253
 
252
254
  async def list_exports(self) -> list[Export]:
@@ -256,7 +258,7 @@ class AsyncClient(_AsyncBaseClient):
256
258
  """
257
259
  return [
258
260
  Export.model_validate(e)
259
- for e in (await self._get(f"{self._url}/exports")).get("exports", [])
261
+ for e in await self._get_paginated(f"{self._url}/exports", "exports")
260
262
  ]
261
263
 
262
264
  async def run_action(self, action_id: int) -> TaskStatus:
@@ -406,9 +408,9 @@ class AsyncClient(_AsyncBaseClient):
406
408
  """
407
409
  return [
408
410
  TaskSummary.model_validate(e)
409
- for e in (
410
- await self._get(f"{self._url}/{action_url(action_id)}/{action_id}/tasks")
411
- ).get("tasks", [])
411
+ for e in await self._get_paginated(
412
+ f"{self._url}/{action_url(action_id)}/{action_id}/tasks", "tasks"
413
+ )
412
414
  ]
413
415
 
414
416
  async def get_task_status(self, action_id: int, task_id: str) -> TaskStatus:
@@ -32,7 +32,7 @@ class _AsyncTransactionalClient(_AsyncBaseClient):
32
32
  """
33
33
  return [
34
34
  Module.model_validate(e)
35
- for e in (await self._get(f"{self._url}/modules")).get("modules", [])
35
+ for e in await self._get_paginated(f"{self._url}/modules", "modules")
36
36
  ]
37
37
 
38
38
  async def get_model_status(self) -> ModelStatus:
@@ -63,7 +63,7 @@ class _AsyncTransactionalClient(_AsyncBaseClient):
63
63
  :return: All Lists on this model.
64
64
  """
65
65
  return [
66
- List.model_validate(e) for e in (await self._get(f"{self._url}/lists")).get("lists", [])
66
+ List.model_validate(e) for e in await self._get_paginated(f"{self._url}/lists", "lists")
67
67
  ]
68
68
 
69
69
  async def get_list_metadata(self, list_id: int) -> ListMetadata:
anaplan_sdk/_base.py CHANGED
@@ -6,8 +6,12 @@ import asyncio
6
6
  import logging
7
7
  import random
8
8
  import time
9
+ from asyncio import gather
10
+ from concurrent.futures import ThreadPoolExecutor
9
11
  from gzip import compress
10
- from typing import Any, Callable, Coroutine, Literal
12
+ from itertools import chain
13
+ from math import ceil
14
+ from typing import Any, Callable, Coroutine, Iterator, Literal
11
15
 
12
16
  import httpx
13
17
  from httpx import HTTPError, Response
@@ -26,15 +30,13 @@ class _BaseClient:
26
30
  self._retry_count = retry_count
27
31
  self._client = client
28
32
 
29
- def _get(self, url: str, **kwargs) -> dict[str, float | int | str | list | dict | bool]:
33
+ def _get(self, url: str, **kwargs) -> dict[str, Any]:
30
34
  return self._run_with_retry(self._client.get, url, **kwargs).json()
31
35
 
32
36
  def _get_binary(self, url: str) -> bytes:
33
37
  return self._run_with_retry(self._client.get, url).content
34
38
 
35
- def _post(
36
- self, url: str, json: dict | list
37
- ) -> dict[str, float | int | str | list | dict | bool]:
39
+ def _post(self, url: str, json: dict | list) -> dict[str, Any]:
38
40
  return self._run_with_retry(
39
41
  self._client.post, url, headers={"Content-Type": "application/json"}, json=json
40
42
  ).json()
@@ -50,6 +52,30 @@ class _BaseClient:
50
52
  content=compress(content),
51
53
  )
52
54
 
55
+ def __get_page(self, url: str, limit: int, offset: int, result_key: str, **kwargs) -> list:
56
+ kwargs["params"] = kwargs.get("params", {}) | {"limit": limit, "offset": offset}
57
+ return self._get(url, **kwargs).get(result_key, [])
58
+
59
+ def __get_first_page(self, url: str, limit: int, result_key: str, **kwargs) -> tuple[list, int]:
60
+ kwargs["params"] = kwargs.get("params", {}) | {"limit": limit}
61
+ res = self._get(url, **kwargs)
62
+ return res.get(result_key, []), res["meta"]["paging"]["totalSize"]
63
+
64
+ def _get_paginated(
65
+ self, url: str, result_key: str, page_size: int = 5_000, **kwargs
66
+ ) -> Iterator[dict[str, Any]]:
67
+ first_page, total_items = self.__get_first_page(url, page_size, result_key, **kwargs)
68
+ if total_items <= page_size:
69
+ return iter(first_page)
70
+
71
+ with ThreadPoolExecutor() as executor:
72
+ pages = executor.map(
73
+ lambda n: self.__get_page(url, page_size, n * page_size, result_key, **kwargs),
74
+ range(1, ceil(total_items / page_size)),
75
+ )
76
+
77
+ return chain(first_page, *pages)
78
+
53
79
  def _run_with_retry(self, func: Callable[..., Response], *args, **kwargs) -> Response:
54
80
  for i in range(max(self._retry_count, 1)):
55
81
  try:
@@ -77,15 +103,13 @@ class _AsyncBaseClient:
77
103
  self._retry_count = retry_count
78
104
  self._client = client
79
105
 
80
- async def _get(self, url: str, **kwargs) -> dict[str, float | int | str | list | dict | bool]:
106
+ async def _get(self, url: str, **kwargs) -> dict[str, Any]:
81
107
  return (await self._run_with_retry(self._client.get, url, **kwargs)).json()
82
108
 
83
109
  async def _get_binary(self, url: str) -> bytes:
84
110
  return (await self._run_with_retry(self._client.get, url)).content
85
111
 
86
- async def _post(
87
- self, url: str, json: dict | list
88
- ) -> dict[str, float | int | str | list | dict | bool]:
112
+ async def _post(self, url: str, json: dict | list) -> dict[str, Any]:
89
113
  return (
90
114
  await self._run_with_retry(
91
115
  self._client.post, url, headers={"Content-Type": "application/json"}, json=json
@@ -103,6 +127,33 @@ class _AsyncBaseClient:
103
127
  content=compress(content),
104
128
  )
105
129
 
130
+ async def __get_page(
131
+ self, url: str, limit: int, offset: int, result_key: str, **kwargs
132
+ ) -> list:
133
+ kwargs["params"] = kwargs.get("params", {}) | {"limit": limit, "offset": offset}
134
+ return (await self._get(url, **kwargs)).get(result_key, [])
135
+
136
+ async def __get_first_page(
137
+ self, url: str, limit: int, result_key: str, **kwargs
138
+ ) -> tuple[list, int]:
139
+ kwargs["params"] = kwargs.get("params", {}) | {"limit": limit}
140
+ res = await self._get(url, **kwargs)
141
+ return res.get(result_key, []), res["meta"]["paging"]["totalSize"]
142
+
143
+ async def _get_paginated(
144
+ self, url: str, result_key: str, page_size: int = 5_000, **kwargs
145
+ ) -> Iterator[dict[str, Any]]:
146
+ first_page, total_items = await self.__get_first_page(url, page_size, result_key, **kwargs)
147
+ if total_items <= page_size:
148
+ return iter(first_page)
149
+ pages = await gather(
150
+ *(
151
+ self.__get_page(url, page_size, n * page_size, result_key, **kwargs)
152
+ for n in range(1, ceil(total_items / page_size))
153
+ )
154
+ )
155
+ return chain(first_page, *pages)
156
+
106
157
  async def _run_with_retry(
107
158
  self, func: Callable[..., Coroutine[Any, Any, Response]], *args, **kwargs
108
159
  ) -> Response:
@@ -1,5 +1,3 @@
1
- from itertools import chain
2
- from math import ceil
3
1
  from typing import Literal
4
2
 
5
3
  import httpx
@@ -25,62 +23,21 @@ class _AuditClient(_BaseClient):
25
23
  """
26
24
  return [
27
25
  User.model_validate(e)
28
- for e in self._get("https://api.anaplan.com/2/0/users").get("users")
26
+ for e in self._get_paginated("https://api.anaplan.com/2/0/users", "users")
29
27
  ]
30
28
 
31
29
  def get_events(self, days_into_past: int = 30, event_type: Event = "all") -> list:
32
30
  """
33
31
  Get audit events from Anaplan Audit API.
34
32
  :param days_into_past: The nuber of days into the past to get events for. The API provides
35
- data for up to 30 days.
33
+ data for up to 30 days.
36
34
  :param event_type: The type of events to get.
37
35
  :return: A list of audit events.
38
36
  """
39
- total = self._get_total(days_into_past, event_type)
40
- if total == 0:
41
- return []
42
- if total <= 10_000:
43
- return self._get_result_page(days_into_past, event_type)
44
-
45
- from concurrent.futures import ThreadPoolExecutor
46
-
47
- with ThreadPoolExecutor(max_workers=self._thread_count) as executor:
48
- futures = [
49
- executor.submit(
50
- self._get_result_page, days_into_past, event_type, self._limit, n * self._limit
51
- )
52
- for n in range(ceil(total / self._limit))
53
- ]
54
- results = [future.result() for future in futures]
55
- return list(chain.from_iterable(results))
56
-
57
- def _get_total(self, days_into_past: int = 60, event_type: Event = "all") -> int:
58
- return ( # noqa
59
- self._get(
60
- self._url,
61
- params={
62
- "limit": 0,
63
- "type": event_type,
64
- "intervalInHours": days_into_past * 24,
65
- },
66
- )
67
- )["meta"]["paging"]["totalSize"] # noqa
68
-
69
- def _get_result_page(
70
- self,
71
- days_into_past: int = 60,
72
- event_type: Event = "all",
73
- limit: int = 10_000,
74
- offset: int = 0,
75
- ) -> list:
76
- return (
77
- self._get(
37
+ return list(
38
+ self._get_paginated(
78
39
  self._url,
79
- params={
80
- "intervalInHours": days_into_past * 24,
81
- "limit": limit,
82
- "offset": offset,
83
- "type": event_type,
84
- },
40
+ "response",
41
+ params={"type": event_type, "intervalInHours": days_into_past * 24},
85
42
  )
86
- ).get("response", [])
43
+ )
@@ -199,8 +199,10 @@ class Client(_BaseClient):
199
199
  """
200
200
  return [
201
201
  Workspace.model_validate(e)
202
- for e in self._get("https://api.anaplan.com/2/0/workspaces?tenantDetails=true").get(
203
- "workspaces", []
202
+ for e in self._get_paginated(
203
+ "https://api.anaplan.com/2/0/workspaces",
204
+ "workspaces",
205
+ params={"tenantDetails": "true"},
204
206
  )
205
207
  ]
206
208
 
@@ -211,8 +213,8 @@ class Client(_BaseClient):
211
213
  """
212
214
  return [
213
215
  Model.model_validate(e)
214
- for e in self._get("https://api.anaplan.com/2/0/models?modelDetails=true").get(
215
- "models", []
216
+ for e in self._get_paginated(
217
+ "https://api.anaplan.com/2/0/models", "models", params={"modelDetails": "true"}
216
218
  )
217
219
  ]
218
220
 
@@ -221,7 +223,7 @@ class Client(_BaseClient):
221
223
  Lists all the Files in the Model.
222
224
  :return: The List of Files.
223
225
  """
224
- return [File.model_validate(e) for e in self._get(f"{self._url}/files").get("files", [])]
226
+ return [File.model_validate(e) for e in self._get_paginated(f"{self._url}/files", "files")]
225
227
 
226
228
  def list_actions(self) -> list[Action]:
227
229
  """
@@ -231,7 +233,7 @@ class Client(_BaseClient):
231
233
  :return: The List of Actions.
232
234
  """
233
235
  return [
234
- Action.model_validate(e) for e in (self._get(f"{self._url}/actions")).get("actions", [])
236
+ Action.model_validate(e) for e in self._get_paginated(f"{self._url}/actions", "actions")
235
237
  ]
236
238
 
237
239
  def list_processes(self) -> list[Process]:
@@ -241,7 +243,7 @@ class Client(_BaseClient):
241
243
  """
242
244
  return [
243
245
  Process.model_validate(e)
244
- for e in (self._get(f"{self._url}/processes")).get("processes", [])
246
+ for e in self._get_paginated(f"{self._url}/processes", "processes")
245
247
  ]
246
248
 
247
249
  def list_imports(self) -> list[Import]:
@@ -250,7 +252,7 @@ class Client(_BaseClient):
250
252
  :return: The List of Imports.
251
253
  """
252
254
  return [
253
- Import.model_validate(e) for e in (self._get(f"{self._url}/imports")).get("imports", [])
255
+ Import.model_validate(e) for e in self._get_paginated(f"{self._url}/imports", "imports")
254
256
  ]
255
257
 
256
258
  def list_exports(self) -> list[Export]:
@@ -400,8 +402,8 @@ class Client(_BaseClient):
400
402
  """
401
403
  return [
402
404
  TaskSummary.model_validate(e)
403
- for e in self._get(f"{self._url}/{action_url(action_id)}/{action_id}/tasks").get(
404
- "tasks", []
405
+ for e in self._get_paginated(
406
+ f"{self._url}/{action_url(action_id)}/{action_id}/tasks", "tasks"
405
407
  )
406
408
  ]
407
409
 
@@ -28,7 +28,9 @@ class _TransactionalClient(_BaseClient):
28
28
  Lists all the Modules in the Model.
29
29
  :return: The List of Modules.
30
30
  """
31
- return [Module.model_validate(e) for e in self._get(f"{self._url}/modules").get("modules")]
31
+ return [
32
+ Module.model_validate(e) for e in self._get_paginated(f"{self._url}/modules", "modules")
33
+ ]
32
34
 
33
35
  def get_model_status(self) -> ModelStatus:
34
36
  """
@@ -53,9 +55,9 @@ class _TransactionalClient(_BaseClient):
53
55
  def list_lists(self) -> list[List]:
54
56
  """
55
57
  Lists all the Lists in the Model.
56
- :return: All Lists on this Model.
58
+ :return: All Lists on this model.
57
59
  """
58
- return [List.model_validate(e) for e in self._get(f"{self._url}/lists").get("lists", [])]
60
+ return [List.model_validate(e) for e in self._get_paginated(f"{self._url}/lists", "lists")]
59
61
 
60
62
  def get_list_metadata(self, list_id: int) -> ListMetadata:
61
63
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anaplan-sdk
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Provides pythonic access to the Anaplan API
5
5
  Project-URL: Homepage, https://vinzenzklass.github.io/anaplan-sdk/
6
6
  Project-URL: Repository, https://github.com/VinzenzKlass/anaplan-sdk
@@ -0,0 +1,19 @@
1
+ anaplan_sdk/__init__.py,sha256=5fr-SZSsH6f3vkRUTDoK6xdAN31cCpe9Mwz2VNu47Uw,134
2
+ anaplan_sdk/_auth.py,sha256=0d495G_iU8vfpk29BJow7Jw2staf18nXqpJlSfaL9h8,5123
3
+ anaplan_sdk/_base.py,sha256=sRsM1z2QadTZ3HhX5NDH6NNRgGCJTy32sJB3cQzDT7E,8465
4
+ anaplan_sdk/exceptions.py,sha256=ALkA9fBF0NQ7dufFxV6AivjmHyuJk9DOQ9jtJV2n7f0,1809
5
+ anaplan_sdk/models.py,sha256=CpfFVJcW4AVwbAoI6GuPClbywjs2bWXOyH7Vrlnlo4o,16255
6
+ anaplan_sdk/_async_clients/__init__.py,sha256=wT6qfi4f_4vLFWTJQTsBw8r3DrHtoTIVqi88p5_j-Cg,259
7
+ anaplan_sdk/_async_clients/_alm.py,sha256=HtpwKNCc5eb6DUgS8nqNocxzaoaHOAMQPo0SaTMaD-A,4021
8
+ anaplan_sdk/_async_clients/_audit.py,sha256=t8tsQQ6v5kJXERAeAWEI1P9-vO5GsJCyWRTwh7EK1uw,1467
9
+ anaplan_sdk/_async_clients/_bulk.py,sha256=O2EiDRdGliYMovGESUvjy2HM0SwsQh9UTmayKmtnASc,22419
10
+ anaplan_sdk/_async_clients/_transactional.py,sha256=eKLT2s5cfnLmK7eqzhfAn8kwoYxEBYgSqwhDgZFA03k,7496
11
+ anaplan_sdk/_clients/__init__.py,sha256=FsbwvZC1FHrxuRXwbPxUzbhz_lO1DpXIxEOjx6-3QuA,219
12
+ anaplan_sdk/_clients/_alm.py,sha256=wzhibRuNzsK3PZM2EOI3OnSGHfv8CG2fuY5zLbnSqog,3912
13
+ anaplan_sdk/_clients/_audit.py,sha256=ae6szT0_OhaNWZUA9b3s2xnkYhSOKbrtnn0SKxmDeqI,1485
14
+ anaplan_sdk/_clients/_bulk.py,sha256=NUW26y0-9PO_4yatabZ3n47ld66nHbBVP7Fx3GbG8l8,22471
15
+ anaplan_sdk/_clients/_transactional.py,sha256=_ZrR40sNREZbaSkIzxpM9iMc85Wq9LDnytR8IlU9lqY,7331
16
+ anaplan_sdk-0.3.1.dist-info/METADATA,sha256=GSpp1wiTd-b1sEKq32K7FzXrc2kTgdio1PK1cUQJsIo,3617
17
+ anaplan_sdk-0.3.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
18
+ anaplan_sdk-0.3.1.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
19
+ anaplan_sdk-0.3.1.dist-info/RECORD,,
@@ -1,19 +0,0 @@
1
- anaplan_sdk/__init__.py,sha256=5fr-SZSsH6f3vkRUTDoK6xdAN31cCpe9Mwz2VNu47Uw,134
2
- anaplan_sdk/_auth.py,sha256=0d495G_iU8vfpk29BJow7Jw2staf18nXqpJlSfaL9h8,5123
3
- anaplan_sdk/_base.py,sha256=MEE6LpL788QTkrpAVsYI5hu3RfbzSMLGUj-QSW8-OU0,6160
4
- anaplan_sdk/exceptions.py,sha256=ALkA9fBF0NQ7dufFxV6AivjmHyuJk9DOQ9jtJV2n7f0,1809
5
- anaplan_sdk/models.py,sha256=CpfFVJcW4AVwbAoI6GuPClbywjs2bWXOyH7Vrlnlo4o,16255
6
- anaplan_sdk/_async_clients/__init__.py,sha256=wT6qfi4f_4vLFWTJQTsBw8r3DrHtoTIVqi88p5_j-Cg,259
7
- anaplan_sdk/_async_clients/_alm.py,sha256=HtpwKNCc5eb6DUgS8nqNocxzaoaHOAMQPo0SaTMaD-A,4021
8
- anaplan_sdk/_async_clients/_audit.py,sha256=wgJx58aDksWJLu4MU-tOz76KjG41AVzBW0v3jAEv9GE,2897
9
- anaplan_sdk/_async_clients/_bulk.py,sha256=X5W6-WgUYW9O2f8SIWy7IxjSv4vAz9fYL9jxpEzrpXQ,22354
10
- anaplan_sdk/_async_clients/_transactional.py,sha256=LlrEVc6c9cUD62PBlOCNjS0ALxqoHy5GZvadacyPbG8,7496
11
- anaplan_sdk/_clients/__init__.py,sha256=FsbwvZC1FHrxuRXwbPxUzbhz_lO1DpXIxEOjx6-3QuA,219
12
- anaplan_sdk/_clients/_alm.py,sha256=wzhibRuNzsK3PZM2EOI3OnSGHfv8CG2fuY5zLbnSqog,3912
13
- anaplan_sdk/_clients/_audit.py,sha256=jqj_sTGNUaM2jAu91Us747pVULntPUkL_qkA4nKc8so,2981
14
- anaplan_sdk/_clients/_bulk.py,sha256=3oOaUqjvHF-L-ThFK7joLMQ2iDSSFZ9y5mVUhW45fp8,22398
15
- anaplan_sdk/_clients/_transactional.py,sha256=2ssYdMY9vynQUwwigOvgSgi2-wbfXDQaAShLqXbVFSQ,7299
16
- anaplan_sdk-0.3.0.dist-info/METADATA,sha256=b4_PgGjPB-TPX2RV3R5PMLxozPjAnCqq6naA3BXLpNA,3617
17
- anaplan_sdk-0.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
18
- anaplan_sdk-0.3.0.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
19
- anaplan_sdk-0.3.0.dist-info/RECORD,,