primitive 0.2.59__tar.gz → 0.2.60__tar.gz

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 (118) hide show
  1. {primitive-0.2.59 → primitive-0.2.60}/PKG-INFO +1 -1
  2. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/__about__.py +1 -1
  3. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/files/actions.py +73 -7
  4. primitive-0.2.60/src/primitive/files/commands.py +100 -0
  5. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/files/graphql/fragments.py +5 -2
  6. primitive-0.2.60/src/primitive/files/ui.py +37 -0
  7. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/hardware/actions.py +5 -4
  8. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/jobs/actions.py +1 -0
  9. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/monitor/actions.py +1 -1
  10. primitive-0.2.59/src/primitive/files/commands.py +0 -43
  11. {primitive-0.2.59 → primitive-0.2.60}/.git-hooks/pre-commit +0 -0
  12. {primitive-0.2.59 → primitive-0.2.60}/.gitattributes +0 -0
  13. {primitive-0.2.59 → primitive-0.2.60}/.github/workflows/lint.yml +0 -0
  14. {primitive-0.2.59 → primitive-0.2.60}/.github/workflows/publish.yml +0 -0
  15. {primitive-0.2.59 → primitive-0.2.60}/.github/workflows/pyright.yml +0 -0
  16. {primitive-0.2.59 → primitive-0.2.60}/.gitignore +0 -0
  17. {primitive-0.2.59 → primitive-0.2.60}/.vscode/extensions.json +0 -0
  18. {primitive-0.2.59 → primitive-0.2.60}/.vscode/settings.json +0 -0
  19. {primitive-0.2.59 → primitive-0.2.60}/LICENSE.txt +0 -0
  20. {primitive-0.2.59 → primitive-0.2.60}/Makefile +0 -0
  21. {primitive-0.2.59 → primitive-0.2.60}/README.md +0 -0
  22. {primitive-0.2.59 → primitive-0.2.60}/linux setup.md +0 -0
  23. {primitive-0.2.59 → primitive-0.2.60}/pyproject.toml +0 -0
  24. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/__init__.py +0 -0
  25. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/agent/__init__.py +0 -0
  26. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/agent/actions.py +0 -0
  27. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/agent/commands.py +0 -0
  28. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/agent/runner.py +0 -0
  29. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/agent/uploader.py +0 -0
  30. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/auth/__init__.py +0 -0
  31. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/auth/actions.py +0 -0
  32. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/auth/commands.py +0 -0
  33. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/auth/graphql/__init__.py +0 -0
  34. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/auth/graphql/queries.py +0 -0
  35. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/cli.py +0 -0
  36. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/client.py +0 -0
  37. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/daemons/__init__.py +0 -0
  38. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/daemons/actions.py +0 -0
  39. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/daemons/commands.py +0 -0
  40. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/daemons/launch_agents.py +0 -0
  41. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/daemons/launch_service.py +0 -0
  42. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/daemons/ui.py +0 -0
  43. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/exec/__init__.py +0 -0
  44. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/exec/actions.py +0 -0
  45. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/exec/commands.py +0 -0
  46. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/exec/interactive.py +0 -0
  47. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/files/__init__.py +0 -0
  48. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/files/graphql/__init__.py +0 -0
  49. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/files/graphql/mutations.py +0 -0
  50. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/files/graphql/queries.py +0 -0
  51. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/git/__init__.py +0 -0
  52. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/git/actions.py +0 -0
  53. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/git/commands.py +0 -0
  54. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/git/graphql/__init__.py +0 -0
  55. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/git/graphql/queries.py +0 -0
  56. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/graphql/__init__.py +0 -0
  57. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/graphql/relay.py +0 -0
  58. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/graphql/sdk.py +0 -0
  59. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/graphql/utility_fragments.py +0 -0
  60. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/hardware/__init__.py +0 -0
  61. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/hardware/android.py +0 -0
  62. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/hardware/commands.py +0 -0
  63. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/hardware/graphql/__init__.py +0 -0
  64. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/hardware/graphql/fragments.py +0 -0
  65. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/hardware/graphql/mutations.py +0 -0
  66. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/hardware/graphql/queries.py +0 -0
  67. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/hardware/ui.py +0 -0
  68. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/jobs/__init__.py +0 -0
  69. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/jobs/commands.py +0 -0
  70. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/jobs/graphql/__init__.py +0 -0
  71. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/jobs/graphql/fragments.py +0 -0
  72. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/jobs/graphql/mutations.py +0 -0
  73. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/jobs/graphql/queries.py +0 -0
  74. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/messaging/__init__.py +0 -0
  75. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/messaging/provider.py +0 -0
  76. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/monitor/commands.py +0 -0
  77. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/organizations/__init__.py +0 -0
  78. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/organizations/actions.py +0 -0
  79. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/organizations/commands.py +0 -0
  80. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/organizations/graphql/__init__.py +0 -0
  81. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/organizations/graphql/fragments.py +0 -0
  82. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/organizations/graphql/mutations.py +0 -0
  83. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/organizations/graphql/queries.py +0 -0
  84. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/projects/__init__.py +0 -0
  85. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/projects/actions.py +0 -0
  86. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/projects/commands.py +0 -0
  87. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/projects/graphql/__init__.py +0 -0
  88. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/projects/graphql/fragments.py +0 -0
  89. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/projects/graphql/mutations.py +0 -0
  90. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/projects/graphql/queries.py +0 -0
  91. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/provisioning/__init__.py +0 -0
  92. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/provisioning/actions.py +0 -0
  93. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/provisioning/graphql/__init__.py +0 -0
  94. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/provisioning/graphql/queries.py +0 -0
  95. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/reservations/__init__.py +0 -0
  96. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/reservations/actions.py +0 -0
  97. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/reservations/commands.py +0 -0
  98. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/reservations/graphql/__init__.py +0 -0
  99. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/reservations/graphql/fragments.py +0 -0
  100. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/reservations/graphql/mutations.py +0 -0
  101. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/reservations/graphql/queries.py +0 -0
  102. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/__init__.py +0 -0
  103. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/actions.py +0 -0
  104. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/auth.py +0 -0
  105. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/cache.py +0 -0
  106. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/chunk_size.py +0 -0
  107. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/config.py +0 -0
  108. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/daemons.py +0 -0
  109. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/exceptions.py +0 -0
  110. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/logging.py +0 -0
  111. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/memory_size.py +0 -0
  112. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/printer.py +0 -0
  113. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/psutil.py +0 -0
  114. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/shell.py +0 -0
  115. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/text.py +0 -0
  116. {primitive-0.2.59 → primitive-0.2.60}/src/primitive/utils/x509.py +0 -0
  117. {primitive-0.2.59 → primitive-0.2.60}/tests/__init__.py +0 -0
  118. {primitive-0.2.59 → primitive-0.2.60}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: primitive
