CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl-labs/python-project-structure

Python project structure — pyproject.toml, src layout, __init__.py, .gitignore, dependency groups, type hints, py.typed, test structure, entry points, ruff/mypy configuration

91

1.03x
Quality

87%

Does it follow best practices?

Impact

99%

1.03x

Average score across 5 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-2/

{
  "context": "Tests whether the agent creates a FastAPI microservice with comprehensive project structure: pyproject.toml, separated dev/test dependency groups, pytest configuration, test infrastructure with conftest.py and multiple test files, ruff/mypy tooling, proper .gitignore, and type hints throughout.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "pyproject.toml with build-system",
      "description": "pyproject.toml has [build-system] section",
      "max_score": 6
    },
    {
      "name": "requires-python",
      "description": "requires-python >= 3.11 in pyproject.toml",
      "max_score": 4
    },
    {
      "name": "Separate dev and test groups",
      "description": "[project.optional-dependencies] has separate dev (ruff, mypy) and test (pytest, httpx, pytest-cov) groups, or at minimum one combined group separating these from production deps",
      "max_score": 8
    },
    {
      "name": "Ruff configured",
      "description": "[tool.ruff] section with lint rules in pyproject.toml",
      "max_score": 5
    },
    {
      "name": "Mypy strict",
      "description": "[tool.mypy] with strict = true",
      "max_score": 5
    },
    {
      "name": "pytest configured in pyproject.toml",
      "description": "[tool.pytest.ini_options] with testpaths and asyncio_mode configured",
      "max_score": 5
    },
    {
      "name": ".gitignore comprehensive",
      "description": ".gitignore includes .venv/, __pycache__/, .env, .coverage or htmlcov/, .mypy_cache/",
      "max_score": 5
    },
    {
      "name": "__init__.py in all packages",
      "description": "All directories (app package, routes/, services/, tests/) have __init__.py",
      "max_score": 7
    },
    {
      "name": "App factory pattern",
      "description": "main.py has create_app() that creates FastAPI, registers routers and error handlers",
      "max_score": 6
    },
    {
      "name": "Config from environment",
      "description": "config.py uses pydantic-settings BaseSettings with API keys and config loaded from env",
      "max_score": 5
    },
    {
      "name": "Routes with APIRouter",
      "description": "Routes use FastAPI APIRouter in a routes/ directory",
      "max_score": 5
    },
    {
      "name": "Type hints everywhere",
      "description": "All functions have type annotations on parameters and return types",
      "max_score": 8
    },
    {
      "name": "conftest.py with fixtures",
      "description": "tests/conftest.py exists with app fixture and async test client fixture",
      "max_score": 8
    },
    {
      "name": "Multiple test files",
      "description": "At least two test files exist (e.g., test_notifications.py and test_models.py) with actual test functions",
      "max_score": 7
    },
    {
      "name": "tests/ has __init__.py",
      "description": "tests/ directory has __init__.py",
      "max_score": 4
    },
    {
      "name": "No setup.py",
      "description": "No setup.py or setup.cfg exists",
      "max_score": 3
    },
    {
      "name": "Pydantic models with Literal types",
      "description": "models.py uses Pydantic models with Literal types for notification type or status",
      "max_score": 5
    }
  ]
}

evals

tile.json