From f0fb349ddfa459ff35116daf2e56f779d67eb93b Mon Sep 17 00:00:00 2001 From: Vidit Ostwal <110953813+Vidit-Ostwal@users.noreply.github.com> Date: Tue, 14 Oct 2025 22:22:39 +0530 Subject: [PATCH] Fixing copy and adding NOT_SPECIFIED check in task.py (#3690) * Fixing copy and adding NOT_SPECIFIED check: * Fixed mypy issues * Added test Cases * added linting checks * Removed the docs bot folder * Fixed ruff checks * Remove secret_folder from tracking --------- Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> --- src/crewai/task.py | 8 +++++--- tests/test_task.py | 47 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/crewai/task.py b/src/crewai/task.py index ebf284317..5fa9149f9 100644 --- a/src/crewai/task.py +++ b/src/crewai/task.py @@ -7,7 +7,7 @@ import uuid import warnings from collections.abc import Callable from concurrent.futures import Future -from copy import copy +from copy import copy as shallow_copy from hashlib import md5 from pathlib import Path from typing import ( @@ -672,7 +672,9 @@ Follow these guidelines: copied_data = {k: v for k, v in copied_data.items() if v is not None} cloned_context = ( - [task_mapping[context_task.key] for context_task in self.context] + self.context + if self.context is NOT_SPECIFIED + else [task_mapping[context_task.key] for context_task in self.context] if isinstance(self.context, list) else None ) @@ -681,7 +683,7 @@ Follow these guidelines: return next((agent for agent in agents if agent.role == role), None) cloned_agent = get_agent_by_role(self.agent.role) if self.agent else None - cloned_tools = copy(self.tools) if self.tools else [] + cloned_tools = shallow_copy(self.tools) if self.tools else [] return self.__class__( **copied_data, diff --git a/tests/test_task.py b/tests/test_task.py index 0e304df54..169088c83 100644 --- a/tests/test_task.py +++ b/tests/test_task.py @@ -1218,7 +1218,7 @@ def test_create_directory_false(): assert not resolved_dir.exists() with pytest.raises( - RuntimeError, match="Directory .* does not exist and create_directory is False" + RuntimeError, match=r"Directory .* does not exist and create_directory is False" ): task._save_file("test content") @@ -1635,3 +1635,48 @@ def test_task_interpolation_with_hyphens(): assert "say hello world" in task.prompt() assert result.raw == "Hello, World!" + + +def test_task_copy_with_none_context(): + original_task = Task( + description="Test task", + expected_output="Test output", + context=None + ) + + new_task = original_task.copy(agents=[], task_mapping={}) + assert original_task.context is None + assert new_task.context is None + + +def test_task_copy_with_not_specified_context(): + from crewai.utilities.constants import NOT_SPECIFIED + original_task = Task( + description="Test task", + expected_output="Test output", + ) + + new_task = original_task.copy(agents=[], task_mapping={}) + assert original_task.context is NOT_SPECIFIED + assert new_task.context is NOT_SPECIFIED + + +def test_task_copy_with_list_context(): + """Test that copying a task with list context works correctly.""" + task1 = Task( + description="Task 1", + expected_output="Output 1" + ) + task2 = Task( + description="Task 2", + expected_output="Output 2", + context=[task1] + ) + + task_mapping = {task1.key: task1} + + copied_task2 = task2.copy(agents=[], task_mapping=task_mapping) + + assert isinstance(copied_task2.context, list) + assert len(copied_task2.context) == 1 + assert copied_task2.context[0] is task1