primitive 0.2.68__py3-none-any.whl → 0.2.70__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 primitive might be problematic. Click here for more details.

@@ -0,0 +1,268 @@
1
+ from pathlib import Path
2
+
3
+ import click
4
+ import typing
5
+ from loguru import logger
6
+
7
+ from ..utils.cache import get_operating_systems_cache
8
+ from ..utils.text import slugify
9
+
10
+ if typing.TYPE_CHECKING:
11
+ from ..client import Primitive
12
+
13
+
14
+ @click.group("operating-systems")
15
+ @click.pass_context
16
+ def cli(context):
17
+ "Operating Systems"
18
+ pass
19
+
20
+
21
+ @cli.command("download")
22
+ @click.option("--id", help="Operating system ID", required=False)
23
+ @click.option("--slug", help="Operating system slug", required=False)
24
+ @click.option("--organization-slug", help="Organization slug", required=False)
25
+ @click.option(
26
+ "--directory",
27
+ help="Directory to download the operating system files to",
28
+ required=False,
29
+ )
30
+ @click.pass_context
31
+ def download(context, id, slug, organization_slug, directory):
32
+ if not (id or slug):
33
+ raise click.UsageError("You must provide either --id or --slug.")
34
+ if id and slug:
35
+ raise click.UsageError("You can only specify one of --id or --slug.")
36
+
37
+ primitive: Primitive = context.obj.get("PRIMITIVE")
38
+
39
+ organization = (
40
+ primitive.organizations.get_organization(slug=organization_slug)
41
+ if organization_slug
42
+ else primitive.organizations.get_default_organization()
43
+ )
44
+
45
+ if not organization:
46
+ if organization_slug:
47
+ logger.error(f"No organization found with slug {slug}")
48
+ else:
49
+ logger.error("Failed to fetch default organization")
50
+
51
+ try:
52
+ operating_system = primitive.operating_systems.get_operating_system(
53
+ organization_id=organization["id"], slug=slug, id=id
54
+ )
55
+ except Exception:
56
+ logger.error("Unable to fetch operating system")
57
+ return
58
+
59
+ is_cached = primitive.operating_systems.is_operating_system_cached(
60
+ slug=operating_system["slug"],
61
+ directory=directory,
62
+ )
63
+
64
+ if is_cached:
65
+ logger.info("Operating system already exists in cache, aborting download.")
66
+ return
67
+
68
+ operating_system_directory = (
69
+ Path(directory) / operating_system["slug"]
70
+ if directory
71
+ else (get_operating_systems_cache() / operating_system["slug"])
72
+ )
73
+ checksum_directory = operating_system_directory / "checksum"
74
+ checksum_file_path = (
75
+ checksum_directory / operating_system["checksumFile"]["fileName"]
76
+ )
77
+ iso_directory = operating_system_directory / "iso"
78
+ iso_file_path = iso_directory / operating_system["isoFile"]["fileName"]
79
+
80
+ if not iso_directory.exists():
81
+ iso_directory.mkdir(parents=True)
82
+
83
+ if not checksum_directory.exists():
84
+ checksum_directory.mkdir(parents=True)
85
+
86
+ logger.info("Downloading operating system iso")
87
+ primitive.files.download_file(
88
+ file_id=operating_system["isoFile"]["id"],
89
+ output_path=iso_directory,
90
+ organization_id=organization["id"],
91
+ )
92
+
93
+ logger.info("Downloading operating system checksum")
94
+ primitive.files.download_file(
95
+ file_id=operating_system["checksumFile"]["id"],
96
+ output_path=checksum_directory,
97
+ organization_id=organization["id"],
98
+ )
99
+
100
+ logger.info("Validating iso checksum")
101
+ try:
102
+ checksum_file_type = (
103
+ primitive.operating_systems.OperatingSystemChecksumFileType[
104
+ operating_system["checksumFileType"]
105
+ ]
106
+ )
107
+ checksum_valid = primitive.operating_systems.validate_checksum(
108
+ operating_system["slug"],
109
+ iso_file_path,
110
+ checksum_file_path,
111
+ checksum_file_type=checksum_file_type,
112
+ )
113
+ except Exception:
114
+ logger.error("Failed to validate checksum.")
115
+ return
116
+
117
+ if not checksum_valid:
118
+ logger.error(
119
+ "Checksums did not match: file may have been corrupted during download."
120
+ + f"\nTry deleting the directory {get_operating_systems_cache()}/{operating_system['slug']} and running this command again."
121
+ )
122
+ return
123
+
124
+ logger.success(
125
+ f"Successfully downloaded operating system to {operating_system_directory}"
126
+ )
127
+
128
+
129
+ @cli.group("remotes")
130
+ @click.pass_context
131
+ def remotes(context):
132
+ "Remotes"
133
+ pass
134
+
135
+
136
+ @remotes.command("mirror")
137
+ @click.pass_context
138
+ @click.argument("operating-system")
139
+ @click.option("--slug", help="Slug of the operating system", required=False)
140
+ @click.option(
141
+ "--organization-slug",
142
+ help="Slug of the organization to upload the operating system to",
143
+ required=False,
144
+ )
145
+ def operating_system_mirror_command(
146
+ context, operating_system, slug=None, organization_slug=None
147
+ ):
148
+ primitive: Primitive = context.obj.get("PRIMITIVE")
149
+
150
+ operating_system_slug = slugify(slug) if slug else slugify(operating_system)
151
+
152
+ organization = (
153
+ primitive.organizations.get_organization(slug=organization_slug)
154
+ if organization_slug
155
+ else primitive.organizations.get_default_organization()
156
+ )
157
+
158
+ if not organization:
159
+ if organization_slug:
160
+ logger.error(f"No organization found with slug {slug}.")
161
+ else:
162
+ logger.error("Failed to fetch default organization.")
163
+
164
+ is_slug_available = primitive.operating_systems.is_slug_available(
165
+ slug=operating_system_slug,
166
+ organization_id=organization["id"],
167
+ )
168
+
169
+ if not is_slug_available:
170
+ logger.error(
171
+ f"Operating system slug {operating_system_slug} already exists."
172
+ + " Please specify the --slug parameter to mirror the operating system with a different slug."
173
+ )
174
+ return
175
+
176
+ try:
177
+ iso_file_path, checksum_file_path = (
178
+ primitive.operating_systems.download_from_remote(operating_system)
179
+ )
180
+ except Exception:
181
+ logger.error("Unable to download operating system")
182
+ return
183
+
184
+ logger.info("Validating iso checksum")
185
+ try:
186
+ checksum_valid = primitive.operating_systems.validate_checksum(
187
+ operating_system, iso_file_path, checksum_file_path
188
+ )
189
+ except Exception:
190
+ logger.error("Failed to validate checksum.")
191
+ return
192
+
193
+ if not checksum_valid:
194
+ logger.error(
195
+ "Checksums did not match: file may have been corrupted during download."
196
+ + f"\nTry deleting the directory {get_operating_systems_cache()}/{operating_system} and running this command again."
197
+ )
198
+ return
199
+
200
+ logger.info("Checksum valid")
201
+
202
+ logger.info("Uploading operating system files to primitive.")
203
+ file_key_prefix = "operating-systems"
204
+
205
+ iso_upload_result = primitive.files.upload_file_direct(
206
+ path=iso_file_path,
207
+ organization_id=organization["id"],
208
+ key_prefix=file_key_prefix,
209
+ )
210
+
211
+ if iso_upload_result and iso_upload_result.data is not None:
212
+ iso_upload_data = iso_upload_result.data
213
+ iso_file_id = iso_upload_data.get("fileUpdate", {}).get("id")
214
+
215
+ if not iso_file_id:
216
+ logger.error("Unable to upload iso file")
217
+ return
218
+
219
+ checksum_upload_response = primitive.files.upload_file_via_api(
220
+ path=checksum_file_path,
221
+ organization_id=organization["id"],
222
+ key_prefix=file_key_prefix,
223
+ )
224
+
225
+ if not checksum_upload_response.ok:
226
+ logger.error("Unable to upload checksum file")
227
+ return
228
+
229
+ checksum_file_id = (
230
+ checksum_upload_response.json()
231
+ .get("data", {})
232
+ .get("fileUpload", {})
233
+ .get("id", {})
234
+ )
235
+
236
+ if not checksum_file_id:
237
+ logger.error("Unable to upload checksum file")
238
+ return
239
+
240
+ logger.info("Creating operating system in primitive.")
241
+ operating_system_create_response = (
242
+ primitive.operating_systems.create_operating_system(
243
+ slug=operating_system_slug,
244
+ checksum_file_id=checksum_file_id,
245
+ checksum_file_type=primitive.operating_systems.get_checksum_file_type(
246
+ operating_system
247
+ ).value,
248
+ organization_id=organization["id"],
249
+ iso_file_id=iso_file_id,
250
+ )
251
+ )
252
+
253
+ if "id" not in operating_system_create_response:
254
+ logger.error("Failed to create operating system")
255
+ return
256
+
257
+ logger.success("Operating system created in primitive.")
258
+
259
+
260
+ @remotes.command("list")
261
+ @click.pass_context
262
+ def operating_system_list_command(context):
263
+ primitive: Primitive = context.obj.get("PRIMITIVE")
264
+ remote_operating_system_names = (
265
+ primitive.operating_systems.get_remote_operating_system_names()
266
+ )
267
+ logger.info("Remote operating systems available for download:")
268
+ logger.info("\n".join(remote_operating_system_names))
File without changes
@@ -0,0 +1,32 @@
1
+ from primitive.graphql.utility_fragments import operation_info_fragment
2
+
3
+ operating_system_create_mutation = (
4
+ operation_info_fragment
5
+ + """
6
+ mutation operatingSystemCreate($input: OperatingSystemInput!) {
7
+ operatingSystemCreate(input: $input) {
8
+ ... on OperatingSystem {
9
+ id
10
+ pk
11
+ createdAt
12
+ updatedAt
13
+ slug
14
+ organization {
15
+ id
16
+ slug
17
+ }
18
+ isoFile {
19
+ id
20
+ fileName
21
+ }
22
+ checksumFile {
23
+ id
24
+ fileName
25
+ }
26
+ checksumFileType
27
+ }
28
+ ...OperationInfoFragment
29
+ }
30
+ }
31
+ """
32
+ )
@@ -0,0 +1,36 @@
1
+ operating_system_list_query = """
2
+ query operatingSystemList(
3
+ $filters: OperatingSystemFilters
4
+ ) {
5
+ operatingSystemList(
6
+ filters: $filters
7
+ ) {
8
+ totalCount
9
+ edges {
10
+ cursor
11
+ node {
12
+ ... on OperatingSystem {
13
+ id
14
+ pk
15
+ createdAt
16
+ updatedAt
17
+ slug
18
+ organization {
19
+ id
20
+ slug
21
+ }
22
+ isoFile {
23
+ id
24
+ fileName
25
+ }
26
+ checksumFile {
27
+ id
28
+ fileName
29
+ }
30
+ checksumFileType
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+ """
@@ -67,3 +67,9 @@ class Organizations(BaseAction):
67
67
  )
