Skip to content

jacoblearned/pants-basedpyright

Repository files navigation

pants-basedpyright

PyPI - Version PyPI - License

basedpyright is a fast type checker for Python, forked from Pyright. Unlike Pyright, however, it does not depend on an active Node.js installation. This makes it simpler to integrate Pyright-compatible type checking into pure Python projects without depending on a separate JavaScript runtime.

basedpyright also provides several other benefits like baseline support.

This repo contains a plugin for the Pants monorepo build system to integrate basedpyright into Pants's type checking workflow.

Supports Pants versions v2.27 - 2.29.

Features

  • Runs basedpyright type checking during $ pants check goal against appropriate Python targets.
  • No dependency on Node.js, making it easier to integrate pyright checks into monorepos that don't want to manage Node.js environments and dependencies for Python tooling.
  • Automatic config file detection in the workspace root (pyrightconfig.json as well as the [tool.basedpyright] or [tool.pyright] sections of a pyproject.toml file).
  • Explicit config file path support via [basedpyright].config section of pants.toml or CLI arguments , e.g. $ pants check --basedpyright-config="path/to/config.<json|toml>" ::.
  • Supports installation from resolves

Installation

Add pants-basedpyright to your plugins list in pants.toml:

[GLOBAL]
plugins = [
    "pants-basedpyright==0.2.0",
]

Then enable the backend in your pants.toml:

[GLOBAL]
backend_packages = [
    # ...other backends...
    "pants_basedpyright",
]

Configuration

Config File Discovery

By default, the plugin will look for a pyrightconfig.json or pyproject.toml file in the workspace root.

A pyproject.toml will be considered a config file candidate if it contains a [tool.basedpyright] or [tool.pyright] section, as basedpyright supports both formats for backwards compatibility with pyright.

If both files are present, basedpyright will give precedence to pyrightconfig.json.

Explicit Config File Path

You can also specify a custom config file path in your pants.toml that will take precedence over the default discovery behavior:

[basedpyright]
config = "path/to/your/pyproject.toml"  # or "path/to/your/pyrightconfig.json"

Or via the CLI (taking precedence over the pants.toml setting, if it exists):

pants check --basedpyright-config="path/to/your/pyproject.toml" ::  # or "path/to/your/pyrightconfig.json"

See the Pants options docs for more details on general option setting.

Usage

Run basedpyright checks:

pants check ::  # Check all targets

Advanced

Installing basedpyright from a Resolve

Pants resolves provide a mechanism to manage multiple sets of third-party dependencies.

Using resolves, you can install a different version of basedpyright than the default version specified by the plugin.

It's also possible to install basedpyright from a resolve so the tool is version-locked alongside your other Python dependencies. See Lockfiles for tools for more details.

  1. To install basedpyright itself from a particular Pants Python resolve, first ensure resolves are enabled in your pants.toml:
[python]
# ...other python settings...
enable_resolves = true
default_resolve = "python-default"  # Optional, this is the default if not set

[python.resolves]
python-default = "3rdparty/python/python-default.lock"
custom-resolve-with-basedpyright = "path/to/your/custom-resolve.lock"
  1. Run pants generate-lockfiles to create the lockfile if you haven't already. See Lockfiles for tools for an example BUILD and requirements file that generate-lockfiles will use to create a resolve that includes pytest a tool dependency.

  2. Specify the resolve from which to install basedpyright in the [basedpyright] section of your pants.toml:

[basedpyright]
install_from_resolve = "custom-resolve-with-basedpyright"

Now when you run pants check, the plugin will use the basedpyright version installed from the specified resolve.

License

MIT