snapctl 0.49.4__py3-none-any.whl → 0.50.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.
Potentially problematic release.
This version of snapctl might be problematic. Click here for more details.
- snapctl/commands/byogs.py +16 -2
- snapctl/commands/byosnap.py +53 -25
- snapctl/commands/byows.py +2 -4
- snapctl/config/constants.py +1 -1
- snapctl/data/releases/beta-0.50.0.mdx +10 -0
- snapctl/main.py +1 -2
- snapctl/utils/echo.py +19 -8
- {snapctl-0.49.4.dist-info → snapctl-0.50.0.dist-info}/METADATA +1 -1
- {snapctl-0.49.4.dist-info → snapctl-0.50.0.dist-info}/RECORD +12 -12
- snapctl/data/releases/beta-0.49.4.mdx +0 -8
- {snapctl-0.49.4.dist-info → snapctl-0.50.0.dist-info}/LICENSE +0 -0
- {snapctl-0.49.4.dist-info → snapctl-0.50.0.dist-info}/WHEEL +0 -0
- {snapctl-0.49.4.dist-info → snapctl-0.50.0.dist-info}/entry_points.txt +0 -0
snapctl/commands/byogs.py
CHANGED
|
@@ -105,6 +105,16 @@ class ByoGs:
|
|
|
105
105
|
pass
|
|
106
106
|
return None
|
|
107
107
|
|
|
108
|
+
@staticmethod
|
|
109
|
+
def _docker_supports_buildkit():
|
|
110
|
+
try:
|
|
111
|
+
version = subprocess.check_output(
|
|
112
|
+
["docker", "version", "--format", "{{.Server.Version}}"])
|
|
113
|
+
major, minor = map(int, version.decode().split(".")[:2])
|
|
114
|
+
return (major > 18) or (major == 18 and minor >= 9)
|
|
115
|
+
except Exception:
|
|
116
|
+
return False
|
|
117
|
+
|
|
108
118
|
def _check_dependencies(self) -> None:
|
|
109
119
|
progress = Progress(
|
|
110
120
|
SpinnerColumn(),
|
|
@@ -200,6 +210,10 @@ class ByoGs:
|
|
|
200
210
|
progress.add_task(
|
|
201
211
|
description='Building your snap...', total=None)
|
|
202
212
|
try:
|
|
213
|
+
env = os.environ.copy()
|
|
214
|
+
if ByoGs._docker_supports_buildkit():
|
|
215
|
+
info('Docker BuildKit is supported. Enabling it.')
|
|
216
|
+
env["DOCKER_BUILDKIT"] = "1"
|
|
203
217
|
# image_tag = f'{ByoGs.SID}.{self.tag}'
|
|
204
218
|
build_platform = ByoGs.DEFAULT_BUILD_PLATFORM
|
|
205
219
|
if len(self.token_parts) == 4:
|
|
@@ -217,7 +231,7 @@ class ByoGs:
|
|
|
217
231
|
# f"docker build --no-cache -t {tag} {path}"
|
|
218
232
|
'docker', 'build', '--platform', build_platform, '-t', self.tag,
|
|
219
233
|
'-f', self.docker_path_filename, self.path
|
|
220
|
-
], shell=True, check=False)
|
|
234
|
+
], shell=True, check=False, env=env)
|
|
221
235
|
# stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
|
|
222
236
|
else:
|
|
223
237
|
response = subprocess.run([
|
|
@@ -225,7 +239,7 @@ class ByoGs:
|
|
|
225
239
|
"docker build --platform " +
|
|
226
240
|
f"{build_platform} -t {self.tag} " +
|
|
227
241
|
f"-f {self.docker_path_filename} {self.path}"
|
|
228
|
-
], shell=True, check=False)
|
|
242
|
+
], shell=True, check=False, env=env)
|
|
229
243
|
# stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
|
|
230
244
|
if not response.returncode:
|
|
231
245
|
return snapctl_success(
|
snapctl/commands/byosnap.py
CHANGED
|
@@ -509,16 +509,19 @@ class ByoSnap:
|
|
|
509
509
|
outfile.write(line)
|
|
510
510
|
return True
|
|
511
511
|
except FileNotFoundError:
|
|
512
|
-
|
|
512
|
+
warning(
|
|
513
|
+
f"[ERROR] Could not find profile file: {resource_filename}")
|
|
514
|
+
return False
|
|
515
|
+
|
|
516
|
+
@staticmethod
|
|
517
|
+
def _docker_supports_buildkit():
|
|
518
|
+
try:
|
|
519
|
+
version = subprocess.check_output(
|
|
520
|
+
["docker", "version", "--format", "{{.Server.Version}}"])
|
|
521
|
+
major, minor = map(int, version.decode().split(".")[:2])
|
|
522
|
+
return (major > 18) or (major == 18 and minor >= 9)
|
|
523
|
+
except Exception:
|
|
513
524
|
return False
|
|
514
|
-
# @staticmethod
|
|
515
|
-
# def _handle_output_file(input_filepath, output_filepath) -> bool:
|
|
516
|
-
# file_written = False
|
|
517
|
-
# with open(input_filepath, 'r') as in_file, open(output_filepath, 'w') as outfile:
|
|
518
|
-
# for line in in_file:
|
|
519
|
-
# outfile.write(line)
|
|
520
|
-
# file_written = True
|
|
521
|
-
# return file_written
|
|
522
525
|
|
|
523
526
|
def _get_profile_contents(self) -> dict:
|
|
524
527
|
"""
|
|
@@ -588,13 +591,15 @@ class ByoSnap:
|
|
|
588
591
|
code=SNAPCTL_INPUT_ERROR
|
|
589
592
|
)
|
|
590
593
|
# IMPORTANT: This is where the profile data is set and validated
|
|
594
|
+
#
|
|
595
|
+
# Update: June 2, 2025 - We removed the line that updated the self.platform_type
|
|
596
|
+
# self.platform_type = profile_data_obj['platform']
|
|
591
597
|
self.profile_data = profile_data_obj
|
|
592
598
|
ByoSnap._validate_byosnap_profile_data(self.profile_data)
|
|
593
599
|
# End: IMPORTANT: This is where the profile data is set
|
|
594
600
|
# Now apply the overrides
|
|
595
601
|
self.name = self.profile_data['name']
|
|
596
602
|
self.desc = self.profile_data['description']
|
|
597
|
-
self.platform_type = self.profile_data['platform']
|
|
598
603
|
self.language = self.profile_data['language']
|
|
599
604
|
self.prefix = self.profile_data['prefix']
|
|
600
605
|
# Setup the final ingress external port
|
|
@@ -716,6 +721,10 @@ class ByoSnap:
|
|
|
716
721
|
build_platform = ByoSnap.DEFAULT_BUILD_PLATFORM
|
|
717
722
|
if len(self.token_parts) == 4:
|
|
718
723
|
build_platform = self.token_parts[3]
|
|
724
|
+
if self.platform_type is not None:
|
|
725
|
+
build_platform = self.platform_type
|
|
726
|
+
# if len(self.token_parts) == 4:
|
|
727
|
+
# build_platform = self.token_parts[3]
|
|
719
728
|
progress = Progress(
|
|
720
729
|
SpinnerColumn(),
|
|
721
730
|
TextColumn("[progress.description]{task.description}"),
|
|
@@ -725,6 +734,10 @@ class ByoSnap:
|
|
|
725
734
|
progress.add_task(
|
|
726
735
|
description='Building your snap...', total=None)
|
|
727
736
|
try:
|
|
737
|
+
env = os.environ.copy()
|
|
738
|
+
if ByoSnap._docker_supports_buildkit():
|
|
739
|
+
info('Docker BuildKit is supported. Enabling it.')
|
|
740
|
+
env["DOCKER_BUILDKIT"] = "1"
|
|
728
741
|
# Warning check for architecture specific commands
|
|
729
742
|
info(f'Building on system architecture {sys_platform.machine()}')
|
|
730
743
|
check_response = check_dockerfile_architecture(
|
|
@@ -737,7 +750,7 @@ class ByoSnap:
|
|
|
737
750
|
# f"docker build --no-cache -t {remote_tag} {path}"
|
|
738
751
|
'docker', 'build', '--platform', build_platform, '-t', self.remote_tag,
|
|
739
752
|
'-f', self.docker_path_filename, self.path
|
|
740
|
-
], shell=True, check=False)
|
|
753
|
+
], shell=True, check=False, env=env)
|
|
741
754
|
# stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
|
|
742
755
|
else:
|
|
743
756
|
response = subprocess.run([
|
|
@@ -745,7 +758,7 @@ class ByoSnap:
|
|
|
745
758
|
"docker build --platform " +
|
|
746
759
|
f"{build_platform} -t {self.remote_tag} " +
|
|
747
760
|
f"-f {self.docker_path_filename} {self.path}"
|
|
748
|
-
], shell=True, check=False)
|
|
761
|
+
], shell=True, check=False, env=env)
|
|
749
762
|
# stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
|
|
750
763
|
if not response.returncode:
|
|
751
764
|
return snapctl_success(
|
|
@@ -943,15 +956,21 @@ class ByoSnap:
|
|
|
943
956
|
if self.path is None and self.resources_path is None:
|
|
944
957
|
snapctl_error(
|
|
945
958
|
"Missing one of: path or resources-path parameter", SNAPCTL_INPUT_ERROR)
|
|
946
|
-
if not self.tag:
|
|
947
|
-
snapctl_error("Missing tag", SNAPCTL_INPUT_ERROR)
|
|
948
|
-
if
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
959
|
+
if not self.tag and not self.version:
|
|
960
|
+
snapctl_error("Missing tag or version", SNAPCTL_INPUT_ERROR)
|
|
961
|
+
if self.tag:
|
|
962
|
+
if len(self.tag.split()) > 1 or \
|
|
963
|
+
len(self.tag) > ByoSnap.TAG_CHARACTER_LIMIT:
|
|
964
|
+
snapctl_error(
|
|
965
|
+
"Tag should be a single word with maximum of " +
|
|
966
|
+
f"{ByoSnap.TAG_CHARACTER_LIMIT} characters",
|
|
967
|
+
SNAPCTL_INPUT_ERROR
|
|
968
|
+
)
|
|
969
|
+
if self.version:
|
|
970
|
+
pattern = r'^v\d+\.\d+\.\d+$'
|
|
971
|
+
if not re.match(pattern, self.version):
|
|
972
|
+
snapctl_error(message="Version should be in the format vX.X.X",
|
|
973
|
+
code=SNAPCTL_INPUT_ERROR)
|
|
955
974
|
elif self.subcommand == 'publish-version':
|
|
956
975
|
# Setup
|
|
957
976
|
self._setup_token_and_token_parts(
|
|
@@ -1127,6 +1146,9 @@ class ByoSnap:
|
|
|
1127
1146
|
progress.add_task(
|
|
1128
1147
|
description='Uploading your BYOSnap Docs...', total=None)
|
|
1129
1148
|
try:
|
|
1149
|
+
upload_tag = self.tag
|
|
1150
|
+
if not upload_tag:
|
|
1151
|
+
upload_tag = self.version
|
|
1130
1152
|
if self.resources_path:
|
|
1131
1153
|
base_dir = self.resources_path
|
|
1132
1154
|
else:
|
|
@@ -1141,7 +1163,7 @@ class ByoSnap:
|
|
|
1141
1163
|
info(f'Uploading swagger.json at {swagger_file}')
|
|
1142
1164
|
url = (
|
|
1143
1165
|
f"{self.base_url}/v1/snapser-api/byosnaps/"
|
|
1144
|
-
f"{self.byosnap_id}/docs/{
|
|
1166
|
+
f"{self.byosnap_id}/docs/{upload_tag}/openapispec"
|
|
1145
1167
|
)
|
|
1146
1168
|
test_res = requests.post(
|
|
1147
1169
|
url, files={"attachment": attachment_file},
|
|
@@ -1181,7 +1203,7 @@ class ByoSnap:
|
|
|
1181
1203
|
with open(readme_file, "rb") as attachment_file:
|
|
1182
1204
|
url = (
|
|
1183
1205
|
f"{self.base_url}/v1/snapser-api/byosnaps/"
|
|
1184
|
-
f"{self.byosnap_id}/docs/{
|
|
1206
|
+
f"{self.byosnap_id}/docs/{upload_tag}/markdown"
|
|
1185
1207
|
)
|
|
1186
1208
|
test_res = requests.post(
|
|
1187
1209
|
url, files={"attachment": attachment_file},
|
|
@@ -1213,7 +1235,7 @@ class ByoSnap:
|
|
|
1213
1235
|
with open(file_path, "rb") as attachment_file:
|
|
1214
1236
|
url = (
|
|
1215
1237
|
f"{self.base_url}/v1/snapser-api/byosnaps/"
|
|
1216
|
-
f"{self.byosnap_id}/docs/{
|
|
1238
|
+
f"{self.byosnap_id}/docs/{upload_tag}/tools"
|
|
1217
1239
|
)
|
|
1218
1240
|
test_res = requests.post(
|
|
1219
1241
|
url, files={"attachment": attachment_file},
|
|
@@ -1370,7 +1392,11 @@ class ByoSnap:
|
|
|
1370
1392
|
"prod_template": prod_template,
|
|
1371
1393
|
# Currently not supported so we are just hardcoding an empty list
|
|
1372
1394
|
"egress": {"ports": []},
|
|
1395
|
+
# Platform override
|
|
1373
1396
|
}
|
|
1397
|
+
if self.platform_type is not None:
|
|
1398
|
+
payload['platform_override'] = self.platform_type
|
|
1399
|
+
|
|
1374
1400
|
res = requests.post(
|
|
1375
1401
|
f"{self.base_url}/v1/snapser-api/byosnaps/{self.byosnap_id}/versions",
|
|
1376
1402
|
json=payload, headers={'api-key': self.api_key},
|
|
@@ -1452,6 +1478,8 @@ class ByoSnap:
|
|
|
1452
1478
|
# Currently not supported so we are just hardcoding an empty list
|
|
1453
1479
|
"egress": {"ports": []},
|
|
1454
1480
|
}
|
|
1481
|
+
if self.platform_type is not None:
|
|
1482
|
+
payload['platform_override'] = self.platform_type
|
|
1455
1483
|
res = requests.patch(
|
|
1456
1484
|
f"{self.base_url}/v1/snapser-api/byosnaps/{self.byosnap_id}/versions/{self.version}",
|
|
1457
1485
|
json=payload, headers={'api-key': self.api_key},
|
|
@@ -1504,7 +1532,7 @@ class ByoSnap:
|
|
|
1504
1532
|
"service_id": self.byosnap_id,
|
|
1505
1533
|
"name": self.name,
|
|
1506
1534
|
"description": self.desc,
|
|
1507
|
-
"platform": self.
|
|
1535
|
+
"platform": self.profile_data['platform'],
|
|
1508
1536
|
"language": self.language,
|
|
1509
1537
|
}
|
|
1510
1538
|
res = requests.post(
|
snapctl/commands/byows.py
CHANGED
|
@@ -99,12 +99,11 @@ class Byows:
|
|
|
99
99
|
def _get_export_commands(snap_ids, port):
|
|
100
100
|
'''
|
|
101
101
|
Generate export commands for the given snap IDs and port.
|
|
102
|
-
Replace hyphens with underscores in environment variable names.
|
|
103
102
|
'''
|
|
104
103
|
env_vars = []
|
|
105
104
|
|
|
106
105
|
for snap_id in snap_ids:
|
|
107
|
-
upper_id = snap_id.upper()
|
|
106
|
+
upper_id = snap_id.upper()
|
|
108
107
|
env_vars.append(f"SNAPEND_{upper_id}_GRPC_URL=localhost:{port}")
|
|
109
108
|
env_vars.append(
|
|
110
109
|
f"SNAPEND_{upper_id}_HTTP_URL=http://localhost:{port}")
|
|
@@ -122,12 +121,11 @@ class Byows:
|
|
|
122
121
|
def _generate_env_file(snap_ids, port):
|
|
123
122
|
'''
|
|
124
123
|
Generate an environment file with the given snap IDs and port.
|
|
125
|
-
Replace hyphens with underscores in environment variable names.
|
|
126
124
|
'''
|
|
127
125
|
env_lines = []
|
|
128
126
|
|
|
129
127
|
for snap_id in snap_ids:
|
|
130
|
-
upper_id = snap_id.upper()
|
|
128
|
+
upper_id = snap_id.upper()
|
|
131
129
|
env_lines.append(
|
|
132
130
|
f"export SNAPEND_{upper_id}_GRPC_URL=localhost:{port}")
|
|
133
131
|
env_lines.append(
|
snapctl/config/constants.py
CHANGED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
## beta-0.50.0
|
|
2
|
+
##### June 5, 2025
|
|
3
|
+
|
|
4
|
+
### Bug fix
|
|
5
|
+
- Success, info or warning messages were sometimes getting truncated in the CLI output. This has been fixed.
|
|
6
|
+
- Snapctl byosnap and byogs now support features that could only work with Buildkit.
|
|
7
|
+
|
|
8
|
+
### Feature
|
|
9
|
+
- The `snapctl byosnap upload-docs` command now supports `--version` to keep it consistent with all the new commands like `sync` and `publish`.
|
|
10
|
+
|
snapctl/main.py
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
"""
|
|
4
4
|
import configparser
|
|
5
5
|
import os
|
|
6
|
-
import json
|
|
7
6
|
from sys import platform
|
|
8
7
|
from typing import Union
|
|
9
8
|
import typer
|
|
@@ -403,7 +402,7 @@ def byosnap(
|
|
|
403
402
|
help="(req: create) Language of your snap - " +
|
|
404
403
|
", ".join(ByoSnap.LANGUAGES) + "."
|
|
405
404
|
),
|
|
406
|
-
# publish-image, publish-version, publish, sync
|
|
405
|
+
# publish-image, publish-version, publish, sync, upload-docs
|
|
407
406
|
tag: str = typer.Option(
|
|
408
407
|
None, "--tag", help=(
|
|
409
408
|
"(req: publish-image, publish-version, upload-docs) (optional: publish, sync) Tag for your snap"
|
snapctl/utils/echo.py
CHANGED
|
@@ -4,38 +4,49 @@ This module contains functions to print messages to the console.
|
|
|
4
4
|
import json
|
|
5
5
|
import typer
|
|
6
6
|
from rich import print
|
|
7
|
+
from rich.markup import escape
|
|
7
8
|
from snapctl.config.constants import SNAPCTL_ERROR
|
|
8
9
|
from snapctl.types.definitions import ErrorResponse
|
|
9
10
|
# Run `python -m rich.emoji` to get a list of all emojis that are supported
|
|
10
11
|
|
|
11
12
|
|
|
12
|
-
def
|
|
13
|
+
def _stringify_message(msg: object) -> str:
|
|
14
|
+
if isinstance(msg, (dict, list)):
|
|
15
|
+
return json.dumps(msg, indent=2)
|
|
16
|
+
return str(msg)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def error(msg: object, code: int = SNAPCTL_ERROR, data: object = None) -> None:
|
|
13
20
|
"""
|
|
14
21
|
Prints an error message to the console.
|
|
15
22
|
"""
|
|
23
|
+
msg = _stringify_message(msg)
|
|
16
24
|
error_response = ErrorResponse(
|
|
17
25
|
error=True, code=code, msg=msg, data=data if data else ''
|
|
18
26
|
)
|
|
19
|
-
print(f"[bold red]Error[/bold red] {msg}")
|
|
27
|
+
print(f"[bold red]Error[/bold red] {escape(msg)}")
|
|
20
28
|
typer.echo(json.dumps(error_response.to_dict()), err=True)
|
|
21
29
|
|
|
22
30
|
|
|
23
|
-
def warning(msg:
|
|
31
|
+
def warning(msg: object) -> None:
|
|
24
32
|
"""
|
|
25
33
|
Prints a warning message to the console.
|
|
26
34
|
"""
|
|
27
|
-
|
|
35
|
+
msg = _stringify_message(msg)
|
|
36
|
+
print(f"[bold yellow]Warning[/bold yellow] {escape(msg)}")
|
|
28
37
|
|
|
29
38
|
|
|
30
|
-
def info(msg:
|
|
39
|
+
def info(msg: object) -> None:
|
|
31
40
|
"""
|
|
32
41
|
Prints an info message to the console.
|
|
33
42
|
"""
|
|
34
|
-
|
|
43
|
+
msg = _stringify_message(msg)
|
|
44
|
+
print(f"[bold blue]Info[/bold blue] {escape(msg)}")
|
|
35
45
|
|
|
36
46
|
|
|
37
|
-
def success(msg:
|
|
47
|
+
def success(msg: object) -> None:
|
|
38
48
|
"""
|
|
39
49
|
Prints a success message to the console.
|
|
40
50
|
"""
|
|
41
|
-
|
|
51
|
+
msg = _stringify_message(msg)
|
|
52
|
+
print(f"[bold green]Success[/bold green] {escape(msg)}")
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
snapctl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
2
|
snapctl/__main__.py,sha256=43jKoTk8b85hk_MT6499N3ruHdEfM8WBImd_-3VzjI8,116
|
|
3
3
|
snapctl/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
snapctl/commands/byogs.py,sha256=
|
|
5
|
-
snapctl/commands/byosnap.py,sha256=
|
|
6
|
-
snapctl/commands/byows.py,sha256=
|
|
4
|
+
snapctl/commands/byogs.py,sha256=fwXM7X_IqkVPAByGWWxwNzJeZlDTsh_ApWNH3IhyVVM,20076
|
|
5
|
+
snapctl/commands/byosnap.py,sha256=TAITdbB_FhGk7K94bPDDjykXbU9XwO9opW__qdeg0SQ,78187
|
|
6
|
+
snapctl/commands/byows.py,sha256=XNornG5rOocALBtCeJ_9O91AHAFnR5v6CVr5Aen9l1o,18339
|
|
7
7
|
snapctl/commands/game.py,sha256=lAABIWIibrwcqvpKvTy_7UzzLtbiP6gdk4_qPBHFKOI,5248
|
|
8
8
|
snapctl/commands/generate.py,sha256=9-NlZVQllBT2LZT_t9S3ztwtHzTbM-C8_x0f6z70U3g,5606
|
|
9
9
|
snapctl/commands/release_notes.py,sha256=QlhBlywLiRTKBs3SlaxHf-0E0OEU_47Xjld9gGtj4Zw,1943
|
|
10
10
|
snapctl/commands/snapend.py,sha256=4hY4ffLtZ2mxbKRgwDPi8erc78nGl-6kxmCf56HODpk,39382
|
|
11
11
|
snapctl/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
-
snapctl/config/constants.py,sha256=
|
|
12
|
+
snapctl/config/constants.py,sha256=Tb1mxr4ySAciFpt896sjPs8rJSKKIIVa1S7YYyY0fzQ,3716
|
|
13
13
|
snapctl/config/endpoints.py,sha256=jD0n5ocJBbIkrb97F2_r9hqAHzUuddAqzqqBAPUKDTI,477
|
|
14
14
|
snapctl/config/hashes.py,sha256=3OKAyOxQPnn--_hvPIzFJnhC8NVfQK4WT-RH4PHEV1w,5242
|
|
15
15
|
snapctl/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -28,15 +28,15 @@ snapctl/data/releases/beta-0.49.0.mdx,sha256=pqJP7NfM3ZMxs4SoeANCdDqTxjR9IBGbBI3
|
|
|
28
28
|
snapctl/data/releases/beta-0.49.1.mdx,sha256=4EXupEegYffnL5bu_XWxGbzIPp9xOzl7t4xbmhq52fU,200
|
|
29
29
|
snapctl/data/releases/beta-0.49.2.mdx,sha256=Vv_OIQyPieEGI9FgTUT0v5Gm0PC2JWa2FqcCUhnvx6s,176
|
|
30
30
|
snapctl/data/releases/beta-0.49.3.mdx,sha256=XmSfpiH-LqvKS2REJ5FGDcLgyEN-OcSzwrXNI_EhiGc,234
|
|
31
|
-
snapctl/data/releases/beta-0.
|
|
32
|
-
snapctl/main.py,sha256=
|
|
31
|
+
snapctl/data/releases/beta-0.50.0.mdx,sha256=_w9f1HjHqukQ8IaTfUdk2W3gBcSwjMyMA8-rjuUxYTo,399
|
|
32
|
+
snapctl/main.py,sha256=3J0rPUichWZ_q9vR6bxgrepGJWoZiVSBJFoTmiUFIm8,25213
|
|
33
33
|
snapctl/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
34
|
snapctl/types/definitions.py,sha256=EQzLeiXkJ8ISRlCqHMviNVsWWpmhWjpKaOBLdlvOTmY,644
|
|
35
35
|
snapctl/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
|
-
snapctl/utils/echo.py,sha256=
|
|
36
|
+
snapctl/utils/echo.py,sha256=9fxrPW9kNJwiJvJBFy9RlAP4qGRcPTOHfQb3pQh3CMg,1446
|
|
37
37
|
snapctl/utils/helper.py,sha256=7ugGs1GE7Rywf1-tQxrgqXUU97EQYFjS3JUDpk9SX_Q,6850
|
|
38
|
-
snapctl-0.
|
|
39
|
-
snapctl-0.
|
|
40
|
-
snapctl-0.
|
|
41
|
-
snapctl-0.
|
|
42
|
-
snapctl-0.
|
|
38
|
+
snapctl-0.50.0.dist-info/LICENSE,sha256=6AcXm54KFSpmUI1ji9NIBd4Xl-DtjTqiyjBzfVb_CEk,2804
|
|
39
|
+
snapctl-0.50.0.dist-info/METADATA,sha256=Ay4j3Hyu0PhG7pVCDeT9XJQevCW-EJEWoTtOBV4X41s,36275
|
|
40
|
+
snapctl-0.50.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
41
|
+
snapctl-0.50.0.dist-info/entry_points.txt,sha256=tkKW9MzmFdRs6Bgkv29G78i9WEBK4WIOWunPfe3t2Wg,44
|
|
42
|
+
snapctl-0.50.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|