68
68
  organizations = [edge["node"] for edge in result.data["organizations"]["edges"]]
69
69
  return organizations[0]
70
+
71
+ @guard
72
+ def get_default_organization(self):
73
+ whoami_result = self.primitive.auth.whoami()
74
+ default_organization = whoami_result.data["whoami"]["defaultOrganization"]
75
+ return default_organization
primitive/utils/cache.py CHANGED
@@ -67,3 +67,14 @@ def get_deps_cache() -> Path:
67
67
  deps_dir.mkdir(parents=True, exist_ok=True)
68
68
 
69
69
  return deps_dir
70
+
71
+
72
+ def get_operating_systems_cache() -> Path:
73
+ cache_dir = get_cache_dir()
74
+
75
+ deps_dir = cache_dir / "operating-systems"
76
+
77
+ if not deps_dir.exists():
78
+ deps_dir.mkdir(parents=True, exist_ok=True)
79
+
80
+ return deps_dir
@@ -0,0 +1,44 @@
1
+ import hashlib
2
+ import re
3
+ from pathlib import Path
4
+
5
+ from loguru import logger
6
+
7
+
8
+ def calculate_sha256(file_path: str) -> str:
9
+ file_path = Path(file_path)
10
+
11
+ if not file_path.exists():
12
+ logger.error(f"File '{file_path}' does not exist.")
13
+ raise FileNotFoundError(file_path)
14
+
15
+ sha256_hash = hashlib.sha256()
16
+ with file_path.open("rb") as f:
17
+ for byte_block in iter(lambda: f.read(8192), b""):
18
+ sha256_hash.update(byte_block)
19
+ return sha256_hash.hexdigest()
20
+
21
+
22
+ class ChecksumNotFoundInFile(Exception):
23
+ pass
24
+
25
+
26
+ def get_checksum_from_file(checksum_file_path: str, file_name: str) -> str | None:
27
+ checksum_file_path = Path(checksum_file_path)
28
+
29
+ if not checksum_file_path.exists():
30
+ logger.error(f"File '{checksum_file_path}' does not exist.")
31
+ raise FileNotFoundError(checksum_file_path)
32
+
33
+ with checksum_file_path.open("r") as f:
34
+ for line in f:
35
+ match = re.match(r"^([a-fA-F0-9]{64})\s+\*?(.*)$", line.strip())
36
+ if match:
37
+ sha256_hash, current_file_name = match.groups()
38
+ if current_file_name == file_name:
39
+ return sha256_hash
40
+
41
+ logger.error(
42
+ f"No matching checksum entry found for {file_name} in {checksum_file_path}."
43
+ )
44
+ raise ChecksumNotFoundInFile(checksum_file_path)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: primitive
3
- Version: 0.2.68
3
+ Version: 0.2.70
4
4
  Project-URL: Documentation, https://github.com//primitivecorp/primitive-cli#readme
