From e54a91d456f006d17a6299025ecee755c90806e1 Mon Sep 17 00:00:00 2001 From: tarai Date: Thu, 16 Apr 2026 23:16:41 +0000 Subject: [PATCH] fix: #2 handle missing config file gracefully - load_config() now creates default config when file is missing - Creates config directory automatically if needed - Added test for missing config scenario - All 3 tests pass Fixes #2 --- .gitignore | 3 +++ task.py | 19 +++++++++++++++++-- test_task.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..75c6182 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__/ +*.pyc +.pytest_cache/ diff --git a/task.py b/task.py index 53cc8ed..bfb89f4 100644 --- a/task.py +++ b/task.py @@ -10,10 +10,25 @@ from commands.done import mark_done +DEFAULT_CONFIG = """# Task storage settings +storage: + format: json + max_tasks: 1000 + +# Display settings +display: + color: true + unicode: true +""" + + def load_config(): - """Load configuration from file.""" + """Load configuration from file. Creates default config if missing.""" config_path = Path.home() / ".config" / "task-cli" / "config.yaml" - # NOTE: This will crash if config doesn't exist - known bug for bounty testing + if not config_path.exists(): + config_path.parent.mkdir(parents=True, exist_ok=True) + config_path.write_text(DEFAULT_CONFIG) + print(f"Created default config at {config_path}") with open(config_path) as f: return f.read() diff --git a/test_task.py b/test_task.py index ba98e43..89140a6 100644 --- a/test_task.py +++ b/test_task.py @@ -1,10 +1,13 @@ """Basic tests for task CLI.""" import json +import os +import shutil import pytest from pathlib import Path from commands.add import add_task, validate_description from commands.done import validate_task_id +from task import load_config def test_validate_description(): @@ -28,3 +31,29 @@ def test_validate_task_id(): with pytest.raises(ValueError): validate_task_id(tasks, 99) + + +def test_load_config_missing_creates_default(): + """Test that load_config creates default config when file is missing.""" + config_dir = Path.home() / ".config" / "task-cli" + config_path = config_dir / "config.yaml" + backup = None + + try: + # Back up existing config if present + if config_path.exists(): + backup = config_path.read_text() + config_path.unlink() + + # load_config should create default config, not crash + result = load_config() + assert config_path.exists() + assert "storage:" in result + assert "format: json" in result + assert "display:" in result + finally: + # Restore original config + if backup is not None: + config_path.write_text(backup) + elif config_path.exists(): + config_path.unlink()