Source code for matrice.action

import sys
from datetime import datetime, timedelta


[docs] class Action: """ Represents an action within the system. This class provides an interface to interact with a specific action identified by its `action_id`. It retrieves the action's details such as type, project, user, status, creation time, and associated service from the API. Attributes ---------- action_id : str The unique identifier for this action. action_type : str The type of action (retrieved from the API response). project_id : str The unique ID of the project associated with this action. user_id : str The unique ID of the user who triggered the action. step_code : str A code representing the current step of the action process. status : str The current status of the action (e.g., "pending", "completed"). created_at : str The timestamp when the action was initiated. service_name : str The name of the service handling this action. Methods ------- __init__(session, action_id) Initializes the Action object and fetches the action details from the API. refresh() Refreshes the action instance, updating its details by calling the API again. Examples -------- >>> session = RPCSession() # Assuming `RPCSession` is an existing session class >>> action = Action(session, "action_id_1234") >>> print(action.action_type) # Output the type of action """
[docs] def __init__(self, session, action_id): """ Initializes the Action object and fetches the action details from the API. Parameters ---------- session : RPCSession An active session object that is used to make API calls. action_id : str The unique identifier for the action whose details need to be fetched. Notes ----- This constructor calls the `get_action_details` function to retrieve the action details, which are then set as attributes of the Action object. If an error occurs while fetching the action details, an error message will be printed. """ ##TODO: Add compute cost as well refresh time self.action_id = action_id self.session = session data, error = get_action_details(session, action_id) if error is not None: print(f"An error occured while fetching action details: \n {error}") else: self.action_type = data["action"] self.project_id = data["_idProject"] self.user_id = data["_idUser"] self.step_code = data["stepCode"] self.status = data["status"] self.created_at = data["createdAt"] self.service_name = data["serviceName"] self.action_details = data["actionDetails"] self.job_params = data.get("jobParams", {})
[docs] def refresh(self): """ Refresh the instance by reinstantiating it with the previous values. """ # Check if two minutes have passed since the last refresh if datetime.now() - self.last_refresh_time < timedelta(minutes=2): raise Exception("Refresh can only be called after two minutes since the last refresh.") # Capture the current state state = self.__dict__.copy() init_params = { 'session': self.session, 'action_id': self.action_id } # Reinitialize the instance self.__init__(**init_params) # Update the last refresh time self.last_refresh_time = datetime.now()
[docs] def get_action_details(session, action_id): """ Fetches action details from the API. Parameters ---------- session : RPCSession An active session object used to perform API requests. action_id : str The unique identifier of the action whose details are being fetched. Returns ------- tuple A tuple containing two elements: - A dictionary with the action details if the request is successful. - An error message (str) if the request fails, otherwise `None`. Raises ------ ConnectionError Raised when there's a failure in communication with the API. Examples -------- >>> session = RPCSession() >>> data, error = get_action_details(session, "action_id_1234") >>> if error is None: >>> pprint(data) >>> else: >>> print(f"Error: {error}") """ path = f"/v1/project/action/{action_id}/details" resp = session.rpc.get(path=path) if resp.get("success"): return resp.get("data"), None else: return resp.get("data"), resp.get("message")