5
5
  Project-URL: Issues, https://github.com//primitivecorp/primitive-cli/issues
6
6
  Project-URL: Source, https://github.com//primitivecorp/primitive-cli
@@ -1,11 +1,11 @@
1
- primitive/__about__.py,sha256=C8M6D49G3Ebr3FPG2sD1HtX3IjFMyfqC0icwwuBfmp8,130
1
+ primitive/__about__.py,sha256=NOrCGYjwMjgYW_AaVMV1_PDAVaXvQrgfkCKN6ly7xDM,130
2
2
  primitive/__init__.py,sha256=bwKdgggKNVssJFVPfKSxqFMz4IxSr54WWbmiZqTMPNI,106
3
- primitive/cli.py,sha256=kLjqyNijkbElbH8XhEtR6vjPc5uwOoh9mKEf2RkcfKk,2608
4
- primitive/client.py,sha256=n0eQAft3lQyTT_tVE1_1BWSsh8G7gJI2kHBuXLvZVEY,3836
3
+ primitive/cli.py,sha256=ga1TcPKyUkGNGZ76CjIQqTKWn1r9di5k_uRbLljY07w,2745
4
+ primitive/client.py,sha256=EyXLOFwKUT_ZB3at5m4hbdtjgaKVVFoiDdE0bP0_JfI,3966
5
5
  primitive/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- primitive/agent/actions.py,sha256=ohY81bflsYSTsNgo2o2WP_tZr66haX4z319zf5oib-4,9362
