primitive 0.2.68__py3-none-any.whl → 0.2.72__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,246 @@
1
+ import click
2
+ import typing
3
+ from loguru import logger
4
+
5
+
6
+ if typing.TYPE_CHECKING:
7
+ from ..client import Primitive
8
+
9
+
10
+ @click.group("operating-systems")
11
+ @click.pass_context
12
+ def cli(context):
13
+ "Operating Systems"
14
+ pass
15
+
16
+
17
+ @cli.command("list")
18
+ @click.option(
19
+ "--organization-slug",
20
+ help="Organization slug to list operating systems for",
21
+ required=False,
22
+ )
23
+ @click.pass_context
24
+ def operating_systems_list_command(context, organization_slug):
25
+ primitive: Primitive = context.obj.get("PRIMITIVE")
26
+
27
+ organization = (
28
+ primitive.organizations.get_organization(slug=organization_slug)
29
+ if organization_slug
30
+ else primitive.organizations.get_default_organization()
31
+ )
32
+
33
+ if not organization:
34
+ if organization_slug:
35
+ logger.error(f"No organization found with slug {organization_slug}")
36
+ else:
37
+ logger.error("Failed to fetch default organization")
38
+
39
+ operating_systems = primitive.operating_systems.list(
40
+ organization_id=organization["id"]
41
+ )
42
+ operating_system_slugs = [
43
+ operating_system["slug"] for operating_system in operating_systems
44
+ ]
45
+
46
+ newline = "\n"
47
+ logger.info(
48
+ f"Operating systems: {newline}- {f'{newline}- '.join(operating_system_slugs)}"
49
+ )
50
+
51
+
52
+ @cli.command("create")
53
+ @click.option("--slug", help="Slug for created operating system", required=True)
54
+ @click.option(
55
+ "--iso-file", help="Path to operating system iso file to upload", required=True
56
+ )
57
+ @click.option(
58
+ "--checksum-file",
59
+ help="Path to operating system checksum file to upload",
60
+ required=True,
61
+ )
62
+ @click.option(
63
+ "--checksum-file-type", help="The type of the checksum file", required=True
64
+ )
65
+ @click.option(
66
+ "--organization-slug",
67
+ help="Organization to create the operating system in",
68
+ required=False,
69
+ )
70
+ @click.pass_context
71
+ def create_command(
72
+ context, slug, iso_file, checksum_file, checksum_file_type, organization_slug
73
+ ):
74
+ primitive: Primitive = context.obj.get("PRIMITIVE")
75
+
76
+ organization = (
77
+ primitive.organizations.get_organization(slug=organization_slug)
78
+ if organization_slug
79
+ else primitive.organizations.get_default_organization()
80
+ )
81
+
82
+ if not organization:
83
+ if organization_slug:
84
+ logger.error(f"No organization found with slug {organization_slug}")
85
+ return
86
+ else:
87
+ logger.error("Failed to fetch default organization")
88
+ return
89
+
90
+ try:
91
+ primitive.operating_systems.create(
92
+ slug=slug,
93
+ iso_file=iso_file,
94
+ checksum_file=checksum_file,
95
+ checksum_file_type=checksum_file_type,
96
+ organization_id=organization["id"],
97
+ )
98
+ except Exception as error:
99
+ logger.error(error)
100
+ return
101
+
102
+ logger.success("Operating system created in primitive.")
103
+
104
+
105
+ @cli.command("download")
106
+ @click.option("--id", help="Operating system ID", required=False)
107
+ @click.option("--slug", help="Operating system slug", required=False)
108
+ @click.option("--organization-slug", help="Organization slug", required=False)
109
+ @click.option(
110
+ "--directory",
111
+ help="Directory to download the operating system files to",
112
+ required=False,
113
+ )
114
+ @click.pass_context
115
+ def download(context, id, slug, organization_slug, directory):
116
+ if not (id or slug):
117
+ raise click.UsageError("You must provide either --id or --slug.")
118
+ if id and slug:
119
+ raise click.UsageError("You can only specify one of --id or --slug.")
120
+
121
+ primitive: Primitive = context.obj.get("PRIMITIVE")
122
+
123
+ organization = (
124
+ primitive.organizations.get_organization(slug=organization_slug)
125
+ if organization_slug
126
+ else primitive.organizations.get_default_organization()
127
+ )
128
+
129
+ if not organization:
130
+ if organization_slug:
131
+ logger.error(f"No organization found with slug {organization_slug}")
132
+ return
133
+ else:
134
+ logger.error("Failed to fetch default organization")
135
+ return
136
+
137
+ try:
138
+ operating_system_directory = primitive.operating_systems.download(
139
+ id=id, slug=slug, organization_id=organization["id"], directory=directory
140
+ )
141
+ except Exception as error:
142
+ logger.error(error)
143
+ return
144
+
145
+ logger.success(
146
+ f"Successfully downloaded operating system to {operating_system_directory}"
147
+ )
148
+
149
+
150
+ @cli.group("remotes")
151
+ @click.pass_context
152
+ def remotes(context):
153
+ "Remotes"
154
+ pass
155
+
156
+
157
+ @remotes.command("download")
158
+ @click.pass_context
159
+ @click.argument("operating-system")
160
+ @click.option(
161
+ "--directory",
162
+ help="Directory to download the operating system files to",
163
+ required=False,
164
+ )
165
+ def operating_system_remotes_download_command(
166
+ context, operating_system, directory=None
167
+ ):
168
+ primitive: Primitive = context.obj.get("PRIMITIVE")
169
+
170
+ try:
171
+ primitive.operating_systems.download_remote(
172
+ remote_operating_system_name=operating_system, directory=directory
173
+ )
174
+ except Exception as error:
175
+ logger.error(error)
176
+ return
177
+
178
+ logger.success(f"Successfully downloaded operating system files to {directory}")
179
+
180
+
181
+ @remotes.command("mirror")
182
+ @click.pass_context
183
+ @click.argument("operating-system")
184
+ @click.option("--slug", help="Slug of the operating system", required=False)
185
+ @click.option(
186
+ "--organization-slug",
187
+ help="Slug of the organization to upload the operating system to",
188
+ required=False,
189
+ )
190
+ @click.option(
191
+ "--directory",
192
+ help="Directory to download the operating system files to",
193
+ required=False,
194
+ )
195
+ def operating_system_mirror_command(
196
+ context, operating_system, slug=None, organization_slug=None, directory=None
197
+ ):
198
+ primitive: Primitive = context.obj.get("PRIMITIVE")
199
+
200
+ organization = (
201
+ primitive.organizations.get_organization(slug=organization_slug)
202
+ if organization_slug
203
+ else primitive.organizations.get_default_organization()
204
+ )
205
+
206
+ if not organization:
207
+ if organization_slug:
208
+ logger.error(f"No organization found with slug {organization_slug}.")
209
+ return
210
+ else:
211
+ logger.error("Failed to fetch default organization.")
212
+ return
213
+
214
+ try:
215
+ iso_file_path, checksum_file_path = primitive.operating_systems.download_remote(
216
+ operating_system, directory=directory
217
+ )
218
+
219
+ checksum_file_type = primitive.operating_systems.get_remote_info(
220
+ operating_system
221
+ )["checksum_file_type"]
222
+
223
+ primitive.operating_systems.create(
224
+ slug=slug if slug else operating_system,
225
+ iso_file=iso_file_path,
226
+ checksum_file=checksum_file_path,
227
+ checksum_file_type=checksum_file_type.value,
228
+ organization_id=organization["id"],
229
+ )
230
+ except Exception as error:
231
+ logger.error(error)
232
+ return
233
+
234
+ logger.success("Successfully mirrored operating system")
235
+
236
+
237
+ @remotes.command("list")
238
+ @click.pass_context
239
+ def remote_operating_systems_list_command(context):
240
+ primitive: Primitive = context.obj.get("PRIMITIVE")
241
+ remotes_list = primitive.operating_systems.list_remotes()
242
+ remote_slugs = [remote["slug"] for remote in remotes_list]
243
+ newline = "\n"
244
+ logger.info(
245
+ f"Remote operating systems: {newline}- {f'{newline}- '.join(remote_slugs)}"
246
+ )
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.72
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,12 @@
1
- primitive/__about__.py,sha256=C8M6D49G3Ebr3FPG2sD1HtX3IjFMyfqC0icwwuBfmp8,130
1
+ primitive/__about__.py,sha256=pYIjjw7lxGTZ015Ir3hYhbZnOjU5lRO-cLrPQE5MBpw,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/pxe.py,sha256=XTu9Plj2mlmlL6YjcDqlfS_IGBK4i7aGKhTL-k_wnBU,2542
9
+ primitive/agent/runner.py,sha256=nel7NiqWoIh5HFdoor9YIsPpMBJPHsevg3XtAHrKvc0,16619
9
10
  primitive/agent/uploader.py,sha256=DT_Nzt5eOTm_uRcYKm1sjBBaQZzp5iNZ_uN5XktfQ30,3382
