[build-system] requires = ["setuptools>=45", "wheel"] build-backend = "setuptools.build_meta" [project] name = "openenv-core" version = "0.2.2.dev0" description = "A unified framework for reinforcement learning environments" readme = "README.md" requires-python = ">=3.10" dependencies = [ # Core shared dependencies - minimal set required for all environments # Heavy dependencies (torch, numpy, smolagents, etc.) should be in # individual environment pyproject.toml files "fastapi>=0.104.0", "pydantic>=2.0.0", "uvicorn>=0.24.0", "requests>=2.25.0", # CLI dependencies "typer>=0.9.0", "rich>=13.0.0", "pyyaml>=6.0", "huggingface_hub>=0.20.0", "openai>=2.7.2", "tomli>=2.3.0", "tomli-w>=1.2.0", "websockets>=15.0.1", # MCP support "fastmcp>=3.0.0", # Web UI dependencies "gradio>=4.0.0", ] [project.optional-dependencies] core = [ "fastapi>=0.104.0", "pydantic>=2.0.0", "uvicorn>=0.24.0", "requests>=2.25.0", "websockets>=15.0.1", ] cli = [ "typer>=0.9.0", "rich>=13.0.0", "pyyaml>=6.0", "huggingface_hub>=0.20.0", "openai>=2.7.2", "tomli>=2.3.0", "tomli-w>=1.2.0", ] docs = [ "sphinx==7.2.6", "pytorch-sphinx-theme2", "sphinxcontrib.katex==0.9.10", "docutils>=0.18.1,<0.21", "sphinx-design==0.6.1", "sphinxcontrib-mermaid==1.0.0", "myst-parser", "sphinxext-opengraph", "sphinx-sitemap==2.7.1", "sphinx-gallery>=0.14.0", "matplotlib", "nest-asyncio", "smolagents", ] all = [ "openenv-core[core] @ git+https://github.com/meta-pytorch/OpenEnv.git@main", "openenv-core[cli]", ] daytona = [ "daytona>=0.136.0", "pyyaml>=6.0", ] inspect = [ "inspect-ai>=0.3.0", ] [project.scripts] openenv = "openenv.cli.__main__:main" [tool.setuptools] package-dir = {"" = "src"} include-package-data = true [tool.setuptools.package-data] "openenv.cli" = ["templates/**/*"] [tool.setuptools.packages.find] where = ["src"] [tool.coverage.run] omit = [ "openenv/cli/templates/**", "**/templates/**", "openenv/cli/__main__.py", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", ] [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" markers = [ "docker: Tests that require Docker to be running", "network: Tests that require network access (HuggingFace, etc.)", "integration: Integration tests with external resources", ] [dependency-groups] dev = [ "ruff>=0.14.0", "usort>=1.1.0", "pytest>=7.0", "pytest-asyncio>=0.21", ] [tool.usort] # Disable first_party auto-detection so all non-stdlib imports land in # the same "third_party" bucket (the default_category). This matches # pyfmt's usort behavior inside arc f, which groups openenv.* and env # package imports together without blank-line separators. first_party_detection = false [tool.ruff] line-length = 88 [tool.ruff.lint] select = ["E", "F", "W"] ignore = [ "E402", # Module level import not at top of file (needed for pytest.importorskip patterns) "E501", # Line too long (not enforced previously, would require large refactor) ] [tool.ruff.lint.per-file-ignores] # Context manager variables that are intentionally unused "tests/envs/test_websockets.py" = ["F841"] "tests/test_cli/test_push.py" = ["F841"] # Compatibility shim module "src/openenv_core/__init__.py" = ["F401"]