6
+ primitive/agent/actions.py,sha256=SnYJQKOQgzGL2-zopWT2ioy9w7OP9pqAbS3itMq-614,9528
7
7
  primitive/agent/commands.py,sha256=o847pK7v7EWQGG67tky6a33qtwoutX6LZrP2FIS_NOk,388
8
- primitive/agent/runner.py,sha256=QoRsehNhpcdCXeidi_YO1W4REjAJ2UR8ZecyePTmc-g,16177
8
+ primitive/agent/runner.py,sha256=bYDH_kjoR8XrsxNsE2RfkGOJqfqX2M8jXyaFp3zGxqk,17760
9
9
  primitive/agent/uploader.py,sha256=DT_Nzt5eOTm_uRcYKm1sjBBaQZzp5iNZ_uN5XktfQ30,3382
10
10
  primitive/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  primitive/auth/actions.py,sha256=9NIEXJ1BNJutJs6AMMSjMN_ziONUAUhY_xHwojYJCLA,942
@@ -23,7 +23,7 @@ primitive/exec/actions.py,sha256=rcAMP7hxJZhQUwx-orduCUratzMwVRknX14QSyQLdcA,434
23
23
  primitive/exec/commands.py,sha256=66LO2kkJC-ynNZQpUCXv4Ol15QoacdSZAHblePDcmLo,510
