Files
wehub-resource-sync 97e91a83f3
Ruff / Ruff (push) Has been cancelled
Test / Core Tests (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.10) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.11) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.12) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.13) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.9) (push) Has been cancelled
Test / Full Coverage (Python 3.11) (push) Has been cancelled
Test / Core Provider Tests (OpenAI) (push) Has been cancelled
Test / Core Provider Tests (Anthropic) (push) Has been cancelled
Test / Core Provider Tests (Google) (push) Has been cancelled
Test / Core Provider Tests (Other) (push) Has been cancelled
Test / Anthropic Tests (push) Has been cancelled
Test / Gemini Tests (push) Has been cancelled
Test / Google GenAI Tests (push) Has been cancelled
Test / Vertex AI Tests (push) Has been cancelled
Test / OpenAI Tests (push) Has been cancelled
Test / Writer Tests (push) Has been cancelled
Test / Auto Client Tests (push) Has been cancelled
ty / type-check (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:36:38 +08:00

97 lines
3.5 KiB
Python

# conftest.py
import os
import pytest
import importlib.util
from instructor import Mode, Provider
from instructor.v2.core.registry import mode_registry
# Mapping of providers to their API key environment variables and package names
PROVIDER_API_KEYS = {
Provider.ANTHROPIC: ("ANTHROPIC_API_KEY", "anthropic"),
Provider.GENAI: ("GOOGLE_API_KEY", "google.genai"),
Provider.COHERE: ("COHERE_API_KEY", "cohere"),
Provider.OPENAI: ("OPENAI_API_KEY", "openai"),
Provider.MISTRAL: ("MISTRAL_API_KEY", "mistralai"),
Provider.GROQ: ("GROQ_API_KEY", "groq"),
Provider.XAI: ("XAI_API_KEY", "xai_sdk"),
Provider.FIREWORKS: ("FIREWORKS_API_KEY", "fireworks"),
Provider.CEREBRAS: ("CEREBRAS_API_KEY", "cerebras"),
Provider.WRITER: ("WRITER_API_KEY", "writerai"),
Provider.PERPLEXITY: ("PERPLEXITY_API_KEY", "openai"),
Provider.BEDROCK: ("AWS_ACCESS_KEY_ID", "boto3"),
Provider.VERTEXAI: ("GOOGLE_APPLICATION_CREDENTIALS", "google.cloud.aiplatform"),
}
def pytest_configure(config):
"""Register custom markers."""
config.addinivalue_line(
"markers", "requires_api_key: mark test as requiring provider API key"
)
config.addinivalue_line(
"markers", "provider(provider): specify provider for API key checks"
)
config.addinivalue_line("markers", "asyncio: mark test as requiring pytest-asyncio")
def get_registered_provider_mode_pairs() -> list[tuple[Provider, Mode]]:
"""Return all registered (provider, mode) pairs from the v2 registry."""
pairs = mode_registry.list_modes()
# Return empty list if no modes registered - tests using this should handle empty case
return pairs
@pytest.fixture(autouse=True)
def check_api_key_requirement(request):
"""Skip tests marked with 'requires_api_key' if API key is not set.
Automatically detects the provider from test parameters and checks
for the appropriate API key.
"""
if not request.node.get_closest_marker("requires_api_key"):
return
# Try to get provider from test parameters
provider = None
provider_marker = request.node.get_closest_marker("provider")
if provider_marker and provider_marker.args:
provider = provider_marker.args[0]
if hasattr(request, "param"):
provider = request.param
elif (
hasattr(request.node, "callspec") and "provider" in request.node.callspec.params
):
provider = request.node.callspec.params["provider"]
if provider is None:
# Fallback: check if any provider API key is set
for _prov, (env_var, _pkg) in PROVIDER_API_KEYS.items():
if os.getenv(env_var):
return # At least one API key is set
pytest.skip(
"No provider API key environment variable is set" # ty: ignore[too-many-positional-arguments]
)
return
# Check for specific provider
if provider in PROVIDER_API_KEYS:
env_var, package = PROVIDER_API_KEYS[provider]
if not os.getenv(env_var):
pytest.skip(
f"{env_var} environment variable not set" # ty: ignore[too-many-positional-arguments]
)
if importlib.util.find_spec(package.split(".")[0]) is None:
pytest.skip(
f"{package} package is not installed" # ty: ignore[too-many-positional-arguments]
)
if request.node.get_closest_marker("asyncio"):
if importlib.util.find_spec("pytest_asyncio") is None:
pytest.skip(
"pytest-asyncio is not installed" # ty: ignore[too-many-positional-arguments]
)