diff --git a/providers/openrouter_registry.py b/providers/openrouter_registry.py index 97b8f60..0ee7f39 100644 --- a/providers/openrouter_registry.py +++ b/providers/openrouter_registry.py @@ -37,9 +37,23 @@ class OpenRouterModelRegistry: # Environment variable path self.config_path = Path(env_path) else: - # Default to conf/custom_models.json - use relative path from this file - # This works in development environment - self.config_path = Path(__file__).parent.parent / "conf" / "custom_models.json" + # Try multiple potential locations for the config file + potential_paths = [ + Path(__file__).parent.parent / "conf" / "custom_models.json", # Development + Path("conf/custom_models.json"), # uvx working directory + Path.cwd() / "conf" / "custom_models.json", # Current working directory + ] + + # Find first existing path + self.config_path = None + for path in potential_paths: + if path.exists(): + self.config_path = path + break + + # If none found, default to the first one for error reporting + if self.config_path is None: + self.config_path = potential_paths[0] # Load configuration self.reload() diff --git a/requirements.txt b/requirements.txt index a021f7a..6e2b713 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ google-genai>=1.19.0 openai>=1.55.2 # Minimum version for httpx 0.28.0 compatibility pydantic>=2.0.0 python-dotenv>=1.0.0 +importlib-resources>=5.0.0; python_version<"3.9" # Development dependencies (install with pip install -r requirements-dev.txt) # pytest>=7.4.0 diff --git a/tests/test_uvx_resource_packaging.py b/tests/test_uvx_resource_packaging.py new file mode 100644 index 0000000..6ce6479 --- /dev/null +++ b/tests/test_uvx_resource_packaging.py @@ -0,0 +1,68 @@ +"""Tests for uvx path resolution functionality.""" + +from pathlib import Path +from unittest.mock import patch + +from providers.openrouter_registry import OpenRouterModelRegistry + + +class TestUvxPathResolution: + """Test uvx path resolution for OpenRouter model registry.""" + + def test_normal_operation(self): + """Test that normal operation works in development environment.""" + registry = OpenRouterModelRegistry() + assert len(registry.list_models()) > 0 + assert len(registry.list_aliases()) > 0 + + def test_config_path_resolution(self): + """Test that the config path resolution finds the config file in multiple locations.""" + # Check that the config file exists in the development location + config_file = Path(__file__).parent.parent / "conf" / "custom_models.json" + assert config_file.exists(), "Config file should exist in conf/custom_models.json" + + # Test that a registry can find and use the config + registry = OpenRouterModelRegistry() + assert registry.config_path.exists(), "Registry should find existing config path" + assert len(registry.list_models()) > 0, "Registry should load models from config" + + def test_explicit_config_path_override(self): + """Test that explicit config path works correctly.""" + config_path = Path(__file__).parent.parent / "conf" / "custom_models.json" + + registry = OpenRouterModelRegistry(config_path=str(config_path)) + + # Should use the provided file path + assert registry.config_path == config_path + assert len(registry.list_models()) > 0 + + def test_environment_variable_override(self): + """Test that CUSTOM_MODELS_CONFIG_PATH environment variable works.""" + config_path = Path(__file__).parent.parent / "conf" / "custom_models.json" + + with patch.dict("os.environ", {"CUSTOM_MODELS_CONFIG_PATH": str(config_path)}): + registry = OpenRouterModelRegistry() + + # Should use environment path + assert registry.config_path == config_path + assert len(registry.list_models()) > 0 + + def test_multiple_path_fallback(self): + """Test that multiple path resolution works for different deployment scenarios.""" + registry = OpenRouterModelRegistry() + + # In development, should find the config + assert registry.config_path is not None + assert isinstance(registry.config_path, Path) + + # Should load models successfully + assert len(registry.list_models()) > 0 + + def test_missing_config_handling(self): + """Test behavior when config file is missing.""" + # Use a non-existent path + registry = OpenRouterModelRegistry(config_path="/nonexistent/path/config.json") + + # Should gracefully handle missing config + assert len(registry.list_models()) == 0 + assert len(registry.list_aliases()) == 0