24
24
  primitive/exec/interactive.py,sha256=TscY6s2ZysijidKPheq6y-fCErUVLS0zcdTW8XyFWGI,2435
25
25
  primitive/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- primitive/files/actions.py,sha256=tuf5PXgNrcxegfzC-CZ6r3iWBkQV9gxZpALU-hjyGpY,14865
26
+ primitive/files/actions.py,sha256=56I4tbGjXH117uZLghu2vgz6-ziM-UzZmCYpQndo1bg,15705
27
27
  primitive/files/commands.py,sha256=-U0ArpZXDWltmkELG2SYIOLbaiMC6Zv24X9zZ29aqCE,3021
28
28
  primitive/files/ui.py,sha256=lYnfu6gnZ5f-C28wps_egVDz8tdjL5P4361uxpSyfvY,919
29
29
  primitive/files/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -40,9 +40,9 @@ primitive/graphql/relay.py,sha256=bmij2AjdpURQ6GGVCxwWhauF-r_SxuAU2oJ4sDbLxpI,72
40
40
  primitive/graphql/sdk.py,sha256=dE4TD8KiTKw3Y0uiw5XrIcuZGqexE47eSlPaPD6jDGo,1545
41
41
  primitive/graphql/utility_fragments.py,sha256=uIjwILC4QtWNyO5vu77VjQf_p0jvP3A9q_6zRq91zqs,303
42
42
  primitive/hardware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- primitive/hardware/actions.py,sha256=yCBIGV9zwkeeW3NykdoOLCXefEC2C-z4LlfQImZY_Mc,38471
43
+ primitive/hardware/actions.py,sha256=B0mkqNsjeMPFZsAgI23X1I8th2U1cqCg4Ugm3w6dxfk,44255
44
44
  primitive/hardware/android.py,sha256=tu7pBPxWFrIwb_mm5CEdFFf1_veNDOKjOCQg13i_Lh4,2758
45
- primitive/hardware/commands.py,sha256=XU365RByl75ECAV_GdA4xxLrmZkwo1axlw9ZH0k3yRk,4751
45
+ primitive/hardware/commands.py,sha256=ZAbrqGuK4c4aCYPySaTUt51qFsf_F3Zsb0KaLfeVnmA,5045
46
46
  primitive/hardware/ui.py,sha256=12rucuZ2s-w5R4bKyxON5dEbrdDnVf5sbj3K_nbdo44,2473