3
- Version: 0.2.59
3
+ Version: 0.2.60
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,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2025-present Dylan Stein <dylan@primitive.tech>
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
- __version__ = "0.2.59"
4
+ __version__ = "0.2.60"
@@ -124,15 +124,39 @@ class Files(BaseAction):
124
124
  return result
125
125
 
126
126
  @guard
127
- def get_file(self, file_id: Optional[str] = None):
127
+ def files(
128
+ self,
129
+ file_id: Optional[str] = None,
130
+ file_name: Optional[str] = None,
131
+ organization_id: Optional[str] = None,
132
+ organization_slug: Optional[str] = None,
133
+ ):
128
134
  query = gql(files_list)
129
135
 
130
136
  filters = {}
137
+ if not organization_id and not organization_slug:
138
+ whoami_result = self.primitive.auth.whoami()
139
+ default_organization = whoami_result.data["whoami"]["defaultOrganization"]
140
+ organization_id = default_organization["id"]
141
+ logger.info(
142
+ f"Using default organization ID: {default_organization.get('slug')} ({organization_id})"
143
+ )
144
+ if organization_slug and not organization_id:
145
+ organization = self.primitive.organizations.get_organization(
146
+ slug=organization_slug
147
+ )
148
+ organization_id = organization.get("id")
149
+
150
+ if organization_id:
151
+ filters["organization"] = {"id": organization_id}
152
+
131
153
  if file_id:
