primitive 0.1.68__tar.gz → 0.1.70__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 (115) hide show
  1. {primitive-0.1.68 → primitive-0.1.70}/.vscode/settings.json +2 -0
  2. {primitive-0.1.68 → primitive-0.1.70}/PKG-INFO +2 -1
  3. {primitive-0.1.68 → primitive-0.1.70}/pyproject.toml +2 -1
  4. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/__about__.py +1 -1
  5. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/agent/process.py +8 -1
  6. primitive-0.1.70/src/primitive/agent/runner.py +250 -0
  7. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/agent/uploader.py +6 -7
  8. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/cli.py +0 -4
  9. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/client.py +5 -8
  10. primitive-0.1.70/src/primitive/files/actions.py +354 -0
  11. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/files/commands.py +4 -1
  12. primitive-0.1.70/src/primitive/files/graphql/fragments.py +18 -0
  13. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/files/graphql/mutations.py +17 -1
  14. primitive-0.1.70/src/primitive/files/graphql/queries.py +31 -0
  15. primitive-0.1.70/src/primitive/utils/auth.py +35 -0
  16. primitive-0.1.70/src/primitive/utils/chunk_size.py +87 -0
  17. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/utils/files.py +10 -7
  18. {primitive-0.1.68 → primitive-0.1.70}/uv.lock +193 -177
  19. primitive-0.1.68/src/primitive/agent/runner.py +0 -245
  20. primitive-0.1.68/src/primitive/files/actions.py +0 -191
  21. primitive-0.1.68/src/primitive/lint/actions.py +0 -76
  22. primitive-0.1.68/src/primitive/lint/commands.py +0 -17
  23. primitive-0.1.68/src/primitive/sim/__init__.py +0 -0
  24. primitive-0.1.68/src/primitive/sim/actions.py +0 -129
  25. primitive-0.1.68/src/primitive/sim/commands.py +0 -19
  26. primitive-0.1.68/src/primitive/utils/__init__.py +0 -0
  27. primitive-0.1.68/src/primitive/utils/auth.py +0 -27
  28. {primitive-0.1.68 → primitive-0.1.70}/.git-hooks/pre-commit +0 -0
  29. {primitive-0.1.68 → primitive-0.1.70}/.gitattributes +0 -0
  30. {primitive-0.1.68 → primitive-0.1.70}/.github/workflows/lint.yml +0 -0
  31. {primitive-0.1.68 → primitive-0.1.70}/.github/workflows/publish.yml +0 -0
  32. {primitive-0.1.68 → primitive-0.1.70}/.gitignore +0 -0
  33. {primitive-0.1.68 → primitive-0.1.70}/LICENSE.txt +0 -0
  34. {primitive-0.1.68 → primitive-0.1.70}/Makefile +0 -0
  35. {primitive-0.1.68 → primitive-0.1.70}/README.md +0 -0
  36. {primitive-0.1.68 → primitive-0.1.70}/linux setup.md +0 -0
  37. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/__init__.py +0 -0
  38. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/agent/__init__.py +0 -0
  39. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/agent/actions.py +0 -0
  40. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/agent/commands.py +0 -0
  41. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/agent/provision.py +0 -0
  42. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/auth/__init__.py +0 -0
  43. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/auth/actions.py +0 -0
  44. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/auth/commands.py +0 -0
  45. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/auth/graphql/__init__.py +0 -0
  46. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/auth/graphql/queries.py +0 -0
  47. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/daemons/__init__.py +0 -0
  48. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/daemons/actions.py +0 -0
  49. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/daemons/commands.py +0 -0
  50. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/daemons/launch_agents.py +0 -0
  51. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/daemons/launch_service.py +0 -0
  52. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/exec/__init__.py +0 -0
  53. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/exec/actions.py +0 -0
  54. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/exec/commands.py +0 -0
  55. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/exec/interactive.py +0 -0
  56. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/files/__init__.py +0 -0
  57. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/files/graphql/__init__.py +0 -0
  58. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/git/__init__.py +0 -0
  59. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/git/actions.py +0 -0
  60. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/git/commands.py +0 -0
  61. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/git/graphql/__init__.py +0 -0
  62. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/git/graphql/queries.py +0 -0
  63. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/graphql/__init__.py +0 -0
  64. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/graphql/relay.py +0 -0
  65. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/graphql/sdk.py +0 -0
  66. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/graphql/utility_fragments.py +0 -0
  67. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/hardware/__init__.py +0 -0
  68. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/hardware/actions.py +0 -0
  69. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/hardware/commands.py +0 -0
  70. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/hardware/graphql/__init__.py +0 -0
  71. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/hardware/graphql/fragments.py +0 -0
  72. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/hardware/graphql/mutations.py +0 -0
  73. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/hardware/graphql/queries.py +0 -0
  74. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/jobs/__init__.py +0 -0
  75. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/jobs/actions.py +0 -0
  76. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/jobs/commands.py +0 -0
  77. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/jobs/graphql/__init__.py +0 -0
  78. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/jobs/graphql/fragments.py +0 -0
  79. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/jobs/graphql/mutations.py +0 -0
  80. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/jobs/graphql/queries.py +0 -0
  81. {primitive-0.1.68/src/primitive/lint → primitive-0.1.70/src/primitive/organizations}/__init__.py +0 -0
  82. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/organizations/actions.py +0 -0
  83. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/organizations/commands.py +0 -0
  84. {primitive-0.1.68/src/primitive/organizations → primitive-0.1.70/src/primitive/organizations/graphql}/__init__.py +0 -0
  85. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/organizations/graphql/fragments.py +0 -0
  86. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/organizations/graphql/mutations.py +0 -0
  87. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/organizations/graphql/queries.py +0 -0
  88. {primitive-0.1.68/src/primitive/organizations/graphql → primitive-0.1.70/src/primitive/projects}/__init__.py +0 -0
  89. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/projects/actions.py +0 -0
  90. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/projects/commands.py +0 -0
  91. {primitive-0.1.68/src/primitive/projects → primitive-0.1.70/src/primitive/projects/graphql}/__init__.py +0 -0
  92. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/projects/graphql/fragments.py +0 -0
  93. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/projects/graphql/mutations.py +0 -0
  94. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/projects/graphql/queries.py +0 -0
  95. {primitive-0.1.68/src/primitive/projects/graphql → primitive-0.1.70/src/primitive/provisioning}/__init__.py +0 -0
  96. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/provisioning/actions.py +0 -0
  97. {primitive-0.1.68/src/primitive/provisioning → primitive-0.1.70/src/primitive/provisioning/graphql}/__init__.py +0 -0
  98. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/provisioning/graphql/queries.py +0 -0
  99. {primitive-0.1.68/src/primitive/provisioning/graphql → primitive-0.1.70/src/primitive/reservations}/__init__.py +0 -0
  100. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/reservations/actions.py +0 -0
  101. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/reservations/commands.py +0 -0
  102. {primitive-0.1.68/src/primitive/reservations → primitive-0.1.70/src/primitive/reservations/graphql}/__init__.py +0 -0
  103. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/reservations/graphql/fragments.py +0 -0
  104. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/reservations/graphql/mutations.py +0 -0
  105. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/reservations/graphql/queries.py +0 -0
  106. {primitive-0.1.68/src/primitive/reservations/graphql → primitive-0.1.70/src/primitive/utils}/__init__.py +0 -0
  107. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/utils/actions.py +0 -0
  108. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/utils/cache.py +0 -0
  109. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/utils/config.py +0 -0
  110. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/utils/git.py +0 -0
  111. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/utils/memory_size.py +0 -0
  112. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/utils/printer.py +0 -0
  113. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/utils/shell.py +0 -0
  114. {primitive-0.1.68 → primitive-0.1.70}/src/primitive/utils/verible.py +0 -0
  115. {primitive-0.1.68 → primitive-0.1.70}/tests/__init__.py +0 -0
