anaplan-sdk 0.5.0a1__py3-none-any.whl → 0.5.0a2__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.
@@ -2,12 +2,12 @@ import asyncio
2
2
  import logging
3
3
  import random
4
4
  import time
5
- from asyncio import gather
5
+ from asyncio import gather, sleep
6
6
  from concurrent.futures import ThreadPoolExecutor
7
7
  from gzip import compress
8
8
  from itertools import chain
9
9
  from math import ceil
10
- from typing import Any, Callable, Coroutine, Iterator, Literal, Type, TypeVar
10
+ from typing import Any, Awaitable, Callable, Coroutine, Iterator, Literal, Type, TypeVar
11
11
 
12
12
  import httpx
13
13
  from httpx import HTTPError, Response
@@ -18,6 +18,7 @@ from .models import (
18
18
  InsertionResult,
19
19
  ModelCalendar,
20
20
  MonthsQuartersYearsCalendar,
21
+ TaskSummary,
21
22
  WeeksGeneralCalendar,
22
23
  WeeksGroupingCalendar,
23
24
  WeeksPeriodsCalendar,
@@ -38,61 +39,50 @@ _json_header = {"Content-Type": "application/json"}
38
39
  _gzip_header = {"Content-Type": "application/x-gzip"}
39
40
 
40
41
  T = TypeVar("T", bound=AnaplanModel)
42
+ Task = TypeVar("Task", bound=TaskSummary)
41
43
 
42
44
 
43
- class _BaseClient:
44
- def __init__(self, retry_count: int, client: httpx.Client):
45
- self._retry_count = retry_count
45
+ class _HttpService:
46
+ def __init__(self, client: httpx.Client, retry_count: int, page_size: int, poll_delay: int):
46
47
  self._client = client
47
- logger.debug(f"Initialized BaseClient with retry_count={retry_count}.")
48
+ self._retry_count = retry_count
49
+ self._poll_delay = poll_delay
50
+ self._page_size = min(page_size, 5_000)
48
51
 
49
- def _get(self, url: str, **kwargs) -> dict[str, Any]:
52
+ def get(self, url: str, **kwargs) -> dict[str, Any]:
50
53
  return self.__run_with_retry(self._client.get, url, **kwargs).json()
51
54
 
52
- def _get_binary(self, url: str) -> bytes:
55
+ def get_binary(self, url: str) -> bytes:
53
56
  return self.__run_with_retry(self._client.get, url).content
54
57
 
55
- def _post(self, url: str, json: dict | list) -> dict[str, Any]:
58
+ def post(self, url: str, json: dict | list) -> dict[str, Any]:
56
59
  return self.__run_with_retry(self._client.post, url, headers=_json_header, json=json).json()
57
60
 
58
- def _put(self, url: str, json: dict | list) -> dict[str, Any]:
61
+ def put(self, url: str, json: dict | list) -> dict[str, Any]:
59
62
  res = self.__run_with_retry(self._client.put, url, headers=_json_header, json=json)
60
63
  return res.json() if res.num_bytes_downloaded > 0 else {}
61
64
 
62
- def _patch(self, url: str, json: dict | list) -> dict[str, Any]:
65
+ def patch(self, url: str, json: dict | list) -> dict[str, Any]:
63
66
  return (
64
67
  self.__run_with_retry(self._client.patch, url, headers=_json_header, json=json)
65
68
  ).json()
66
69
 
67
- def _delete(self, url: str) -> dict[str, Any]:
70
+ def delete(self, url: str) -> dict[str, Any]:
68
71
  return (self.__run_with_retry(self._client.delete, url, headers=_json_header)).json()
69
72
 
70
- def _post_empty(self, url: str, **kwargs) -> dict[str, Any]:
73
+ def post_empty(self, url: str, **kwargs) -> dict[str, Any]:
71
74
  res = self.__run_with_retry(self._client.post, url, **kwargs)
72
75
  return res.json() if res.num_bytes_downloaded > 0 else {}
73
76
 
74
- def _put_binary_gzip(self, url: str, content: str | bytes) -> Response:
77
+ def put_binary_gzip(self, url: str, content: str | bytes) -> Response:
75
78
  content = compress(content.encode() if isinstance(content, str) else content)
76
79
  return self.__run_with_retry(self._client.put, url, headers=_gzip_header, content=content)
77
80
 
78
- def __get_page(self, url: str, limit: int, offset: int, result_key: str, **kwargs) -> list:
79
- logger.debug(f"Fetching page: offset={offset}, limit={limit} from {url}.")
80
- kwargs["params"] = kwargs.get("params") or {} | {"limit": limit, "offset": offset}
81
- return self._get(url, **kwargs).get(result_key, [])
82
-
83
- def __get_first_page(self, url: str, limit: int, result_key: str, **kwargs) -> tuple[list, int]:
84
- logger.debug(f"Fetching first page with limit={limit} from {url}.")
85
- kwargs["params"] = kwargs.get("params") or {} | {"limit": limit}
86
- res = self._get(url, **kwargs)
87
- total_items, first_page = res["meta"]["paging"]["totalSize"], res.get(result_key, [])
88
- logger.debug(f"Found {total_items} total items, retrieved {len(first_page)} in first page.")
89
- return first_page, total_items
90
-
91
- def _get_paginated(
81
+ def get_paginated(
92
82
  self, url: str, result_key: str, page_size: int = 5_000, **kwargs
93
83
  ) -> Iterator[dict[str, Any]]:
94
84
  logger.debug(f"Starting paginated fetch from {url} with page_size={page_size}.")
95
- first_page, total_items = self.__get_first_page(url, page_size, result_key, **kwargs)
85
+ first_page, total_items = self._get_first_page(url, page_size, result_key, **kwargs)
96
86
  if total_items <= page_size:
97
87
  logger.debug("All items fit in first page, no additional requests needed.")
98
88
  return iter(first_page)
@@ -101,12 +91,30 @@ class _BaseClient:
101
91
  logger.debug(f"Fetching {pages_needed - 1} additional pages with {page_size} items each.")
102
92
  with ThreadPoolExecutor() as executor:
103
93
  pages = executor.map(
104
- lambda n: self.__get_page(url, page_size, n * page_size, result_key, **kwargs),
94
+ lambda n: self._get_page(url, page_size, n * page_size, result_key, **kwargs),
105
95
  range(1, pages_needed),
106
96
  )
107
97
  logger.debug(f"Completed paginated fetch of {total_items} total items.")
108
98
  return chain(first_page, *pages)
109
99
 
100
+ def poll_task(self, func: Callable[..., Task], *args) -> Task:
101
+ while (result := func(*args)).task_state != "COMPLETE":
102
+ time.sleep(self._poll_delay)
103
+ return result
104
+
105
+ def _get_page(self, url: str, limit: int, offset: int, result_key: str, **kwargs) -> list:
106
+ logger.debug(f"Fetching page: offset={offset}, limit={limit} from {url}.")
107
+ kwargs["params"] = kwargs.get("params") or {} | {"limit": limit, "offset": offset}
108
+ return self.get(url, **kwargs).get(result_key, [])
109
+
110
+ def _get_first_page(self, url: str, limit: int, result_key: str, **kwargs) -> tuple[list, int]:
111
+ logger.debug(f"Fetching first page with limit={limit} from {url}.")
112
+ kwargs["params"] = kwargs.get("params") or {} | {"limit": limit}
113
+ res = self.get(url, **kwargs)
114
+ total_items, first_page = res["meta"]["paging"]["totalSize"], res.get(result_key, [])
115
+ logger.debug(f"Found {total_items} total items, retrieved {len(first_page)} in first page.")
116
+ return first_page, total_items
117
+
110
118
  def __run_with_retry(self, func: Callable[..., Response], *args, **kwargs) -> Response:
111
119
  for i in range(max(self._retry_count, 1)):
112
120
  try:
@@ -129,80 +137,86 @@ class _BaseClient:
129
137
  raise AnaplanException("Exhausted all retries without a successful response or Error.")
130
138
 
131
139
 
132
- class _AsyncBaseClient:
133
- def __init__(self, retry_count: int, client: httpx.AsyncClient):
134
- self._retry_count = retry_count
140
+ class _AsyncHttpService:
141
+ def __init__(
142
+ self, client: httpx.AsyncClient, retry_count: int, page_size: int, poll_delay: int
143
+ ):
135
144
  self._client = client
136
- logger.debug(f"Initialized AsyncBaseClient with retry_count={retry_count}.")
145
+ self._retry_count = retry_count
146
+ self._poll_delay = poll_delay
147
+ self._page_size = min(page_size, 5_000)
137
148
 
138
- async def _get(self, url: str, **kwargs) -> dict[str, Any]:
139
- return (await self.__run_with_retry(self._client.get, url, **kwargs)).json()
149
+ async def get(self, url: str, **kwargs) -> dict[str, Any]:
150
+ return (await self._run_with_retry(self._client.get, url, **kwargs)).json()
140
151
 
141
- async def _get_binary(self, url: str) -> bytes:
142
- return (await self.__run_with_retry(self._client.get, url)).content
152
+ async def get_binary(self, url: str) -> bytes:
153
+ return (await self._run_with_retry(self._client.get, url)).content
143
154
 
144
- async def _post(self, url: str, json: dict | list) -> dict[str, Any]:
155
+ async def post(self, url: str, json: dict | list) -> dict[str, Any]:
145
156
  return (
146
- await self.__run_with_retry(self._client.post, url, headers=_json_header, json=json)
157
+ await self._run_with_retry(self._client.post, url, headers=_json_header, json=json)
147
158
  ).json()
148
159
 
149
- async def _put(self, url: str, json: dict | list) -> dict[str, Any]:
150
- res = await self.__run_with_retry(self._client.put, url, headers=_json_header, json=json)
160
+ async def put(self, url: str, json: dict | list) -> dict[str, Any]:
161
+ res = await self._run_with_retry(self._client.put, url, headers=_json_header, json=json)
151
162
  return res.json() if res.num_bytes_downloaded > 0 else {}
152
163
 
153
- async def _patch(self, url: str, json: dict | list) -> dict[str, Any]:
164
+ async def patch(self, url: str, json: dict | list) -> dict[str, Any]:
154
165
  return (
155
- await self.__run_with_retry(self._client.patch, url, headers=_json_header, json=json)
166
+ await self._run_with_retry(self._client.patch, url, headers=_json_header, json=json)
156
167
  ).json()
157
168
 
158
- async def _delete(self, url: str) -> dict[str, Any]:
159
- return (await self.__run_with_retry(self._client.delete, url, headers=_json_header)).json()
169
+ async def delete(self, url: str) -> dict[str, Any]:
170
+ return (await self._run_with_retry(self._client.delete, url, headers=_json_header)).json()
160
171
 
161
- async def _post_empty(self, url: str, **kwargs) -> dict[str, Any]:
162
- res = await self.__run_with_retry(self._client.post, url, **kwargs)
172
+ async def post_empty(self, url: str, **kwargs) -> dict[str, Any]:
173
+ res = await self._run_with_retry(self._client.post, url, **kwargs)
163
174
  return res.json() if res.num_bytes_downloaded > 0 else {}
164
175
 
165
- async def _put_binary_gzip(self, url: str, content: str | bytes) -> Response:
176
+ async def put_binary_gzip(self, url: str, content: str | bytes) -> Response:
166
177
  content = compress(content.encode() if isinstance(content, str) else content)
167
- return await self.__run_with_retry(
178
+ return await self._run_with_retry(
168
179
  self._client.put, url, headers=_gzip_header, content=content
169
180
  )
170
181
 
171
- async def __get_page(
172
- self, url: str, limit: int, offset: int, result_key: str, **kwargs
173
- ) -> list:
174
- logger.debug(f"Fetching page: offset={offset}, limit={limit} from {url}.")
175
- kwargs["params"] = kwargs.get("params") or {} | {"limit": limit, "offset": offset}
176
- return (await self._get(url, **kwargs)).get(result_key, [])
177
-
178
- async def __get_first_page(
179
- self, url: str, limit: int, result_key: str, **kwargs
180
- ) -> tuple[list, int]:
181
- logger.debug(f"Fetching first page with limit={limit} from {url}.")
182
- kwargs["params"] = kwargs.get("params") or {} | {"limit": limit}
183
- res = await self._get(url, **kwargs)
184
- total_items, first_page = res["meta"]["paging"]["totalSize"], res.get(result_key, [])
185
- logger.debug(f"Found {total_items} total items, retrieved {len(first_page)} in first page.")
186
- return first_page, total_items
187
-
188
- async def _get_paginated(
182
+ async def get_paginated(
189
183
  self, url: str, result_key: str, page_size: int = 5_000, **kwargs
190
184
  ) -> Iterator[dict[str, Any]]:
191
185
  logger.debug(f"Starting paginated fetch from {url} with page_size={page_size}.")
192
- first_page, total_items = await self.__get_first_page(url, page_size, result_key, **kwargs)
186
+ first_page, total_items = await self._get_first_page(url, page_size, result_key, **kwargs)
193
187
  if total_items <= page_size:
194
188
  logger.debug("All items fit in first page, no additional requests needed.")
195
189
  return iter(first_page)
196
190
  pages = await gather(
197
191
  *(
198
- self.__get_page(url, page_size, n * page_size, result_key, **kwargs)
192
+ self._get_page(url, page_size, n * page_size, result_key, **kwargs)
199
193
  for n in range(1, ceil(total_items / page_size))
200
194
  )
201
195
  )
202
- logger.info(f"Completed paginated fetch of {total_items} total items.")
196
+ logger.debug(f"Completed paginated fetch of {total_items} total items.")
203
197
  return chain(first_page, *pages)
204
198
 
205
- async def __run_with_retry(
199
+ async def poll_task(self, func: Callable[..., Awaitable[Task]], *args) -> Task:
200
+ while (result := await func(*args)).task_state != "COMPLETE":
201
+ await sleep(self._poll_delay)
202
+ return result
203
+
204
+ async def _get_page(self, url: str, limit: int, offset: int, result_key: str, **kwargs) -> list:
205
+ logger.debug(f"Fetching page: offset={offset}, limit={limit} from {url}.")
206
+ kwargs["params"] = kwargs.get("params") or {} | {"limit": limit, "offset": offset}
207
+ return (await self.get(url, **kwargs)).get(result_key, [])
208
+
209
+ async def _get_first_page(
210
+ self, url: str, limit: int, result_key: str, **kwargs
211
+ ) -> tuple[list, int]:
212
+ logger.debug(f"Fetching first page with limit={limit} from {url}.")
213
+ kwargs["params"] = kwargs.get("params") or {} | {"limit": limit}
214
+ res = await self.get(url, **kwargs)
215
+ total_items, first_page = res["meta"]["paging"]["totalSize"], res.get(result_key, [])
216
+ logger.debug(f"Found {total_items} total items, retrieved {len(first_page)} in first page.")
217
+ return first_page, total_items
218
+
219
+ async def _run_with_retry(
206
220
  self, func: Callable[..., Coroutine[Any, Any, Response]], *args, **kwargs
207
221
  ) -> Response:
208
222
  for i in range(max(self._retry_count, 1)):
@@ -34,6 +34,7 @@ from ._transactional import (
34
34
  FiscalYear,
35
35
  InsertionResult,
36
36
  LineItem,
37
+ ListDeletionResult,
37
38
  ListItem,
38
39
  ModelCalendar,
39
40
  ModelStatus,
@@ -91,4 +92,5 @@ __all__ = [
91
92
  "ModelCalendar",
92
93
  "ModelDeletionResult",
93
94
  "DimensionWithCode",
95
+ "ListDeletionResult",
94
96
  ]
@@ -1,7 +1,6 @@
1
1
  from typing import Literal, TypeAlias
2
2
 
3
- from pydantic import ConfigDict, Field, field_validator
4
- from pydantic.alias_generators import to_camel
3
+ from pydantic import Field, field_validator
5
4
 
6
5
  from ._base import AnaplanModel
7
6
 
@@ -164,13 +163,7 @@ class TaskResult(AnaplanModel):
164
163
  )
165
164
 
166
165
 
167
- class TaskStatus(AnaplanModel):
168
- model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
169
- id: str = Field(validation_alias="taskId", description="The unique identifier of this task.")
170
- task_state: Literal["NOT_STARTED", "IN_PROGRESS", "COMPLETE"] = Field(
171
- description="The state of this task."
172
- )
173
- creation_time: int = Field(description="Unix timestamp of when this task was created.")
166
+ class TaskStatus(TaskSummary):
174
167
  progress: float = Field(description="The progress of this task as a float between 0 and 1.")
175
168
  current_step: str | None = Field(None, description="The current step of this task.")
176
169
  result: TaskResult | None = Field(None)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anaplan-sdk
3
- Version: 0.5.0a1
3
+ Version: 0.5.0a2
4
4
  Summary: Streamlined Python Interface for Anaplan
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,30 @@
1
+ anaplan_sdk/__init__.py,sha256=WScEKtXlnRLjCb-j3qW9W4kEACTyPsTLFs-L54et2TQ,351
2
+ anaplan_sdk/_auth.py,sha256=l5z2WCcfQ05OkuQ1dcmikp6dB87Rw1qy2zu8bbaAQTs,16620
3
+ anaplan_sdk/_oauth.py,sha256=AynlJDrGIinQT0jwxI2RSvtU4D7Wasyw3H1uicdlLVI,12672
4
+ anaplan_sdk/_services.py,sha256=slsFFx_fCQSfKZo_G0HzEFGErvmEerSMyaVwLXUPCtU,17158
5
+ anaplan_sdk/exceptions.py,sha256=ALkA9fBF0NQ7dufFxV6AivjmHyuJk9DOQ9jtJV2n7f0,1809
6
+ anaplan_sdk/_async_clients/__init__.py,sha256=pZXgMMg4S9Aj_pxQCaSiPuNG-sePVGBtNJ0133VjqW4,364
7
+ anaplan_sdk/_async_clients/_alm.py,sha256=rhVhykUo6wIvA1SBQkpEAviSsVLURumi_3XQlxTf7z8,12788
8
+ anaplan_sdk/_async_clients/_audit.py,sha256=dipSzp4jMvRCHJAVMQfO854_wpmIcYEDinEPSGdoms4,2342
9
+ anaplan_sdk/_async_clients/_bulk.py,sha256=sUDWT01JcN-IWc5RY0thcAA45k54x6lO-lN2WMoCrZE,27278
10
+ anaplan_sdk/_async_clients/_cloud_works.py,sha256=ecm7DqT39J56xQwYxJMKd_ZVqxzXZdpmagwJUvqKBj4,17613
11
+ anaplan_sdk/_async_clients/_cw_flow.py,sha256=PTi-jKeRtYgibqrcE7SCsEgus18nE7ZCs7Awzk4u6Dk,3981
12
+ anaplan_sdk/_async_clients/_transactional.py,sha256=dRh4poYLWcV0kJyCG0MSFzJCzLW7fZ_1-j3c_Lx7zHY,17203
13
+ anaplan_sdk/_clients/__init__.py,sha256=FsbwvZC1FHrxuRXwbPxUzbhz_lO1DpXIxEOjx6-3QuA,219
14
+ anaplan_sdk/_clients/_alm.py,sha256=_LlZIRCE3HxZ4OzU13LOGnX4MQ26j2puSPTy9WGJa3o,12515
15
+ anaplan_sdk/_clients/_audit.py,sha256=9mq7VGYsl6wOdIU7G3GvzP3O7r1ZDCFg5eAu7k4RgxM,2154
16
+ anaplan_sdk/_clients/_bulk.py,sha256=Aw2cu8fAQ0lb4kc0kuYtVXr1BMuEry2yR7dlPR8CBEc,27330
17
+ anaplan_sdk/_clients/_cloud_works.py,sha256=b7LpFcRbUxcN7_9_5GgVIlGf1X1ZmQWFZgnCQKaU55s,17405
18
+ anaplan_sdk/_clients/_cw_flow.py,sha256=rwoQRdtxaigdBavr4LHtnrWsNpAgzt2zuIJOFV9ZE50,3870
19
+ anaplan_sdk/_clients/_transactional.py,sha256=avqww59ccM3FqYMeK1oE-8UH4jyk_pKSCETzhSGKyxA,16936
20
+ anaplan_sdk/models/__init__.py,sha256=zfwDQJQrXuLEXSpbJcm08a_YK1P7a7u-kMhwtJiJFmA,1783
21
+ anaplan_sdk/models/_alm.py,sha256=oeENd0YM7-LoIRBq2uATIQTxVgIP9rXx3UZE2UnQAp0,4670
22
+ anaplan_sdk/models/_base.py,sha256=6AZc9CfireUKgpZfMxYKu4MbwiyHQOsGLjKrxGXBLic,508
23
+ anaplan_sdk/models/_bulk.py,sha256=S72qujNr5STdiyKaCEvrQjKYHik_aemiJFNKE7docpI,8405
24
+ anaplan_sdk/models/_transactional.py,sha256=2bH10zvtMb5Lfh6DC7iQk72aEwq6tyLQ-XnH_0wYSqI,14172
25
+ anaplan_sdk/models/cloud_works.py,sha256=nfn_LHPR-KmW7Tpvz-5qNCzmR8SYgvsVV-lx5iDlyqI,19425
26
+ anaplan_sdk/models/flows.py,sha256=SuLgNj5-2SeE3U1i8iY8cq2IkjuUgd_3M1n2ENructk,3625
27
+ anaplan_sdk-0.5.0a2.dist-info/METADATA,sha256=82p3Dx0kw_5MNBdZYtbNzsCC8s7GM6hnFqpdpan-Ggo,3669
28
+ anaplan_sdk-0.5.0a2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
29
+ anaplan_sdk-0.5.0a2.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
30
+ anaplan_sdk-0.5.0a2.dist-info/RECORD,,
@@ -1,30 +0,0 @@
1
- anaplan_sdk/__init__.py,sha256=WScEKtXlnRLjCb-j3qW9W4kEACTyPsTLFs-L54et2TQ,351
2
- anaplan_sdk/_auth.py,sha256=l5z2WCcfQ05OkuQ1dcmikp6dB87Rw1qy2zu8bbaAQTs,16620
3
- anaplan_sdk/_base.py,sha256=i7NznGMnI9tVQB5mXo5DakSRmvWoDOgfkOMWQGNiXOI,16616
4
- anaplan_sdk/_oauth.py,sha256=AynlJDrGIinQT0jwxI2RSvtU4D7Wasyw3H1uicdlLVI,12672
5
- anaplan_sdk/exceptions.py,sha256=ALkA9fBF0NQ7dufFxV6AivjmHyuJk9DOQ9jtJV2n7f0,1809
6
- anaplan_sdk/_async_clients/__init__.py,sha256=pZXgMMg4S9Aj_pxQCaSiPuNG-sePVGBtNJ0133VjqW4,364
7
- anaplan_sdk/_async_clients/_alm.py,sha256=pL-l9EBkbR_M7FbIpKo-YPi265busEhqJn2fB0syVsA,13063
8
- anaplan_sdk/_async_clients/_audit.py,sha256=tsMydMxepKW9NVAVpqoC48sfmKKC7bJoljUycWfxipA,2396
9
- anaplan_sdk/_async_clients/_bulk.py,sha256=OcCzvMhbQjJBbeyVw6J5o3Kipa7Tfv0fJcS5MAcIZn4,26708
10
- anaplan_sdk/_async_clients/_cloud_works.py,sha256=miTgllBKcd5-kKjy5XIdMzndQnyR2DngEN8ldS7t_Rg,17529
11
- anaplan_sdk/_async_clients/_cw_flow.py,sha256=gb7UhKuYI0Z1ftEeLKtx-oWmaqDJN_RTRdiOm2ZkjFM,3991
12
- anaplan_sdk/_async_clients/_transactional.py,sha256=9TbFaOYG3cPUPwgQosTtFWXQ6G2PiU3P8r5Mw1p4-dk,17063
13
- anaplan_sdk/_clients/__init__.py,sha256=FsbwvZC1FHrxuRXwbPxUzbhz_lO1DpXIxEOjx6-3QuA,219
14
- anaplan_sdk/_clients/_alm.py,sha256=IS9G7B8MI9ACucxBKdA60p8Bz3-FsywleNK6g3_cK50,12788
15
- anaplan_sdk/_clients/_audit.py,sha256=zjzuU0YS1XViBKZfIVJXAivIsskuJQRyU22DRnpSHZo,2265
16
- anaplan_sdk/_clients/_bulk.py,sha256=bIzu6wd0JbwwQdK4-tp25gVrx3Q7V2NNrV7fFe6TkPg,26760
17
- anaplan_sdk/_clients/_cloud_works.py,sha256=bFtIgexOS6oXftrTL-o2E1v5H8CzNxDy-vHAlUxdKJg,17334
18
- anaplan_sdk/_clients/_cw_flow.py,sha256=F7zoZ4CEpXe7FcGTJO9y2vJC5cd7Jz-ipTnlsk4Q-dA,3867
19
- anaplan_sdk/_clients/_transactional.py,sha256=rEa9VdgTFYQkzij9nBGdur7KbWDq_RrkiuwE25FZ0ic,16767
20
- anaplan_sdk/models/__init__.py,sha256=8qS16lOb2cKxbHzqMkTK0bYvzolucppqD1I7Xx1I5rc,1731
21
- anaplan_sdk/models/_alm.py,sha256=oeENd0YM7-LoIRBq2uATIQTxVgIP9rXx3UZE2UnQAp0,4670
22
- anaplan_sdk/models/_base.py,sha256=6AZc9CfireUKgpZfMxYKu4MbwiyHQOsGLjKrxGXBLic,508
23
- anaplan_sdk/models/_bulk.py,sha256=WL0OPNbsYo7lpx-vrk_GLvQXZijxfpE0kleqfQifRyg,8868
24
- anaplan_sdk/models/_transactional.py,sha256=2bH10zvtMb5Lfh6DC7iQk72aEwq6tyLQ-XnH_0wYSqI,14172
25
- anaplan_sdk/models/cloud_works.py,sha256=nfn_LHPR-KmW7Tpvz-5qNCzmR8SYgvsVV-lx5iDlyqI,19425
26
- anaplan_sdk/models/flows.py,sha256=SuLgNj5-2SeE3U1i8iY8cq2IkjuUgd_3M1n2ENructk,3625
27
- anaplan_sdk-0.5.0a1.dist-info/METADATA,sha256=e9ldeBTGI3rqZ9o8VsK_rCl4e2BOqCRIW_Zl5B4UH4U,3669
28
- anaplan_sdk-0.5.0a1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
29
- anaplan_sdk-0.5.0a1.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
30
- anaplan_sdk-0.5.0a1.dist-info/RECORD,,