primitive 0.2.51__py3-none-any.whl → 0.2.53__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.
primitive/__about__.py CHANGED
@@ -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.51"
4
+ __version__ = "0.2.53"
@@ -89,71 +89,84 @@ class Agent(BaseAction):
89
89
  logger.debug(f"Job Run ID: {job_run_data.get('id')}")
90
90
  logger.debug(f"Job Name: {job_run_data.get('job').get('name')}")
91
91
 
92
- logger.info(
93
- f"Setting JobRun {job_run_data.get('job').get('name')} to request_in_progress"
94
- )
92
+ job_run_status = job_run_data.get("status", None)
95
93
 
96
- job_run_status = job_run_data.get("jobRun", {}).get("status", None)
97
-
98
- while job_run_status != "in_progress":
99
- if job_run_status == "request_completed":
100
- logger.error(
101
- f"JobRun {job_run_data.get('name')} is already completed. Exiting."
102
- )
103
- if RUNNING_IN_CONTAINER:
104
- logger.info("Running in container, exiting after job run")
105
- return
106
- elif job_run_status == "pending":
94
+ while True:
95
+ if job_run_status == "pending":
107
96
  # we are setting to request_in_progress here which puts a started_at time on the JobRun in the API's database
108
97
  # any time spent pulling Git repositories, setting up, etc, counts as compute time