@@ -3,6 +3,8 @@
3
3
  "Checkin",
4
4
  "loguru",
5
5
  "machdep",
6
+ "Mbit",
7
+ "mbps",
6
8
  "pkey",
7
9
  "testsuites",
8
10
  "untar",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: primitive
3
- Version: 0.1.68
3
+ Version: 0.1.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
@@ -23,6 +23,7 @@ Requires-Dist: loguru
23
23
  Requires-Dist: paramiko[invoke]
24
24
  Requires-Dist: primitive-pal==0.1.4
25
25
  Requires-Dist: pyyaml
26
+ Requires-Dist: speedtest-cli
26
27
  Description-Content-Type: text/markdown
27
28
 
28
29
  # primitive
@@ -32,7 +32,8 @@ dependencies = [
32
32
  "loguru",
33
33
  "pyyaml",
34
34
  "primitive-pal == 0.1.4",
35
- "paramiko[invoke]"
35
+ "paramiko[invoke]",
36
+ "speedtest-cli",
36
37
  ]
37
38
 
38
39
  [tool.uv]
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024-present Dylan Stein <dylan@primitive.tech>
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
- __version__ = "0.1.68"
4
+ __version__ = "0.1.70"
@@ -41,7 +41,14 @@ class Process:
41
41
  continue