10
11
  primitive/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
12
  primitive/auth/actions.py,sha256=9NIEXJ1BNJutJs6AMMSjMN_ziONUAUhY_xHwojYJCLA,942
@@ -23,7 +24,7 @@ primitive/exec/actions.py,sha256=rcAMP7hxJZhQUwx-orduCUratzMwVRknX14QSyQLdcA,434
23
24
  primitive/exec/commands.py,sha256=66LO2kkJC-ynNZQpUCXv4Ol15QoacdSZAHblePDcmLo,510
24
25
  primitive/exec/interactive.py,sha256=TscY6s2ZysijidKPheq6y-fCErUVLS0zcdTW8XyFWGI,2435
25
26
  primitive/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- primitive/files/actions.py,sha256=tuf5PXgNrcxegfzC-CZ6r3iWBkQV9gxZpALU-hjyGpY,14865
27
+ primitive/files/actions.py,sha256=56I4tbGjXH117uZLghu2vgz6-ziM-UzZmCYpQndo1bg,15705
27
28
  primitive/files/commands.py,sha256=-U0ArpZXDWltmkELG2SYIOLbaiMC6Zv24X9zZ29aqCE,3021
28
29
  primitive/files/ui.py,sha256=lYnfu6gnZ5f-C28wps_egVDz8tdjL5P4361uxpSyfvY,919
