- Added `enable_prompt_history` & `prompt_history_base_dir` to Falyx, using FileHistory to persist inputs to `~/.{program}_history`
- Added `multiline` option to UserInputAction and passed through to PromptSession
- Updated examples (`argument_examples.py`, `confirm_example.py`) to enable prompt history and add TLDR examples
- Improved CLI usage tips for clarity (`[COMMAND]` instead of `[KEY]`)
- Added `test_action_types.py` and expanded `test_main.py` for init and parser coverage
- Bumped version to 0.1.76
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import shutil
 | |
| import sys
 | |
| import tempfile
 | |
| from argparse import ArgumentParser, Namespace, _SubParsersAction
 | |
| from pathlib import Path
 | |
| 
 | |
| import pytest
 | |
| 
 | |
| from falyx.__main__ import (
 | |
|     bootstrap,
 | |
|     find_falyx_config,
 | |
|     get_parsers,
 | |
|     init_callback,
 | |
|     init_config,
 | |
|     main,
 | |
| )
 | |
| from falyx.parser import CommandArgumentParser
 | |
| 
 | |
| 
 | |
| @pytest.fixture(autouse=True)
 | |
| def fake_home(monkeypatch):
 | |
|     """Redirect Path.home() to a temporary directory for all tests."""
 | |
|     temp_home = Path(tempfile.mkdtemp())
 | |
|     monkeypatch.setattr(Path, "home", lambda: temp_home)
 | |
|     yield temp_home
 | |
|     shutil.rmtree(temp_home, ignore_errors=True)
 | |
| 
 | |
| 
 | |
| @pytest.fixture(autouse=True)
 | |
| def setup_teardown():
 | |
|     """Fixture to set up and tear down the environment for each test."""
 | |
|     cwd = Path.cwd()
 | |
|     yield
 | |
|     for file in cwd.glob("falyx.yaml"):
 | |
|         file.unlink(missing_ok=True)
 | |
|     for file in cwd.glob("falyx.toml"):
 | |
|         file.unlink(missing_ok=True)
 | |
| 
 | |
| 
 | |
| def test_find_falyx_config():
 | |
|     """Test if the falyx config file is found correctly."""
 | |
| 
 | |
|     config_file = Path("falyx.yaml").resolve()
 | |
|     config_file.touch()
 | |
|     config_path = find_falyx_config()
 | |
|     assert config_path == config_file
 | |
|     config_file.unlink()
 | |
| 
 | |
| 
 | |
| def test_bootstrap():
 | |
|     """Test if the bootstrap function works correctly."""
 | |
|     config_file = Path("falyx.yaml").resolve()
 | |
|     config_file.touch()
 | |
|     sys_path_before = list(sys.path)
 | |
|     bootstrap_path = bootstrap()
 | |
|     assert bootstrap_path == config_file
 | |
|     assert str(config_file.parent) in sys.path
 | |
|     config_file.unlink()
 | |
|     sys.path = sys_path_before
 | |
| 
 | |
| 
 | |
| def test_bootstrap_no_config():
 | |
|     """Test if the bootstrap function works correctly when no config file is found."""
 | |
|     sys_path_before = list(sys.path)
 | |
|     bootstrap_path = bootstrap()
 | |
|     assert bootstrap_path is None
 | |
|     assert sys.path == sys_path_before
 | |
|     # assert str(Path.cwd()) not in sys.path
 | |
| 
 | |
| 
 | |
| def test_bootstrap_with_global_config():
 | |
|     """Test if the bootstrap function works correctly when a global config file is found."""
 | |
|     config_file = Path.home() / ".config" / "falyx" / "falyx.yaml"
 | |
|     config_file.parent.mkdir(parents=True, exist_ok=True)
 | |
|     config_file.touch()
 | |
|     sys_path_before = list(sys.path)
 | |
|     bootstrap_path = bootstrap()
 | |
|     assert bootstrap_path == config_file
 | |
|     assert str(config_file.parent) in sys.path
 | |
|     config_file.unlink()
 | |
|     sys.path = sys_path_before
 | |
| 
 | |
| 
 | |
| @pytest.mark.asyncio
 | |
| async def test_init_config():
 | |
|     """Test if the init_config function adds the correct argument."""
 | |
|     parser = CommandArgumentParser()
 | |
|     init_config(parser)
 | |
|     args = await parser.parse_args(["test_project"])
 | |
|     assert args["name"] == "test_project"
 | |
| 
 | |
|     # Test with default value
 | |
|     args = await parser.parse_args([])
 | |
|     assert args["name"] == "."
 | |
| 
 | |
| 
 | |
| def test_init_callback(tmp_path):
 | |
|     """Test if the init_callback function works correctly."""
 | |
|     # Test project initialization
 | |
|     args = Namespace(command="init", name=str(tmp_path))
 | |
|     init_callback(args)
 | |
|     assert (tmp_path / "falyx.yaml").exists()
 | |
| 
 | |
| 
 | |
| def test_init_global_callback():
 | |
|     # Test global initialization
 | |
|     args = Namespace(command="init_global")
 | |
|     init_callback(args)
 | |
|     assert (Path.home() / ".config" / "falyx" / "tasks.py").exists()
 | |
|     assert (Path.home() / ".config" / "falyx" / "falyx.yaml").exists()
 | |
| 
 | |
| 
 | |
| def test_get_parsers():
 | |
|     """Test if the get_parsers function returns the correct parsers."""
 | |
|     root_parser, subparsers = get_parsers()
 | |
|     assert isinstance(root_parser, ArgumentParser)
 | |
|     assert isinstance(subparsers, _SubParsersAction)
 | |
| 
 | |
|     # Check if the 'init' command is available
 | |
|     init_parser = subparsers.choices.get("init")
 | |
|     assert init_parser is not None
 | |
|     assert "name" == init_parser._get_positional_actions()[0].dest
 | |
| 
 | |
| 
 | |
| def test_main():
 | |
|     """Test if the main function runs with the correct arguments."""
 | |
| 
 | |
|     sys.argv = ["falyx", "run", "?"]
 | |
| 
 | |
|     with pytest.raises(SystemExit) as exc_info:
 | |
|         main()
 | |
|     assert exc_info.value.code == 0
 |