diff --git a/tests/e2e/test_client_e2e.py b/tests/e2e/test_client_e2e.py index a46acfe5..08ea35ea 100644 --- a/tests/e2e/test_client_e2e.py +++ b/tests/e2e/test_client_e2e.py @@ -36,13 +36,15 @@ def test_queue_node(self, e2e_client: Client): Args: e2e_client: A Client instance. """ - node_name = "Add" + node_name = "Add" # TODO CHANGE TO ID inputs = { "lhs": 1, "rhs": 2, } # Inputs are left hand side and right hand side of equation - job_id = e2e_client.queue_node(node=node_name, inputs=inputs) + job_id = e2e_client.queue_node( + node=node_name, inputs=inputs + ) # TODO CHANGE TO ID # Add the job_id as an attribute of the test class so that it can be used in other tests TestClientMethods.job_id = job_id diff --git a/tests/unit/api_providers/test_workflows_provider.py b/tests/unit/api_providers/test_workflows_provider.py index 7018f532..28f8654a 100644 --- a/tests/unit/api_providers/test_workflows_provider.py +++ b/tests/unit/api_providers/test_workflows_provider.py @@ -52,7 +52,7 @@ def mock_workflow_dict() -> dict[str, Any]: @pytest.fixture def mock_executable_dict(mock_workflow_dict: dict[str, Any]) -> dict[str, Any]: """Executable workflow test data.""" - return {"node_id": "Workflow", "inputs": mock_workflow_dict} + return {"node_id": "Workflow", "inputs": mock_workflow_dict} # TODO CHANGE TO ID @pytest.fixture @@ -73,7 +73,7 @@ def mock_executable_workflow( ): """Create mock executable workflow object.""" executable = Mock(spec=WorkflowExecutable) - executable.node_id = "Workflow" + executable.node_id = "Workflow" # TODO CHANGE TO ID executable.inputs = { "graph": mock_workflow.graph, "inputs": mock_workflow.inputs, @@ -487,7 +487,10 @@ def test_read_version_success( ): """Test reading workflow versions (latest and specific).""" mock_response = Mock() - mock_response.workflow = {"node_id": "Workflow", "inputs": mock_workflow_dict} + mock_response.workflow = { + "node_id": "Workflow", + "inputs": mock_workflow_dict, + } # TODO CHANGE TO ID api_method = getattr(mock_workflows_client, expected_api_method) api_method.return_value = mock_response @@ -495,7 +498,7 @@ def test_read_version_success( result = version_manager.read_version("project-123", "workflow-123", version_id) assert isinstance(result, WorkflowExecutable) - assert result.node_id == "Workflow" + assert result.node_id == "Workflow" # TODO CHANGE TO ID assert result.inputs == mock_workflow_dict api_method.assert_called_once_with(*expected_api_args) diff --git a/tests/unit/nodes/test_base.py b/tests/unit/nodes/test_base.py index 5f13b736..df1e3dfb 100644 --- a/tests/unit/nodes/test_base.py +++ b/tests/unit/nodes/test_base.py @@ -1,8 +1,8 @@ import pytest +from typeguard import TypeCheckError from uncertainty_engine_types import Handle from uncertainty_engine.nodes.base import Node -from typeguard import TypeCheckError def test_node(): @@ -10,7 +10,7 @@ def test_node(): Verify result for arbitrary test node. """ node = Node("test_node", a=1, b=2) - assert node.node_name == "test_node" + assert node.node_name == "test_node" # TODO CHANGE TO ID assert node.a == 1 assert node.b == 2 assert node.label is None @@ -22,11 +22,11 @@ def test_node_no_inputs(): Verify result for test node with no inputs. """ node = Node("test_node") - assert node.node_name == "test_node" + assert node.node_name == "test_node" # TODO CHANGE TO ID assert node() == ("test_node", {}) -def test_node_name_type(): +def test_node_name_type(): # TODO CHANGE TO ID """ Verify error is raised if node name is not a string. """ diff --git a/uncertainty_engine/api_providers/models.py b/uncertainty_engine/api_providers/models.py index 0dd6ee72..6381feb2 100644 --- a/uncertainty_engine/api_providers/models.py +++ b/uncertainty_engine/api_providers/models.py @@ -4,7 +4,7 @@ class WorkflowExecutable(BaseModel): - node_id: Literal["Workflow"] + node_id: Literal["Workflow"] # TODO CHANGE TO ID inputs: dict[str, Any] diff --git a/uncertainty_engine/api_providers/workflows_provider.py b/uncertainty_engine/api_providers/workflows_provider.py index 4114957e..0740a03c 100644 --- a/uncertainty_engine/api_providers/workflows_provider.py +++ b/uncertainty_engine/api_providers/workflows_provider.py @@ -235,7 +235,7 @@ def save( executable_workflow = ( WorkflowExecutable( # Workflow must be wrapped by this to be executable - node_id="Workflow", + node_id="Workflow", # TODO CHANGE TO ID inputs={ "external_input_id": workflow.external_input_id, "graph": workflow.graph, diff --git a/uncertainty_engine/client.py b/uncertainty_engine/client.py index 545b5cdd..9429fc15 100644 --- a/uncertainty_engine/client.py +++ b/uncertainty_engine/client.py @@ -30,7 +30,7 @@ class Job(BaseModel): Represents a job in the Uncertainty Engine. """ - node_id: str + node_id: str # TODO CHANGE TO ID job_id: str @@ -178,7 +178,7 @@ def list_nodes(self, category: Optional[str] = None) -> list: return node_list - def get_node_info(self, node: str) -> NodeInfo: + def get_node_info(self, node: str) -> NodeInfo: # TODO CHANGE TO ID """ Get information about a specific node. @@ -189,12 +189,12 @@ def get_node_info(self, node: str) -> NodeInfo: Information about the node as a NodeInfo object. """ - node_info = self.core_api.get(f"/nodes/{node}") + node_info = self.core_api.get(f"/nodes/{node}") # TODO CHANGE TO ID return NodeInfo(**node_info) def queue_node( self, - node: Union[str, Node], + node: Union[str, Node], # TODO CHANGE TO ID inputs: Optional[dict[str, Any]] = None, input: Optional[dict[str, Any]] = None, ) -> Job: @@ -202,7 +202,7 @@ def queue_node( Queue a node for execution. Args: - node: The name of the node to execute or the node object itself. + node: The name of the node to execute or the node object itself. # TODO CHANGE TO ID inputs: The input data for the node. If the node is defined by its name, this is required. Defaults to ``None``. input: **DEPRECATED** The input data for the node. Use `inputs` instead. @@ -214,9 +214,9 @@ def queue_node( # TODO: Remove once `input` is removed and make `inputs` required final_inputs = handle_input_deprecation(input, inputs) - if isinstance(node, Node): - node, final_inputs = node() - elif isinstance(node, str) and final_inputs is None: + if isinstance(node, Node): # TODO CHANGE TO ID + node, final_inputs = node() # TODO CHANGE TO ID + elif isinstance(node, str) and final_inputs is None: # TODO CHANGE TO ID raise ValueError( "Input data/parameters are required when specifying a node by name." ) @@ -224,16 +224,16 @@ def queue_node( job_id = self.core_api.post( "/nodes/queue", { - "node_id": node, + "node_id": node, # TODO CHANGE TO ID "inputs": final_inputs, }, ) - return Job(node_id=node, job_id=job_id) + return Job(node_id=node, job_id=job_id) # TODO CHANGE TO ID def run_node( self, - node: Union[str, Node], + node: Union[str, Node], # TODO CHANGE TO ID inputs: Optional[dict[str, Any]] = None, input: Optional[dict[str, Any]] = None, ) -> JobInfo: @@ -241,7 +241,7 @@ def run_node( Run a node synchronously. Args: - node: The name of the node to execute or the node object itself. + node: The name of the node to execute or the node object itself. # TODO CHANGE TO ID inputs: The input data for the node. If the node is defined by its name, this is required. Defaults to ``None``. input: **DEPRECATED** The input data for the node. Use `inputs` instead. @@ -273,7 +273,9 @@ def job_status(self, job: Job) -> JobInfo: outputs={'ans': 3.0} ) """ - response_data = self.core_api.get(f"/nodes/status/{job.node_id}/{job.job_id}") + response_data = self.core_api.get( + f"/nodes/status/{job.node_id}/{job.job_id}" + ) # TODO CHANGE TO ID return JobInfo(**response_data) def view_tokens(self) -> int: diff --git a/uncertainty_engine/graph.py b/uncertainty_engine/graph.py index 761dda2e..ea6c6f58 100644 --- a/uncertainty_engine/graph.py +++ b/uncertainty_engine/graph.py @@ -51,12 +51,12 @@ def add_node( node_input_dict = dict() for ki, vi in node.__dict__.items(): - if ki not in ["node_name", "label"]: + if ki not in ["node_name", "label"]: # TODO CHANGE TO ID if isinstance(vi, Handle): node_input_dict[ki] = vi.model_dump() else: node_input_dict[ki] = { - "node_name": self.external_input_id, + "node_name": self.external_input_id, # TODO CHANGE TO ID "node_handle": f"{label}_{ki}", } self.external_input[f"{label}_{ki}"] = vi @@ -71,7 +71,10 @@ def add_node( if ki not in ["self", "label"] } - self.nodes["nodes"][label] = {"type": node.node_name, "inputs": node_input_dict} + self.nodes["nodes"][label] = { + "type": node.node_name, + "inputs": node_input_dict, + } # TODO CHANGE TO ID def add_nodes_from(self, nodes: list[Node]) -> None: """ @@ -96,7 +99,7 @@ def add_edge( target_key: The input key of the target node. """ self.nodes["nodes"][target]["inputs"][target_key] = { - "node_name": source, + "node_name": source, # TODO CHANGE TO ID "node_handle": source_key, } diff --git a/uncertainty_engine/nodes/base.py b/uncertainty_engine/nodes/base.py index e74bb439..376bcf8e 100644 --- a/uncertainty_engine/nodes/base.py +++ b/uncertainty_engine/nodes/base.py @@ -10,13 +10,13 @@ class Node: A generic representation of a node in the Uncertainty Engine. Args: - node_name: The name of the node. + node_name: The name of the node. # TODO CHANGE TO ID label: A human-readable label for the node. Defaults to None. **kwargs: Arbitrary keyword arguments representing the input parameters of the node. Example: >>> add_node = Node( - ... node_name="Add", + ... node_name="Add", # TODO CHANGE TO ID ... lhs=1, ... rhs=2, ... ) @@ -24,8 +24,10 @@ class Node: ('Add', {'lhs': 1, 'rhs': 2}) """ - def __init__(self, node_name: str, label: Optional[str] = None, **kwargs): - self.node_name = node_name + def __init__( + self, node_name: str, label: Optional[str] = None, **kwargs + ): # TODO CHANGE TO ID + self.node_name = node_name # TODO CHANGE TO ID self.label = label for key, value in kwargs.items(): setattr(self, key, value) @@ -41,9 +43,9 @@ def __call__(self) -> tuple[str, dict]: input = { key: getattr(self, key) for key in self.__dict__ - if key not in ["node_name", "label"] + if key not in ["node_name", "label"] # TODO CHANGE TO ID } - return self.node_name, input + return self.node_name, input # TODO CHANGE TO ID def make_handle(self, output_name: str) -> Handle: """ diff --git a/uncertainty_engine/nodes/basic.py b/uncertainty_engine/nodes/basic.py index 5fc1c545..0988f05f 100644 --- a/uncertainty_engine/nodes/basic.py +++ b/uncertainty_engine/nodes/basic.py @@ -26,7 +26,7 @@ def __init__( label: Optional[str] = None, ): super().__init__( - node_name=self.node_name, + node_name=self.node_name, # TODO CHANGE TO ID label=label, lhs=lhs, rhs=rhs, diff --git a/uncertainty_engine/nodes/sensor_designer.py b/uncertainty_engine/nodes/sensor_designer.py index c71ced51..33af4832 100644 --- a/uncertainty_engine/nodes/sensor_designer.py +++ b/uncertainty_engine/nodes/sensor_designer.py @@ -21,7 +21,7 @@ class BuildSensorDesigner(Node): sigma: The uncertainty of the sensor data. If a float, the same uncertainty is applied to all sensors. """ - node_name: str = "BuildSensorDesigner" + node_name: str = "BuildSensorDesigner" # TODO CHANGE TO ID def __init__( self, @@ -50,7 +50,7 @@ def __init__( quantities_of_interest_data_processed = None super().__init__( - node_name=self.node_name, + node_name=self.node_name, # TODO CHANGE TO ID label=label, sensor_data=sensor_data_processed, quantities_of_interest_data=quantities_of_interest_data_processed, @@ -87,7 +87,7 @@ def __init__( ).model_dump() super().__init__( - node_name=self.node_name, + node_name=self.node_name, # TODO CHANGE TO ID label=label, sensor_designer=sensor_designer_processed, num_sensors=num_sensors, @@ -105,7 +105,7 @@ class ScoreSensorDesign(Node): design: A list of sensors that make up the design. """ - node_name: str = "ScoreSensorDesign" + node_name: str = "ScoreSensorDesign" # TODO CHANGE TO ID def __init__( self, @@ -122,7 +122,7 @@ def __init__( ).model_dump() super().__init__( - node_name=self.node_name, + node_name=self.node_name, # TODO CHANGE TO ID label=label, sensor_designer=sensor_designer_processed, design=design, diff --git a/uncertainty_engine/nodes/workflow.py b/uncertainty_engine/nodes/workflow.py index a131bc06..aae74936 100644 --- a/uncertainty_engine/nodes/workflow.py +++ b/uncertainty_engine/nodes/workflow.py @@ -28,14 +28,14 @@ class Workflow(Node): ... graph=graph.nodes, ... inputs=graph.external_input, ... requested_output={ - ... "Result": {"node_name": "Download", "node_handle": "file"} + ... "Result": {"node_name": "Download", "node_handle": "file"} # TODO CHANGE TO ID ... } ... ) >>> client.queue_node(workflow) "" """ - node_name: str = "Workflow" + node_name: str = "Workflow" # TODO CHANGE TO ID def __init__( self, @@ -58,7 +58,7 @@ def __init__( self.inputs = final_inputs super().__init__( - node_name=self.node_name, + node_name=self.node_name, # TODO CHANGE TO ID external_input_id=external_input_id, graph=graph, inputs=final_inputs,