29
30
  primitive/files/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -40,9 +41,9 @@ primitive/graphql/relay.py,sha256=bmij2AjdpURQ6GGVCxwWhauF-r_SxuAU2oJ4sDbLxpI,72
40
41
  primitive/graphql/sdk.py,sha256=dE4TD8KiTKw3Y0uiw5XrIcuZGqexE47eSlPaPD6jDGo,1545
41
42
  primitive/graphql/utility_fragments.py,sha256=uIjwILC4QtWNyO5vu77VjQf_p0jvP3A9q_6zRq91zqs,303
42
43
  primitive/hardware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- primitive/hardware/actions.py,sha256=yCBIGV9zwkeeW3NykdoOLCXefEC2C-z4LlfQImZY_Mc,38471
44
+ primitive/hardware/actions.py,sha256=WdI7dd7TJen6xF8h63kH8PbCXydJfHlFF56QZdAgh5w,44645
44
45
  primitive/hardware/android.py,sha256=tu7pBPxWFrIwb_mm5CEdFFf1_veNDOKjOCQg13i_Lh4,2758
45
- primitive/hardware/commands.py,sha256=XU365RByl75ECAV_GdA4xxLrmZkwo1axlw9ZH0k3yRk,4751
46
+ primitive/hardware/commands.py,sha256=ZAbrqGuK4c4aCYPySaTUt51qFsf_F3Zsb0KaLfeVnmA,5045
46
47
  primitive/hardware/ui.py,sha256=12rucuZ2s-w5R4bKyxON5dEbrdDnVf5sbj3K_nbdo44,2473
47
48
  primitive/hardware/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
49
  primitive/hardware/graphql/fragments.py,sha256=FRPAKB3KBfVxVm69HeYCxvvrdkW-O8CR46Inbk3wgc8,481
@@ -56,17 +57,23 @@ primitive/jobs/graphql/fragments.py,sha256=I-Ly0TGARt_TdenLQ7877pGLWBzono_IMj7NC
56
57
  primitive/jobs/graphql/mutations.py,sha256=8ASvCmwQh7cMeeiykOdYaYVryG8FRIuVF6v_J8JJZuw,219
57
58
  primitive/jobs/graphql/queries.py,sha256=57B5mSnAYjNEFFk1P69odON0fqkf7FyhsA316pcxb6g,1712
58
59
  primitive/messaging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
- primitive/messaging/provider.py,sha256=NkR4hnQzEZ0SItno1TgYNvzTwgKZq03iNrnIpLK7MTg,4400
60
- primitive/monitor/actions.py,sha256=GqwnTibVwAtiSU40TBexBruZI_V-7ZS8MoYZpFxq3mI,10833
60
+ primitive/messaging/provider.py,sha256=BCkhRq_F6jKqf26x-9Da3ebCqgpjwxynRHIu7I7iFeQ,4432
61
+ primitive/monitor/actions.py,sha256=Ky4KPNJc5c0LaxZkDs8-7pP2bQ6xNBFxmNf8eAmi7ag,11079
61
62
  primitive/monitor/commands.py,sha256=VDlEL_Qpm_ysHxug7VpI0cVAZ0ny6AS91Y58D7F1zkU,409
62
63
  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
64
+ primitive/network/actions.py,sha256=iw6X5zKdsFCQ8vAw_glEI6sdtVUeXdauW33PjsKL_QU,18874
65
+ primitive/network/commands.py,sha256=wVszHkmmY85dwlEJR726vqx6rDcfD4XtAptgiHf5p4U,1361
65
66
  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
