peak-sdk 1.4.0__py3-none-any.whl → 1.6.0__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.
Files changed (50) hide show
  1. peak/_metadata.py +58 -3
  2. peak/_version.py +1 -1
  3. peak/cli/cli.py +4 -2
  4. peak/cli/helpers.py +2 -0
  5. peak/cli/press/blocks/specs.py +2 -2
  6. peak/cli/press/specs.py +4 -2
  7. peak/cli/resources/alerts/__init__.py +35 -0
  8. peak/cli/resources/alerts/emails.py +360 -0
  9. peak/cli/resources/images.py +1 -1
  10. peak/cli/resources/services.py +23 -0
  11. peak/cli/resources/users.py +71 -0
  12. peak/cli/resources/workflows.py +77 -15
  13. peak/cli/ruff.toml +5 -3
  14. peak/compression.py +2 -2
  15. peak/exceptions.py +4 -6
  16. peak/handler.py +3 -5
  17. peak/helpers.py +35 -9
  18. peak/output.py +2 -2
  19. peak/press/apps.py +8 -16
  20. peak/press/blocks.py +8 -16
  21. peak/press/deployments.py +2 -4
  22. peak/press/specs.py +12 -14
  23. peak/resources/__init__.py +3 -2
  24. peak/resources/alerts.py +309 -0
  25. peak/resources/artifacts.py +2 -4
  26. peak/resources/images.py +8 -14
  27. peak/resources/services.py +7 -6
  28. peak/resources/users.py +93 -0
  29. peak/resources/webapps.py +3 -5
  30. peak/resources/workflows.py +106 -16
  31. peak/sample_yaml/resources/emails/send_email.yaml +15 -0
  32. peak/sample_yaml/resources/services/create_or_update_service.yaml +1 -0
  33. peak/sample_yaml/resources/services/create_service.yaml +1 -0
  34. peak/sample_yaml/resources/services/update_service.yaml +1 -0
  35. peak/sample_yaml/resources/workflows/create_or_update_workflow.yaml +28 -0
  36. peak/sample_yaml/resources/workflows/create_workflow.yaml +10 -0
  37. peak/sample_yaml/resources/workflows/patch_workflow.yaml +28 -0
  38. peak/sample_yaml/resources/workflows/update_workflow.yaml +28 -0
  39. peak/session.py +7 -4
  40. peak/telemetry.py +1 -1
  41. peak/template.py +6 -4
  42. peak/tools/logging/__init__.py +26 -268
  43. peak/tools/logging/log_level.py +35 -3
  44. peak/tools/logging/logger.py +389 -0
  45. peak/validators.py +34 -2
  46. {peak_sdk-1.4.0.dist-info → peak_sdk-1.6.0.dist-info}/METADATA +11 -12
  47. {peak_sdk-1.4.0.dist-info → peak_sdk-1.6.0.dist-info}/RECORD +50 -43
  48. {peak_sdk-1.4.0.dist-info → peak_sdk-1.6.0.dist-info}/WHEEL +1 -1
  49. {peak_sdk-1.4.0.dist-info → peak_sdk-1.6.0.dist-info}/LICENSE +0 -0
  50. {peak_sdk-1.4.0.dist-info → peak_sdk-1.6.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,389 @@
1
+ #
2
+ # # Copyright © 2024 Peak AI Limited. or its affiliates. All Rights Reserved.
3
+ # #
4
+ # # Licensed under the Apache License, Version 2.0 (the "License"). You
5
+ # # may not use this file except in compliance with the License. A copy of
6
+ # # the License is located at:
7
+ # #
8
+ # # https://github.com/PeakBI/peak-sdk/blob/main/LICENSE
9
+ # #
10
+ # # or in the "license" file accompanying this file. This file is
11
+ # # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
12
+ # # ANY KIND, either express or implied. See the License for the specific
13
+ # # language governing permissions and limitations under the License.
14
+ # #
15
+ # # This file is part of the peak-sdk.
16
+ # # see (https://github.com/PeakBI/peak-sdk)
17
+ # #
18
+ # # You should have received a copy of the APACHE LICENSE, VERSION 2.0
19
+ # # along with this program. If not, see <https://apache.org/licenses/LICENSE-2.0>
20
+ #
21
+ """Logging module, a wrapper around `structlog <https://www.structlog.org/en/stable/>`_ library."""
22
+
23
+ from __future__ import annotations
24
+
25
+ import functools
26
+ import inspect
27
+ import logging
28
+ import os
29
+ import sys
30
+ from types import MappingProxyType
31
+ from typing import Any, Callable, Final, Hashable, List, MutableMapping, Optional, Tuple, Union
32
+
33
+ import orjson
34
+ import structlog
35
+
36
+ from .log_handler import LogHandler
37
+ from .log_level import LOG_LEVEL_NAMES_TO_LOG_LEVEL, LogLevel, LogLevelNames
38
+ from .utils import mask_nested_pii_data
39
+
40
+ __title__ = "logging"
41
+ __author__ = "PEAK AI"
42
+ __license__ = "Apache License, Version 2.0"
43
+ __copyright__ = "2024, Peak AI"
44
+ __status__ = "production"
45
+ __date__ = "14 March 2024"
46
+
47
+ __all__: List[str] = [
48
+ "DEFAULT_SHARED_PROCESSORS",
49
+ "LOG_LEVEL_NAMES_TO_LOG_LEVEL",
50
+ "LogHandler",
51
+ "LogLevelNames",
52
+ "LogLevel",
53
+ "PeakLogger",
54
+ "default_processors_factory",
55
+ "get_logger",
56
+ "pii_masking_processor",
57
+ "peak_contexts_processor",
58
+ ]
59
+
60
+
61
+ # ---------------------------------------------------------------------------
62
+ # Utility private functions
63
+ # ---------------------------------------------------------------------------
64
+
65
+
66
+ def pii_masking_processor(
67
+ _: str,
68
+ __: str,
69
+ event_dict: MutableMapping[str, Any],
70
+ ) -> MutableMapping[str, Any]:
71
+ """Masks sensitive PII data present in event_dict."""
72
+ return mask_nested_pii_data(event_dict)
73
+
74
+
75
+ def peak_contexts_processor(
76
+ _: str,
77
+ __: str,
78
+ event_dict: MutableMapping[str, Any],
79
+ ) -> MutableMapping[str, Any]:
80
+ """Add the standard attribute to the event_dict."""
81
+ attributes_to_add: dict[str, Any] = {
82
+ "source": "peak-sdk",
83
+ "runtime": os.getenv("PEAK_RUNTIME"),
84
+ "press_deployment_id": os.getenv("PRESS_DEPLOYMENT_ID"),
85
+ "run_id": os.getenv("PEAK_RUN_ID"),
86
+ "exec_id": os.getenv("PEAK_EXEC_ID"),
87
+ "stage": os.getenv("STAGE"),
88
+ "tenant_name": os.getenv("TENANT_NAME", os.getenv("TENANT")),
89
+ "tenant_id": os.getenv("TENANT_ID"),
90
+ "api_name": os.getenv("PEAK_API_NAME"),
91
+ "api_id": os.getenv("PEAK_API_ID"),
92
+ "step_name": os.getenv("PEAK_STEP_NAME"),
93
+ "step_id": os.getenv("PEAK_STEP_ID"),
94
+ "webapp_name": os.getenv("PEAK_WEBAPP_NAME"),
95
+ "webapp_id": os.getenv("PEAK_WEBAPP_ID"),
96
+ "workflow_name": os.getenv("PEAK_WORKFLOW_NAME"),
97
+ "workflow_id": os.getenv("PEAK_WORKFLOW_ID"),
98
+ "workspace_name": os.getenv("PEAK_WORKSPACE_NAME"),
99
+ "workspace_id": os.getenv("PEAK_WORKSPACE_ID"),
100
+ "image_name": os.getenv("PEAK_IMAGE_NAME"),
101
+ "image_id": os.getenv("PEAK_IMAGE_ID"),
102
+ }
103
+
104
+ for attr, value in attributes_to_add.items():
105
+ if value:
106
+ event_dict[attr] = value
107
+
108
+ return event_dict
109
+
110
+
111
+ # ---------------------------------------------------------------------------
112
+ # Utility functions at module level for main logger factory
113
+ # ---------------------------------------------------------------------------
114
+
115
+
116
+ DEFAULT_SHARED_PROCESSORS: Tuple[structlog.types.Processor | Any, ...] = (
117
+ structlog.contextvars.merge_contextvars,
118
+ peak_contexts_processor,
119
+ structlog.stdlib.filter_by_level,
120
+ structlog.stdlib.add_logger_name,
121
+ structlog.stdlib.add_log_level,
122
+ structlog.stdlib.PositionalArgumentsFormatter(),
123
+ pii_masking_processor,
124
+ structlog.processors.TimeStamper(fmt="iso", utc=True),
125
+ structlog.processors.StackInfoRenderer(),
126
+ structlog.processors.format_exc_info,
127
+ structlog.processors.UnicodeDecoder(),
128
+ structlog.processors.EventRenamer("message"),
129
+ )
130
+
131
+ _ORJSON_OPTS: Final[int] = (
132
+ orjson.OPT_SERIALIZE_NUMPY
133
+ | orjson.OPT_SERIALIZE_DATACLASS
134
+ | orjson.OPT_SERIALIZE_UUID
135
+ | orjson.OPT_NON_STR_KEYS
136
+ | orjson.OPT_SORT_KEYS
137
+ )
138
+
139
+
140
+ def _orjson_serializer(
141
+ obj: Any,
142
+ sort_keys: Optional[bool] = None,
143
+ default: Callable[[Any], Any] = str,
144
+ ) -> str:
145
+ """Custom serializer using orjson.dumps for structlog."""
146
+ apply_opts: int = (_ORJSON_OPTS | orjson.OPT_SORT_KEYS) if sort_keys else _ORJSON_OPTS
147
+
148
+ return orjson.dumps(obj, option=apply_opts, default=default).decode("utf-8")
149
+
150
+
151
+ @functools.lru_cache(maxsize=2, typed=True) # Only 2 different combinations of disable_masking are possible
152
+ def default_processors_factory(
153
+ disable_masking: Optional[bool],
154
+ ) -> list[structlog.types.Processor | Any]:
155
+ """Return the default processors for PeakLogger.
156
+
157
+ Args:
158
+ disable_masking (Optional[bool], optional): Whether to disable masking of sensitive data. Defaults to False.
159
+
160
+ Returns:
161
+ list[structlog.types.Processor | Any]: List of processors to be used by the logger.
162
+ """
163
+ _processors = list(DEFAULT_SHARED_PROCESSORS)
164
+
165
+ if disable_masking:
166
+ _processors.remove(pii_masking_processor)
167
+
168
+ # add renderer based on the environment
169
+ if sys.stdout.isatty():
170
+ # Pretty printing when we run in a terminal session.
171
+ _processors.remove(structlog.processors.format_exc_info)
172
+ _processors.append(
173
+ structlog.dev.ConsoleRenderer(
174
+ colors=True,
175
+ event_key="message",
176
+ timestamp_key="timestamp",
177
+ exception_formatter=structlog.dev.RichTracebackFormatter(color_system="truecolor"),
178
+ ),
179
+ )
180
+ else:
181
+ # Print JSON when we run in production
182
+ _processors.append(structlog.processors.JSONRenderer(serializer=_orjson_serializer, sort_keys=True))
183
+
184
+ return _processors
185
+
186
+
187
+ @functools.lru_cache(maxsize=128, typed=True)
188
+ def _handle_and_patch_processor_factory_kwargs(
189
+ func: Callable[..., List[structlog.types.Processor | Any]],
190
+ **kwargs: Hashable,
191
+ ) -> List[structlog.types.Processor | Any]:
192
+ """Handle keyword arguments for custom_processors_factory using inspect.signature, additionally patch the processors list to include EventRenamer in the right position if not already present.
193
+
194
+ Unknown keyword arguments are ignored.
195
+
196
+ Args:
197
+ func (Callable[..., List[structlog.types.Processor | Any]]): Custom processor factory function.
198
+ **kwargs: Additional keyword arguments to be passed to the custom_processors_factory, if provided.
199
+ kwargs received by the factory function must be hashable else TypeError will be raised by this wrapper.
200
+
201
+ Returns:
202
+ List[structlog.types.Processor | Any]: List of processors to be used by the logger.
203
+
204
+ Raises:
205
+ ValueError: If multiple renderers are found in the processor factory's returned processors list.
206
+ """
207
+ func_params: MappingProxyType[str, inspect.Parameter] = inspect.signature(func).parameters
208
+ _processors = func(**{k: v for k, v in kwargs.items() if k in func_params})
209
+
210
+ if "structlog.processors.EventRenamer" not in str(_processors):
211
+
212
+ # find index of KeyValueRenderer/JSONRenderer/ConsoleRenderer and push EventRenamer to before either of them
213
+ indices_for_insertion: list[int] = [
214
+ _processors.index(processor)
215
+ for processor in _processors
216
+ if getattr(processor, "__name__", processor.__class__.__name__)
217
+ in ("KeyValueRenderer", "JSONRenderer", "ConsoleRenderer")
218
+ ]
219
+
220
+ if len(indices_for_insertion) > 1:
221
+ multiple_renderer_error_msg: str = f"""
222
+ Multiple renderers found in the processors list returned by the `custom_processors_factory` function: {func.__name__}.
223
+ Please ensure only one of KeyValueRenderer, JSONRenderer, or ConsoleRenderer is present in the processors list.
224
+ """
225
+ raise ValueError(multiple_renderer_error_msg)
226
+
227
+ _processors.insert(
228
+ min([*indices_for_insertion, len(_processors)]),
229
+ structlog.processors.EventRenamer("message"),
230
+ )
231
+
232
+ return _processors
233
+
234
+
235
+ # ---------------------------------------------------------------------------
236
+ # Logger factory function
237
+ # ---------------------------------------------------------------------------
238
+
239
+
240
+ def get_logger(
241
+ name: Optional[str] = None,
242
+ level: Optional[LogLevel] = LogLevel.INFO,
243
+ custom_processors_factory: Optional[Callable[..., List[structlog.types.Processor | Any]]] = None,
244
+ disable_masking: Optional[bool] = False, # noqa: FBT002
245
+ handlers: Optional[List[LogHandler]] = None,
246
+ file_name: Optional[str] = None,
247
+ **kwargs: Any,
248
+ ) -> PeakLogger:
249
+ """Return a logger with the specified settings.
250
+
251
+ When using the default implementation, pretty-printing is automatically enabled when logger is run in a terminal session (sys.stdout.isatty() == True)
252
+ and JSON printing is enabled when logger is run in production via the `structlog.processors.JSONRenderer` processor.
253
+
254
+ Args:
255
+ name (Optional[str], optional): Name of the logger. Defaults to None.
256
+ level (LogLevel): Log level. Defaults to LogLevel.INFO.
257
+ custom_processors_factory (Optional[Callable[..., List[structlog.types.Processor | Any]]], optional): A factory function that returns a list of custom processors.
258
+ Defaults to None. This disables the default processors provided with the default implementation.
259
+ disable_masking (Optional[bool], optional): Whether to disable masking of sensitive data. Defaults to False.
260
+ Only applicable when using the default processors, as custom processors can be used to handle masking on their own.
261
+ handlers (Optional[List[Handlers]], optional): List of log handlers (CONSOLE, FILE). Defaults to CONSOLE.
262
+ file_name (Optional[str], optional): Filename for FILE handler. Required if FILE handler is used. Defaults to None.
263
+ **kwargs: Additional keyword arguments to be passed to the custom_processors_factory, if provided.
264
+ `disable_masking` is automatically passed to the custom_processors_factory and should not be provided here.
265
+ if `custom_processors_factory` does not accept any keyword arguments, they will all be ignored.
266
+ Additionally, all kwargs receivable by the factory function must be hashable else TypeError will be raised by the `_handle_and_patch_processor_factory_kwargs` wrapper.
267
+
268
+ Returns:
269
+ PeakLogger: A logger instance configured with the specified settings.
270
+
271
+ Raises:
272
+ ValueError: If the `file_name` is not provided for FILE handler or if `multiple renderers` are found in the `processor`(s) list returned by the `custom_processors_factory`.
273
+ """
274
+ _log_level: int = (
275
+ level.value
276
+ if level is not None
277
+ else logging.DEBUG if os.getenv("DEBUG", "false").lower() == "true" else LogLevel.INFO.value
278
+ )
279
+ _processors: list[structlog.types.Processor | Any] = (
280
+ _handle_and_patch_processor_factory_kwargs(custom_processors_factory, disable_masking=disable_masking, **kwargs)
281
+ if custom_processors_factory is not None
282
+ else default_processors_factory(
283
+ disable_masking=disable_masking,
284
+ )
285
+ )
286
+ handlers_list: list[Any] = []
287
+ if not handlers or LogHandler.CONSOLE in handlers:
288
+ handlers_list.append(logging.StreamHandler()) # Console handler
289
+ if handlers and LogHandler.FILE in handlers:
290
+ if file_name:
291
+ handlers_list.append(logging.FileHandler(file_name)) # File handler
292
+ else:
293
+ msg = "filename must be provided for FILE handler."
294
+ raise ValueError(msg)
295
+
296
+ # Set the log level and add the handlers to the root logger
297
+ # This is required to ensure that the log level and handlers are applied to the root logger
298
+ logging.basicConfig(level=_log_level, handlers=handlers_list, format="", force=True)
299
+
300
+ # configure structlog with the specified settings
301
+ structlog.configure(
302
+ processors=[*_processors],
303
+ context_class=dict,
304
+ logger_factory=structlog.stdlib.LoggerFactory(),
305
+ wrapper_class=structlog.stdlib.BoundLogger,
306
+ cache_logger_on_first_use=True,
307
+ )
308
+
309
+ return PeakLogger(structlog.get_logger(name))
310
+
311
+
312
+ # ---------------------------------------------------------------------------
313
+ # Wrapper Logger class
314
+ # Basically delegate everything to `structlog`.
315
+ # ---------------------------------------------------------------------------
316
+
317
+
318
+ class PeakLogger:
319
+ """Wrapper class for logging with various log levels."""
320
+
321
+ # use __slots__ to avoid dynamic attribute creation
322
+ __slots__: list[str] = ["_logger"]
323
+
324
+ def __init__(self, logger: Any) -> None:
325
+ """Initialize with a logger object.
326
+
327
+ Args:
328
+ logger (Any): Logger object to wrap.
329
+ """
330
+ self._logger: structlog.stdlib.BoundLogger = logger
331
+
332
+ def __getattribute__(self, __name: str) -> Any:
333
+ """Return the attribute from the wrapped logger object."""
334
+ if __name in [*PeakLogger.__slots__, *PeakLogger.__dict__.keys()]:
335
+ return object.__getattribute__(self, __name)
336
+ return getattr(self._logger, __name)
337
+
338
+ def bind(self, context: Union[dict[str, Any], None] = None, **kwargs: Any) -> None:
339
+ """Bind contextual information to the logger, enriching log messages.
340
+
341
+ This method allows attaching context data to the logger, such as additional information
342
+ or system details, to provide more context in log messages.
343
+
344
+ Args:
345
+ context (Union[dict[str, Any], None]): A dictionary or None for contextual information.
346
+ **kwargs: Additional key-value pairs to enhance context.
347
+ """
348
+ if context is None:
349
+ context = {}
350
+
351
+ if kwargs:
352
+ # file deepcode ignore AttributeLoadOnNone: false positive
353
+ context.update(kwargs)
354
+
355
+ self._logger = self._logger.bind(**context)
356
+
357
+ def unbind(self, keys: list[str]) -> None:
358
+ """Unbind specified keys from the logger's context.
359
+
360
+ Args:
361
+ keys (list[str]): List of keys to unbind.
362
+ """
363
+ context: dict[str, Any] | dict[Any, Any] = structlog.get_context(self._logger)
364
+
365
+ for key in keys:
366
+ if key in context:
367
+ del context[key]
368
+
369
+ # Rebind the modified context to the logger
370
+ self._logger = self._logger.bind(**context)
371
+
372
+ def clone_with_context(self, context: Union[dict[str, Any], None] = None, **kwargs: Any) -> PeakLogger:
373
+ """Return a frozen copy of this logger with the specified context added."""
374
+ new_logger = PeakLogger(self._logger.new())
375
+ new_logger.bind(context, **kwargs)
376
+ return new_logger
377
+
378
+ def set_log_level(self, level: LogLevel) -> None:
379
+ """Set the log level of the root logger.
380
+
381
+ Args:
382
+ level (LogLevel): Log level to set.
383
+ """
384
+ if self._is_valid_log_level(level):
385
+ logging.getLogger().setLevel(level.value)
386
+
387
+ def _is_valid_log_level(self, level: LogLevel) -> bool:
388
+ """Check if a given log level is valid."""
389
+ return level in LogLevel
peak/validators.py CHANGED
@@ -23,10 +23,10 @@ from __future__ import annotations
23
23
 
24
24
  import os
25
25
  import tempfile
26
- from typing import List
26
+ from typing import Dict, List
27
27
 
28
28
  from peak.constants import MAX_ARTIFACT_SIZE_MB, MB
29
- from peak.exceptions import FileLimitExceededException
29
+ from peak.exceptions import FileLimitExceededException, InvalidParameterException
30
30
 
31
31
 
32
32
  def check_file_size(fh: tempfile.SpooledTemporaryFile[bytes], max_size: float = MAX_ARTIFACT_SIZE_MB) -> None:
@@ -36,6 +36,38 @@ def check_file_size(fh: tempfile.SpooledTemporaryFile[bytes], max_size: float =
36
36
  raise FileLimitExceededException(max_size=max_size)
37
37
 
38
38
 
39
+ def validate_action(action: str) -> None:
40
+ """Validate the action provided.
41
+
42
+ Args:
43
+ action (str): The action to be validated.
44
+
45
+ Raises:
46
+ InvalidParameterException: If the action is not 'read' or 'write'.
47
+
48
+ Returns: None
49
+ """
50
+ if action not in ["read", "write"]:
51
+ raise InvalidParameterException(message="The action must be 'read' or 'write'.")
52
+
53
+
54
+ def validate_feature_path(search_result: Dict[str, bool], feature_path: str) -> None:
55
+ """Validate the feature path provided.
56
+
57
+ Args:
58
+ search_result (Dict[str, bool]): The search result for the feature path.
59
+ feature_path (str): The feature path to be validated.
60
+
61
+ Raises:
62
+ InvalidParameterException: If the feature path is incomplete and more subfeatures need to be specified.
63
+
64
+ Returns: None
65
+ """
66
+ if search_result["deeper_levels"]:
67
+ message = f"'{feature_path}' contains more subfeatures. Please specify the complete path."
68
+ raise InvalidParameterException(message=message)
69
+
70
+
39
71
  def _get_file_size(fh: tempfile.SpooledTemporaryFile[bytes]) -> int:
40
72
  """Get file size in bytes."""
41
73
  old_pos: int = fh.tell()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: peak-sdk
3
- Version: 1.4.0
3
+ Version: 1.6.0
4
4
  Summary: Python SDK for interacting with the Peak platform
5
5
  Home-page: https://docs.peak.ai/sdk
6
6
  License: Apache-2.0
@@ -16,18 +16,17 @@ Classifier: Programming Language :: Python :: 3
16
16
  Classifier: Programming Language :: Python :: 3.9
17
17
  Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
- Classifier: Programming Language :: Python :: 3.10
20
19
  Classifier: Programming Language :: Python :: 3.8
21
- Classifier: Programming Language :: Python :: 3.9
22
20
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
23
21
  Classifier: Typing :: Typed
24
- Requires-Dist: certifi (>=2023.7.22)
22
+ Requires-Dist: certifi (>=2024.2.2)
25
23
  Requires-Dist: jinja2 (>=3.1,<4.0)
26
- Requires-Dist: pathspec (>=0.11,<0.12)
24
+ Requires-Dist: orjson (>=3.9.15,<4.0.0)
25
+ Requires-Dist: pathspec
27
26
  Requires-Dist: pyyaml (>=6.0,<7.0)
28
- Requires-Dist: requests (>=2.30,<3.0)
27
+ Requires-Dist: requests (>=2.31,<3.0)
29
28
  Requires-Dist: requests-toolbelt (>=1.0,<2.0)
30
- Requires-Dist: shellingham (<1.5.2)
29
+ Requires-Dist: shellingham (<1.5.4)
31
30
  Requires-Dist: structlog (>=24.1.0,<25.0.0)
32
31
  Requires-Dist: typer[all] (>=0.9,<0.10)
33
32
  Requires-Dist: urllib3 (<2)
@@ -94,13 +93,13 @@ Follow these steps to create a virtual environment using Python's built-in `venv
94
93
  echo "compinit" >> ~/.zshrc # replace .zshrc with your shell's configuration file
95
94
  ```
96
95
 
97
- ### Using the SDK/CLI
96
+ ### Using the SDK and CLI
98
97
 
99
- - To start using the SDK and CLI, you'll need either an API Key or an Access Token.
100
- - If you don't have one yet, sign up for an account on the Peak platform to obtain your API key or Access token.
101
- - To export it, run the following command in your terminal and replace <api_key> with your actual API key:
98
+ - To start using the SDK and CLI, you'll need either an API Key or a Personal Access Token (PAT).
99
+ - If you don't have one yet, sign up for an account on the Peak platform to obtain your API key or Personal Access token (PAT).
100
+ - To export it, run the following command in your terminal and replace <peak_auth_token> with your actual API key or PAT:
102
101
  ```
103
- export API_KEY=<api_key | access_token>
102
+ export PEAK_AUTH_TOKEN=<peak_auth_token>
104
103
  ```
105
104
 
106
105
  ### Documentation
@@ -1,52 +1,57 @@
1
1
  peak/__init__.py,sha256=yULGsiciVPNjdTO6uwEynsyLFiGBA2n7TT72DzKn9z8,1263
2
- peak/_metadata.py,sha256=grRJ8sixuoMQnvJnq-tQDheb5URzLXkKxXzl8UrTHvY,22930
3
- peak/_version.py,sha256=hHRSX_HntUAVVQwEqC8xFuqFaKh-BM5TKJ4dISWDTXI,886
2
+ peak/_metadata.py,sha256=dONDzIdtBsr8Qvqy1jsIQj6PgUk2359JcVZRwx-ssps,24458
3
+ peak/_version.py,sha256=JnFhHlT-MCHSe2YAfw8jFNoQJ5BO7gGoF0Oe5HurtMw,886
4
4
  peak/auth.py,sha256=KcqCqovY6sFiMGNAGP9k3AtCAXrZ-tYd7QP-PFYorX0,904
5
5
  peak/base_client.py,sha256=3cS8hZApONkojwdgzt_tbwSxwpFcn3xGwzVcmxkgOJc,1808
6
6
  peak/callbacks.py,sha256=ZO3Yk_-xa9LGoJgMCc01hqYLq2z3wU45UO3iLHSHk6k,2486
7
7
  peak/cli/__init_.py,sha256=enzNZ-aEPmKIC8eExPvF-ZdomGroRUPmP09003PNGAg,859
8
8
  peak/cli/args.py,sha256=EA7YQ_jojN9M9RZPZFsbvIe_NEVc6W80boxSXpS-MnQ,5720
9
- peak/cli/cli.py,sha256=XpjhYs_ykPBxTbVJly9H-z2nUO5OpG5JapxiU3pqe4k,2332
10
- peak/cli/helpers.py,sha256=oumntAaROK0ID-psgjokhshKCIbFgXFf44ix7TFCy9M,8216
9
+ peak/cli/cli.py,sha256=pmwb8hrOVCIsXYMaRJzGVcSBHusehpeqkjpT4BW_qYk,2445
10
+ peak/cli/helpers.py,sha256=GS1YUdQcjzxW_YDRsVbBsmdJ36mxn4Z2DuoaVd9JRYw,8286
11
11
  peak/cli/press/__init__.py,sha256=7zvL15sobpdrEuGoziADkJVnrHMiZKINYr4FDRFetY8,898
12
12
  peak/cli/press/apps/__init__.py,sha256=_bUtQG1zrO9Jv5zIFFKikR82-NsAfpow2KgSOa3oX_M,1459
13
13
  peak/cli/press/apps/deployments.py,sha256=7JmxFhtaOZ9QXTtAtd-Oxu69JemRBP6MDuaRONdWEAY,15895
14
14
  peak/cli/press/apps/specs.py,sha256=VrSVH-YFFnTq3bwGW_ws3r4hpTv9UazzjhSXU8HT35Q,15566
15
15
  peak/cli/press/blocks/__init__.py,sha256=0kQIpLD29rlec5xTB9RLNPdIHxf6vi6_3gukBkwaySI,1499
16
16
  peak/cli/press/blocks/deployments.py,sha256=20zUO6_GSjc2DpCfao0_2urktjn4Z6JY4T1GVc4sK60,20260
17
- peak/cli/press/blocks/specs.py,sha256=NZ2RejlWRZr8eRQJZR5CB2jwZPKjOZIs5n8wKIkGmZo,29517
17
+ peak/cli/press/blocks/specs.py,sha256=YcMx_HSAQbcY4oAL1f7ezQn460zTKGyVYnWdik4W-Sk,29539
18
18
  peak/cli/press/deployments.py,sha256=TBDu8YD0BdD_lnHD2vZuSHTsmZ-m3WQJFi8Fefwzck4,2834
19
- peak/cli/press/specs.py,sha256=kxq_n-kJgK_xgamj3f_paNRI9ISKiOuwgO2MGeFO0KY,4611
19
+ peak/cli/press/specs.py,sha256=I5eBzFDN365oo16lEwnPaOlcncBRRpvIchkt4ukGreg,4811
20
20
  peak/cli/resources/__init__.py,sha256=ThMYJ-QNULjTWOmAGUzhKWuqDcHq73DxzgTV2r5-uLs,883
21
+ peak/cli/resources/alerts/__init__.py,sha256=TyeLPOGiA4qvOKORV3Ejlx8n6lGfX1G2GcU-bpYsgPE,1197
22
+ peak/cli/resources/alerts/emails.py,sha256=NBJQfk9lTvfzGw8rTO3lRbK3iB05p71rwdfyxvTEhjc,12062
21
23
  peak/cli/resources/artifacts.py,sha256=LQcJKw39xoJaFeTJMYi1n-XTyU02SOSKg0J1VuWrhgU,12383
22
- peak/cli/resources/images.py,sha256=KzLVGNuPUpCA8AsZufXZgYFA4pnZ9JsZInE7zclmNmQ,43125
23
- peak/cli/resources/services.py,sha256=f-1lGUerQ1qwIcVFfSumiPES1nreQp1bhaUeKXbJLtI,23435
24
+ peak/cli/resources/images.py,sha256=-dIY4ZKYe_HxgCx91foIWUu1dZD5MrCpjHJxVMjrp6Q,43098
25
+ peak/cli/resources/services.py,sha256=WUQw2J0V8SGs7h-yJ5tgLTUWNE5e8rasw6hII4hE9ng,24546
24
26
  peak/cli/resources/tenants.py,sha256=m5hwW8rQLKsRQwOFAmE2QQXiOLRV-hZmomxUGSEPFjg,2624
27
+ peak/cli/resources/users.py,sha256=igXEelUTnqcqVd4OUu2YUMu8kwelWp7ZM9JgXxk9Jfg,2628
25
28
  peak/cli/resources/webapps.py,sha256=0Wunb-XYvM5n5HQO4_-LDMCDezdRo_FbbsEnHPTdA2Y,21349
26
- peak/cli/resources/workflows.py,sha256=jd5dy24WBpXu5xfp0-LDBkeHq9KxBE-rstdrfPX7zx8,48787
27
- peak/cli/ruff.toml,sha256=eyOQvxmLQvGqEEcH3RaiM_8B5wh2UVWrWYzL2xeX7sk,185
29
+ peak/cli/resources/workflows.py,sha256=eLJQlNXO1el9IGEPD6qjNyUMYIcODiuU_GOYWQCsNkg,52731
30
+ peak/cli/ruff.toml,sha256=fpwsdsoY9ktmnOMvwONo13_myn0N5AcoDq8mMueCVDs,267
28
31
  peak/cli/version.py,sha256=Y8HJCJJqkXnpcXw8dyaJcPZmIDOl32bJZ2bWmjmlJBM,1654
29
- peak/compression.py,sha256=06rQLl10FQRZVHwimXV-QsYmd4rb24RzkRj1CrHfeGs,7447
32
+ peak/compression.py,sha256=ZV2WCzyhmn1omupKAFaA0s3CsFEOmd2UjcuM-uSjUB4,7442
30
33
  peak/config.py,sha256=FZ6aIN0gwA52noh-8HJkGnUr8HEOpyNFk6uR4QWt65o,1146
31
34
  peak/constants.py,sha256=TDMN4cXXKyR_Q8maeo8Ukvprl_Bz0YtYytD3yuHBZKs,3312
32
- peak/exceptions.py,sha256=uXVBnBVK6kAkAC_VVeEvohdRUH2KGhRthnqwnhfHcV4,6974
33
- peak/handler.py,sha256=IqbGbEz1slg5RH3Cg7Wn5pyDAy5fo1yga1TVqI7UYDM,14777
34
- peak/helpers.py,sha256=Mx2lkokMt2NlEpHvRw1hzuo-K3uQyfrZSaFM6VtDB44,7588
35
+ peak/exceptions.py,sha256=SC8afkb7p4bfylp_IOsEJBTS2K0E-mg4ApEYtq0YkhQ,6965
36
+ peak/handler.py,sha256=9nxWnL-Qq_sEwKwfHZ6QEFchyss2L15KNMRYrA83eBM,14782
37
+ peak/helpers.py,sha256=EvTk4oMdkVcAXXqbYoxa0o9Si1y7X_PqS4yOJwSxhdg,8781
35
38
  peak/logger.py,sha256=bPq_7mdbhFoUcnV_LCi8hRDrb7INwf8PHHEx2z83bFU,1548
36
- peak/output.py,sha256=SbWppqvrEHzZp4I_iX3l855BcRSTuZ3mQsiqYpdCgLk,6230
39
+ peak/output.py,sha256=BM_DTyz8kxGCUAY--19SzsRofzqafFOuRGehUVtgbm4,6180
37
40
  peak/press/__init__.py,sha256=80Key6wov_xZld45-39ELT0gDC_t4cy-JvA9wfCy7-c,1112
38
- peak/press/apps.py,sha256=TT9ehWvqxp3YBeg6KSAiQSp6_fIN_JEc5gGJ9W6P2WQ,41975
39
- peak/press/blocks.py,sha256=HfJy-0m1-hMZBdJUN0YU-q2sTaQOExd1e3ZvuFM0gec,59239
40
- peak/press/deployments.py,sha256=PaZGNbC5Bcx885tzxUYA-ve44gfKgMnP4dkJrPDVVH8,5950
41
- peak/press/specs.py,sha256=b-O5a-hjdPXFIGcGR913VWC6FKWTiZ74lkOXhFaLOFA,10850
41
+ peak/press/apps.py,sha256=B_gvt1PzBe_EuQz83pgaXOZAdK0T2CvbuGj-KU7fuvs,41911
42
+ peak/press/blocks.py,sha256=Ob5UE72BZOwz0AZtUMKfbsIV8JPu8oTA9IShEl9UAEo,59175
43
+ peak/press/deployments.py,sha256=cXJKOy3h1DOjN51PJhimG93no4D_7ijvdlM7jrkobac,5934
44
+ peak/press/specs.py,sha256=GH9-SACctAlcBZznXEmsIqneOwIJoE55mD4aHQymMrM,10915
42
45
  peak/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- peak/resources/__init__.py,sha256=vvEBH8XAD1ljwh2swyyCNO6F6blJ2r3K7ywzkU8pEyM,1172
44
- peak/resources/artifacts.py,sha256=xPnv7DqCoSsKNcp8AC638rDnS37o-mfhrWOChHuQ92s,14381
45
- peak/resources/images.py,sha256=ZZlDoZ-P8DwIS3-flbaEWeZi6yHJbXns0McqC3jmrBo,37273
46
- peak/resources/services.py,sha256=g9IhSnSzbS4nymN2LwfqrItLsVKCCfIw9kHRNRP2DHU,16712
46
+ peak/resources/__init__.py,sha256=xTYFuTvVTXJECutc1h-uDYuK-xL-5lctu3ZDXvn0ZHw,1207
47
+ peak/resources/alerts.py,sha256=-RIfyCa4bkrb32poJlbKnsfLslpw49DyqvUOCTl-mUo,12370
48
+ peak/resources/artifacts.py,sha256=lLVRRrznKKYVOA-pinWyqLpRd-AoFHGkFYwLT9aEGOU,14365
49
+ peak/resources/images.py,sha256=5HKyaBuUO2cvEI-KieUJ9laDBp0vAD02o3SNmK4J6mI,37186
50
+ peak/resources/services.py,sha256=B9FJQD4eFGYdHbYbfHocfXm1LlRGil7yTmQPwTEpazM,16910
47
51
  peak/resources/tenants.py,sha256=J6lxfq1HXfyhA2EmSSSUHi4fRN6KU__yV7El1PVmvtk,2936
48
- peak/resources/webapps.py,sha256=B2Ai0twwcqBkFcaHVbvMO-834nBwd-zz9hY4OqItJkU,13753
49
- peak/resources/workflows.py,sha256=B1vbUBuG1hF82JyZpJ0tD1gDe1vrGEbejC083XjJU1o,48779
52
+ peak/resources/users.py,sha256=X9NfZo1dVvXQk_DCxzTKGG_VCsSmk7HzHdJrRR90mKQ,3428
53
+ peak/resources/webapps.py,sha256=6rJDEj0dkQ8bPm0OnNchB7_Ec4eN9FBCUhD8r7YyX5U,13719
54
+ peak/resources/workflows.py,sha256=ePDis4MFa7HZd2PCEt2Y-WfpdFY1hsOmJStiXxccVwc,52753
50
55
  peak/sample_yaml/press/apps/deployments/create_app_deployment.yaml,sha256=-P2wFBnxY_yCxRJ5-Wx1NQyLrdbBQa8RAxVKXjyiGYc,996
51
56
  peak/sample_yaml/press/apps/deployments/create_app_deployment_revision.yaml,sha256=QVYjGBBDxoqADIxWuOuV3X8rABpvHMZUbXlA7KpKg1s,688
52
57
  peak/sample_yaml/press/apps/deployments/update_app_deployment_metadata.yaml,sha256=RBrAnxULPXYTrYY7T6l-L5_Q1E8LJ6RwVwOkw4zn5w0,302
@@ -63,6 +68,7 @@ peak/sample_yaml/press/blocks/specs/update_block_spec_metadata.yaml,sha256=WsfYG
63
68
  peak/sample_yaml/resources/artifacts/create_artifact.yaml,sha256=TtUB8yI-hZqXY3t5bCYPbXncvg-GXUIq0T8Ak7tYuW4,152
64
69
  peak/sample_yaml/resources/artifacts/create_artifact_version.yaml,sha256=orT1FOpjxpLP3XHMB9XDfhLM1KG8Sv3PSlVUQkeNUeI,104
65
70
  peak/sample_yaml/resources/artifacts/update_artifact_metadata.yaml,sha256=nvV84lOBtoekXl3kWrMTIU3tbsVn-gVIx4cLRI8jevw,99
71
+ peak/sample_yaml/resources/emails/send_email.yaml,sha256=aU0oUT7AppVRSnu-NJmp-Li0xKkM8XGqStpJAIGYKGg,256
66
72
  peak/sample_yaml/resources/images/dockerfile/create_image.yaml,sha256=ilAnSimao_seHS2B_s2A8cSlSPzoM68rE0D8iOqtK6I,343
67
73
  peak/sample_yaml/resources/images/dockerfile/create_image_version.yaml,sha256=1eQG1oG870Aq221SGoHC6HhfFRRN-skeQZMmmouIwfc,310
68
74
  peak/sample_yaml/resources/images/dockerfile/update_version.yaml,sha256=CM_20zqxoe4QFL8nfabZYOk8gkSI2pYRiYoNKC9itaY,275
@@ -73,35 +79,36 @@ peak/sample_yaml/resources/images/upload/create_image.yaml,sha256=-ZtlxiohuyS8n_
73
79
  peak/sample_yaml/resources/images/upload/create_image_version.yaml,sha256=pE9CQM9V5jftNWssFQGAPSCEyAx8nCn-LdYmlNQmVHw,395
74
80
  peak/sample_yaml/resources/images/upload/create_or_update_image.yaml,sha256=xhB-BGRhlJ74n8Hnhvv4_JXmQKBuBvGwhfJHTfBNaMo,414
75
81
  peak/sample_yaml/resources/images/upload/update_version.yaml,sha256=r1jL5UhQSWJlQxprwRQenm2i_1lqrzZPydXpaTP-DTw,321
76
- peak/sample_yaml/resources/services/create_or_update_service.yaml,sha256=zR7-E4r0T6wxA0H4EcusWhOzmoLZ0_45tyzSKK9257E,410
77
- peak/sample_yaml/resources/services/create_service.yaml,sha256=zR7-E4r0T6wxA0H4EcusWhOzmoLZ0_45tyzSKK9257E,410
82
+ peak/sample_yaml/resources/services/create_or_update_service.yaml,sha256=YrS3TiUDj-sy8qseFFXuvpR_CXRyCI268hYzv6YA4PA,428
83
+ peak/sample_yaml/resources/services/create_service.yaml,sha256=YrS3TiUDj-sy8qseFFXuvpR_CXRyCI268hYzv6YA4PA,428
78
84
  peak/sample_yaml/resources/services/test_service.yaml,sha256=600Ufl4c63LWXiGJATH0-dvWPIgLjh-QOd-mIIruuxo,158
79
- peak/sample_yaml/resources/services/update_service.yaml,sha256=0MysavbZ8wPK0xzK-GJwD7PrhpJ_ZDZlpy7VZNQuRww,377
85
+ peak/sample_yaml/resources/services/update_service.yaml,sha256=-0G2AkcJXl5b9e_idoTV3rjeVJ42Dxtb7QWDE-nCB30,395
80
86
  peak/sample_yaml/resources/webapps/create_or_update_webapp.yaml,sha256=r7amhHgvHFczoet7Uv1TU40IN3nPECDohD-V0_joGUM,192
81
87
  peak/sample_yaml/resources/webapps/create_webapp.yaml,sha256=vha4FJgOILeBOp2eaw2CL_fr3LudotLjNu1CR1-cnTg,208
82
88
  peak/sample_yaml/resources/webapps/update_webapp.yaml,sha256=6L2F30h-U6_aSZfRAllDxwAgCMHZk8jBHgUi4l18xRM,199
83
- peak/sample_yaml/resources/workflows/create_or_update_workflow.yaml,sha256=TBXrNAAuHtkxbLYfR541R8BaU7QWG8VPs9veGXZhWWU,556
84
- peak/sample_yaml/resources/workflows/create_workflow.yaml,sha256=f9O6C0pAvjINPa6wWxV4H_1uCvswOZecD8Q8q5xXgsM,1011
89
+ peak/sample_yaml/resources/workflows/create_or_update_workflow.yaml,sha256=8_aAg8W0C5J3h2TaUW-sVLygYMlMC5EHprddB4LN254,1188
90
+ peak/sample_yaml/resources/workflows/create_workflow.yaml,sha256=GBc89mnn22XlP0HlXJyveqeoGgqynoO6EByppLWLhiM,1230
85
91
  peak/sample_yaml/resources/workflows/execute_partial_workflow.yaml,sha256=Mmv3aEr8jsiFN-yuPbp8hk5ZT-GdtEAgwt2pArFC_EQ,237
86
92
  peak/sample_yaml/resources/workflows/execute_workflow.yaml,sha256=aMPjkzS3pFvKy-FfKfGAW9qb1WmAUSU2gsUcyv8a3X0,160
87
- peak/sample_yaml/resources/workflows/patch_workflow.yaml,sha256=TAyTpYWDftJu4vMOqSERxT0vcGgNSzwqzxn4VQDxmdE,385
88
- peak/sample_yaml/resources/workflows/update_workflow.yaml,sha256=HDtMK4Cbay4ePN2n6ErW7UpLsSyOw48CxGGjbVO4PVg,567
93
+ peak/sample_yaml/resources/workflows/patch_workflow.yaml,sha256=tv4lKxWY4xDxtgYc40lN4Bwb9yBnHhoPCoCQ_e88BJA,1017
94
+ peak/sample_yaml/resources/workflows/update_workflow.yaml,sha256=UXqar4eKGkdJCKP_4MkUfYa0IeqhQ8ZHYnbJA08yZrc,1199
89
95
  peak/sample_yaml/resources/workflows/workflow_auto_retry.yaml,sha256=_E5FA-uD1qGVC3RhMCqi56Ac60TACMTnjNZ0wp1aLg8,849
90
96
  peak/sample_yaml/resources/workflows/workflow_execution_parameters.yaml,sha256=bmRQLw-kM3qB2KBWsVonbKPy7-N_SE_CRyeoD5zKm6M,1229
91
97
  peak/sample_yaml/resources/workflows/workflow_input_parameters.yaml,sha256=lG_3KZoZPSIhw2YA9CZvU1B400oMD1t8xQQjvoocO24,457
92
98
  peak/sample_yaml/resources/workflows/workflow_output_parameters.yaml,sha256=PEkinTcETUgFAK1o5-cKjYAqhAlzEFKtOJzRpuBPom8,536
93
99
  peak/sample_yaml/resources/workflows/workflow_skippable_steps.yaml,sha256=BjDy73pWO6nJ-4IjmdyHOJJE5C35E18gjPPlITs7ucI,680
94
- peak/session.py,sha256=swp89e3uQg3SSzuN37LdQ_1ckI4tlMaUDfxRJJFQ0ig,9927
95
- peak/telemetry.py,sha256=ERfDjHWv51WTy0JF-8KXlVnTQx7q9GAEnS8Kk2Rtaqs,7113
96
- peak/template.py,sha256=KT3QX_0PRXJsqeziCMytQ-aM2CKF5h5vnOz6OrpGD6g,9758
100
+ peak/session.py,sha256=AvHmlFQrQLtJlBEMTRC5QKPc8Sg5zXVjmhhrUXaX6Eg,10157
101
+ peak/telemetry.py,sha256=vRiWm3evFRSy_V8wC2IopdDP32KbcueqNASUhlnmyHs,7086
102
+ peak/template.py,sha256=njz8haMQV_WfZ5HQoJFNseUMWPSw2a9r0V7P1hY9GFM,9798
97
103
  peak/tools/__init__.py,sha256=qK30qBi0MNvob6UkyzcfhI0s8nfSwGC4167A_2URBnY,1048
98
- peak/tools/logging/__init__.py,sha256=I53XIPHE0Q9tIVh5RVtonmAV1Pc4phVOdoCXv3ivnAs,10936
104
+ peak/tools/logging/__init__.py,sha256=tIKis2HbtFzXY9gEsjcFipHxoGbieDtV2cYKP7Z9Ibw,1513
99
105
  peak/tools/logging/log_handler.py,sha256=wxU7klDyhCSdiotPnTXCvLhpRes_bnbQ3H1xVn42qjk,1406
100
- peak/tools/logging/log_level.py,sha256=B0EeQ_2waaHB67suhR422-eiUA53g5hgCoM1Abt6OI0,1770
106
+ peak/tools/logging/log_level.py,sha256=Xtv4zZnYk4QBix_MfCRGim4yJbv7w2tTbNKe_s4QmaI,2665
107
+ peak/tools/logging/logger.py,sha256=Jow5D3hqek-n0kHWNeL2nKbC9NfpfkWFT_FmPp-skTw,15653
101
108
  peak/tools/logging/utils.py,sha256=qmjdBbCc1Y6JDbSgNXfdnLnpkx7fb9kPw9u8uO3AAII,3330
102
- peak/validators.py,sha256=K5QLn86KCNyTNop1FV34eC7ZVNAcNdtmQ20sdbILwGI,1664
103
- peak_sdk-1.4.0.dist-info/LICENSE,sha256=W0jszenKx7YdFA7BDnyg8xDKXzCP8AperJb_PHh9paQ,11340
104
- peak_sdk-1.4.0.dist-info/METADATA,sha256=I0FL4dOp7n0XUhRt2mvXo3A6ZIVPfnDx3nscbONdgg8,7072
105
- peak_sdk-1.4.0.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
106
- peak_sdk-1.4.0.dist-info/entry_points.txt,sha256=zHCEjuOTjkfmqivgEZQsPGm4zFA4W3Q_vKCjPr7W6lE,47
107
- peak_sdk-1.4.0.dist-info/RECORD,,
109
+ peak/validators.py,sha256=_nVAXF_AB443voKNjyQsCTQBAVVAqn7xCbCbBguohIs,2715
110
+ peak_sdk-1.6.0.dist-info/LICENSE,sha256=W0jszenKx7YdFA7BDnyg8xDKXzCP8AperJb_PHh9paQ,11340
111
+ peak_sdk-1.6.0.dist-info/METADATA,sha256=jTkdveMM8BarH1fWE6Z0MLkSwhj_RuGuM4zncwRI_Gs,7044
112
+ peak_sdk-1.6.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
113
+ peak_sdk-1.6.0.dist-info/entry_points.txt,sha256=zHCEjuOTjkfmqivgEZQsPGm4zFA4W3Q_vKCjPr7W6lE,47
114
+ peak_sdk-1.6.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.5.1
2
+ Generator: poetry-core 1.9.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any