anaplan-sdk 0.4.0a2__py3-none-any.whl → 0.4.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.
- anaplan_sdk/_async_clients/_bulk.py +5 -0
- anaplan_sdk/_async_clients/_transactional.py +26 -4
- anaplan_sdk/_auth.py +13 -5
- anaplan_sdk/_base.py +1 -5
- anaplan_sdk/_clients/_bulk.py +6 -2
- anaplan_sdk/_clients/_transactional.py +26 -4
- anaplan_sdk/models/_base.py +1 -6
- anaplan_sdk/models/cloud_works.py +5 -9
- {anaplan_sdk-0.4.0a2.dist-info → anaplan_sdk-0.4.1.dist-info}/METADATA +4 -4
- {anaplan_sdk-0.4.0a2.dist-info → anaplan_sdk-0.4.1.dist-info}/RECORD +12 -12
- {anaplan_sdk-0.4.0a2.dist-info → anaplan_sdk-0.4.1.dist-info}/WHEEL +0 -0
- {anaplan_sdk-0.4.0a2.dist-info → anaplan_sdk-0.4.1.dist-info}/licenses/LICENSE +0 -0
@@ -56,6 +56,7 @@ class AsyncClient(_AsyncBaseClient):
|
|
56
56
|
redirect_uri: str | None = None,
|
57
57
|
refresh_token: str | None = None,
|
58
58
|
oauth2_scope: str = "openid profile email offline_access",
|
59
|
+
on_auth_code: Callable[[str], str] | None = None,
|
59
60
|
on_token_refresh: Callable[[dict[str, str]], None] | None = None,
|
60
61
|
timeout: float | httpx.Timeout = 30,
|
61
62
|
retry_count: int = 2,
|
@@ -91,6 +92,9 @@ class AsyncClient(_AsyncBaseClient):
|
|
91
92
|
:param refresh_token: If you have a valid refresh token, you can pass it to skip the
|
92
93
|
interactive authentication code step.
|
93
94
|
:param oauth2_scope: The scope of the Oauth2 token, if you want to narrow it.
|
95
|
+
:param on_auth_code: A callback that takes the redirect URI as a single argument and must
|
96
|
+
return the entire response URI. This will substitute the interactive
|
97
|
+
authentication code step in the terminal.
|
94
98
|
:param on_token_refresh: A callback function that is called whenever the token is refreshed.
|
95
99
|
With this you can for example securely store the token in your
|
96
100
|
application or on your server for later reuse. The function
|
@@ -124,6 +128,7 @@ class AsyncClient(_AsyncBaseClient):
|
|
124
128
|
redirect_uri=redirect_uri,
|
125
129
|
refresh_token=refresh_token,
|
126
130
|
oauth2_scope=oauth2_scope,
|
131
|
+
on_auth_code=on_auth_code,
|
127
132
|
on_token_refresh=on_token_refresh,
|
128
133
|
)
|
129
134
|
),
|
@@ -92,7 +92,15 @@ class _AsyncTransactionalClient(_AsyncBaseClient):
|
|
92
92
|
"""
|
93
93
|
Insert new items to the given list. The items must be a list of dictionaries with at least
|
94
94
|
the keys `code` and `name`. You can optionally pass further keys for parents, extra
|
95
|
-
properties etc.
|
95
|
+
properties etc. If you pass a long list, it will be split into chunks of 100,000 items, the
|
96
|
+
maximum allowed by the API.
|
97
|
+
|
98
|
+
**Warning**: If one or some of the requests timeout during large batch operations, the
|
99
|
+
operation may actually complete on the server. Retries for these chunks will then report
|
100
|
+
these items as "ignored" rather than "added", leading to misleading results. The results in
|
101
|
+
Anaplan will be correct, but this function may report otherwise. Be generous with your
|
102
|
+
timeouts and retries if you are using this function for large batch operations.
|
103
|
+
|
96
104
|
:param list_id: The ID of the List.
|
97
105
|
:param items: The items to insert into the List.
|
98
106
|
:return: The result of the insertion, indicating how many items were added,
|
@@ -123,7 +131,16 @@ class _AsyncTransactionalClient(_AsyncBaseClient):
|
|
123
131
|
|
124
132
|
async def delete_list_items(self, list_id: int, items: list[dict[str, str | int]]) -> int:
|
125
133
|
"""
|
126
|
-
Deletes items from a List.
|
134
|
+
Deletes items from a List. If you pass a long list, it will be split into chunks of 100,000
|
135
|
+
items, the maximum allowed by the API.
|
136
|
+
|
137
|
+
**Warning**: If one or some of the requests timeout during large batch operations, the
|
138
|
+
operation may actually complete on the server. Retries for these chunks will then report
|
139
|
+
none of these items as deleted, since on the retry none are removed, leading to misleading
|
140
|
+
results. The results in Anaplan will be correct, but this function may report otherwise.
|
141
|
+
Be generous with your timeouts and retries if you are using this function for large batch
|
142
|
+
operations.
|
143
|
+
|
127
144
|
:param list_id: The ID of the List.
|
128
145
|
:param items: The items to delete from the List. Must be a dict with either `code` or `id`
|
129
146
|
as the keys to identify the records to delete.
|
@@ -158,8 +175,13 @@ class _AsyncTransactionalClient(_AsyncBaseClient):
|
|
158
175
|
"""
|
159
176
|
Write the passed items to the specified module. If successful, the number of cells changed
|
160
177
|
is returned, if only partially successful or unsuccessful, the response with the according
|
161
|
-
details is returned instead.
|
162
|
-
|
178
|
+
details is returned instead.
|
179
|
+
|
180
|
+
**You can update a maximum of 100,000 cells or 15 MB of data (whichever is lower) in a
|
181
|
+
single request.** You must chunk your data accordingly. This is not done by this SDK,
|
182
|
+
since it is discouraged. For larger imports, you should use the Bulk API instead.
|
183
|
+
|
184
|
+
For more details see: https://anaplan.docs.apiary.io/#UpdateModuleCellData.
|
163
185
|
:param module_id: The ID of the Module.
|
164
186
|
:param data: The data to write to the Module.
|
165
187
|
:return: The number of cells changed or the response with the according error details.
|
anaplan_sdk/_auth.py
CHANGED
@@ -144,6 +144,7 @@ class AnaplanOauth2AuthCodeAuth(_AnaplanAuth):
|
|
144
144
|
redirect_uri: str,
|
145
145
|
refresh_token: str | None = None,
|
146
146
|
scope: str = "openid profile email offline_access",
|
147
|
+
on_auth_code: Callable[[str], str] | None = None,
|
147
148
|
on_token_refresh: Callable[[dict[str, str]], None] | None = None,
|
148
149
|
):
|
149
150
|
try:
|
@@ -163,6 +164,7 @@ class AnaplanOauth2AuthCodeAuth(_AnaplanAuth):
|
|
163
164
|
self._refresh_token = refresh_token
|
164
165
|
self._scope = scope
|
165
166
|
self._id_token = None
|
167
|
+
self._on_auth_code = on_auth_code
|
166
168
|
self._on_token_refresh = on_token_refresh
|
167
169
|
if not refresh_token:
|
168
170
|
self.__auth_code_flow()
|
@@ -195,13 +197,17 @@ class AnaplanOauth2AuthCodeAuth(_AnaplanAuth):
|
|
195
197
|
try:
|
196
198
|
logger.info("Creating Authentication Token with OAuth2 Authorization Code Flow.")
|
197
199
|
url, _, _ = self._oauth.prepare_authorization_request(
|
198
|
-
"https://us1a.app.anaplan.com/auth/
|
200
|
+
"https://us1a.app.anaplan.com/auth/prelogin",
|
199
201
|
redirect_url=self._redirect_uri,
|
200
202
|
scope=self._scope,
|
201
203
|
)
|
202
|
-
authorization_response =
|
203
|
-
|
204
|
-
|
204
|
+
authorization_response = (
|
205
|
+
self._on_auth_code(url)
|
206
|
+
if self._on_auth_code
|
207
|
+
else input(
|
208
|
+
f"Please go to {url} and authorize the app.\n"
|
209
|
+
"Then paste the entire redirect URL here: "
|
210
|
+
)
|
205
211
|
)
|
206
212
|
url, headers, body = self._oauth.prepare_token_request(
|
207
213
|
token_url=self._token_url,
|
@@ -211,7 +217,7 @@ class AnaplanOauth2AuthCodeAuth(_AnaplanAuth):
|
|
211
217
|
)
|
212
218
|
self._parse_auth_response(httpx.post(url=url, headers=headers, content=body))
|
213
219
|
except (httpx.HTTPError, ValueError, TypeError, OAuth2Error) as error:
|
214
|
-
raise
|
220
|
+
raise InvalidCredentialsException("Error during OAuth2 authorization flow.") from error
|
215
221
|
|
216
222
|
|
217
223
|
def create_auth(
|
@@ -225,6 +231,7 @@ def create_auth(
|
|
225
231
|
redirect_uri: str | None = None,
|
226
232
|
refresh_token: str | None = None,
|
227
233
|
oauth2_scope: str = "openid profile email offline_access",
|
234
|
+
on_auth_code: Callable[[str], str] | None = None,
|
228
235
|
on_token_refresh: Callable[[dict[str, str]], None] | None = None,
|
229
236
|
) -> _AnaplanAuth:
|
230
237
|
if certificate and private_key:
|
@@ -238,6 +245,7 @@ def create_auth(
|
|
238
245
|
redirect_uri=redirect_uri,
|
239
246
|
refresh_token=refresh_token,
|
240
247
|
scope=oauth2_scope,
|
248
|
+
on_auth_code=on_auth_code,
|
241
249
|
on_token_refresh=on_token_refresh,
|
242
250
|
)
|
243
251
|
raise ValueError(
|
anaplan_sdk/_base.py
CHANGED
@@ -12,11 +12,7 @@ from typing import Any, Callable, Coroutine, Iterator, Literal, Type, TypeVar
|
|
12
12
|
import httpx
|
13
13
|
from httpx import HTTPError, Response
|
14
14
|
|
15
|
-
from .exceptions import
|
16
|
-
AnaplanException,
|
17
|
-
AnaplanTimeoutException,
|
18
|
-
InvalidIdentifierException,
|
19
|
-
)
|
15
|
+
from .exceptions import AnaplanException, AnaplanTimeoutException, InvalidIdentifierException
|
20
16
|
from .models import AnaplanModel
|
21
17
|
from .models.cloud_works import (
|
22
18
|
AmazonS3ConnectionInput,
|
anaplan_sdk/_clients/_bulk.py
CHANGED
@@ -58,6 +58,7 @@ class Client(_BaseClient):
|
|
58
58
|
redirect_uri: str | None = None,
|
59
59
|
refresh_token: str | None = None,
|
60
60
|
oauth2_scope: str = "openid profile email offline_access",
|
61
|
+
on_auth_code: Callable[[str], str] | None = None,
|
61
62
|
on_token_refresh: Callable[[dict[str, str]], None] | None = None,
|
62
63
|
timeout: float | httpx.Timeout = 30,
|
63
64
|
retry_count: int = 2,
|
@@ -94,6 +95,9 @@ class Client(_BaseClient):
|
|
94
95
|
:param refresh_token: If you have a valid refresh token, you can pass it to skip the
|
95
96
|
interactive authentication code step.
|
96
97
|
:param oauth2_scope: The scope of the Oauth2 token, if you want to narrow it.
|
98
|
+
:param on_auth_code: A callback that takes the redirect URI as a single argument and must
|
99
|
+
return the entire response URI. This will substitute the interactive
|
100
|
+
authentication code step in the terminal.
|
97
101
|
:param on_token_refresh: A callback function that is called whenever the token is refreshed.
|
98
102
|
With this you can for example securely store the token in your
|
99
103
|
application or on your server for later reuse. The function
|
@@ -130,6 +134,7 @@ class Client(_BaseClient):
|
|
130
134
|
redirect_uri=redirect_uri,
|
131
135
|
refresh_token=refresh_token,
|
132
136
|
oauth2_scope=oauth2_scope,
|
137
|
+
on_auth_code=on_auth_code,
|
133
138
|
on_token_refresh=on_token_refresh,
|
134
139
|
)
|
135
140
|
),
|
@@ -473,8 +478,7 @@ class Client(_BaseClient):
|
|
473
478
|
:return: The identifier of the spawned Task.
|
474
479
|
"""
|
475
480
|
response = self._post(
|
476
|
-
f"{self._url}/{action_url(action_id)}/{action_id}/tasks",
|
477
|
-
json={"localeName": "en_US"},
|
481
|
+
f"{self._url}/{action_url(action_id)}/{action_id}/tasks", json={"localeName": "en_US"}
|
478
482
|
)
|
479
483
|
task_id = response.get("task").get("taskId")
|
480
484
|
logger.info(f"Invoked Action '{action_id}', spawned Task: '{task_id}'.")
|
@@ -86,7 +86,15 @@ class _TransactionalClient(_BaseClient):
|
|
86
86
|
"""
|
87
87
|
Insert new items to the given list. The items must be a list of dictionaries with at least
|
88
88
|
the keys `code` and `name`. You can optionally pass further keys for parents, extra
|
89
|
-
properties etc.
|
89
|
+
properties etc. If you pass a long list, it will be split into chunks of 100,000 items, the
|
90
|
+
maximum allowed by the API.
|
91
|
+
|
92
|
+
**Warning**: If one or some of the requests timeout during large batch operations, the
|
93
|
+
operation may actually complete on the server. Retries for these chunks will then report
|
94
|
+
these items as "ignored" rather than "added", leading to misleading results. The results in
|
95
|
+
Anaplan will be correct, but this function may report otherwise. Be generous with your
|
96
|
+
timeouts and retries if you are using this function for large batch operations.
|
97
|
+
|
90
98
|
:param list_id: The ID of the List.
|
91
99
|
:param items: The items to insert into the List.
|
92
100
|
:return: The result of the insertion, indicating how many items were added,
|
@@ -120,7 +128,16 @@ class _TransactionalClient(_BaseClient):
|
|
120
128
|
|
121
129
|
def delete_list_items(self, list_id: int, items: list[dict[str, str | int]]) -> int:
|
122
130
|
"""
|
123
|
-
Deletes items from a List.
|
131
|
+
Deletes items from a List. If you pass a long list, it will be split into chunks of 100,000
|
132
|
+
items, the maximum allowed by the API.
|
133
|
+
|
134
|
+
**Warning**: If one or some of the requests timeout during large batch operations, the
|
135
|
+
operation may actually complete on the server. Retries for these chunks will then report
|
136
|
+
none of these items as deleted, since on the retry none are removed, leading to misleading
|
137
|
+
results. The results in Anaplan will be correct, but this function may report otherwise.
|
138
|
+
Be generous with your timeouts and retries if you are using this function for large batch
|
139
|
+
operations.
|
140
|
+
|
124
141
|
:param list_id: The ID of the List.
|
125
142
|
:param items: The items to delete from the List. Must be a dict with either `code` or `id`
|
126
143
|
as the keys to identify the records to delete.
|
@@ -155,8 +172,13 @@ class _TransactionalClient(_BaseClient):
|
|
155
172
|
"""
|
156
173
|
Write the passed items to the specified module. If successful, the number of cells changed
|
157
174
|
is returned, if only partially successful or unsuccessful, the response with the according
|
158
|
-
details is returned instead.
|
159
|
-
|
175
|
+
details is returned instead.
|
176
|
+
|
177
|
+
**You can update a maximum of 100,000 cells or 15 MB of data (whichever is lower) in a
|
178
|
+
single request.** You must chunk your data accordingly. This is not done by this SDK,
|
179
|
+
since it is discouraged. For larger imports, you should use the Bulk API instead.
|
180
|
+
|
181
|
+
For more details see: https://anaplan.docs.apiary.io/#UpdateModuleCellData.
|
160
182
|
:param module_id: The ID of the Module.
|
161
183
|
:param data: The data to write to the Module.
|
162
184
|
:return: The number of cells changed or the response with the according error details.
|
anaplan_sdk/models/_base.py
CHANGED
@@ -6,12 +6,7 @@ class AnaplanModel(BaseModel):
|
|
6
6
|
model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
|
7
7
|
|
8
8
|
@field_serializer(
|
9
|
-
"action_id",
|
10
|
-
"file_id",
|
11
|
-
"process_id",
|
12
|
-
"id",
|
13
|
-
when_used="unless-none",
|
14
|
-
check_fields=False,
|
9
|
+
"action_id", "file_id", "process_id", "id", when_used="unless-none", check_fields=False
|
15
10
|
) # While these are of type int, they are serialized as strings in the API payloads
|
16
11
|
def str_serializer(self, v: int) -> str:
|
17
12
|
return str(v)
|
@@ -262,8 +262,7 @@ class SingleIntegration(Integration):
|
|
262
262
|
|
263
263
|
class AnaplanSource(AnaplanModel):
|
264
264
|
type: Literal["Anaplan"] = Field(
|
265
|
-
default="Anaplan",
|
266
|
-
description="Literal signifying this is an Anaplan source.",
|
265
|
+
default="Anaplan", description="Literal signifying this is an Anaplan source."
|
267
266
|
)
|
268
267
|
action_id: int = Field(
|
269
268
|
description=(
|
@@ -294,20 +293,18 @@ class TableSource(AnaplanModel):
|
|
294
293
|
|
295
294
|
class TableTarget(TableSource):
|
296
295
|
overwrite: bool = Field(
|
297
|
-
default=False,
|
298
|
-
description="Whether to overwrite the table if it exists.",
|
296
|
+
default=False, description="Whether to overwrite the table if it exists."
|
299
297
|
)
|
300
298
|
|
301
299
|
|
302
300
|
class AnaplanTarget(AnaplanModel):
|
303
301
|
type: Literal["Anaplan"] = Field(
|
304
|
-
default="Anaplan",
|
305
|
-
description="Literal signifying this is an Anaplan target.",
|
302
|
+
default="Anaplan", description="Literal signifying this is an Anaplan target."
|
306
303
|
)
|
307
304
|
action_id: int = Field(
|
308
305
|
description=(
|
309
306
|
"The ID of the action to be used as a target. This can be a process, or import."
|
310
|
-
)
|
307
|
+
)
|
311
308
|
)
|
312
309
|
file_id: int = Field(description="The ID of the file to be used as a target.")
|
313
310
|
|
@@ -342,8 +339,7 @@ class IntegrationInput(AnaplanModel):
|
|
342
339
|
),
|
343
340
|
)
|
344
341
|
nux_visible: bool = Field(
|
345
|
-
default=False,
|
346
|
-
description="Whether this integration is visible in the UI.",
|
342
|
+
default=False, description="Whether this integration is visible in the UI."
|
347
343
|
)
|
348
344
|
jobs: list[IntegrationJobInput] = Field(
|
349
345
|
description="The jobs in this integration.", min_length=1
|
@@ -1,19 +1,19 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: anaplan-sdk
|
3
|
-
Version: 0.4.
|
4
|
-
Summary:
|
3
|
+
Version: 0.4.1
|
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
|
7
7
|
Project-URL: Documentation, https://vinzenzklass.github.io/anaplan-sdk/
|
8
8
|
Author-email: Vinzenz Klass <vinzenz.klass@valantic.com>
|
9
9
|
License-Expression: Apache-2.0
|
10
10
|
License-File: LICENSE
|
11
|
-
Keywords: anaplan,anaplan alm api,anaplan api,anaplan audit api,anaplan bulk api,anaplan integration
|
11
|
+
Keywords: anaplan,anaplan alm api,anaplan api,anaplan audit api,anaplan bulk api,anaplan cloudworks api,anaplan integration,anaplan integration api,anaplan sdk,anaplan transactional api
|
12
12
|
Requires-Python: >=3.10.4
|
13
13
|
Requires-Dist: httpx<1.0.0,>=0.27.0
|
14
14
|
Requires-Dist: pydantic<3.0.0,>=2.7.2
|
15
15
|
Provides-Extra: cert
|
16
|
-
Requires-Dist: cryptography<
|
16
|
+
Requires-Dist: cryptography<46.0.0,>=42.0.7; extra == 'cert'
|
17
17
|
Provides-Extra: oauth
|
18
18
|
Requires-Dist: oauthlib<4.0.0,>=3.0.0; extra == 'oauth'
|
19
19
|
Description-Content-Type: text/markdown
|
@@ -1,29 +1,29 @@
|
|
1
1
|
anaplan_sdk/__init__.py,sha256=5fr-SZSsH6f3vkRUTDoK6xdAN31cCpe9Mwz2VNu47Uw,134
|
2
|
-
anaplan_sdk/_auth.py,sha256=
|
3
|
-
anaplan_sdk/_base.py,sha256=
|
2
|
+
anaplan_sdk/_auth.py,sha256=LjPKGoM7qqiFmr9qC4_ZnV9sTHPbvhrnf6iSq_w1tNI,10569
|
3
|
+
anaplan_sdk/_base.py,sha256=9CdLshORWsLixOyoFa3A0Bka5lhLwlZrQI5sEdBcGFI,12298
|
4
4
|
anaplan_sdk/exceptions.py,sha256=ALkA9fBF0NQ7dufFxV6AivjmHyuJk9DOQ9jtJV2n7f0,1809
|
5
5
|
anaplan_sdk/_async_clients/__init__.py,sha256=pZXgMMg4S9Aj_pxQCaSiPuNG-sePVGBtNJ0133VjqW4,364
|
6
6
|
anaplan_sdk/_async_clients/_alm.py,sha256=O1_r-O1tNDq7vXRwE2UEFE5S2bPmPh4IAQPQ8bmZfQE,3297
|
7
7
|
anaplan_sdk/_async_clients/_audit.py,sha256=a92RY0B3bWxp2CCAWjzqKfvBjG1LJGlai0Hn5qmwgF8,2312
|
8
|
-
anaplan_sdk/_async_clients/_bulk.py,sha256=
|
8
|
+
anaplan_sdk/_async_clients/_bulk.py,sha256=YLttQd9oVHrvafXZ_J0QD8EQ3QCtmcT9YRZQ8_X71AI,25674
|
9
9
|
anaplan_sdk/_async_clients/_cloud_works.py,sha256=KPX9W55SF6h8fJd4Rx-HLq6eaRA-Vo3rFu343UiiaGQ,16642
|
10
10
|
anaplan_sdk/_async_clients/_cw_flow.py,sha256=ZTNAbKDwb59Wg3u68hbtt1kpd-LNz9K0sftT-gvYzJQ,3651
|
11
|
-
anaplan_sdk/_async_clients/_transactional.py,sha256=
|
11
|
+
anaplan_sdk/_async_clients/_transactional.py,sha256=Mvr7OyBPjQRpBtzkJNfRzV4aNCzUiaYmm0zQubo62Wo,8035
|
12
12
|
anaplan_sdk/_clients/__init__.py,sha256=FsbwvZC1FHrxuRXwbPxUzbhz_lO1DpXIxEOjx6-3QuA,219
|
13
13
|
anaplan_sdk/_clients/_alm.py,sha256=UAdQxgHfax-VquC0YtbqrRBku2Rn35tVgwJdxYFScps,3202
|
14
14
|
anaplan_sdk/_clients/_audit.py,sha256=xQQiwWIb4QQefolPvxNwBFE-pkRzzi8fYPyewjF63lc,2181
|
15
|
-
anaplan_sdk/_clients/_bulk.py,sha256=
|
15
|
+
anaplan_sdk/_clients/_bulk.py,sha256=TVinTtTYnlcoTrOX0ldpW11qui5rSUXm_PE1L7JgST8,25466
|
16
16
|
anaplan_sdk/_clients/_cloud_works.py,sha256=KAMnLoeMJ2iwMXlDSbKynCE57BtkCfOgM5O8wT1kkSs,16291
|
17
17
|
anaplan_sdk/_clients/_cw_flow.py,sha256=5IFWFT-qbyGvaSOOtaFOjHnOlyYbj4Rj3xiavfTlm8c,3527
|
18
|
-
anaplan_sdk/_clients/_transactional.py,sha256=
|
18
|
+
anaplan_sdk/_clients/_transactional.py,sha256=YUVbA54uhMloQcahwMtmZO3YooO6qQzwZN3ZRSu_z_c,7976
|
19
19
|
anaplan_sdk/models/__init__.py,sha256=nSplwPG_74CG9CKbv1PzP9bsA9v5-daS4azpTCvCQTI,925
|
20
20
|
anaplan_sdk/models/_alm.py,sha256=IqsTPvkx_ujLpaqZgIrTcr44KHJyKc4dyeRs9rkDjms,2307
|
21
|
-
anaplan_sdk/models/_base.py,sha256=
|
21
|
+
anaplan_sdk/models/_base.py,sha256=6AZc9CfireUKgpZfMxYKu4MbwiyHQOsGLjKrxGXBLic,508
|
22
22
|
anaplan_sdk/models/_bulk.py,sha256=dHP3kMvsKONCZS6mHB271-wp2S4P3rM874Ita8TzABU,8256
|
23
23
|
anaplan_sdk/models/_transactional.py,sha256=_0UbVR9D5QABI29yloYrJTSgL-K0EU7PzPeJu5LdhnY,4854
|
24
|
-
anaplan_sdk/models/cloud_works.py,sha256=
|
24
|
+
anaplan_sdk/models/cloud_works.py,sha256=nfn_LHPR-KmW7Tpvz-5qNCzmR8SYgvsVV-lx5iDlyqI,19425
|
25
25
|
anaplan_sdk/models/flows.py,sha256=SuLgNj5-2SeE3U1i8iY8cq2IkjuUgd_3M1n2ENructk,3625
|
26
|
-
anaplan_sdk-0.4.
|
27
|
-
anaplan_sdk-0.4.
|
28
|
-
anaplan_sdk-0.4.
|
29
|
-
anaplan_sdk-0.4.
|
26
|
+
anaplan_sdk-0.4.1.dist-info/METADATA,sha256=BBxu0ztPLPPxIJtueo3P3cfs1webd9Fxu60hFdHi0p8,3543
|
27
|
+
anaplan_sdk-0.4.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
28
|
+
anaplan_sdk-0.4.1.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
|
29
|
+
anaplan_sdk-0.4.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|