109
- self.primitive.jobs.job_run_update(
98
+ logger.info(
99
+ f"Setting JobRun {job_run_data.get('id')} to request_in_progress."
100
+ )
101
+ # get the status back from the job run update, this should be 'in progress'
102
+ job_run_update_result = self.primitive.jobs.job_run_update(
110
103
  id=job_run_id, status="request_in_progress"
111
104
  )
112
- logger.info(
113
- f"Waiting for JobRun {job_run_data.get('name')} to be in_progress. Current status: {job_run_status}"
114
- )
115
- sleep(1)
105
+ job_run_update_data = job_run_update_result.data
106
+ if job_run_update_data is not None:
107
+ # if the job_run_status is not in "in_progress", short circuit
108
+ job_run_status = job_run_update_data.get(
109
+ "jobRunUpdate", {}
110
+ ).get("status", None)
111
+ if job_run_status == "in_progress":
112
+ logger.info(f"JobRun {job_run_data.get('id')} in progress.")
113
+ break
114
+ if (
115
+ job_run_status == "request_completed"
116
+ or job_run_status == "completed"
117
+ ):
118
+ logger.error(
119
+ f"JobRun {job_run_data.get('name')} is already completed with conclusion {job_run_data.get('jobRun', {}).get('conclusion', 'unknown')}. Exiting."
120
+ )
121
+ break
122
+
116
123
  job_run_result = self.primitive.jobs.get_job_run(id=job_run_id)
117
124
  if job_run_result.data is not None:
118
125
  job_run_data = job_run_result.data.get("jobRun", {})
119
126
  job_run_status = job_run_data.get("status", None)
120
-
121
- try:
122
- runner = Runner(
123
- primitive=self.primitive,
124
- job_run=job_run_data,
125
- )
126
- runner.setup()
127
- except Exception as exception:
128
- logger.exception(
129
- f"Exception while initializing runner: {exception}"
130
- )
131
- self.primitive.jobs.job_run_update(
132
- id=job_run_id,
133
- status="request_completed",
134
- conclusion="failure",
127
+ logger.info(
128
+ f"Waiting for JobRun {job_run_data.get('id')} to be in_progress. Current status: {job_run_status}"
135
129
  )
136
- continue
130
+ sleep(1)
137
131
 
138
- try:
139
- runner.execute_job_run()
140
- except Exception as exception:
141
- logger.exception(f"Exception while executing job: {exception}")
142
- self.primitive.jobs.job_run_update(
143
- id=job_run_id,
144
- status="request_completed",
145
- conclusion="failure",
146
- )
147
- finally:
148
- runner.cleanup()
132
+ # the backend has said it's okay for the agent to run this job
133
+ if job_run_status == "in_progress":
134
+ try:
135
+ runner = Runner(
136
+ primitive=self.primitive,
137
+ job_run=job_run_data,
138
+ )
139
+ runner.setup()
140
+ except Exception as exception:
141
+ logger.exception(
142
+ f"Exception while initializing runner: {exception}"
143
+ )
144
+ self.primitive.jobs.job_run_update(
145
+ id=job_run_id,
146
+ status="request_completed",
147
+ conclusion="failure",
148
+ )
149
+ continue
149
150
 
150
- # NOTE: also run scan here to force upload of artifacts
151
- # This should probably eventually be another daemon?
152
- uploader.scan()
151
+ try:
152
+ runner.execute_job_run()
153
+ except Exception as exception:
154
+ logger.exception(f"Exception while executing job: {exception}")
155
+ self.primitive.jobs.job_run_update(
156
+ id=job_run_id,
157
+ status="request_completed",
158
+ conclusion="failure",
159
+ )
160
+ finally:
161
+ runner.cleanup()
153
162
 
154
- if RUNNING_IN_CONTAINER:
155
- logger.info("Running in container, exiting after job run")
156
- break
163
+ # NOTE: also run scan here to force upload of artifacts
164
+ # This should probably eventually be another daemon?
165
+ uploader.scan()
166
+
167
+ if RUNNING_IN_CONTAINER:
168
+ logger.info("Running in container, exiting after job run")
169
+ break
157
170
 
158
171
  sleep(5)
159
172
  except KeyboardInterrupt:
@@ -46,22 +46,24 @@ class Uploader:
46
46
 
47
47
  for file in files:
48
48
  try:
49
- result = self.primitive.files.upload_file_direct(
49
+ upload_file_result = self.primitive.files.upload_file_direct(
50
50
  path=file,
51
51
  key_prefix=str(PurePath(file).relative_to(cache.parent).parent),
52
52
  )
53
- except Exception as exception:
54
- if "is empty" in str(exception):
55
- logger.warning(f"{file} is empty, skipping upload")
56
- continue
57
53
 
58
- upload_id = result.data["fileUpdate"]["id"]
54
+ if upload_file_result and upload_file_result.data is not None:
55
+ upload_file_data = upload_file_result.data
56
+ upload_id = upload_file_data.get("fileUpdate", {}).get("id")
59
57
 
60
- if upload_id:
61
- file_ids.append(upload_id)
62
- continue
58
+ if upload_id:
59
+ file_ids.append(upload_id)
60
+ continue
63
61
 
64
- logger.error(f"Unable to upload file {file}")
62
+ logger.error(f"Unable to upload file {file}")
63
+ except Exception as exception:
64
+ if "is empty" in str(exception):
65
+ logger.warning(f"{file} is empty, skipping upload")
66
+ continue
65
67
 
66
68
  # Clean up job cache
67
69
  shutil.rmtree(path=cache)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: primitive
3
- Version: 0.2.51
3
+ Version: 0.2.53
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,12 +1,12 @@
1
- primitive/__about__.py,sha256=98Py-XClBciFeBwMwwz2608bBaQxMYKd4HlOLCukdAM,130
1
+ primitive/__about__.py,sha256=lSz0mtiMJzyxukJ01ol9sDoiQlVzFFSwYibTsET0ZRo,130
2
2
  primitive/__init__.py,sha256=bwKdgggKNVssJFVPfKSxqFMz4IxSr54WWbmiZqTMPNI,106
3
3
  primitive/cli.py,sha256=g7EtHI9MATAB0qQu5w-WzbXtxz_8zu8z5E7sETmMkKU,2509
4
4
  primitive/client.py,sha256=RMF46F89oK82gfZH6Bf0WZrhXPUu01pbieSO_Vcuoc4,3624
5
5
  primitive/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- primitive/agent/actions.py,sha256=Ald56Lq8KOtQ0_eFm2TseKkEIa8RP3IClLNVyv9IL4E,7035
6
+ primitive/agent/actions.py,sha256=-vHuwZZv8tWfq5SSljr18tUJz3BbyodrfdXKZvvrWEM,7993
7
7
  primitive/agent/commands.py,sha256=o847pK7v7EWQGG67tky6a33qtwoutX6LZrP2FIS_NOk,388
8
8
  primitive/agent/runner.py,sha256=deMLa4l758k-BeK7Up4LVeD9hXfmAf6o3jJh8OmURys,11315
9
- primitive/agent/uploader.py,sha256=ZzrzsajNBogwEC7mT6Ejy0h2Jd9axMYGzt9pbCvVMlk,3171
9
+ primitive/agent/uploader.py,sha256=DT_Nzt5eOTm_uRcYKm1sjBBaQZzp5iNZ_uN5XktfQ30,3382
10
10
  primitive/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  primitive/auth/actions.py,sha256=9NIEXJ1BNJutJs6AMMSjMN_ziONUAUhY_xHwojYJCLA,942
12
12
  primitive/auth/commands.py,sha256=Krm38ioduDJZw0OIrIcb6eR2X6iECiWX0JPAI-2HNxY,2352
@@ -95,8 +95,8 @@ primitive/utils/printer.py,sha256=f1XUpqi5dkTL3GWvYRUGlSwtj2IxU1q745T4Fxo7Tn4,37
95
95
  primitive/utils/psutil.py,sha256=xa7ef435UL37jyjmUPbEqCO2ayQMpCs0HCrxVEvLcuM,763
96
96
  primitive/utils/shell.py,sha256=Z4zxmOaSyGCrS0D6I436iQci-ewHLt4UxVg1CD9Serc,2171
97
97
  primitive/utils/text.py,sha256=XiESMnlhjQ534xE2hMNf08WehE1SKaYFRNih0MmnK0k,829
98
- primitive-0.2.51.dist-info/METADATA,sha256=PIcqx1gPY31EuSFxHmGQLOxecKUYIGu4KS3l5ieIvno,3513
99
- primitive-0.2.51.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
100
- primitive-0.2.51.dist-info/entry_points.txt,sha256=p1K8DMCWka5FqLlqP1sPek5Uovy9jq8u51gUsP-z334,48
101
- primitive-0.2.51.dist-info/licenses/LICENSE.txt,sha256=B8kmQMJ2sxYygjCLBk770uacaMci4mPSoJJ8WoDBY_c,1098
102
- primitive-0.2.51.dist-info/RECORD,,
98
+ primitive-0.2.53.dist-info/METADATA,sha256=hflPnuPJOARIUnf8e9toXIKDpGzCpwNqbFPt-J7BAAw,3513
99
+ primitive-0.2.53.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
100
+ primitive-0.2.53.dist-info/entry_points.txt,sha256=p1K8DMCWka5FqLlqP1sPek5Uovy9jq8u51gUsP-z334,48
101
+ primitive-0.2.53.dist-info/licenses/LICENSE.txt,sha256=B8kmQMJ2sxYygjCLBk770uacaMci4mPSoJJ8WoDBY_c,1098
102
+ primitive-0.2.53.dist-info/RECORD,,