42
42
 
43
43
  if key.fileobj is self.process.stdout:
44
- logger.info(data.rstrip())
44
+ raw_data = data.rstrip()
45
+ if "error" in raw_data.lower():
46
+ logger.error(raw_data)
47
+ self._errors += 1
48
+ elif "warning" in raw_data.lower():
49
+ logger.warning(raw_data)
50
+ else:
51
+ logger.info(raw_data)
45
52
  elif key.fileobj is self.process.stderr:
46
53
  logger.error(data.rstrip())
47
54
  self._errors += 1
@@ -0,0 +1,250 @@
1
+ import os
2
+ import threading
3
+ import typing
4
+ import json
5
+ from pathlib import Path, PurePath
6
+ from time import sleep
7
+ from typing import Dict, Iterable, List, Optional, TypedDict, Callable
8
+
9
+ import yaml
10
+ from loguru import logger
11
+ from .process import Process
12
+ from .provision import ProvisionPython
13
+ from ..utils.cache import get_artifacts_cache, get_logs_cache
14
+ from ..utils.files import find_files_for_extension
15
+
16
+ try:
17
+ from yaml import CLoader as Loader
18
+ except ImportError:
19
+ from yaml import Loader
20
+
21
+ if typing.TYPE_CHECKING:
22
+ import primitive.client
23
+
24
+
25
+ class Artifact(TypedDict):
26
+ name: str
27
+ extension: str
28
+
29
+
30
+ class JobStep(TypedDict):
31
+ name: str
32
+ workdir: str
33
+ artifacts: List[Artifact]
34
+ cmd: str
35
+
36
+
37
+ class JobDescription(TypedDict):
38
+ name: str
39
+ provision: str
40
+ steps: List[JobStep]
41
+
42
+
43
+ class AgentRunner:
44
+ def __init__(
45
+ self,
46
+ primitive: "primitive.client.Primitive",
47
+ source_dir: Path,
48
+ job_id: str,
49
+ job_slug: str,
50
+ max_log_size: int = 10 * 1024 * 1024,
51
+ log_to_file: bool = True,
52
+ job: Optional[JobDescription] = None,
53
+ ) -> None:
54
+ self.primitive = primitive
55
+ self.source_dir = source_dir
56
+ self.workdir = "."
57
+ self.job_id = job_id
58
+ self.job_slug = job_slug
59
+ self.max_log_size = max_log_size
60
+ self.log_to_file = log_to_file
61
+
62
+ # Enable and configure logger
63
+ logger.enable("primitive")
64
+
65
+ if self.log_to_file:
66
+ log_name = f"{self.job_slug}_{self.job_id}_{{time}}.primitive.log"
67
+ logger.add(
68
+ Path(get_logs_cache(self.job_id) / log_name),
69
+ rotation=self.max_log_size,
70
+ format=AgentRunner.log_serializer(),
71
+ )
72
+
73
+ # Attempt to load job from file
74
+ if not job:
75
+ logger.info(f"Scanning directory for job file {self.job_slug}")
76
+ yaml_file = Path(self.source_dir / ".primitive" / f"{self.job_slug}.yaml")
77
+ yml_file = Path(self.source_dir / ".primitive" / f"{self.job_slug}.yml")
78
+
79
+ if yaml_file.exists() and yml_file.exists():
80
+ logger.error(
81
+ f"Found two job descriptions with the same slug: {self.job_slug}"
82
+ )
83
+ self.primitive.jobs.job_run_update(
84
+ self.job_id, status="request_completed", conclusion="failure"
85
+ )
86
+ raise FileExistsError
87
+
88
+ if yaml_file.exists():
89
+ self.job = yaml.load(open(yaml_file, "r"), Loader=Loader)
90
+ elif yml_file.exists():
91
+ self.job = yaml.load(open(yml_file, "r"), Loader=Loader)
92
+ else:
93
+ logger.error(
94
+ f"No job description with matching slug '{self.job_slug}' found"
95
+ )
96
+ self.primitive.jobs.job_run_update(
97
+ self.job_id, status="request_completed", conclusion="failure"
98
+ )
99
+ raise FileNotFoundError
100
+
101
+ logger.info(f"Found job description for {self.job_slug}")
102
+ else:
103
+ self.job = job
104
+
105
+ @staticmethod
106
+ def log_serializer() -> Callable:
107
+ def fmt(record):
108
+ step = ""
109
+ if "step" in record["extra"]:
110
+ step = record["extra"]["step"]
111
+
112
+ log = {
113
+ "time": record["time"].strftime("%Y-%m-%d %H:%M:%S.%f"),
114
+ "utc": record["time"].strftime("%Y-%m-%d %H:%M:%S.%f%z"),
115
+ "level": record["level"].name,
116
+ "message": record["message"],
117
+ "name": record["name"],
118
+ "step": step,
119
+ }
120
+
121
+ record["extra"]["serialized"] = json.dumps(log)
122
+
123
+ return "{extra[serialized]}\n"
124
+
125
+ return fmt
126
+
127
+ def name(self) -> str:
128
+ return self.job["name"]
129
+
130
+ def steps(self) -> Iterable[JobStep]:
131
+ for step in self.job["steps"]:
132
+ yield step
133
+
134
+ def execute(self) -> None:
135
+ logger.info(f"Executing {self.job_slug} job")
136
+ self.primitive.jobs.job_run_update(self.job_id, status="request_in_progress")
137
+
138
+ # Initialize the environment with the system
139
+ environment = os.environ
140
+ if "provision" in self.job:
141
+ logger.info(f"Provisioning for {self.job['provision']} environment")
142
+ environment = self.provision()
143
+
144
+ if not environment:
145
+ self.primitive.jobs.job_run_update(
146
+ self.job_id, status="request_completed", conclusion="failure"
147
+ )
148
+ logger.error(f"{self.job_slug} concluded with error(s)")
149
+ return
150
+
151
+ total_job_errors = 0
152
+ for step in self.steps():
153
+ logger.info(f"Beginning step {step['name']}")
154
+
155
+ with logger.contextualize(step=step["name"]):
156
+ if "workdir" in step:
157
+ self.workdir = step["workdir"]
158
+
159
+ proc = Process(
160
+ cmd=step["cmd"],
161
+ workdir=Path(self.source_dir / self.workdir),
162
+ env=environment,
163
+ )
164
+
165
+ try:
166
+ proc.start()
167
+ except Exception as e:
168
+ logger.error(f"Error while attempting to run process {e}")
169
+ self.primitive.jobs.job_run_update(
170
+ self.job_id, status="request_completed", conclusion="failure"
171
+ )
172
+ logger.error(f"{self.job_slug} concluded with error(s)")
173
+ return
174
+
175
+ def status_check():
176
+ while proc.is_running():
177
+ # Check job status
178
+ status = self.primitive.jobs.get_job_status(self.job_id)
179
+ status_value = status.data["jobRun"]["status"]
180
+
181
+ # TODO: Should probably use request_cancelled or something
182
+ # once we change it, we'll have to call conclude w/ cancelled status
183
+ if status_value == "completed":
184
+ logger.warning("Job cancelled by user")
185
+ proc.terminate()
186
+ return
187
+
188
+ sleep(5)
189
+
190
+ status_thread = threading.Thread(target=status_check)
191
+ status_thread.start()
192
+
193
+ returncode = proc.wait()
194
+ total_job_errors += proc.errors
195
+ status_thread.join()
196
+
197
+ self.collect_artifacts(step)
198
+
199
+ if returncode > 0:
200
+ self.primitive.jobs.job_run_update(
201
+ self.job_id, status="request_completed", conclusion="failure"
202
+ )
203
+ logger.error(f"{self.job_slug} concluded with error(s)")
204
+ return
205
+
206
+ if total_job_errors > 0:
207
+ self.primitive.jobs.job_run_update(
208
+ self.job_id, status="request_completed", conclusion="failure"
209
+ )
210
+ logger.error(f"{self.job_slug} concluded with error(s)")
211
+ return
212
+
213
+ self.primitive.jobs.job_run_update(
214
+ self.job_id, status="request_completed", conclusion="success"
215
+ )
216
+ logger.success(f"Completed {self.job_slug} job")
217
+
218
+ def provision(self) -> Optional[Dict]:
219
+ match self.job["provision"]:
220
+ case "python":
221
+ requirements_glob = self.source_dir.rglob("requirements.txt")
222
+
223
+ requirements_path = next(requirements_glob, None)
224
+
225
+ if not requirements_path:
226
+ logger.error("Unable to locate requirements.txt")
227
+ return None
228
+
229
+ prov = ProvisionPython(self.source_dir, requirements_path)
230
+ return prov.create_env()
231
+
232
+ def collect_artifacts(self, step: JobStep) -> None:
233
+ if "artifacts" not in step:
234
+ return
235
+
236
+ for artifact in step["artifacts"]:
237
+ files = find_files_for_extension(self.source_dir, artifact["extension"])
238
+
239
+ for file in files:
240
+ # Find path relative to source_dir
241
+ relative_path = PurePath(file).relative_to(self.source_dir)
242
+
243
+ # Construct destination to preserve directory structure
244
+ destination = Path(get_artifacts_cache(self.job_id) / relative_path)
245
+
246
+ # Create directories if they don't exist
247
+ destination.parent.mkdir(parents=True, exist_ok=True)
248
+
249
+ # Move file
250
+ file.rename(destination)
@@ -1,8 +1,8 @@
1
- import typing
2
- from typing import Dict
3
- import shutil
4
1
  import os
