import json
import logging
from typing import Dict, List, Optional
from dataclasses import dataclass
from enum import Enum
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class TaskStatus(Enum):
PENDING = "pending"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
CANCELLED = "cancelled"
@dataclass
class Task:
id: int
title: str
description: str
status: TaskStatus
priority: int = 1
class TaskManager:
def __init__(self):
self.tasks: Dict[int, Task] = {}
self.next_id = 1
def create_task(self, title: str, description: str, priority: int = 1) -> Task:
task = Task(
id=self.next_id,
title=title,
description=description,
status=TaskStatus.PENDING,
priority=priority
)
self.tasks[self.next_id] = task
self.next_id += 1
logger.info(f"Created task: {task.title}")
return task
def update_task_status(self, task_id: int, status: TaskStatus) -> bool:
if task_id in self.tasks:
self.tasks[task_id].status = status
logger.info(f"Updated task {task_id} status to {status.value}")
return True
return False
def get_task(self, task_id: int) -> Optional[Task]:
return self.tasks.get(task_id)
def list_tasks(self, status: Optional[TaskStatus] = None) -> List[Task]:
if status:
return [task for task in self.tasks.values() if task.status == status]
return list(self.tasks.values())
def delete_task(self, task_id: int) -> bool:
if task_id in self.tasks:
del self.tasks[task_id]
logger.info(f"Deleted task {task_id}")
return True
return False
def export_tasks(self, filename: str) -> None:
tasks_data = []
for task in self.tasks.values():
tasks_data.append({
'id': task.id,
'title': task.title,
'description': task.description,
'status': task.status.value,
'priority': task.priority
})
with open(filename, 'w') as f:
json.dump(tasks_data, f, indent=2)
logger.info(f"Exported {len(tasks_data)} tasks to {filename}")
def main():
manager = TaskManager()
task1 = manager.create_task("Learn Rust", "Study Rust programming language", 3)
task2 = manager.create_task("Write tests", "Add unit tests to the project", 2)
task3 = manager.create_task("Code review", "Review pull requests", 1)
manager.update_task_status(task1.id, TaskStatus.IN_PROGRESS)
manager.update_task_status(task2.id, TaskStatus.COMPLETED)
print("All tasks:")
for task in manager.list_tasks():
print(f" {task.id}: {task.title} - {task.status.value}")
manager.export_tasks("tasks.json")
if __name__ == "__main__":
main()