Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions mypy_primer/globals.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class _Args:
type_checker: str
mypyc_compile_level: int | None
mypy_install_librt: bool
debug_build: bool
cargo_profile: str | None

custom_typeshed_repo: str
new_typeshed: str | None
Expand Down Expand Up @@ -94,9 +94,8 @@ def parse_options(argv: list[str]) -> _Args:
),
)
type_checker_group.add_argument(
"--debug-build",
action="store_true",
help="build the type checker in debug mode (only relevant for pyrefly/ty)",
"--cargo-profile",
help="cargo build profile to use (e.g., 'dev', 'release', or custom profiles; only relevant for pyrefly/ty)",
)
type_checker_group.add_argument(
"--mypyc-compile-level",
Expand Down Expand Up @@ -240,9 +239,9 @@ def parse_options(argv: list[str]) -> _Args:
parser.error("--shard-index and --num-shards must be used together")
if ret.type_checker != "mypy" and ret.mypyc_compile_level is not None:
parser.error("--mypyc-compile-level can only be used with --type-checker=mypy")
if ret.debug_build and ret.type_checker not in {"pyrefly", "ty"}:
if ret.cargo_profile is not None and ret.type_checker not in {"pyrefly", "ty"}:
parser.error(
"`--debug-build` can only be used with `--type-checker=pyrefly` or `--type-checker=ty`"
"`--cargo-profile` can only be used with `--type-checker=pyrefly` or `--type-checker=ty`"
)

return ret
Expand Down
5 changes: 2 additions & 3 deletions mypy_primer/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
from mypy_primer.model import Project, TypeCheckResult
from mypy_primer.projects import get_projects
from mypy_primer.type_checker import (
RustBuildMode,
setup_mypy,
setup_pyrefly,
setup_pyright,
Expand Down Expand Up @@ -55,14 +54,14 @@ def setup_type_checker(
setup_fn = setup_ty
kwargs = {
"repo": ARGS.repo,
"build_mode": (RustBuildMode.DEBUG if ARGS.debug_build else RustBuildMode.RELEASE),
"build_profile": ARGS.cargo_profile or "release",
}
elif ARGS.type_checker == "pyrefly":
setup_fn = setup_pyrefly
kwargs = {
"repo": ARGS.repo,
"typeshed_dir": typeshed_dir,
"build_mode": (RustBuildMode.DEBUG if ARGS.debug_build else RustBuildMode.RELEASE),
"build_profile": ARGS.cargo_profile or "release",
}
else:
raise ValueError(f"Unknown type checker {ARGS.type_checker}")
Expand Down
2 changes: 1 addition & 1 deletion mypy_primer/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ def get_pyrefly_cmd(self, pyrefly: Path, additional_flags: Sequence[str] = ()) -

pyrefly_cmd = pyrefly_cmd.format_map(_FormatMap(pyrefly=pyrefly, paths=self.paths))

pyrefly_cmd += f" --python-interpreter {quote_path(self.venv.dir)}/bin/python --summary=none --output-format min-text"
pyrefly_cmd += f" --python-interpreter-path {quote_path(self.venv.dir)}/bin/python --summary=none --output-format min-text"
return pyrefly_cmd

async def run_pyrefly(
Expand Down
40 changes: 16 additions & 24 deletions mypy_primer/type_checker.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from __future__ import annotations

import enum
import os
import shutil
import subprocess
Expand All @@ -11,6 +10,14 @@
from mypy_primer.utils import Venv, get_npm, has_uv, run


def _cargo_build_artifact_directory(build_profile: str) -> str:
"""Return the cargo artifact directory name for a given build profile.

Cargo uses "debug" as the directory name for the "dev" profile.
"""
return "debug" if build_profile == "dev" else build_profile


async def setup_mypy(
mypy_dir: Path,
*,
Expand Down Expand Up @@ -132,7 +139,7 @@ async def setup_ty(
ty_dir: Path,
revision_like: RevisionLike,
*,
build_mode: RustBuildMode,
build_profile: str,
repo: str | None,
) -> Path:
ty_dir.mkdir(parents=True, exist_ok=True)
Expand All @@ -148,7 +155,7 @@ async def setup_ty(

try:
await run(
["cargo", "build", "--bin", "ty", *build_mode.flags()],
["cargo", "build", "--bin", "ty", "--profile", build_profile],
cwd=repo_dir,
env=env,
output=True,
Expand All @@ -159,7 +166,7 @@ async def setup_ty(
print(e.stderr, file=sys.stderr)
raise e

ty_exe = cargo_target_dir / build_mode.artifact_directory() / "ty"
ty_exe = cargo_target_dir / _cargo_build_artifact_directory(build_profile) / "ty"
assert ty_exe.exists()
return ty_exe

Expand All @@ -168,7 +175,7 @@ async def setup_pyrefly(
pyrefly_dir: Path,
revision_like: RevisionLike,
*,
build_mode: RustBuildMode,
build_profile: str,
repo: str | None,
typeshed_dir: Path | None,
) -> Path:
Expand All @@ -178,7 +185,9 @@ async def setup_pyrefly(
repo = "https://github.com/facebook/pyrefly"
repo_dir = await ensure_repo_at_revision(repo, pyrefly_dir, revision_like)

cargo_target_dir = pyrefly_dir / "target"
env = os.environ.copy()
env["CARGO_TARGET_DIR"] = str(cargo_target_dir)
if typeshed_dir is not None:
if typeshed_dir.name != "typeshed":
raise RuntimeError(f"Unexpected typeshed dir {typeshed_dir}")
Expand All @@ -187,7 +196,7 @@ async def setup_pyrefly(
if not os.environ.get("MYPY_PRIMER_NO_REBUILD", False):
try:
await run(
["cargo", "build", *build_mode.flags()],
["cargo", "build", "--profile", build_profile],
cwd=repo_dir / "pyrefly",
env=env,
output=True,
Expand All @@ -198,7 +207,7 @@ async def setup_pyrefly(
print(e.stderr, file=sys.stderr)
raise e

pyrefly_exe = repo_dir / "target" / build_mode.artifact_directory() / "pyrefly"
pyrefly_exe = cargo_target_dir / _cargo_build_artifact_directory(build_profile) / "pyrefly"
assert pyrefly_exe.exists()
return pyrefly_exe

Expand All @@ -208,20 +217,3 @@ async def setup_typeshed(parent_dir: Path, *, repo: str, revision_like: Revision
shutil.rmtree(parent_dir)
parent_dir.mkdir(exist_ok=True)
return await ensure_repo_at_revision(repo, parent_dir, revision_like)


class RustBuildMode(enum.Enum):
RELEASE = "release"
DEBUG = "debug"

def flags(self) -> list[str]:
if self == RustBuildMode.RELEASE:
return ["--release"]
else:
return []

def artifact_directory(self) -> Path:
if self == RustBuildMode.RELEASE:
return Path("release")
else:
return Path("debug")