peak-sdk 1.4.0__py3-none-any.whl → 1.5.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.
peak/_version.py CHANGED
@@ -18,4 +18,4 @@
18
18
  # # You should have received a copy of the APACHE LICENSE, VERSION 2.0
19
19
  # # along with this program. If not, see <https://apache.org/licenses/LICENSE-2.0>
20
20
  #
21
- __version__: str = "1.4.0"
21
+ __version__: str = "1.5.0"
peak/cli/cli.py CHANGED
@@ -25,7 +25,7 @@ import peak.config
25
25
  import typer
26
26
  from peak.cli import args, helpers
27
27
  from peak.cli.press import apps, blocks, deployments, specs
28
- from peak.cli.resources import artifacts, images, services, tenants, webapps, workflows
28
+ from peak.cli.resources import artifacts, images, services, tenants, users, webapps, workflows
29
29
  from peak.constants import Sources
30
30
  from peak.output import Writer
31
31
 
@@ -43,6 +43,7 @@ typer_app.add_typer(apps.app, name="apps")
43
43
  typer_app.add_typer(blocks.app, name="blocks")
44
44
  typer_app.add_typer(specs.app, name="specs")
45
45
  typer_app.add_typer(deployments.app, name="deployments")
46
+ typer_app.add_typer(users.app, name="users")
46
47
 
47
48
 
48
49
  @typer_app.callback()
peak/cli/helpers.py CHANGED
@@ -251,5 +251,6 @@ def get_client(command: str) -> base_client.BaseClient:
251
251
  "services": resources.services,
252
252
  "webapps": resources.webapps,
253
253
  "tenants": resources.tenants,
254
+ "users": resources.users,
254
255
  }
255
256
  return command_client_map[command].get_client() # type: ignore[no-any-return]