47
47
  primitive/hardware/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
48
  primitive/hardware/graphql/fragments.py,sha256=FRPAKB3KBfVxVm69HeYCxvvrdkW-O8CR46Inbk3wgc8,481
@@ -57,16 +57,22 @@ primitive/jobs/graphql/mutations.py,sha256=8ASvCmwQh7cMeeiykOdYaYVryG8FRIuVF6v_J
57
57
  primitive/jobs/graphql/queries.py,sha256=57B5mSnAYjNEFFk1P69odON0fqkf7FyhsA316pcxb6g,1712
58
58
  primitive/messaging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
59
  primitive/messaging/provider.py,sha256=NkR4hnQzEZ0SItno1TgYNvzTwgKZq03iNrnIpLK7MTg,4400
60
- primitive/monitor/actions.py,sha256=GqwnTibVwAtiSU40TBexBruZI_V-7ZS8MoYZpFxq3mI,10833
60
+ primitive/monitor/actions.py,sha256=HO45Q1Cw9VTd2dITp-ftYJ4wJKt3YHHLdeJSqY-qhos,11085
61
61
  primitive/monitor/commands.py,sha256=VDlEL_Qpm_ysHxug7VpI0cVAZ0ny6AS91Y58D7F1zkU,409
62
62
  primitive/network/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
- primitive/network/actions.py,sha256=qpkn9U7LTDzdoOntiFP2sBPCQYEraRjAYrkcPzhmw78,17021
64
- primitive/network/commands.py,sha256=F84KmwkG0DHNLIa7Em8LMm2XDOaKMCWRpcFej8olxM0,1071
63
+ primitive/network/actions.py,sha256=8JuArc8kRF-UjatxI1SbrD-F72ywGypmwDeijiXLTzw,18994
64
+ primitive/network/commands.py,sha256=wVszHkmmY85dwlEJR726vqx6rDcfD4XtAptgiHf5p4U,1361
65
65
  primitive/network/redfish.py,sha256=uOtAS_Dwc4I4bnWKNSTCQ_xsj5LTtRzW5v2P_fWaSJM,4248
66
- primitive/network/ssh.py,sha256=a4LNMCQEEbYxTczkfRBiFBahGtZ_h6KKOx6rGk2PFfM,3208
67
- primitive/network/ui.py,sha256=_i4lJ3hhTrPc_KS5EjXPkqqKkzdLCOdxxtk5MiDWsfU,504
66
+ primitive/network/ssh.py,sha256=vVopUr7PoZsu2-n8BQfwr_IF39HgPbrxz9dKKoJqsdE,4095
67
+ primitive/network/ui.py,sha256=-AV6OD1O3_nsTrgS-W49R6LfDN0vmXmz0Dli_S--LxE,685
68
+ primitive/operating_systems/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
+ primitive/operating_systems/actions.py,sha256=68YUAowtvJ8jm5HBXHjnQ_K8q0Z83J2hS5rfPkoJ53A,9127
70
+ primitive/operating_systems/commands.py,sha256=blZlHPKd1bfUImXP-AKUc7WGzMZ3Cm9wUI1--Q59JiQ,8523
71
+ primitive/operating_systems/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
+ primitive/operating_systems/graphql/mutations.py,sha256=L2ZeWEfBK22QAv2AsfDQWHKcwH5SWvMvcmOOftiEM7w,699
73
+ primitive/operating_systems/graphql/queries.py,sha256=TJzcYbFP4SowsFJb8Wv8Q1r5_gCZRKbobEzniu9LWFk,738
68
74
  primitive/organizations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
- primitive/organizations/actions.py,sha256=kVHOhG1oS2sI5p8uldSo5L-RUZsnG36eaulVuKLyZ-M,1863
75
+ primitive/organizations/actions.py,sha256=jkuAUoQexh4antNQd-0JWsAzCFy-e9yQeBc1JlaqqfU,2087
70
76
  primitive/organizations/commands.py,sha256=_dwgVEJCqMa5VgB_7P1wLPFc0AuT1p9dtyR9JRr4kpw,487
