diff --git a/src/py/flwr/cli/new/new.py b/src/py/flwr/cli/new/new.py index 8d644391ca5b..468d434acd8e 100644 --- a/src/py/flwr/cli/new/new.py +++ b/src/py/flwr/cli/new/new.py @@ -81,7 +81,13 @@ def new( ] = None, ) -> None: """Create new Flower project.""" - print(f"Creating Flower project {project_name}...") + print( + typer.style( + f"🔨 Creating Flower project {project_name}...", + fg=typer.colors.GREEN, + bold=True, + ) + ) if project_name is None: project_name = prompt_text("Please provide project name") @@ -131,4 +137,18 @@ def new( context=context, ) - print("Project creation successful.") + print( + typer.style( + "🎊 Project creation successful.\n\n" + "Use the following command to run your project:\n", + fg=typer.colors.GREEN, + bold=True, + ) + ) + print( + typer.style( + f" cd {project_name}\n" + " pip install .\n flwr run\n", + fg=typer.colors.BRIGHT_CYAN, + bold=True, + ) + ) diff --git a/src/py/flwr/server/compat/app.py b/src/py/flwr/server/compat/app.py index c13a713b5f2c..ff1d99b5366e 100644 --- a/src/py/flwr/server/compat/app.py +++ b/src/py/flwr/server/compat/app.py @@ -143,11 +143,8 @@ def start_driver( # pylint: disable=too-many-arguments, too-many-locals config=initialized_config, ) + # Terminate the thread f_stop.set() - - # Stop the Driver API server and the thread - del driver - thread.join() event(EventType.START_SERVER_LEAVE) diff --git a/src/py/flwr/server/driver/driver.py b/src/py/flwr/server/driver/driver.py index bcaac1f61b85..0098e0ce97c2 100644 --- a/src/py/flwr/server/driver/driver.py +++ b/src/py/flwr/server/driver/driver.py @@ -247,8 +247,8 @@ def send_and_receive( time.sleep(3) return ret - def __del__(self) -> None: - """Disconnect GrpcDriver if connected.""" + def close(self) -> None: + """Disconnect from the SuperLink if connected.""" # Check if GrpcDriver is initialized if self.grpc_driver is None: return diff --git a/src/py/flwr/server/driver/driver_test.py b/src/py/flwr/server/driver/driver_test.py index 2bf253222f94..5136f4f90210 100644 --- a/src/py/flwr/server/driver/driver_test.py +++ b/src/py/flwr/server/driver/driver_test.py @@ -205,8 +205,7 @@ def test_del_with_initialized_driver(self) -> None: self.driver._get_grpc_driver_and_run_id() # Execute - # pylint: disable-next=unnecessary-dunder-call - self.driver.__del__() + self.driver.close() # Assert self.mock_grpc_driver.disconnect.assert_called_once() @@ -214,8 +213,7 @@ def test_del_with_initialized_driver(self) -> None: def test_del_with_uninitialized_driver(self) -> None: """Test cleanup behavior when Driver is not initialized.""" # Execute - # pylint: disable-next=unnecessary-dunder-call - self.driver.__del__() + self.driver.close() # Assert self.mock_grpc_driver.disconnect.assert_not_called() diff --git a/src/py/flwr/server/run_serverapp.py b/src/py/flwr/server/run_serverapp.py index 5b00d356886a..2f0f1185847e 100644 --- a/src/py/flwr/server/run_serverapp.py +++ b/src/py/flwr/server/run_serverapp.py @@ -138,7 +138,7 @@ def run_server_app() -> None: run(driver=driver, server_app_dir=server_app_dir, server_app_attr=server_app_attr) # Clean up - driver.__del__() # pylint: disable=unnecessary-dunder-call + driver.close() event(EventType.RUN_SERVER_APP_LEAVE) diff --git a/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py b/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py index 5fe815180823..c99a7854d53a 100644 --- a/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +++ b/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py @@ -47,7 +47,7 @@ def create_node( def delete_node(request: DeleteNodeRequest, state: State) -> DeleteNodeResponse: """.""" # Validate node_id - if request.node.anonymous or request.node.node_id <= 0: + if request.node.anonymous or request.node.node_id == 0: return DeleteNodeResponse() # Update state diff --git a/src/py/flwr/server/workflow/default_workflows.py b/src/py/flwr/server/workflow/default_workflows.py index a5c726b0b191..876ae56dcadc 100644 --- a/src/py/flwr/server/workflow/default_workflows.py +++ b/src/py/flwr/server/workflow/default_workflows.py @@ -98,7 +98,6 @@ def __call__(self, driver: Driver, context: Context) -> None: # Terminate the thread f_stop.set() - del driver thread.join() diff --git a/src/py/flwr/simulation/run_simulation.py b/src/py/flwr/simulation/run_simulation.py index 31884f2edc68..56fce363726a 100644 --- a/src/py/flwr/simulation/run_simulation.py +++ b/src/py/flwr/simulation/run_simulation.py @@ -240,7 +240,7 @@ def _main_loop( finally: # Stop Driver driver_server.stop(grace=0) - del driver + driver.close() # Trigger stop event f_stop.set()