67
+ primitive/network/ssh.py,sha256=evtZFWFsKfuN4MeFtPpvzjBM1a5Q0O06rxd6ZkSzoJo,4377
68
+ primitive/network/ui.py,sha256=-AV6OD1O3_nsTrgS-W49R6LfDN0vmXmz0Dli_S--LxE,685
69
+ primitive/operating_systems/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
+ primitive/operating_systems/actions.py,sha256=SNeYC4QgG0H-ybmIQaAXhDj6c9yYG6BgIQfzU2wm8hY,16993
71
+ primitive/operating_systems/commands.py,sha256=4qG3Ggf-sqLa0Cr6MErpjd6TOoc5_bE5tgJ8LigKKnw,7288
72
+ primitive/operating_systems/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ primitive/operating_systems/graphql/mutations.py,sha256=L2ZeWEfBK22QAv2AsfDQWHKcwH5SWvMvcmOOftiEM7w,699
74
+ primitive/operating_systems/graphql/queries.py,sha256=TJzcYbFP4SowsFJb8Wv8Q1r5_gCZRKbobEzniu9LWFk,738
68
75
  primitive/organizations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
- primitive/organizations/actions.py,sha256=kVHOhG1oS2sI5p8uldSo5L-RUZsnG36eaulVuKLyZ-M,1863
76
+ primitive/organizations/actions.py,sha256=jkuAUoQexh4antNQd-0JWsAzCFy-e9yQeBc1JlaqqfU,2087
70
77
  primitive/organizations/commands.py,sha256=_dwgVEJCqMa5VgB_7P1wLPFc0AuT1p9dtyR9JRr4kpw,487
71
78
  primitive/organizations/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
79
  primitive/organizations/graphql/fragments.py,sha256=a1qKq4FZB5qze0XTo1fOUeGAscIasjn_Ig4gA2_vStY,142
@@ -93,7 +100,8 @@ primitive/reservations/graphql/queries.py,sha256=BP7ON6QfChZRlY_YTyUbxM_tEPSfJqc
93
100
  primitive/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
101
  primitive/utils/actions.py,sha256=Gm84YgXFSpilpYqjG5nxcQTdRSp3waN7ZorzIzMBLtc,208
95
102
  primitive/utils/auth.py,sha256=uBIZNPF2CpbaPV2UMi6eWVUKghV6WIm-pG3-UM29bNs,1465
96
- primitive/utils/cache.py,sha256=FHGmVWYLJFQOazpXXcEwI0YJEZbdkgG39nOLdOv6VNk,1575
103
+ primitive/utils/cache.py,sha256=61FwFdUXBGGDT5ezM0dUDFDcWPoCKcUFDcesuKNu0ew,1804
104
+ primitive/utils/checksums.py,sha256=KoSdD6TaW70O67DfbFAoT9BAr7zN4txYg7P8xJC19F4,1333
97
105
  primitive/utils/chunk_size.py,sha256=PAuVuirUTA9oRXyjo1c6MWxo31WVBRkWMuWw-AS58Bw,2914
98
106
  primitive/utils/config.py,sha256=DlFM5Nglo22WPtbpZSVtH7NX-PTMaKYlcrUE7GPRG4c,1058
99
107
  primitive/utils/daemons.py,sha256=mSoSHitiGfS4KYAEK9sKsiv_YcACHKgY3qISnDpUUIE,1086
@@ -105,8 +113,8 @@ primitive/utils/psutil.py,sha256=xa7ef435UL37jyjmUPbEqCO2ayQMpCs0HCrxVEvLcuM,763
105
113
  primitive/utils/shell.py,sha256=Z4zxmOaSyGCrS0D6I436iQci-ewHLt4UxVg1CD9Serc,2171
106
114
  primitive/utils/text.py,sha256=XiESMnlhjQ534xE2hMNf08WehE1SKaYFRNih0MmnK0k,829
107
115
  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,,
116
+ primitive-0.2.72.dist-info/METADATA,sha256=L8m-fkO2D2xT8U2iUqr62x_NCoIvG8Rv3Em-RSlFAlY,3569
117
+ primitive-0.2.72.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
118
+ primitive-0.2.72.dist-info/entry_points.txt,sha256=p1K8DMCWka5FqLlqP1sPek5Uovy9jq8u51gUsP-z334,48
119
+ primitive-0.2.72.dist-info/licenses/LICENSE.txt,sha256=B8kmQMJ2sxYygjCLBk770uacaMci4mPSoJJ8WoDBY_c,1098
120
+ primitive-0.2.72.dist-info/RECORD,,