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.
- anaplan_sdk/_async_clients/_alm.py +24 -31
- anaplan_sdk/_async_clients/_audit.py +7 -9
- anaplan_sdk/_async_clients/_bulk.py +66 -64
- anaplan_sdk/_async_clients/_cloud_works.py +36 -34
- anaplan_sdk/_async_clients/_cw_flow.py +13 -13
- anaplan_sdk/_async_clients/_transactional.py +40 -33
- anaplan_sdk/_clients/_alm.py +22 -31
- anaplan_sdk/_clients/_audit.py +7 -10
- anaplan_sdk/_clients/_bulk.py +63 -62
- anaplan_sdk/_clients/_cloud_works.py +32 -32
- anaplan_sdk/_clients/_cw_flow.py +13 -13
- anaplan_sdk/_clients/_transactional.py +42 -33
- anaplan_sdk/{_base.py → _services.py} +86 -72
- anaplan_sdk/models/__init__.py +2 -0
- anaplan_sdk/models/_bulk.py +2 -9
- {anaplan_sdk-0.5.0a1.dist-info → anaplan_sdk-0.5.0a2.dist-info}/METADATA +1 -1
- anaplan_sdk-0.5.0a2.dist-info/RECORD +30 -0
- anaplan_sdk-0.5.0a1.dist-info/RECORD +0 -30
- {anaplan_sdk-0.5.0a1.dist-info → anaplan_sdk-0.5.0a2.dist-info}/WHEEL +0 -0
- {anaplan_sdk-0.5.0a1.dist-info → anaplan_sdk-0.5.0a2.dist-info}/licenses/LICENSE +0 -0
@@ -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
|
44
|
-
def __init__(self, retry_count: int,
|
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
|
-
|
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
|
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
|
55
|
+
def get_binary(self, url: str) -> bytes:
|
53
56
|
return self.__run_with_retry(self._client.get, url).content
|
54
57
|
|
55
|
-
def
|
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
|
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
|
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
|
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
|
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
|
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
|
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.
|
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.
|
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
|
133
|
-
def __init__(
|
134
|
-
self.
|
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
|
-
|
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
|
139
|
-
return (await self.
|
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
|
142
|
-
return (await self.
|
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
|
155
|
+
async def post(self, url: str, json: dict | list) -> dict[str, Any]:
|
145
156
|
return (
|
146
|
-
await self.
|
157
|
+
await self._run_with_retry(self._client.post, url, headers=_json_header, json=json)
|
147
158
|
).json()
|
148
159
|
|
149
|
-
async def
|
150
|
-
res = await self.
|
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
|
164
|
+
async def patch(self, url: str, json: dict | list) -> dict[str, Any]:
|
154
165
|
return (
|
155
|
-
await self.
|
166
|
+
await self._run_with_retry(self._client.patch, url, headers=_json_header, json=json)
|
156
167
|
).json()
|
157
168
|
|
158
|
-
async def
|
159
|
-
return (await self.
|
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
|
162
|
-
res = await self.
|
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
|
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.
|
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
|
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.
|
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.
|
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.
|
196
|
+
logger.debug(f"Completed paginated fetch of {total_items} total items.")
|
203
197
|
return chain(first_page, *pages)
|
204
198
|
|
205
|
-
async def
|
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)):
|
anaplan_sdk/models/__init__.py
CHANGED
@@ -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
|
]
|
anaplan_sdk/models/_bulk.py
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
from typing import Literal, TypeAlias
|
2
2
|
|
3
|
-
from pydantic import
|
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(
|
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.
|
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,,
|
File without changes
|
File without changes
|