71
77
  primitive/organizations/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
78
  primitive/organizations/graphql/fragments.py,sha256=a1qKq4FZB5qze0XTo1fOUeGAscIasjn_Ig4gA2_vStY,142
@@ -93,7 +99,8 @@ primitive/reservations/graphql/queries.py,sha256=BP7ON6QfChZRlY_YTyUbxM_tEPSfJqc
93
99
  primitive/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
100
  primitive/utils/actions.py,sha256=Gm84YgXFSpilpYqjG5nxcQTdRSp3waN7ZorzIzMBLtc,208
95
101
  primitive/utils/auth.py,sha256=uBIZNPF2CpbaPV2UMi6eWVUKghV6WIm-pG3-UM29bNs,1465
96
- primitive/utils/cache.py,sha256=FHGmVWYLJFQOazpXXcEwI0YJEZbdkgG39nOLdOv6VNk,1575
102
+ primitive/utils/cache.py,sha256=61FwFdUXBGGDT5ezM0dUDFDcWPoCKcUFDcesuKNu0ew,1804
103
+ primitive/utils/checksums.py,sha256=KoSdD6TaW70O67DfbFAoT9BAr7zN4txYg7P8xJC19F4,1333
97
104
  primitive/utils/chunk_size.py,sha256=PAuVuirUTA9oRXyjo1c6MWxo31WVBRkWMuWw-AS58Bw,2914
98
105
  primitive/utils/config.py,sha256=DlFM5Nglo22WPtbpZSVtH7NX-PTMaKYlcrUE7GPRG4c,1058
99
106
  primitive/utils/daemons.py,sha256=mSoSHitiGfS4KYAEK9sKsiv_YcACHKgY3qISnDpUUIE,1086
@@ -105,8 +112,8 @@ primitive/utils/psutil.py,sha256=xa7ef435UL37jyjmUPbEqCO2ayQMpCs0HCrxVEvLcuM,763
105
112
  primitive/utils/shell.py,sha256=Z4zxmOaSyGCrS0D6I436iQci-ewHLt4UxVg1CD9Serc,2171
106
113
  primitive/utils/text.py,sha256=XiESMnlhjQ534xE2hMNf08WehE1SKaYFRNih0MmnK0k,829
107
114
  primitive/utils/x509.py,sha256=HwHRPqakTHWd40ny-9O_yNknSL1Cxo50O0UCjXHFq04,3796
108
- primitive-0.2.68.dist-info/METADATA,sha256=Z16gZVIM8zx0JvTsSjpQrrbzl69hskD2JDRUtGoA6CQ,3569
109
- primitive-0.2.68.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
110
- primitive-0.2.68.dist-info/entry_points.txt,sha256=p1K8DMCWka5FqLlqP1sPek5Uovy9jq8u51gUsP-z334,48
111
- primitive-0.2.68.dist-info/licenses/LICENSE.txt,sha256=B8kmQMJ2sxYygjCLBk770uacaMci4mPSoJJ8WoDBY_c,1098
112
- primitive-0.2.68.dist-info/RECORD,,
115
+ primitive-0.2.70.dist-info/METADATA,sha256=6RjEuCX8ocvGe1cuwHtM3UN82KuKN5iLSyCtIlJavjQ,3569
116
+ primitive-0.2.70.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
117
+ primitive-0.2.70.dist-info/entry_points.txt,sha256=p1K8DMCWka5FqLlqP1sPek5Uovy9jq8u51gUsP-z334,48
118
+ primitive-0.2.70.dist-info/licenses/LICENSE.txt,sha256=B8kmQMJ2sxYygjCLBk770uacaMci4mPSoJJ8WoDBY_c,1098
119
+ primitive-0.2.70.dist-info/RECORD,,