132
- filters["id"] = {"exact": file_id}
154
+ filters["id"] = file_id
155
+ if file_name:
156
+ filters["fileName"] = {"exact": file_name}
133
157
 
134
158
  variables = {
135
- "first": 1,
159
+ "first": 25,
136
160
  "filters": filters,
137
161
  }
138
162
  result = self.primitive.session.execute(
@@ -242,9 +266,9 @@ class Files(BaseAction):
242
266
  file_id = pending_file_create.get("id")
243
267
  parts_details = pending_file_create.get("partsDetails")
244
268
  else:
245
- get_file_result = self.get_file(file_id)
269
+ file_result = self.files(file_id=file_id)
246
270
  parts_details = (
247
- get_file_result.data.get("files")
271
+ file_result.data.get("files")
248
272
  .get("edges")[0]
249
273
  .get("node")
250
274
  .get("partsDetails")
@@ -340,14 +364,56 @@ class Files(BaseAction):
340
364
  "fileObject": (path.name, open(path, "rb")),
341
365
  }
342
366
 
343
- session = create_requests_session(self.primitive.host_config)
367
+ session = create_requests_session(host_config=self.primitive.host_config)
344
368
  transport = self.primitive.host_config.get("transport")
345
369
  url = f"{transport}://{self.primitive.host}/"
346
370
  response = session.post(url, files=body)
347
371
  return response
348
372
 
349
- def get_presigned_url(self, file_pk: str):
373
+ def get_presigned_url(self, file_pk: str) -> str:
350
374
  transport = self.primitive.host_config.get("transport")
351
375
  host = self.primitive.host_config.get("host")
352
376
  file_access_url = f"{transport}://{host}/files/{file_pk}/presigned-url/"
353
377
  return file_access_url
378
+
379
+ def download_file(
380
+ self,
381
+ file_name: str = "",
382
+ file_id: str = "",
383
+ organization_id: str = "",
384
+ organization_slug: str = "",
385
+ output_path: Path = Path().cwd(),
386
+ ) -> Path:
387
+ file_pk = None
388
+
389
+ files_result = self.primitive.files.files(
390
+ file_id=file_id,
391
+ file_name=file_name,
392
+ organization_id=organization_id,
393
+ organization_slug=organization_slug,
394
+ )
395
+ if files_data := files_result.data:
396
+ file = files_data["files"]["edges"][0]["node"]
397
+ file_pk = file["pk"]
398
+ file_name = file["fileName"]
399
+
400
+ if not file_pk:
401
+ raise Exception(
402
+ "File not found on remote server. Please check file name or file id"
403
+ )
404
+
405
+ session = create_requests_session(host_config=self.primitive.host_config)
406
+ transport = self.primitive.host_config.get("transport")
407
+ url = f"{transport}://{self.primitive.host}/files/{file_pk}/stream/"
408
+
409
+ downloaded_file = output_path / file_name
410
+
411
+ with session.get(url, stream=True) as response:
412
+ response.raise_for_status()
413
+ with open(downloaded_file, "wb") as partial_downloaded_file:
414
+ for chunk in response.iter_content(chunk_size=8192):
415
+ if chunk:
416
+ partial_downloaded_file.write(chunk)
417
+ partial_downloaded_file.flush()
418
+
419
+ return downloaded_file
@@ -0,0 +1,100 @@
1
+ import json
2
+ import typing
3
+ from pathlib import Path
4
+
5
+ import click
6
+
7
+ from primitive.files.ui import render_files_table
8
+
9
+ from ..utils.printer import print_result
10
+
11
+ if typing.TYPE_CHECKING:
12
+ from ..client import Primitive
13
+
14
+
15
+ @click.group("files")
16
+ @click.pass_context
17
+ def cli(context):
18
+ """Files"""
19
+ pass
20
+
21
+
22
+ @cli.command("upload")
23
+ @click.pass_context
24
+ @click.argument("path", type=click.Path(exists=True))
25
+ @click.option("--public", "-p", help="Is this a Public file", is_flag=True)
26
+ @click.option("--key-prefix", "-k", help="Key Prefix", default="")
27
+ @click.option("--direct", help="direct", is_flag=True)
28
+ def file_upload_command(context, path, public, key_prefix, direct):
29
+ """File Upload"""
30
+ primitive: Primitive = context.obj.get("PRIMITIVE")
31
+ path = Path(path)
32
+ if direct:
33
+ result = primitive.files.upload_file_direct(
34
+ path, is_public=public, key_prefix=key_prefix
35
+ )
36
+ else:
37
+ result = primitive.files.upload_file_via_api(
38
+ path, is_public=public, key_prefix=key_prefix
39
+ )
40
+ try:
41
+ message = json.dumps(result.json())
42
+ except AttributeError:
43
+ message = "File Upload Failed"
44
+
45
+ print_result(message=message, context=context)
46
+
47
+
48
+ @cli.command("download")
49
+ @click.pass_context
50
+ @click.option("--file-id", help="File ID", required=False)
51
+ @click.option("--file-name", help="File Name", required=False)
52
+ @click.option("--output", help="Output Path", required=False, type=click.Path())
53
+ @click.option("--organization-id", help="Organization ID", required=False)
54
+ @click.option("--organization", help="Organization Slug", required=False)
55
+ def file_download_command(
56
+ context,
57
+ file_id=None,
58
+ file_name=None,
59
+ output=None,
60
+ organization_id=None,
61
+ organization=None,
62
+ ):
63
+ """File Download"""
64
+ primitive: Primitive = context.obj.get("PRIMITIVE")
65
+
66
+ if not file_id and not file_name:
67
+ raise click.UsageError("Either --id or --file-name must be provided.")
68
+
69
+ if not output:
70
+ output = Path().cwd()
71
+ else:
72
+ output = Path(output)
73
+
74
+ downloaded_file = primitive.files.download_file(
75
+ output_path=output,
76
+ file_id=file_id,
77
+ file_name=file_name,
78
+ organization_id=organization_id,
79
+ organization_slug=organization,
80
+ )
81
+ print_result(message=f"File downloaded to {downloaded_file}", context=context)
82
+
83
+
84
+ @cli.command("list")
85
+ @click.pass_context
86
+ @click.option("--organization-id", help="Organization ID", required=False)
87
+ @click.option("--organization", help="Organization Slug", required=False)
88
+ def list_command(context, organization_id=None, organization=None):
89
+ """List Files"""
90
+ primitive: Primitive = context.obj.get("PRIMITIVE")
91
+ files_result = primitive.files.files(
92
+ organization_id=organization_id, organization_slug=organization
93
+ )
94
+
95
+ files = [file.get("node") for file in files_result.data.get("files").get("edges")]
96
+
97
+ if context.obj["JSON"]:
98
+ print_result(message=files, context=context)
99
+ else:
100
+ render_files_table(files)
@@ -4,7 +4,11 @@ fragment FileFragment on File {
4
4
  pk
5
5
  createdAt
6
6
  updatedAt
7
- createdBy
7
+ createdBy {
8
+ id
9
+ pk
10
+ username
11
+ }
8
12
  location
9
13
  fileName
10
14
  fileSize
@@ -13,6 +17,5 @@ fragment FileFragment on File {
13
17
  isComplete
14
18
  partsDetails
15
19
  humanReadableMemorySize
16
- contents
17
20
  }
18
21
  """
@@ -0,0 +1,37 @@
1
+ from rich.console import Console
2
+ from rich.table import Table
3
+
4
+
5
+ def render_files_table(file_list) -> None:
6
+ console = Console()
7
+
8
+ table = Table(show_header=True, header_style="bold #FFA800")
9
+ table.add_column("File Name")
10
+ table.add_column("File ID")
11
+ table.add_column("File Size (bytes)", justify="right")
12
+
13
+ for file in file_list:
14
+ file_name = file.get("fileName")
15
+ file_id = file.get("id")
16
+ file_size = file.get("fileSize")
17
+
18
+ table.add_row(
19
+ file_name,
20
+ file_id,
21
+ file_size,
22
+ )
23
+
24
+ console.print(table)
25
+
26
+
27
+ def file_status_string(file) -> str:
28
+ if file.get("isQuarantined"):
29
+ return "Quarantined"
30
+ if not file.get("isOnline"):
31
+ return "Offline"
32
+ if not file.get("isHealthy"):
33
+ return "Not healthy"
34
+ if not file.get("isAvailable"):
35
+ return "Not available"
36
+ else:
37
+ return "Available"
@@ -740,10 +740,11 @@ class Hardware(BaseAction):
740
740
  logger.exception(f"Error checking in children: {exception}")
741
741
 
742
742
  def push_metrics(self):
743
- self.primitive.messaging.send_message(
744
- message_type=MESSAGE_TYPES.METRICS,
745
- message=self.get_metrics(),
746
- )
743
+ if self.primitive.messaging.ready:
744
+ self.primitive.messaging.send_message(
745
+ message_type=MESSAGE_TYPES.METRICS,
746
+ message=self.get_metrics(),
747
+ )
747
748
 
748
749
  def get_metrics(self):
749
750
  cpu_percent = psutil.cpu_percent(interval=1, percpu=False)
@@ -54,6 +54,7 @@ class Jobs(BaseAction):
54
54
  jobs = [edge["node"] for edge in result.data["jobs"]["edges"]]
55
55
  return jobs
56
56
 
57
+ @guard
57
58
  def get_job_runs(
58
59
  self,
59
60
  organization_id: Optional[str] = None,
@@ -67,7 +67,7 @@ class Monitor(BaseAction):
67
67
  # handles cleanup of old reservations
68
68
  # obtains an active JobRun's ID
69
69
  if not RUNNING_IN_CONTAINER:
70
- self.primitive.hardware.push_metrics()
70
+ # self.primitive.hardware.push_metrics()
71
71
 
72
72
  hardware = self.primitive.hardware.get_own_hardware_details()
73
73
  # fetch the latest hardware and activeReservation details
@@ -1,43 +0,0 @@
1
- import json
2
- import typing
3
- from pathlib import Path
4
-
5
- import click
6
-
7
- from ..utils.printer import print_result
8
-
9
- if typing.TYPE_CHECKING:
10
- from ..client import Primitive
11
-
12
-
13
- @click.group("files")
14
- @click.pass_context
15
- def cli(context):
16
- """Files"""
17
- pass
18
-
19
-
20
- @cli.command("upload")
21
- @click.pass_context
22
- @click.argument("path", type=click.Path(exists=True))
23
- @click.option("--public", "-p", help="Is this a Public file", is_flag=True)
24
- @click.option("--key-prefix", "-k", help="Key Prefix", default="")
25
- @click.option("--direct", "-k", help="direct", is_flag=True)
26
- def file_upload_command(context, path, public, key_prefix, direct):
27
- """File Upload"""
28
- primitive: Primitive = context.obj.get("PRIMITIVE")
29
- path = Path(path)
30
- if direct:
31
- result = primitive.files.upload_file_direct(
32
- path, is_public=public, key_prefix=key_prefix
33
- )
34
- else:
35
- result = primitive.files.upload_file_via_api(
36
- path, is_public=public, key_prefix=key_prefix
37
- )
38
- try:
39
- message = json.dumps(result.data)
40
- except AttributeError:
41
- message = "File Upload Failed"
42
-
43
- print_result(message=message, context=context)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes