xpk 0.11.0__py3-none-any.whl → 0.13.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 (59) hide show
  1. xpk/commands/batch.py +8 -8
  2. xpk/commands/cluster.py +19 -19
  3. xpk/commands/cluster_gcluster.py +2 -1
  4. xpk/commands/common.py +7 -3
  5. xpk/commands/info.py +12 -12
  6. xpk/commands/inspector.py +1 -1
  7. xpk/commands/job.py +42 -12
  8. xpk/commands/kjob_common.py +2 -1
  9. xpk/commands/storage.py +6 -3
  10. xpk/commands/workload.py +28 -15
  11. xpk/core/blueprint/blueprint_generator.py +7 -7
  12. xpk/core/blueprint/blueprint_test.py +218 -0
  13. xpk/core/capacity.py +3 -1
  14. xpk/core/cluster.py +14 -8
  15. xpk/core/cluster_private.py +8 -2
  16. xpk/core/commands.py +13 -10
  17. xpk/core/config.py +3 -4
  18. xpk/core/config_test.py +71 -0
  19. xpk/core/docker_image.py +14 -5
  20. xpk/core/docker_manager.py +1 -1
  21. xpk/core/docker_resources.py +10 -5
  22. xpk/core/filestore.py +7 -2
  23. xpk/core/gcloud_context.py +2 -2
  24. xpk/core/jobset.py +1 -1
  25. xpk/core/kjob.py +7 -3
  26. xpk/core/kueue.py +28 -8
  27. xpk/core/nap.py +5 -5
  28. xpk/core/network.py +1 -1
  29. xpk/core/nodepool.py +8 -3
  30. xpk/core/nodepool_test.py +82 -0
  31. xpk/core/pathways.py +6 -2
  32. xpk/core/ray.py +1 -1
  33. xpk/core/resources.py +18 -14
  34. xpk/core/scheduling.py +4 -0
  35. xpk/core/storage.py +14 -14
  36. xpk/core/system_characteristics.py +1 -1
  37. xpk/core/workload.py +11 -0
  38. xpk/core/workload_decorators/rdma_decorator.py +3 -2
  39. xpk/core/workload_decorators/storage_decorator.py +2 -1
  40. xpk/core/workload_decorators/tcpx_decorator.py +4 -2
  41. xpk/core/workload_decorators/tcpx_decorator_test.py +267 -0
  42. xpk/core/workload_decorators/tcpxo_decorator.py +2 -1
  43. xpk/core/workload_test.py +28 -0
  44. xpk/main.py +12 -10
  45. xpk/parser/cluster.py +110 -49
  46. xpk/parser/common.py +45 -36
  47. xpk/parser/storage.py +12 -13
  48. xpk/parser/workload.py +57 -39
  49. xpk/utils/console.py +2 -1
  50. xpk/utils/execution_context.py +28 -0
  51. xpk/utils/file.py +25 -10
  52. xpk/utils/network.py +4 -0
  53. {xpk-0.11.0.dist-info → xpk-0.13.0.dist-info}/METADATA +4 -1
  54. xpk-0.13.0.dist-info/RECORD +101 -0
  55. xpk-0.11.0.dist-info/RECORD +0 -95
  56. {xpk-0.11.0.dist-info → xpk-0.13.0.dist-info}/WHEEL +0 -0
  57. {xpk-0.11.0.dist-info → xpk-0.13.0.dist-info}/entry_points.txt +0 -0
  58. {xpk-0.11.0.dist-info → xpk-0.13.0.dist-info}/licenses/LICENSE +0 -0
  59. {xpk-0.11.0.dist-info → xpk-0.13.0.dist-info}/top_level.txt +0 -0
xpk/parser/storage.py CHANGED
@@ -28,6 +28,13 @@ from .common import (
28
28
  add_kind_cluster_arguments,
29
29
  add_shared_arguments,
30
30
  )
31
+ from typing import Protocol, Any
32
+
33
+
34
+ class Subcommands(Protocol):
35
+
36
+ def add_parser(self, *args, **kwargs) -> Any:
37
+ ...
31
38
 
32
39
 
33
40
  def set_storage_parser(storage_parser: argparse.ArgumentParser) -> None:
@@ -47,7 +54,7 @@ def set_storage_parser(storage_parser: argparse.ArgumentParser) -> None:
47
54
 
48
55
 
49
56
  def add_storage_attach_parser(
50
- storage_subcommands_parser: argparse.ArgumentParser,
57
+ storage_subcommands_parser: Subcommands,
51
58
  ) -> None:
52
59
 
53
60
  storage_attach_parser: argparse.ArgumentParser = (
@@ -171,9 +178,7 @@ def add_storage_attach_parser(
171
178
  add_kind_cluster_arguments(opt_args)
172
179
 
173
180
 
174
- def add_storage_create_parser(
175
- storage_subcommands_parser: argparse.ArgumentParser,
176
- ) -> None:
181
+ def add_storage_create_parser(storage_subcommands_parser: Subcommands) -> None:
177
182
  storage_create_parser: argparse.ArgumentParser = (
178
183
  storage_subcommands_parser.add_parser(
179
184
  'create', help='create XPK Storage.'
@@ -272,9 +277,7 @@ def add_storage_create_parser(
272
277
  add_kind_cluster_arguments(opt_args)
273
278
 
274
279
 
275
- def add_storage_list_parser(
276
- storage_subcommands_parser: argparse.ArgumentParser,
277
- ):
280
+ def add_storage_list_parser(storage_subcommands_parser: Subcommands) -> None:
278
281
  storage_list_parser: argparse.ArgumentParser = (
279
282
  storage_subcommands_parser.add_parser('list', help='List XPK Storages.')
280
283
  )
@@ -290,9 +293,7 @@ def add_storage_list_parser(
290
293
  )
291
294
 
292
295
 
293
- def add_storage_detach_parser(
294
- storage_subcommands_parser: argparse.ArgumentParser,
295
- ):
296
+ def add_storage_detach_parser(storage_subcommands_parser: Subcommands) -> None:
296
297
  storage_detach_parser: argparse.ArgumentParser = (
297
298
  storage_subcommands_parser.add_parser(
298
299
  'detach', help='Detach XPK Storage.'
@@ -315,9 +316,7 @@ def add_storage_detach_parser(
315
316
  add_kind_cluster_arguments(opt_args)
316
317
 
317
318
 
318
- def add_storage_delete_parser(
319
- storage_subcommands_parser: argparse.ArgumentParser,
320
- ):
319
+ def add_storage_delete_parser(storage_subcommands_parser: Subcommands) -> None:
321
320
  storage_delete_parser: argparse.ArgumentParser = (
322
321
  storage_subcommands_parser.add_parser(
323
322
  'delete', help='Delete XPK Storage.'
xpk/parser/workload.py CHANGED
@@ -193,43 +193,6 @@ def set_workload_parsers(workload_parser):
193
193
  ),
194
194
  )
195
195
 
196
- # Autoprovisioning workload arguments
197
- workload_create_autoprovisioning_arguments.add_argument(
198
- '--on-demand',
199
- action='store_true',
200
- help=(
201
- 'Sets autoprovisioning to use on-demand resources for the workload'
202
- ' request. See `--reservation` or `--spot` for other capacity types.'
203
- ),
204
- )
205
- workload_create_autoprovisioning_arguments.add_argument(
206
- '--reservation',
207
- type=str,
208
- help=(
209
- 'Sets autoprovisioning to use reservation resources for the workload'
210
- ' request. This will attempt to find the provided reservation. See'
211
- ' `--spot`, `--flex` or `--on-demand` for other capacity types.'
212
- ),
213
- )
214
- workload_create_autoprovisioning_arguments.add_argument(
215
- '--spot',
216
- action='store_true',
217
- help=(
218
- 'Sets autoprovisioning to use spot resources. See `--reservation`,'
219
- ' `--flex` or `--on-demand` for other capacity types.'
220
- ),
221
- )
222
-
223
- workload_create_autoprovisioning_arguments.add_argument(
224
- '--flex',
225
- action='store_true',
226
- help=(
227
- 'Sets autoprovisioning to use flex-start resources. See'
228
- ' `--reservation`, `--spot` or `--on-demand` for other capacity'
229
- ' types.'
230
- ),
231
- )
232
-
233
196
  # "workload create-pathways" command parser.
234
197
  workload_create_pathways_parser = workload_subcommands.add_parser(
235
198
  'create-pathways', help='Create a new job.'
@@ -257,6 +220,12 @@ def set_workload_parsers(workload_parser):
257
220
  '`--base-docker-image` is used by default. Set this argument if the'
258
221
  ' user wants the docker image to be used directly by the xpk workload.',
259
222
  )
223
+ workload_create_pathways_autoprovisioning_arguments = (
224
+ workload_create_pathways_parser.add_argument_group(
225
+ 'Optional Autoprovisioning Arguments',
226
+ 'Arguments for configuring autoprovisioning.',
227
+ )
228
+ )
260
229
  workload_create_pathways_vertex_tensorboard_arguments = (
261
230
  workload_create_pathways_parser.add_argument_group(
262
231
  'Vertex Tensorboard Arguments',
@@ -407,6 +376,10 @@ def set_workload_parsers(workload_parser):
407
376
  workload_vertex_tensorboard_arguments,
408
377
  workload_create_pathways_vertex_tensorboard_arguments,
409
378
  ])
379
+ add_shared_workload_create_autoprovisioning_arguments([
380
+ workload_create_autoprovisioning_arguments,
381
+ workload_create_pathways_autoprovisioning_arguments,
382
+ ])
410
383
 
411
384
  # Set defaults for both workload create and workload create-pathways after adding all shared args.
412
385
  workload_create_parser.set_defaults(func=workload_create)
@@ -452,7 +425,7 @@ def set_workload_parsers(workload_parser):
452
425
  type=str,
453
426
  help=(
454
427
  'Filters the arguments based on job name. Provide a regex'
455
- ' expressionto parse jobs that match the pattern or provide a job'
428
+ ' expression to parse jobs that match the pattern or provide a job'
456
429
  ' name to delete a single job.'
457
430
  ),
458
431
  )
@@ -521,7 +494,7 @@ def set_workload_parsers(workload_parser):
521
494
  type=str,
522
495
  help=(
523
496
  'Filters the arguments based on job name. Provide a regex'
524
- ' expressionto parse jobs that match the pattern or provide a job'
497
+ ' expression to parse jobs that match the pattern or provide a job'
525
498
  ' name to view a single job.'
526
499
  ),
527
500
  required=False,
@@ -770,3 +743,48 @@ def add_shared_workload_create_tensorboard_arguments(args_parsers):
770
743
  '<cluster>-<workload> will be created.'
771
744
  ),
772
745
  )
746
+
747
+
748
+ def add_shared_workload_create_autoprovisioning_arguments(args_parsers):
749
+ """Add shared autoprovisioning arguments
750
+
751
+ Args:
752
+ List of workload create optional arguments parsers
753
+ """
754
+ for custom_parser in args_parsers:
755
+ custom_parser.add_argument(
756
+ '--on-demand',
757
+ action='store_true',
758
+ help=(
759
+ 'Sets autoprovisioning to use on-demand resources for the workload'
760
+ ' request. See `--reservation` or `--spot` for other capacity'
761
+ ' types.'
762
+ ),
763
+ )
764
+ custom_parser.add_argument(
765
+ '--reservation',
766
+ type=str,
767
+ help=(
768
+ 'Sets autoprovisioning to use reservation resources for the'
769
+ ' workload request. This will attempt to find the provided'
770
+ ' reservation. See `--spot`, `--flex` or `--on-demand` for other'
771
+ ' capacity types.'
772
+ ),
773
+ )
774
+ custom_parser.add_argument(
775
+ '--spot',
776
+ action='store_true',
777
+ help=(
778
+ 'Sets autoprovisioning to use spot resources. See `--reservation`,'
779
+ ' `--flex` or `--on-demand` for other capacity types.'
780
+ ),
781
+ )
782
+ custom_parser.add_argument(
783
+ '--flex',
784
+ action='store_true',
785
+ help=(
786
+ 'Sets autoprovisioning to use flex-start resources. See'
787
+ ' `--reservation`, `--spot` or `--on-demand` for other capacity'
788
+ ' types.'
789
+ ),
790
+ )
xpk/utils/console.py CHANGED
@@ -15,6 +15,7 @@ limitations under the License.
15
15
  """
16
16
 
17
17
  import sys
18
+ from typing import NoReturn
18
19
 
19
20
 
20
21
  def xpk_print(*args, **kwargs):
@@ -29,7 +30,7 @@ def xpk_print(*args, **kwargs):
29
30
  sys.stdout.flush()
30
31
 
31
32
 
32
- def xpk_exit(error_code):
33
+ def xpk_exit(error_code) -> NoReturn:
33
34
  """Helper function to exit xpk with an associated error code.
34
35
 
35
36
  Args:
@@ -0,0 +1,28 @@
1
+ """
2
+ Copyright 2025 Google LLC
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ """
16
+
17
+ dry_run = False
18
+
19
+
20
+ def set_dry_run(value: bool) -> None:
21
+ """Sets the dry_run flag."""
22
+ global dry_run
23
+ dry_run = value
24
+
25
+
26
+ def is_dry_run() -> bool:
27
+ """Returns the current value of the dry_run flag."""
28
+ return dry_run
xpk/utils/file.py CHANGED
@@ -16,10 +16,11 @@ limitations under the License.
16
16
 
17
17
  import tempfile
18
18
  import os
19
- from .console import xpk_print
19
+ import hashlib
20
+ from .execution_context import is_dry_run
20
21
 
21
22
 
22
- def make_tmp_files(per_command_name):
23
+ def make_tmp_files(per_command_name: list[str]) -> list[str]:
23
24
  """Make temporary files for each command.
24
25
 
25
26
  Args:
@@ -28,16 +29,19 @@ def make_tmp_files(per_command_name):
28
29
  Returns:
29
30
  A list of temporary files for each command.
30
31
  """
32
+ if is_dry_run():
33
+ return [_hash_filename(command) for command in per_command_name]
34
+
31
35
  # Supports removal of spaces from command names before converting to file name.
32
36
  return [
33
37
  tempfile.NamedTemporaryFile(
34
38
  delete=False, prefix=command.replace(' ', '-') + '-'
35
- )
39
+ ).file.name
36
40
  for command in per_command_name
37
41
  ]
38
42
 
39
43
 
40
- def write_tmp_file(payload):
44
+ def write_tmp_file(payload: str) -> str:
41
45
  """Writes `payload` to a temporary file.
42
46
 
43
47
  Args:
@@ -46,14 +50,17 @@ def write_tmp_file(payload):
46
50
  Returns:
47
51
  A file object that was written to.
48
52
  """
53
+ if is_dry_run():
54
+ return _hash_filename(payload)
55
+
49
56
  with tempfile.NamedTemporaryFile(delete=False) as tmp:
50
57
  with open(file=tmp.name, mode='w', encoding='utf=8') as f:
51
58
  f.write(payload)
52
59
  f.flush()
53
- return tmp
60
+ return tmp.file.name
54
61
 
55
62
 
56
- def append_tmp_file(payload, file):
63
+ def append_tmp_file(payload: str, file: str) -> str:
57
64
  """Appends `payload` to an already created file.
58
65
 
59
66
  Use `write_temporary_file` to create a file.
@@ -65,18 +72,26 @@ def append_tmp_file(payload, file):
65
72
  Returns:
66
73
  A file object that was written to.
67
74
  """
68
- with open(file=file.name, mode='a', encoding='utf=8') as f:
75
+ if is_dry_run():
76
+ return file
77
+
78
+ with open(file=file, mode='a', encoding='utf=8') as f:
69
79
  f.write(payload)
70
80
  f.flush()
71
81
  return file
72
82
 
73
83
 
74
- def ensure_directory_exists(directory_path):
84
+ def ensure_directory_exists(directory_path: str) -> None:
75
85
  """Checks if a directory exists and creates it if it doesn't.
76
86
 
77
87
  Args:
78
88
  directory_path: The path to the directory.
79
89
  """
80
- if not os.path.exists(directory_path):
90
+ if not is_dry_run() and not os.path.exists(directory_path):
81
91
  os.makedirs(directory_path)
82
- xpk_print(f"Directory '{directory_path}' created successfully.")
92
+
93
+
94
+ def _hash_filename(seed: str) -> str:
95
+ m = hashlib.sha256()
96
+ m.update(seed.encode('utf-8'))
97
+ return m.hexdigest()
xpk/utils/network.py CHANGED
@@ -18,6 +18,7 @@ import ipaddress
18
18
  import socket
19
19
  import requests
20
20
  from .console import xpk_print
21
+ from .execution_context import is_dry_run
21
22
 
22
23
  # Retrives machine's external IP address
23
24
  ip_resolver_url = "http://api.ipify.org"
@@ -36,6 +37,9 @@ def get_current_machine_ip(external_ip=True):
36
37
  The IP address as a string.
37
38
  """
38
39
 
40
+ if is_dry_run():
41
+ return 0, "127.0.0.1"
42
+
39
43
  try:
40
44
  if external_ip:
41
45
  # Get external IP address
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xpk
3
- Version: 0.11.0
3
+ Version: 0.13.0
4
4
  Summary: xpk helps Cloud developers to orchestrate training jobs on accelerators on GKE.
5
5
  Author-email: XPK team <xpk-code-reviewers@google.com>
6
6
  License: Apache-2.0
@@ -28,6 +28,9 @@ Requires-Dist: pylint>=2.6.0; extra == "dev"
28
28
  Requires-Dist: pre-commit; extra == "dev"
29
29
  Requires-Dist: pytest; extra == "dev"
30
30
  Requires-Dist: docker==7.1.0; extra == "dev"
31
+ Requires-Dist: mypy~=1.17; extra == "dev"
32
+ Requires-Dist: types-PyYAML==6.0.2; extra == "dev"
33
+ Requires-Dist: types-docker~=7.1.0.0; extra == "dev"
31
34
  Dynamic: license-file
32
35
 
33
36
  <!--
@@ -0,0 +1,101 @@
1
+ xpk/__init__.py,sha256=7mu-VQDQMyxM5To0KOhuYe4y2TYGsEkfV7hXZmUyih4,561
2
+ xpk/main.py,sha256=GrA6HQ4YzIHEspkP2uwDOLRYZOfBmAh8Rv9sIZcUhZg,2504
3
+ xpk/api/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
4
+ xpk/api/storage_crd.yaml,sha256=r4WFXnSJJ25EUF-t4Ljfbl-cJoSaiFiZkP8451eTub4,1260
5
+ xpk/commands/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
6
+ xpk/commands/batch.py,sha256=g24nbVV-ruiFgFottJ-o4RG6CZeK1vkRJ1dOIoeLr9k,3905
7
+ xpk/commands/cluster.py,sha256=PzXQSgPzctA4EfeuFr8b5oyxzp03TZT3OxixNqUwXlw,40407
8
+ xpk/commands/cluster_gcluster.py,sha256=8jJ7nHBbkmaPtsVQ2m_GnLxkS5iNV5sSN61KL0K_uEY,10861
9
+ xpk/commands/common.py,sha256=xDpg8Y-0dtGNyx7NIhu-k4fjYSlW1X80wl_WL5fumrs,2504
10
+ xpk/commands/config.py,sha256=gFNkf3ibsvZmcPpkpKXe-KJmHO5IKucNwLCXNgKvaDc,836
11
+ xpk/commands/info.py,sha256=1orA0u5KCB6fj-smHkuFL1WCH96NGrEiDpRCgPrxUW4,7304
12
+ xpk/commands/inspector.py,sha256=q12w8V1JRd9HuBwtpi3KvTFHbCrBR0j-59CAsPREG5I,12092
13
+ xpk/commands/job.py,sha256=lfc7rrw-YEA4Wsz5n-mTABkVX050FPWUbwz14G82xGA,6134
14
+ xpk/commands/kind.py,sha256=Vl3RT47kHCR0ORX9dK37HCiYtbmXJUCIAaq-QEbIclU,7578
15
+ xpk/commands/kjob_common.py,sha256=dtT-R0n50byTmu2Qcni0pqKYobUAHNENBN_4pt0l-KE,1952
16
+ xpk/commands/run.py,sha256=5hYMG0DcdHnFWsJ5gmfX09t6ZPVItt7FFoHO_ED0_Dk,3798
17
+ xpk/commands/shell.py,sha256=5-sKcI2Rbk3aCojnBNtipCwgOrbIDnG4f8ah0KIayY8,4182
18
+ xpk/commands/storage.py,sha256=Odrp3JNbVp1Ngr_Pj1ds-V02Qz3HbJiSYm9wUYscI8s,10704
19
+ xpk/commands/version.py,sha256=CU4mb71r66U28krnPAopC6vBpdK-IGclsy5uNaQcgRY,824
20
+ xpk/commands/workload.py,sha256=zIRTwxz_pDUkGMUiBGvrejY-gjnCVpsJW2Ey9cQcb14,26906
21
+ xpk/core/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
22
+ xpk/core/capacity.py,sha256=SQzncJSLuI4LLJ2VcnpxcRlTjiBG3e8nM0_QxG1986w,7367
23
+ xpk/core/cluster.py,sha256=D9VGYlB8mZlGWUjgF9ri7P17RK-Q0EIWLVLHvh7f948,29057
24
+ xpk/core/cluster_private.py,sha256=_wzaywvp_uaszg_L0U3u8wYRYQbY0vSlf3a0aycDUxM,6812
25
+ xpk/core/commands.py,sha256=_kpML4DkorN2yB7gcrgpLaa4OSrivkC8tOTdaCh85VU,10805
26
+ xpk/core/config.py,sha256=svK1NWm7M0ttu2jyp7mzhM0iKmA7ATxLQY5sB-7FfS4,3407
27
+ xpk/core/config_test.py,sha256=v1qfyFRzLkYSQ7Wn4nx1N0dBSOFXidLWDfhkeHDZOVM,1847
28
+ xpk/core/docker_container.py,sha256=GvkCJ2S5UKn8uh3pZhRd3X7iS0-PsQpRO8l7QhywVGc,7604
29
+ xpk/core/docker_image.py,sha256=r7gXOqQX7wd8oHklYjPvhOi8Dbaz0NIfv4NbVfhbGkg,6805
30
+ xpk/core/docker_manager.py,sha256=JBFgyD6O7LKwEHJC7YuSoCDZqrFRtb-LjgWNqkfAbR0,10566
31
+ xpk/core/docker_resources.py,sha256=_aKgpUjyJB2krQ1PkHrotB7K4kByLmPLbuvl_UVvuX8,12843
32
+ xpk/core/filestore.py,sha256=mcuUzsAPARbnrBG4fIGsEoN8NmzjaQ6k0tvIwMtjO9k,8068
33
+ xpk/core/gcloud_context.py,sha256=go0avmBbYx45vk_7W3iwQEphmQUx27oaL6dseyocqLI,5836
34
+ xpk/core/gcluster_manager.py,sha256=JFip2hInFczFP2h5AXa70IPIuTaJ475TG6GxkQjKOI8,6337
35
+ xpk/core/gcsfuse.py,sha256=kg5pgxdTjgiqquuGjev9fXzJPb8oiWPTK6wzCddzheQ,2125
36
+ xpk/core/jobset.py,sha256=T1TPlIm0D5h5PTwnfMGUPZkwVfkd_MpnoKYRqI63ses,4113
37
+ xpk/core/kjob.py,sha256=vuSzPsMIuBpAXJkXTGSgCAz6WzzDl31XkQPQnW3pg1M,14806
38
+ xpk/core/kueue.py,sha256=K2nU-Icqi7-LcDHYIX7m0cNOz3zjuwqFzqMD35k6W7A,15753
39
+ xpk/core/monitoring.py,sha256=v9MvLzNfvJAVby_ehSlPe6PaO0_pf3shkXg5gd-UWm8,4338
40
+ xpk/core/mtc.py,sha256=pO7p3l-EzLFdTE8MdwWV8i0Zu-7epGql_kPoksVofIU,6259
41
+ xpk/core/nap.py,sha256=H0ZDj68m8B8LHPTP41BLd8Q945eYjxFbh4SCkqf9HFM,12809
42
+ xpk/core/network.py,sha256=mu1J9QIQzv_fWfvnVXJYQPcgw7Od01ok2zEqCJx0dIs,10527
43
+ xpk/core/nodepool.py,sha256=8a5sYPFH7CSkLzTugAQ8JaXPux2RH7bY_6fTPMBMh4E,23132
44
+ xpk/core/nodepool_test.py,sha256=QRpmdyZTPRDE2qCibWeKQgE3Q2WCxXt1Onfv0MK4QZQ,2626
45
+ xpk/core/pathways.py,sha256=Q76IaxffhvlTR_Rz6BxSEO0j-ytY5hPEcQaATcfGQiM,10704
46
+ xpk/core/ray.py,sha256=74IMjmwneoMoPu1TpILCV1F64nSu7L5ETmGp86fLgp0,6327
47
+ xpk/core/resources.py,sha256=wFqpcWQj1KwF6b1NRIMqMcrDTQJT00cNHMpFsHlIs_k,8230
48
+ xpk/core/scheduling.py,sha256=dlWMeP_3RDdNKO2qmNxzq-YyQATQ9vKyMMI7xEfEkoM,9242
49
+ xpk/core/storage.py,sha256=NILvVAcLNMLmp4wKx_TEKbMMF5X1oL-FrQV46PT0_ds,16902
50
+ xpk/core/system_characteristics.py,sha256=2mtQlUiufK98XUXo0_f1D4d06FRGdUk_VNkaBg48Fcs,15152
51
+ xpk/core/vertex.py,sha256=pD9UBL62xHomuqdNu7xKccfD2KCbjgohMk3AhX-CXSw,3644
52
+ xpk/core/workload.py,sha256=WyT-H4XdeDY07glL1ikmcs44kLgLjMuMtclyZTxrmg8,8921
53
+ xpk/core/workload_test.py,sha256=tVTvrwDRXD3O1GCoftgEBWilCYTN74ayP1KRP0vptx0,857
54
+ xpk/core/blueprint/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
55
+ xpk/core/blueprint/blueprint_definitions.py,sha256=5i331XA-2yP_ALyB6XU5tP2Tf9iHcIX5g0TilxQi8zE,1800
56
+ xpk/core/blueprint/blueprint_generator.py,sha256=Uoz3YKsZKLfIoPI8d3bQ5RNrFFsqBOWb3HBQr3OolHo,38010
57
+ xpk/core/blueprint/blueprint_test.py,sha256=f3dL7KU9n6M8Hdnrg4VI5EEi9GA2dnwm4LDf9n5Wbuw,7410
58
+ xpk/core/remote_state/__init__.py,sha256=PkV8D9WOtlJHH5AIxsQaKeIBcmupT_Ol_bwJgN6G2I8,561
59
+ xpk/core/remote_state/fuse_remote_state.py,sha256=3Dx4ZZd0NFF5-MlqGWHzz8H4bjYiPOWdF_YSEnKUPQ8,3246
60
+ xpk/core/remote_state/remote_state_client.py,sha256=6PcR92Xy_RMjlF4AscanQ1jXNHnewLWGNC2v53jbzD4,1077
61
+ xpk/core/workload_decorators/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
62
+ xpk/core/workload_decorators/rdma_decorator.py,sha256=isbgPnjdu2AT_Da1nVUIRoGE_qZ7jMDOKCgZOLq5r2A,4006
63
+ xpk/core/workload_decorators/storage_decorator.py,sha256=DDYQVO1OKTLhveDOA4V6b2RWr4n0fbwHdnoFFmW7iaQ,2000
64
+ xpk/core/workload_decorators/tcpx_decorator.py,sha256=m5EgzEHjbcOD13ygY91mQdhwQt4Gr5PyalVkKcHyeV8,5975
65
+ xpk/core/workload_decorators/tcpx_decorator_test.py,sha256=iTBS3X_-VwA2oveNDjscduLtll0VOJyFRCp4xmsjg7w,8515
66
+ xpk/core/workload_decorators/tcpxo_decorator.py,sha256=_nLX7tbnxhnS-xv4Jijd1JOP76V4LpNCfW3Np404Cqw,6537
67
+ xpk/parser/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
68
+ xpk/parser/batch.py,sha256=mJU-Cp1yTLje59vD-B1IiBcUeD-ZmEsoeB4xhj9cflc,1406
69
+ xpk/parser/cluster.py,sha256=jt6oPoFtOZjdtDKVLOKSskUZooajan8mgT9sdlbNuow,30445
70
+ xpk/parser/common.py,sha256=N6P6wPuptluNEddh9kpUsaWgxXGADNZLMfKT-P7QkW0,7791
71
+ xpk/parser/config.py,sha256=-XnWx9aFsBW4Uzo_hpOMD2ZQ0bdZLvq1ksv83_5jqSM,1633
72
+ xpk/parser/core.py,sha256=VRJerlS92ufoQbG1mZv7B04DAP4qGkBHa4pRXgcbAs0,4761
73
+ xpk/parser/info.py,sha256=UJohxVVWdt9IgUXoPsrVae2DN1BjAVGWrSN2ajrB8RQ,1860
74
+ xpk/parser/inspector.py,sha256=hAPAZ2k9iSJgC1mjnz3rMleInsAQ8PmkyyUKFyBmsgY,1997
75
+ xpk/parser/job.py,sha256=5RdE70rucGfrsn65l7Ho6RmO06mag1S0AO-3saVuXyw,4328
76
+ xpk/parser/kind.py,sha256=sgPCqNVrgmFLcOBEbhlaphwVXxMh_opP9ntCq4KPePE,2682
77
+ xpk/parser/run.py,sha256=oi_ksSyJ8Ooffe2EgoV_ecpmXEmNGVotjpIQH-HjufE,1481
78
+ xpk/parser/shell.py,sha256=VC8p-kz9XjJZW9DXZ-rnv41XnRDRpQRFywHpB5j7tfc,1970
79
+ xpk/parser/storage.py,sha256=XNynqulEzTmT8_G6wkeBwfXX0XQ1lsd6BFcx0H6rGfU,9971
80
+ xpk/parser/validators.py,sha256=-NBZelvfwZRzjz-YUCreD8EzMLHll8PZM-d-MVm2PG4,1192
81
+ xpk/parser/version.py,sha256=eJo4PAbbmRQZulgKBs_ytbVgV9zAaaXeNzMMxmgFMVY,769
82
+ xpk/parser/workload.py,sha256=J0Wg4NEO7pOdOwf_8uC9bVzXodBXwkYo1c2gRJVyyak,26068
83
+ xpk/templates/__init__.py,sha256=7mu-VQDQMyxM5To0KOhuYe4y2TYGsEkfV7hXZmUyih4,561
84
+ xpk/templates/storage.yaml,sha256=AykdyMtDnKZF8Y_0BYxoYP03hEIzEk6iNalXAQHgAls,163
85
+ xpk/utils/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
86
+ xpk/utils/console.py,sha256=hRbvtog_VAzuxt5GfwK5GZdd5SWaa7kvWG8zo_qFRQc,1519
87
+ xpk/utils/execution_context.py,sha256=WYxm6NExBIP6iLAWaL5aV858riGJbAHn0Zs6fmKlmzE,784
88
+ xpk/utils/file.py,sha256=hi9v4gfwiB3JHi3tnelPbm_dlTUt47U0wvvWKQqMjiQ,2500
89
+ xpk/utils/gcs_utils.py,sha256=zg-XSTv4G4TFjeT2bNBm2WLdDXPrOZi0rNv_JdppNg4,4113
90
+ xpk/utils/kubectl.py,sha256=WKB9UhpouPN9G4n2ejRi_PgsYLI0R01gzkS1WGU6mJA,1828
91
+ xpk/utils/network.py,sha256=dGS5rxIm_zaayDElHNlzalaf09M99by5ckL_lGDl_yQ,4293
92
+ xpk/utils/objects.py,sha256=OwMNxB4TGX21qnJPdZo2YBMPMbQPqOtHMh19QhoRNRY,2498
93
+ xpk/utils/templates.py,sha256=g8zgR1MxyJmTmzM_wnvH30FmcbgQMC47UQwBtLj8B9k,807
94
+ xpk/utils/validation.py,sha256=bSJApIY0Lk48I4EEQP08ZUvolXt_APpYXVGJXFQ_YLA,2711
95
+ xpk/utils/yaml.py,sha256=j8xuAJ9yAAwnQi6ozwZ-nMnDyDnc3xWkeBZMtSuP4RU,844
96
+ xpk-0.13.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
97
+ xpk-0.13.0.dist-info/METADATA,sha256=EdMiwFyuULp8iGjAVi9qMtzt57IRDZD9sYk0tww-JKY,71759
98
+ xpk-0.13.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
99
+ xpk-0.13.0.dist-info/entry_points.txt,sha256=mzEtiIesFkT1kmcTUVDA1o3uOhiniX6tIz2wmOlMu1M,38
100
+ xpk-0.13.0.dist-info/top_level.txt,sha256=aDe4N0jicmuWExx_6w0TxWQJaEuPSs9BnLU-3aF1GLo,4
101
+ xpk-0.13.0.dist-info/RECORD,,
@@ -1,95 +0,0 @@
1
- xpk/__init__.py,sha256=7mu-VQDQMyxM5To0KOhuYe4y2TYGsEkfV7hXZmUyih4,561
2
- xpk/main.py,sha256=wFc_kIM7kALGIY-JOcoa8m4BCWNRjl5tQ6ZDpv7HpSU,2350
3
- xpk/api/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
4
- xpk/api/storage_crd.yaml,sha256=r4WFXnSJJ25EUF-t4Ljfbl-cJoSaiFiZkP8451eTub4,1260
5
- xpk/commands/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
6
- xpk/commands/batch.py,sha256=qzKkXf45brC-Ln3C-lajcwdqCc2BCVbKJe5M06AdnKQ,3806
7
- xpk/commands/cluster.py,sha256=50sezU0GgJGssK1CdrP_XDaRs2UGFP3q7eEivkfmhkc,40296
8
- xpk/commands/cluster_gcluster.py,sha256=F2QWBo7IYHcX_4jjMvaJoCXisJvrWmGiRbAtPikDS34,10816
9
- xpk/commands/common.py,sha256=DLmvQ0cjdiS6rMAopyzNSAKGlLH-XLeW4-FTGOlWZeo,2401
10
- xpk/commands/config.py,sha256=gFNkf3ibsvZmcPpkpKXe-KJmHO5IKucNwLCXNgKvaDc,836
11
- xpk/commands/info.py,sha256=BHqFFXm3Lg1P8qH1Z3gEXmh141-8udduS5EBk38auDg,7251
12
- xpk/commands/inspector.py,sha256=bwbZW-cLtiBw2V0zvoMprHWhgMbAYm0ez0GjjEqeUR8,12097
13
- xpk/commands/job.py,sha256=LCFB_l1v5x_k4Ov15hPDAhadcvMZlqvHkObNNuHMCdo,5479
14
- xpk/commands/kind.py,sha256=Vl3RT47kHCR0ORX9dK37HCiYtbmXJUCIAaq-QEbIclU,7578
15
- xpk/commands/kjob_common.py,sha256=XTT8uog4PvlxjH7sFTNnvMTlPSzARVM71wj_Czt4XF0,1926
16
- xpk/commands/run.py,sha256=5hYMG0DcdHnFWsJ5gmfX09t6ZPVItt7FFoHO_ED0_Dk,3798
17
- xpk/commands/shell.py,sha256=5-sKcI2Rbk3aCojnBNtipCwgOrbIDnG4f8ah0KIayY8,4182
18
- xpk/commands/storage.py,sha256=tCH2medguOH5bBtywEuqXRtFeHDFE8sq4YVLuOIx_Hk,10600
19
- xpk/commands/version.py,sha256=CU4mb71r66U28krnPAopC6vBpdK-IGclsy5uNaQcgRY,824
20
- xpk/commands/workload.py,sha256=nc5vClmCmRU04ItwiC3cldCLyEVjzvDUpxv987fgQ-A,26470
21
- xpk/core/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
22
- xpk/core/capacity.py,sha256=pO7H9pkEQwr4sWJP63EprKQph6DYhbIYDQN_TRkA4TQ,7308
23
- xpk/core/cluster.py,sha256=UHr6DIREO2RKsenrAXMCsvmFdutgcJxZJqeiJy-c88g,29017
24
- xpk/core/cluster_private.py,sha256=J2-UZ6t5f-UNdcSkuUr2_f4xk6xyrMH9Muk56trBh4M,6657
25
- xpk/core/commands.py,sha256=JiS4vJqWSLu8MKFBIKPBea9MKD2ZdpaQrziVQBqiDr4,10719
26
- xpk/core/config.py,sha256=7VN6aQqI6n7mCG1r9KE5-egbYXwjpRiynrZR1IKaNzo,3475
27
- xpk/core/docker_container.py,sha256=GvkCJ2S5UKn8uh3pZhRd3X7iS0-PsQpRO8l7QhywVGc,7604
28
- xpk/core/docker_image.py,sha256=fEdpLQg1C205mMbLREy48WnhvNv2Nm4KQFX87B2CuiA,6624
29
- xpk/core/docker_manager.py,sha256=mtOEnzSP1GF28ymHSPlTminujh4wWyg5EbC9UT3VFpI,10566
30
- xpk/core/docker_resources.py,sha256=h-jT5AK1yL7reGPMeSUqb4Khulimljb16J7xoRI2XFw,12753
31
- xpk/core/filestore.py,sha256=7M-HAiXR-gEu3BJUgRY3cqEIfjo_FL0BAxq9MljEBt4,8022
32
- xpk/core/gcloud_context.py,sha256=p_LhWHo7GZonear2oupvTO-DpKqEkL0St7PnfxieRDY,5866
33
- xpk/core/gcluster_manager.py,sha256=JFip2hInFczFP2h5AXa70IPIuTaJ475TG6GxkQjKOI8,6337
34
- xpk/core/gcsfuse.py,sha256=kg5pgxdTjgiqquuGjev9fXzJPb8oiWPTK6wzCddzheQ,2125
35
- xpk/core/jobset.py,sha256=L_q67_Gq_XjsZKcnznVlCuk1RGZeDFAGDXdCGxbu1oc,4123
36
- xpk/core/kjob.py,sha256=bl0lIlfFqJqn9fQ2PO-xG6sRPq8RFgk8-cPL2hs-dZM,14681
37
- xpk/core/kueue.py,sha256=Pww37KL9pR9XaeoKRQ3gUao2lrB1VfB2ZLKf6Zt4Ff0,15097
38
- xpk/core/monitoring.py,sha256=v9MvLzNfvJAVby_ehSlPe6PaO0_pf3shkXg5gd-UWm8,4338
39
- xpk/core/mtc.py,sha256=pO7p3l-EzLFdTE8MdwWV8i0Zu-7epGql_kPoksVofIU,6259
40
- xpk/core/nap.py,sha256=kGluT05HOFW9Kq-cZ13pUVyBkAiyA371NvKTiqdYZAk,12791
41
- xpk/core/network.py,sha256=hQR5Kab5Q5CYjggriNIhNh78Aq0CCF-vPUQI6BC4Wgw,10537
42
- xpk/core/nodepool.py,sha256=mHYa51og95hwHIxXuzWEycudfewDogzYULoEwrWWTDE,23029
43
- xpk/core/pathways.py,sha256=g4PUSi6RPqpCPVlziWGj14W7zbdNvkw8mrOq09J3s68,10594
44
- xpk/core/ray.py,sha256=UxOpIc2enHi1fQ4h3KO8FH8bIyEMtYzGtPoeqJKGG4o,6337
45
- xpk/core/resources.py,sha256=uezEuHw2OzpM4LT2c2EjUCPr9lhBTfLnOPay7hGVyj4,8276
46
- xpk/core/scheduling.py,sha256=HIagFbVAl7lz5gRyjpzwke1tLN4PGEyOkUrtBdmy5Ok,9157
47
- xpk/core/storage.py,sha256=AjpRQn6zUn7qL3W17LuzBtMqyB-3i9YEap5Vw01cUpQ,16926
48
- xpk/core/system_characteristics.py,sha256=FZ2FYsabECPML-ROYuJ74X4U64vES19U8CujcDImXh8,15161
49
- xpk/core/vertex.py,sha256=pD9UBL62xHomuqdNu7xKccfD2KCbjgohMk3AhX-CXSw,3644
50
- xpk/core/workload.py,sha256=nfmL4_2Rr0dt5pctHm89KNJcYzulk6CX5d9QEguthJY,8526
51
- xpk/core/blueprint/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
52
- xpk/core/blueprint/blueprint_definitions.py,sha256=5i331XA-2yP_ALyB6XU5tP2Tf9iHcIX5g0TilxQi8zE,1800
53
- xpk/core/blueprint/blueprint_generator.py,sha256=vdxoyQnD2uyi8DaG3QtzdVjizf1nNlwoB23ecHUpkKQ,37967
54
- xpk/core/remote_state/__init__.py,sha256=PkV8D9WOtlJHH5AIxsQaKeIBcmupT_Ol_bwJgN6G2I8,561
55
- xpk/core/remote_state/fuse_remote_state.py,sha256=3Dx4ZZd0NFF5-MlqGWHzz8H4bjYiPOWdF_YSEnKUPQ8,3246
56
- xpk/core/remote_state/remote_state_client.py,sha256=6PcR92Xy_RMjlF4AscanQ1jXNHnewLWGNC2v53jbzD4,1077
57
- xpk/core/workload_decorators/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
58
- xpk/core/workload_decorators/rdma_decorator.py,sha256=GU9QQ-cvosurjnhcXqj6e_TpXVHoZE0Of24lALeWPVc,3972
59
- xpk/core/workload_decorators/storage_decorator.py,sha256=Bj1lRh65s40AJDsWM0xTiHFaWtKC272eImjIjN8Z38c,1967
60
- xpk/core/workload_decorators/tcpx_decorator.py,sha256=oB60_9744MfS-7yZ3mOnb1KWDRvsNyCCuR5jkp2H_i0,5863
61
- xpk/core/workload_decorators/tcpxo_decorator.py,sha256=kV1Mzrz0sISPOIRi8I2yuvBhTEfu4e-EYJuz0A63Ubs,6504
62
- xpk/parser/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
63
- xpk/parser/batch.py,sha256=mJU-Cp1yTLje59vD-B1IiBcUeD-ZmEsoeB4xhj9cflc,1406
64
- xpk/parser/cluster.py,sha256=Zb4kKekItzk1lberAxf3jkUH8pvFqjKC8_bKrIXsK9c,28325
65
- xpk/parser/common.py,sha256=_F2rwsZka15difkvPA1yPARWr9I9ewx8PMzgwMLTvjM,7220
66
- xpk/parser/config.py,sha256=-XnWx9aFsBW4Uzo_hpOMD2ZQ0bdZLvq1ksv83_5jqSM,1633
67
- xpk/parser/core.py,sha256=VRJerlS92ufoQbG1mZv7B04DAP4qGkBHa4pRXgcbAs0,4761
68
- xpk/parser/info.py,sha256=UJohxVVWdt9IgUXoPsrVae2DN1BjAVGWrSN2ajrB8RQ,1860
69
- xpk/parser/inspector.py,sha256=hAPAZ2k9iSJgC1mjnz3rMleInsAQ8PmkyyUKFyBmsgY,1997
70
- xpk/parser/job.py,sha256=5RdE70rucGfrsn65l7Ho6RmO06mag1S0AO-3saVuXyw,4328
71
- xpk/parser/kind.py,sha256=sgPCqNVrgmFLcOBEbhlaphwVXxMh_opP9ntCq4KPePE,2682
72
- xpk/parser/run.py,sha256=oi_ksSyJ8Ooffe2EgoV_ecpmXEmNGVotjpIQH-HjufE,1481
73
- xpk/parser/shell.py,sha256=VC8p-kz9XjJZW9DXZ-rnv41XnRDRpQRFywHpB5j7tfc,1970
74
- xpk/parser/storage.py,sha256=lzGQSgngWnguz6yCNUUOJj65BVB_C_WC6nNksHBeTw4,9914
75
- xpk/parser/validators.py,sha256=-NBZelvfwZRzjz-YUCreD8EzMLHll8PZM-d-MVm2PG4,1192
76
- xpk/parser/version.py,sha256=eJo4PAbbmRQZulgKBs_ytbVgV9zAaaXeNzMMxmgFMVY,769
77
- xpk/parser/workload.py,sha256=UVOVCngwhJ4ikuINsdK4rOFlzr39Sv6q0S49NDuNaI0,25493
78
- xpk/templates/__init__.py,sha256=7mu-VQDQMyxM5To0KOhuYe4y2TYGsEkfV7hXZmUyih4,561
79
- xpk/templates/storage.yaml,sha256=AykdyMtDnKZF8Y_0BYxoYP03hEIzEk6iNalXAQHgAls,163
80
- xpk/utils/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
81
- xpk/utils/console.py,sha256=bKibWIswcB1aWGZp0ZpL-NEhvTrxJMy7wWD4-3BVTKI,1479
82
- xpk/utils/file.py,sha256=jlv2o4ah9UmWJ7NuOCnTwtMZFLerOATBIMQeQ03-kIw,2142
83
- xpk/utils/gcs_utils.py,sha256=zg-XSTv4G4TFjeT2bNBm2WLdDXPrOZi0rNv_JdppNg4,4113
84
- xpk/utils/kubectl.py,sha256=WKB9UhpouPN9G4n2ejRi_PgsYLI0R01gzkS1WGU6mJA,1828
85
- xpk/utils/network.py,sha256=AAm9qGGFAEfAh1FK39muBheXAo7tdBlxR0A8Tg0TyYQ,4205
86
- xpk/utils/objects.py,sha256=OwMNxB4TGX21qnJPdZo2YBMPMbQPqOtHMh19QhoRNRY,2498
87
- xpk/utils/templates.py,sha256=g8zgR1MxyJmTmzM_wnvH30FmcbgQMC47UQwBtLj8B9k,807
88
- xpk/utils/validation.py,sha256=bSJApIY0Lk48I4EEQP08ZUvolXt_APpYXVGJXFQ_YLA,2711
89
- xpk/utils/yaml.py,sha256=j8xuAJ9yAAwnQi6ozwZ-nMnDyDnc3xWkeBZMtSuP4RU,844
90
- xpk-0.11.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
91
- xpk-0.11.0.dist-info/METADATA,sha256=j-s1ky4Hnojze2t84S9u6H6TaeAOWwQrFC8Q4k2aF5Y,71613
92
- xpk-0.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
93
- xpk-0.11.0.dist-info/entry_points.txt,sha256=mzEtiIesFkT1kmcTUVDA1o3uOhiniX6tIz2wmOlMu1M,38
94
- xpk-0.11.0.dist-info/top_level.txt,sha256=aDe4N0jicmuWExx_6w0TxWQJaEuPSs9BnLU-3aF1GLo,4
95
- xpk-0.11.0.dist-info/RECORD,,
File without changes