2
+ import shutil
3
+ import typing
5
4
  from pathlib import Path, PurePath
5
+ from typing import Dict
6
6
 
7
7
  from loguru import logger
8
8
 
@@ -45,12 +45,11 @@ class Uploader:
45
45
  )
46
46
 
47
47
  for file in files:
48
- response = self.primitive.files.upload_file_via_api(
48
+ result = self.primitive.files.upload_file_direct(
49
49
  path=file,
50
- key_prefix=str(PurePath(file).relative_to(cache.parent).parent),
51
- job_run_id=job_run_id,
50
+ key_prefix=str(PurePath(file).relative_to(cache.parent).parent)
52
51
  )
53
- upload_id = response.json()["data"]["fileUpload"]["id"]
52
+ upload_id = result.data["fileUpdate"]["id"]
54
53
 
55
54
  if upload_id:
56
55
  file_ids.append(upload_id)
@@ -13,11 +13,9 @@ from .files.commands import cli as file_commands
13
13
  from .git.commands import cli as git_commands
14
14
  from .hardware.commands import cli as hardware_commands
15
15
  from .jobs.commands import cli as jobs_commands
16
- from .lint.commands import cli as lint_commands
17
16
  from .organizations.commands import cli as organizations_commands
18
17
  from .projects.commands import cli as projects_commands
19
18
  from .reservations.commands import cli as reservations_commands
20
- from .sim.commands import cli as sim_commands
21
19
 
22
20
 
23
21
  @click.group()
@@ -65,14 +63,12 @@ cli.add_command(config_command, "config")
65
63
  cli.add_command(whoami_command, "whoami")
66
64
  cli.add_command(file_commands, "files")
67
65
  cli.add_command(hardware_commands, "hardware")
68
- cli.add_command(lint_commands, "lint")
69
66
  cli.add_command(agent_commands, "agent")
70
67
  cli.add_command(git_commands, "git")
71
68
  cli.add_command(daemons_commands, "daemons")
72
69
  cli.add_command(jobs_commands, "jobs")
73
70
  cli.add_command(organizations_commands, "organizations")
74
71
  cli.add_command(projects_commands, "projects")
75
- cli.add_command(sim_commands, "sim")
76
72
  cli.add_command(reservations_commands, "reservations")
77
73
  cli.add_command(exec_commands, "exec")
78
74
 
@@ -1,5 +1,6 @@
1
1
  import sys
2
2
 
3
+ from gql import Client
3
4
  from loguru import logger
4
5
 
5
6
  from .agent.actions import Agent
@@ -10,12 +11,10 @@ from .files.actions import Files
10
11
  from .git.actions import Git
11
12
  from .hardware.actions import Hardware
12
13
  from .jobs.actions import Jobs
13
- from .lint.actions import Lint
14
14
  from .organizations.actions import Organizations
15
15
  from .projects.actions import Projects
16
16
  from .provisioning.actions import Provisioning
17
17
  from .reservations.actions import Reservations
18
- from .sim.actions import Sim
19
18
  from .utils.config import read_config_file
20
19
 
21
20
  logger.disable("primitive")
@@ -30,10 +29,10 @@ class Primitive:
30
29
  token: str = None,
31
30
  transport: str = None,
32
31
  ) -> None:
33
- self.host = host
34
- self.session = None
35
- self.DEBUG = DEBUG
36
- self.JSON = JSON
32
+ self.host: str = host
33
+ self.session: Client = None
34
+ self.DEBUG: bool = DEBUG
35
+ self.JSON: bool = JSON
37
36
 
38
37
  if self.DEBUG:
39
38
  logger.enable("primitive")
@@ -61,10 +60,8 @@ class Primitive:
61
60
  self.projects: Projects = Projects(self)
62
61
  self.jobs: Jobs = Jobs(self)
63
62
  self.files: Files = Files(self)
64
- self.sim: Sim = Sim(self)
65
63
  self.reservations: Reservations = Reservations(self)
66
64
  self.hardware: Hardware = Hardware(self)
67
- self.lint: Lint = Lint(self)
68
65
  self.agent: Agent = Agent(self)
69
66
  self.git: Git = Git(self)
70
67
  self.daemons: Daemons = Daemons(self)