@@ -0,0 +1,71 @@
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
+ """Peak Users commands."""
22
+ from typing import Optional
23
+
24
+ import typer
25
+ from peak import Session
26
+ from peak.cli.args import OUTPUT_TYPES, PAGING
27
+ from peak.constants import OutputTypesNoTable
28
+ from peak.output import Writer
29
+ from peak.resources import users
30
+
31
+ app = typer.Typer(
32
+ help="User management and permission checking.",
33
+ short_help="Manage User Permissions.",
34
+ )
35
+
36
+ _FEATURE = typer.Option(..., help="The feature path to check permissions for, e.g., 'PRICING.GUARDRAILS'.")
37
+ _ACTION = typer.Option(..., help="The action to check for the feature path, e.g., 'read' or 'write'.")
38
+ _AUTH_TOKEN = typer.Option(
39
+ None,
40
+ help="Authentication token for the user. If not provided, the token from the environment will be used.",
41
+ )
42
+
43
+
44
+ @app.command(short_help="Check user permission for a specific feature.", options_metavar="check_permission")
45
+ def check_permission(
46
+ ctx: typer.Context,
47
+ feature: str = _FEATURE,
48
+ action: str = _ACTION,
49
+ auth_token: Optional[str] = _AUTH_TOKEN,
50
+ paging: Optional[bool] = PAGING, # noqa: ARG001
51
+ output_type: Optional[OutputTypesNoTable] = OUTPUT_TYPES, # noqa: ARG001
52
+ ) -> None:
53
+ """Check if the user has the specified permission for the given feature path.
54
+
55
+ \b
56
+ 📝 ***Example usage:***
57
+ ```bash
58
+ peak user check-permission --feature "PRICING.GUARDRAILS" --action "read" --auth-token <your-auth-token>
59
+ ```
60
+
61
+ \b
62
+ 🆗 ***Response:***
63
+ True if the user has the permission, False otherwise.
64
+ """
65
+ user_session = Session(auth_token=auth_token)
66
+ user_client = users.get_client(session=user_session)
67
+ writer: Writer = ctx.obj["writer"]
68
+
69
+ with writer.pager():
70
+ response = user_client.check_permissions({feature: action})
71
+ writer.write(response.get(feature, False))
peak/helpers.py CHANGED
@@ -239,3 +239,30 @@ def download_logs_helper(
239
239
  if config.SOURCE == Sources.CLI:
240
240
  writer = Writer()
241
241
  writer.write(f"\nLog contents have been saved to: {file_name}")
242
+
243
+
244
+ def search_action(current_path: str, current_dict: Dict[str, Any], action: str) -> Dict[str, bool]:
245
+ """Search for a specified action within a nested dictionary structure and check if deeper levels exist.
246
+
247
+ Args:
248
+ current_path (str): The dot-separated path representing the feature hierarchy.
249
+ current_dict (Dict[str, Any]): The nested dictionary representing the permissions structure.
250
+ action (str): The action to search for (e.g., "read" or "write").
251
+
252
+ Returns:
253
+ bool: A dictionary with keys 'has_permission' indicating if the action is found and
254
+ 'deeper_levels' indicating if there are deeper levels that need specification.
255
+ """
256
+ keys = current_path.split(".")
257
+ for key in keys:
258
+ if key in current_dict:
259
+ current_dict = current_dict[key]
260
+ else:
261
+ return {"has_permission": False, "deeper_levels": False}
262
+
263
+ if "actions" in current_dict:
264
+ actions = current_dict["actions"]
265
+ has_permission = "*" in actions or action in actions or ("write" in actions and action == "read")
266
+ return {"has_permission": has_permission, "deeper_levels": False}
267
+
268
+ return {"has_permission": False, "deeper_levels": True}
@@ -23,6 +23,6 @@ from __future__ import annotations
23
23
 
24
24
  from typing import List
25
25
 
26
- from peak.resources import artifacts, images, services, tenants, webapps, workflows
26
+ from peak.resources import artifacts, images, services, tenants, users, webapps, workflows
27
27
 
28
- __all__: List[str] = ["workflows", "images", "artifacts", "webapps", "tenants", "services"]
28
+ __all__: List[str] = ["artifacts", "images", "services", "tenants", "users", "webapps", "workflows"]
@@ -0,0 +1,93 @@
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
+
22
+ """User client module."""
23
+ from __future__ import annotations
24
+
25
+ from typing import Dict, Optional
26
+
27
+ from peak.base_client import BaseClient
28
+ from peak.constants import ContentType, HttpMethods
29
+ from peak.helpers import search_action
30
+ from peak.session import Session
31
+ from peak.validators import validate_action, validate_feature_path
32
+
33
+
34
+ class User(BaseClient):
35
+ """Client class for interacting with users resource."""
36
+
37
+ BASE_ENDPOINT = "access-control/api/v2"
38
+
39
+ def check_permissions(self, feature_actions: Dict[str, str]) -> Dict[str, bool]:
40
+ """Check if the user has the specified permissions for the given features or subfeatures.
41
+
42
+ Args:
43
+ feature_actions (Dict[str, str]): A dictionary where keys are feature paths (e.g., "PRICING.GUARDRAILS")
44
+ and values are actions (e.g., "read" or "write").
45
+
46
+ Returns:
47
+ Dict[str, bool]: A dictionary where keys are the same feature paths and values are booleans
48
+ indicating whether the user has the specified action permission for that feature.
49
+
50
+ Raises:
51
+ UnauthorizedException: The credentials are invalid.
52
+ ForbiddenException: The user does not have permission to perform the operation.
53
+ NotFoundException: The given feature does not exist.
54
+ UnprocessableEntityException: The server was unable to process the request.
55
+ InternalServerErrorException: The server failed to process the request.
56
+ """
57
+ method, endpoint = HttpMethods.GET, f"{self.BASE_ENDPOINT}/access/permissions"
58
+
59
+ permissions_response = self.session.create_request(
60
+ endpoint,
61
+ method,
62
+ params={
63
+ "type": "app",
64
+ },
65
+ content_type=ContentType.APPLICATION_JSON,
66
+ )
67
+
68
+ result_permissions = {}
69
+
70
+ for feature_path, action in feature_actions.items():
71
+ validate_action(action)
72
+
73
+ search_result = search_action(feature_path, permissions_response, action)
74
+ validate_feature_path(search_result=search_result, feature_path=feature_path)
75
+
76
+ result_permissions[feature_path] = search_result["has_permission"]
77
+
78
+ return result_permissions
79
+
80
+
81
+ def get_client(session: Optional[Session] = None) -> User:
82
+ """Returns a User client, If no session is provided, a default session is used.
83
+
84
+ Args:
85
+ session (Optional[Session]): A Session Object. Default is None.
86
+
87
+ Returns:
88
+ User: The user client object.
89
+ """
90
+ return User(session)
91
+
92
+
93
+ __all__ = ["get_client"]
@@ -1011,7 +1011,7 @@ class Workflow(BaseClient):
1011
1011
  Set `return_iterator` to True if you want automatic client-side pagination, or False if you want server-side pagination.
1012
1012
 
1013
1013
  Raises:
1014
- BadRequestException: BadRequestException: The given request parameters are invalid.
1014
+ BadRequestException: The given request parameters are invalid.
1015
1015
  UnauthorizedException: The credentials are invalid.
1016
1016
  ForbiddenException: The user does not have permission to perform the operation.
1017
1017
  NotFoundException: The given workflow does not exist.
@@ -1068,7 +1068,7 @@ class Workflow(BaseClient):
1068
1068
  Dict[str, Any]: A dictionary containing the logs for the given execution.
1069
1069
 
1070
1070
  Raises:
1071
- BadRequestException: BadRequestException: The given request parameters are invalid.
1071
+ BadRequestException: The given request parameters are invalid.
1072
1072
  UnauthorizedException: The credentials are invalid.
1073
1073
  ForbiddenException: The user does not have permission to perform the operation.
1074
1074
  NotFoundException: The given workflow does not exist.
@@ -1123,7 +1123,7 @@ class Workflow(BaseClient):
1123
1123
  Dict[str, Any]: A dictionary containing the logs for the given execution.
1124
1124
 
1125
1125
  Raises:
1126
- BadRequestException: BadRequestException: The given request parameters are invalid.
1126
+ BadRequestException: The given request parameters are invalid.
1127
1127
  UnauthorizedException: The credentials are invalid.
1128
1128
  ForbiddenException: The user does not have permission to perform the operation.
1129
1129
  NotFoundException: The given workflow does not exist.
peak/session.py CHANGED
@@ -70,7 +70,7 @@ class Session:
70
70
 
71
71
  Args:
72
72
  auth_token (str | None): Authentication token. Both API Key and Bearer tokens are supported.
73
- Picks up from `API_KEY` environment variable if not provided.
73
+ Picks up from `PEAK_AUTH_TOKEN` or `API_KEY` environment variable if not provided.
74
74
  stage (str | None): Name of the stage where tenant is created. Default is `prod`.
75
75
  """
76
76
  self.base_domain: str = ""
@@ -238,9 +238,12 @@ class Session:
238
238
  self.auth_token = auth_token
239
239
  return
240
240
 
241
- logger.info("auth_token not given, searching for API_KEY in env variables")
242
- if not os.environ.get("API_KEY"):
243
- raise exceptions.MissingEnvironmentVariableException(env_var="API_KEY")
241
+ logger.info("auth_token not given, searching for 'PEAK_AUTH_TOKEN' or 'API_KEY' in env variables")
242
+ if not os.environ.get("API_KEY") and not os.environ.get("PEAK_AUTH_TOKEN"):
243
+ raise exceptions.MissingEnvironmentVariableException(env_var="PEAK_AUTH_TOKEN or API_KEY")
244
+ if os.environ.get("PEAK_AUTH_TOKEN"):
245
+ self.auth_token = os.environ["PEAK_AUTH_TOKEN"]
246
+ return
244
247
  self.auth_token = os.environ["API_KEY"]
245
248
 
246
249
  def _set_stage(self, stage: Optional[str]) -> None:
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.5.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
@@ -94,13 +94,13 @@ Follow these steps to create a virtual environment using Python's built-in `venv
94
94
  echo "compinit" >> ~/.zshrc # replace .zshrc with your shell's configuration file
95
95
  ```
96
96
 
97
- ### Using the SDK/CLI
97
+ ### Using the SDK and CLI
98
98
 
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:
99
+ - To start using the SDK and CLI, you'll need either an API Key or a Personal Access Token (PAT).
100
+ - 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).
101
+ - To export it, run the following command in your terminal and replace <peak_auth_token> with your actual API key or PAT:
102
102
  ```
103
- export API_KEY=<api_key | access_token>
103
+ export PEAK_AUTH_TOKEN=<peak_auth_token>
104
104
  ```
105
105
 
106
106
  ### Documentation
@@ -1,13 +1,13 @@
1
1
  peak/__init__.py,sha256=yULGsiciVPNjdTO6uwEynsyLFiGBA2n7TT72DzKn9z8,1263
2
2
  peak/_metadata.py,sha256=grRJ8sixuoMQnvJnq-tQDheb5URzLXkKxXzl8UrTHvY,22930
3
- peak/_version.py,sha256=hHRSX_HntUAVVQwEqC8xFuqFaKh-BM5TKJ4dISWDTXI,886
3
+ peak/_version.py,sha256=LOauAOLrFg8lEqnmcJstbzCjySeXVJ6zNrUW2MLWqeY,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=XkHGdoPhaycU8O4P-ij9-ziLCAgZDdJjUwqNVYRiIIE,2384
10
+ peak/cli/helpers.py,sha256=QwVrvU4muVREeP8hhBbkJ61OOFH8WWPzzQQPkt_TYeo,8250
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
@@ -22,6 +22,7 @@ peak/cli/resources/artifacts.py,sha256=LQcJKw39xoJaFeTJMYi1n-XTyU02SOSKg0J1VuWrh
22
22
  peak/cli/resources/images.py,sha256=KzLVGNuPUpCA8AsZufXZgYFA4pnZ9JsZInE7zclmNmQ,43125
23
23
  peak/cli/resources/services.py,sha256=f-1lGUerQ1qwIcVFfSumiPES1nreQp1bhaUeKXbJLtI,23435
24
24
  peak/cli/resources/tenants.py,sha256=m5hwW8rQLKsRQwOFAmE2QQXiOLRV-hZmomxUGSEPFjg,2624
25
+ peak/cli/resources/users.py,sha256=igXEelUTnqcqVd4OUu2YUMu8kwelWp7ZM9JgXxk9Jfg,2628
25
26
  peak/cli/resources/webapps.py,sha256=0Wunb-XYvM5n5HQO4_-LDMCDezdRo_FbbsEnHPTdA2Y,21349
26
27
  peak/cli/resources/workflows.py,sha256=jd5dy24WBpXu5xfp0-LDBkeHq9KxBE-rstdrfPX7zx8,48787
27
28
  peak/cli/ruff.toml,sha256=eyOQvxmLQvGqEEcH3RaiM_8B5wh2UVWrWYzL2xeX7sk,185
@@ -31,7 +32,7 @@ peak/config.py,sha256=FZ6aIN0gwA52noh-8HJkGnUr8HEOpyNFk6uR4QWt65o,1146
31
32
  peak/constants.py,sha256=TDMN4cXXKyR_Q8maeo8Ukvprl_Bz0YtYytD3yuHBZKs,3312
32
33
  peak/exceptions.py,sha256=uXVBnBVK6kAkAC_VVeEvohdRUH2KGhRthnqwnhfHcV4,6974
33
34
  peak/handler.py,sha256=IqbGbEz1slg5RH3Cg7Wn5pyDAy5fo1yga1TVqI7UYDM,14777
34
- peak/helpers.py,sha256=Mx2lkokMt2NlEpHvRw1hzuo-K3uQyfrZSaFM6VtDB44,7588
35
+ peak/helpers.py,sha256=9PX8GbDmDrqV-VaG_0by3ZD69YyzwYNnTQhuyMC3GUM,8812
35
36
  peak/logger.py,sha256=bPq_7mdbhFoUcnV_LCi8hRDrb7INwf8PHHEx2z83bFU,1548
36
37
  peak/output.py,sha256=SbWppqvrEHzZp4I_iX3l855BcRSTuZ3mQsiqYpdCgLk,6230
37
38
  peak/press/__init__.py,sha256=80Key6wov_xZld45-39ELT0gDC_t4cy-JvA9wfCy7-c,1112
@@ -40,13 +41,14 @@ peak/press/blocks.py,sha256=HfJy-0m1-hMZBdJUN0YU-q2sTaQOExd1e3ZvuFM0gec,59239
40
41
  peak/press/deployments.py,sha256=PaZGNbC5Bcx885tzxUYA-ve44gfKgMnP4dkJrPDVVH8,5950
41
42
  peak/press/specs.py,sha256=b-O5a-hjdPXFIGcGR913VWC6FKWTiZ74lkOXhFaLOFA,10850
42
43
  peak/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- peak/resources/__init__.py,sha256=vvEBH8XAD1ljwh2swyyCNO6F6blJ2r3K7ywzkU8pEyM,1172
44
+ peak/resources/__init__.py,sha256=yszHkLXI7sdz5mMaVcHx5LXefb_957_WwFThQmQ7w20,1188
44
45
  peak/resources/artifacts.py,sha256=xPnv7DqCoSsKNcp8AC638rDnS37o-mfhrWOChHuQ92s,14381
45
46
  peak/resources/images.py,sha256=ZZlDoZ-P8DwIS3-flbaEWeZi6yHJbXns0McqC3jmrBo,37273
46
47
  peak/resources/services.py,sha256=g9IhSnSzbS4nymN2LwfqrItLsVKCCfIw9kHRNRP2DHU,16712
47
48
  peak/resources/tenants.py,sha256=J6lxfq1HXfyhA2EmSSSUHi4fRN6KU__yV7El1PVmvtk,2936
49
+ peak/resources/users.py,sha256=X9NfZo1dVvXQk_DCxzTKGG_VCsSmk7HzHdJrRR90mKQ,3428
48
50
  peak/resources/webapps.py,sha256=B2Ai0twwcqBkFcaHVbvMO-834nBwd-zz9hY4OqItJkU,13753
49
- peak/resources/workflows.py,sha256=B1vbUBuG1hF82JyZpJ0tD1gDe1vrGEbejC083XjJU1o,48779
51
+ peak/resources/workflows.py,sha256=PFWulP_CZ97Q6p0easBGTXBbFrvSrocK448xIMMiQ4I,48716
50
52
  peak/sample_yaml/press/apps/deployments/create_app_deployment.yaml,sha256=-P2wFBnxY_yCxRJ5-Wx1NQyLrdbBQa8RAxVKXjyiGYc,996
51
53
  peak/sample_yaml/press/apps/deployments/create_app_deployment_revision.yaml,sha256=QVYjGBBDxoqADIxWuOuV3X8rABpvHMZUbXlA7KpKg1s,688
52
54
  peak/sample_yaml/press/apps/deployments/update_app_deployment_metadata.yaml,sha256=RBrAnxULPXYTrYY7T6l-L5_Q1E8LJ6RwVwOkw4zn5w0,302
@@ -91,7 +93,7 @@ peak/sample_yaml/resources/workflows/workflow_execution_parameters.yaml,sha256=b
91
93
  peak/sample_yaml/resources/workflows/workflow_input_parameters.yaml,sha256=lG_3KZoZPSIhw2YA9CZvU1B400oMD1t8xQQjvoocO24,457
92
94
  peak/sample_yaml/resources/workflows/workflow_output_parameters.yaml,sha256=PEkinTcETUgFAK1o5-cKjYAqhAlzEFKtOJzRpuBPom8,536
93
95
  peak/sample_yaml/resources/workflows/workflow_skippable_steps.yaml,sha256=BjDy73pWO6nJ-4IjmdyHOJJE5C35E18gjPPlITs7ucI,680
94
- peak/session.py,sha256=swp89e3uQg3SSzuN37LdQ_1ckI4tlMaUDfxRJJFQ0ig,9927
96
+ peak/session.py,sha256=AvHmlFQrQLtJlBEMTRC5QKPc8Sg5zXVjmhhrUXaX6Eg,10157
95
97
  peak/telemetry.py,sha256=ERfDjHWv51WTy0JF-8KXlVnTQx7q9GAEnS8Kk2Rtaqs,7113
96
98
  peak/template.py,sha256=KT3QX_0PRXJsqeziCMytQ-aM2CKF5h5vnOz6OrpGD6g,9758
97
99
  peak/tools/__init__.py,sha256=qK30qBi0MNvob6UkyzcfhI0s8nfSwGC4167A_2URBnY,1048
@@ -99,9 +101,9 @@ peak/tools/logging/__init__.py,sha256=I53XIPHE0Q9tIVh5RVtonmAV1Pc4phVOdoCXv3ivnA
99
101
  peak/tools/logging/log_handler.py,sha256=wxU7klDyhCSdiotPnTXCvLhpRes_bnbQ3H1xVn42qjk,1406
100
102
  peak/tools/logging/log_level.py,sha256=B0EeQ_2waaHB67suhR422-eiUA53g5hgCoM1Abt6OI0,1770
101
103
  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,,
104
+ peak/validators.py,sha256=_nVAXF_AB443voKNjyQsCTQBAVVAqn7xCbCbBguohIs,2715
105
+ peak_sdk-1.5.0.dist-info/LICENSE,sha256=W0jszenKx7YdFA7BDnyg8xDKXzCP8AperJb_PHh9paQ,11340
106
+ peak_sdk-1.5.0.dist-info/METADATA,sha256=NCEKFnlpl8oyhvShHJVF1tJWuIB0AwUXArLd42vxmVU,7121
107
+ peak_sdk-1.5.0.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
108
+ peak_sdk-1.5.0.dist-info/entry_points.txt,sha256=zHCEjuOTjkfmqivgEZQsPGm4zFA4W3Q_vKCjPr7W6lE,47
109
+ peak_sdk-1.5.0.dist-info/RECORD,,