pytest-language-server


Namepytest-language-server JSON
Version 0.5.0 PyPI version JSON
download
home_pageNone
SummaryA blazingly fast Language Server Protocol implementation for pytest
upload_time2025-11-16 14:40:46
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseMIT
keywords pytest lsp language-server testing
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # pytest-language-server 🔥

[![CI](https://github.com/bellini666/pytest-language-server/workflows/CI/badge.svg)](https://github.com/bellini666/pytest-language-server/actions/workflows/ci.yml)
[![Security Audit](https://github.com/bellini666/pytest-language-server/workflows/Security%20Audit/badge.svg)](https://github.com/bellini666/pytest-language-server/actions/workflows/security.yml)
[![PyPI version](https://badge.fury.io/py/pytest-language-server.svg)](https://badge.fury.io/py/pytest-language-server)
[![Downloads](https://static.pepy.tech/badge/pytest-language-server)](https://pepy.tech/project/pytest-language-server)
[![Crates.io](https://img.shields.io/crates/v/pytest-language-server.svg)](https://crates.io/crates/pytest-language-server)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python Version](https://img.shields.io/pypi/pyversions/pytest-language-server.svg)](https://pypi.org/project/pytest-language-server/)

> **Shamelessly vibed into existence** 🤖✨
>
> This entire LSP implementation was built from scratch in a single AI-assisted coding session.
> No template. No boilerplate. Just pure vibes and Rust. That's right - a complete, working
> Language Server Protocol implementation for pytest, vibed into reality through the power of
> modern AI tooling. Even this message about vibing was vibed into existence.

A blazingly fast Language Server Protocol (LSP) implementation for pytest, built with Rust.

## Features

### 🎯 Go to Definition
Jump directly to fixture definitions from anywhere they're used:
- Local fixtures in the same file
- Fixtures in `conftest.py` files
- Third-party fixtures from pytest plugins (pytest-mock, pytest-asyncio, etc.)
- Respects pytest's fixture shadowing/priority rules

### 🔍 Find References
Find all usages of a fixture across your entire test suite:
- Works from fixture definitions or usage sites
- Character-position aware (distinguishes between fixture name and parameters)
- Shows references in all test files
- Correctly handles fixture overriding and hierarchies
- **LSP spec compliant**: Always includes the current position in results

### 📚 Hover Documentation
View fixture information on hover:
- Fixture signature
- Source file location
- Docstring (with proper formatting and dedenting)
- Markdown support in docstrings

### 💡 Code Actions (Quick Fixes)
One-click fixes for common pytest issues:
- **Add missing fixture parameters**: Automatically add undeclared fixtures to function signatures
- **Smart insertion**: Handles both empty and existing parameter lists
- **Editor integration**: Works with any LSP-compatible editor's quick fix menu
- **LSP compliant**: Full support for `CodeActionKind::QUICKFIX`

### ⚠️ Diagnostics & Quick Fixes
Detect and fix common pytest fixture issues with intelligent code actions:

**Undeclared Fixture Detection:**
- Detects when fixtures are used in function bodies but not declared as parameters
- **Line-aware scoping**: Correctly handles local variables assigned later in the function
- **Hierarchy-aware**: Only reports fixtures that are actually available in the current file's scope
- **Works in tests and fixtures**: Detects undeclared usage in both test functions and fixture functions
- Excludes built-in names (`self`, `request`) and actual local variables

**One-Click Quick Fixes:**
- **Code actions** to automatically add missing fixture parameters
- Intelligent parameter insertion (handles both empty and existing parameter lists)
- Works with both single-line and multi-line function signatures
- Triggered directly from diagnostic warnings

Example:
```python
@pytest.fixture
def user_db():
    return Database()

def test_user(user_db):  # ✅ user_db properly declared
    user = user_db.get_user(1)
    assert user.name == "Alice"

def test_broken():  # ⚠️ Warning: 'user_db' used but not declared
    user = user_db.get_user(1)  # 💡 Quick fix: Add 'user_db' fixture parameter
    assert user.name == "Alice"
```

**How to use quick fixes:**
1. Place cursor on the warning squiggle
2. Trigger code actions menu (usually Cmd+. or Ctrl+. in most editors)
3. Select "Add 'fixture_name' fixture parameter"
4. The parameter is automatically added to your function signature

### ⚡️ Performance
Built with Rust for maximum performance:
- Fast workspace scanning with concurrent file processing
- Efficient AST parsing using rustpython-parser
- Lock-free data structures with DashMap
- Minimal memory footprint

## Installation

Choose your preferred installation method:

### 📦 PyPI (Recommended)

The easiest way to install for Python projects:

```bash
# Using uv (recommended)
uv tool install pytest-language-server

# Or with pip
pip install pytest-language-server

# Or with pipx (isolated environment)
pipx install pytest-language-server
```

### 🍺 Homebrew (macOS/Linux)

Install via Homebrew for system-wide availability:

```bash
brew install bellini666/tap/pytest-language-server
```

To add the tap first:
```bash
brew tap bellini666/tap https://github.com/bellini666/pytest-language-server
brew install pytest-language-server
```

### 🦀 Cargo (Rust)

Install from crates.io if you have Rust installed:

```bash
cargo install pytest-language-server
```

### 📥 Pre-built Binaries

Download pre-built binaries from the [GitHub Releases](https://github.com/bellini666/pytest-language-server/releases) page.

Available for:
- **Linux**: x86_64, aarch64, armv7 (glibc and musl)
- **macOS**: Intel and Apple Silicon
- **Windows**: x64 and x86

### 🔨 From Source

Build from source for development or customization:

```bash
git clone https://github.com/bellini666/pytest-language-server
cd pytest-language-server
cargo build --release
```

The binary will be at `target/release/pytest-language-server`.

## Setup

### Neovim (with nvim-lspconfig)

```lua
require'lspconfig'.pytest_lsp.setup{
  cmd = { "pytest-language-server" },
  filetypes = { "python" },
  root_dir = function(fname)
    return require'lspconfig'.util.root_pattern('pyproject.toml', 'setup.py', 'setup.cfg', 'pytest.ini')(fname)
  end,
}
```

### Zed

Install the extension from the extensions marketplace:

1. Open Zed
2. Open the command palette (Cmd+Shift+P / Ctrl+Shift+P)
3. Search for "zed: extensions"
4. Search for "pytest Language Server"
5. Click "Install"

The extension will automatically detect `pytest-language-server` if it's in your PATH.

### VS Code

Install the extension from the marketplace (coming soon) or configure manually:

```json
{
  "pytest-language-server.enable": true,
  "pytest-language-server.path": "pytest-language-server"
}
```

### Other Editors

Any editor with LSP support can use pytest-language-server. Configure it to run the `pytest-language-server` command.

## Configuration

### Logging

Control log verbosity with the `RUST_LOG` environment variable:

```bash
# Minimal logging (default)
RUST_LOG=warn pytest-language-server

# Info level
RUST_LOG=info pytest-language-server

# Debug level (verbose)
RUST_LOG=debug pytest-language-server

# Trace level (very verbose)
RUST_LOG=trace pytest-language-server
```

Logs are written to stderr, so they won't interfere with LSP communication.

### Virtual Environment Detection

The server automatically detects your Python virtual environment:
1. Checks for `.venv/`, `venv/`, or `env/` in your project root
2. Falls back to `$VIRTUAL_ENV` environment variable
3. Scans third-party pytest plugins for fixtures

### Code Actions / Quick Fixes

Code actions are automatically available on diagnostic warnings. If code actions don't appear in your editor:

1. **Check LSP capabilities**: Ensure your editor supports code actions (most modern editors do)
2. **Enable debug logging**: Use `RUST_LOG=info` to see if actions are being created
3. **Verify diagnostics**: Code actions only appear where there are warnings
4. **Trigger manually**: Use your editor's code action keybinding (Cmd+. / Ctrl+.)

For detailed troubleshooting, see [CODE_ACTION_TESTING.md](CODE_ACTION_TESTING.md).

## Supported Fixture Patterns

### Decorator Style
```python
@pytest.fixture
def my_fixture():
    """Fixture docstring."""
    return 42
```

### Assignment Style (pytest-mock)
```python
mocker = pytest.fixture()(_mocker)
```

### Async Fixtures
```python
@pytest.fixture
async def async_fixture():
    return await some_async_operation()
```

### Fixture Dependencies
```python
@pytest.fixture
def fixture_a():
    return "a"

@pytest.fixture
def fixture_b(fixture_a):  # Go to definition works on fixture_a
    return fixture_a + "b"
```

## Fixture Priority Rules

pytest-language-server correctly implements pytest's fixture shadowing rules:
1. **Same file**: Fixtures defined in the same file have highest priority
2. **Closest conftest.py**: Searches parent directories for conftest.py files
3. **Virtual environment**: Third-party plugin fixtures

### Fixture Overriding

The LSP correctly handles complex fixture overriding scenarios:

```python
# conftest.py (parent)
@pytest.fixture
def cli_runner():
    return "parent runner"

# tests/conftest.py (child)
@pytest.fixture
def cli_runner(cli_runner):  # Overrides parent
    return cli_runner  # Uses parent

# tests/test_example.py
def test_example(cli_runner):  # Uses child
    pass
```

When using find-references:
- Clicking on the **function name** `def cli_runner(...)` shows references to the child fixture
- Clicking on the **parameter** `cli_runner(cli_runner)` shows references to the parent fixture
- Character-position aware to distinguish between the two

## Supported Third-Party Fixtures

Automatically discovers fixtures from popular pytest plugins:
- **pytest-mock**: `mocker`, `class_mocker`
- **pytest-asyncio**: `event_loop`
- **pytest-django**: Database fixtures
- **pytest-cov**: Coverage fixtures
- And any other pytest plugin in your environment

## Architecture

- **Language**: Rust 🦀
- **LSP Framework**: tower-lsp
- **Parser**: rustpython-parser
- **Concurrency**: tokio async runtime
- **Data Structures**: DashMap for lock-free concurrent access

## Development

### Prerequisites

- Rust 1.83+ (2021 edition)
- Python 3.10+ (for testing)

### Building

```bash
cargo build --release
```

### Running Tests

```bash
cargo test
```

### Logging During Development

```bash
RUST_LOG=debug cargo run
```

## Security

Security is a priority. This project includes:
- Automated dependency vulnerability scanning (cargo-audit)
- License compliance checking (cargo-deny)
- Daily security audits in CI/CD
- Dependency review on pull requests
- Pre-commit security hooks

See [SECURITY.md](SECURITY.md) for our security policy and how to report vulnerabilities.

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

### Development Setup

1. Install pre-commit hooks:
   ```bash
   pre-commit install
   ```

2. Run security checks locally:
   ```bash
   cargo audit
   cargo clippy
   cargo test
   ```

## License

MIT License - see LICENSE file for details.

## Acknowledgments

Built with:
- [tower-lsp](https://github.com/ebkalderon/tower-lsp) - LSP framework
- [rustpython-parser](https://github.com/RustPython/RustPython) - Python AST parsing
- [tokio](https://tokio.rs/) - Async runtime

Special thanks to the pytest team for creating such an amazing testing framework.

---

**Made with ❤️ and Rust. Shamelessly vibed into existence. Blazingly fast. 🔥**

*When you need a pytest LSP and the vibes are just right.* ✨


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "pytest-language-server",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "pytest, lsp, language-server, testing",
    "author": null,
    "author_email": "Thiago Bellini Ribeiro <hackedbellini@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/07/74/a723ddc64daae6c10e821d676f68b2cef7382ad4a3783b45943e158c2faa/pytest_language_server-0.5.0.tar.gz",
    "platform": null,
    "description": "# pytest-language-server \ud83d\udd25\n\n[![CI](https://github.com/bellini666/pytest-language-server/workflows/CI/badge.svg)](https://github.com/bellini666/pytest-language-server/actions/workflows/ci.yml)\n[![Security Audit](https://github.com/bellini666/pytest-language-server/workflows/Security%20Audit/badge.svg)](https://github.com/bellini666/pytest-language-server/actions/workflows/security.yml)\n[![PyPI version](https://badge.fury.io/py/pytest-language-server.svg)](https://badge.fury.io/py/pytest-language-server)\n[![Downloads](https://static.pepy.tech/badge/pytest-language-server)](https://pepy.tech/project/pytest-language-server)\n[![Crates.io](https://img.shields.io/crates/v/pytest-language-server.svg)](https://crates.io/crates/pytest-language-server)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Python Version](https://img.shields.io/pypi/pyversions/pytest-language-server.svg)](https://pypi.org/project/pytest-language-server/)\n\n> **Shamelessly vibed into existence** \ud83e\udd16\u2728\n>\n> This entire LSP implementation was built from scratch in a single AI-assisted coding session.\n> No template. No boilerplate. Just pure vibes and Rust. That's right - a complete, working\n> Language Server Protocol implementation for pytest, vibed into reality through the power of\n> modern AI tooling. Even this message about vibing was vibed into existence.\n\nA blazingly fast Language Server Protocol (LSP) implementation for pytest, built with Rust.\n\n## Features\n\n### \ud83c\udfaf Go to Definition\nJump directly to fixture definitions from anywhere they're used:\n- Local fixtures in the same file\n- Fixtures in `conftest.py` files\n- Third-party fixtures from pytest plugins (pytest-mock, pytest-asyncio, etc.)\n- Respects pytest's fixture shadowing/priority rules\n\n### \ud83d\udd0d Find References\nFind all usages of a fixture across your entire test suite:\n- Works from fixture definitions or usage sites\n- Character-position aware (distinguishes between fixture name and parameters)\n- Shows references in all test files\n- Correctly handles fixture overriding and hierarchies\n- **LSP spec compliant**: Always includes the current position in results\n\n### \ud83d\udcda Hover Documentation\nView fixture information on hover:\n- Fixture signature\n- Source file location\n- Docstring (with proper formatting and dedenting)\n- Markdown support in docstrings\n\n### \ud83d\udca1 Code Actions (Quick Fixes)\nOne-click fixes for common pytest issues:\n- **Add missing fixture parameters**: Automatically add undeclared fixtures to function signatures\n- **Smart insertion**: Handles both empty and existing parameter lists\n- **Editor integration**: Works with any LSP-compatible editor's quick fix menu\n- **LSP compliant**: Full support for `CodeActionKind::QUICKFIX`\n\n### \u26a0\ufe0f Diagnostics & Quick Fixes\nDetect and fix common pytest fixture issues with intelligent code actions:\n\n**Undeclared Fixture Detection:**\n- Detects when fixtures are used in function bodies but not declared as parameters\n- **Line-aware scoping**: Correctly handles local variables assigned later in the function\n- **Hierarchy-aware**: Only reports fixtures that are actually available in the current file's scope\n- **Works in tests and fixtures**: Detects undeclared usage in both test functions and fixture functions\n- Excludes built-in names (`self`, `request`) and actual local variables\n\n**One-Click Quick Fixes:**\n- **Code actions** to automatically add missing fixture parameters\n- Intelligent parameter insertion (handles both empty and existing parameter lists)\n- Works with both single-line and multi-line function signatures\n- Triggered directly from diagnostic warnings\n\nExample:\n```python\n@pytest.fixture\ndef user_db():\n    return Database()\n\ndef test_user(user_db):  # \u2705 user_db properly declared\n    user = user_db.get_user(1)\n    assert user.name == \"Alice\"\n\ndef test_broken():  # \u26a0\ufe0f Warning: 'user_db' used but not declared\n    user = user_db.get_user(1)  # \ud83d\udca1 Quick fix: Add 'user_db' fixture parameter\n    assert user.name == \"Alice\"\n```\n\n**How to use quick fixes:**\n1. Place cursor on the warning squiggle\n2. Trigger code actions menu (usually Cmd+. or Ctrl+. in most editors)\n3. Select \"Add 'fixture_name' fixture parameter\"\n4. The parameter is automatically added to your function signature\n\n### \u26a1\ufe0f Performance\nBuilt with Rust for maximum performance:\n- Fast workspace scanning with concurrent file processing\n- Efficient AST parsing using rustpython-parser\n- Lock-free data structures with DashMap\n- Minimal memory footprint\n\n## Installation\n\nChoose your preferred installation method:\n\n### \ud83d\udce6 PyPI (Recommended)\n\nThe easiest way to install for Python projects:\n\n```bash\n# Using uv (recommended)\nuv tool install pytest-language-server\n\n# Or with pip\npip install pytest-language-server\n\n# Or with pipx (isolated environment)\npipx install pytest-language-server\n```\n\n### \ud83c\udf7a Homebrew (macOS/Linux)\n\nInstall via Homebrew for system-wide availability:\n\n```bash\nbrew install bellini666/tap/pytest-language-server\n```\n\nTo add the tap first:\n```bash\nbrew tap bellini666/tap https://github.com/bellini666/pytest-language-server\nbrew install pytest-language-server\n```\n\n### \ud83e\udd80 Cargo (Rust)\n\nInstall from crates.io if you have Rust installed:\n\n```bash\ncargo install pytest-language-server\n```\n\n### \ud83d\udce5 Pre-built Binaries\n\nDownload pre-built binaries from the [GitHub Releases](https://github.com/bellini666/pytest-language-server/releases) page.\n\nAvailable for:\n- **Linux**: x86_64, aarch64, armv7 (glibc and musl)\n- **macOS**: Intel and Apple Silicon\n- **Windows**: x64 and x86\n\n### \ud83d\udd28 From Source\n\nBuild from source for development or customization:\n\n```bash\ngit clone https://github.com/bellini666/pytest-language-server\ncd pytest-language-server\ncargo build --release\n```\n\nThe binary will be at `target/release/pytest-language-server`.\n\n## Setup\n\n### Neovim (with nvim-lspconfig)\n\n```lua\nrequire'lspconfig'.pytest_lsp.setup{\n  cmd = { \"pytest-language-server\" },\n  filetypes = { \"python\" },\n  root_dir = function(fname)\n    return require'lspconfig'.util.root_pattern('pyproject.toml', 'setup.py', 'setup.cfg', 'pytest.ini')(fname)\n  end,\n}\n```\n\n### Zed\n\nInstall the extension from the extensions marketplace:\n\n1. Open Zed\n2. Open the command palette (Cmd+Shift+P / Ctrl+Shift+P)\n3. Search for \"zed: extensions\"\n4. Search for \"pytest Language Server\"\n5. Click \"Install\"\n\nThe extension will automatically detect `pytest-language-server` if it's in your PATH.\n\n### VS Code\n\nInstall the extension from the marketplace (coming soon) or configure manually:\n\n```json\n{\n  \"pytest-language-server.enable\": true,\n  \"pytest-language-server.path\": \"pytest-language-server\"\n}\n```\n\n### Other Editors\n\nAny editor with LSP support can use pytest-language-server. Configure it to run the `pytest-language-server` command.\n\n## Configuration\n\n### Logging\n\nControl log verbosity with the `RUST_LOG` environment variable:\n\n```bash\n# Minimal logging (default)\nRUST_LOG=warn pytest-language-server\n\n# Info level\nRUST_LOG=info pytest-language-server\n\n# Debug level (verbose)\nRUST_LOG=debug pytest-language-server\n\n# Trace level (very verbose)\nRUST_LOG=trace pytest-language-server\n```\n\nLogs are written to stderr, so they won't interfere with LSP communication.\n\n### Virtual Environment Detection\n\nThe server automatically detects your Python virtual environment:\n1. Checks for `.venv/`, `venv/`, or `env/` in your project root\n2. Falls back to `$VIRTUAL_ENV` environment variable\n3. Scans third-party pytest plugins for fixtures\n\n### Code Actions / Quick Fixes\n\nCode actions are automatically available on diagnostic warnings. If code actions don't appear in your editor:\n\n1. **Check LSP capabilities**: Ensure your editor supports code actions (most modern editors do)\n2. **Enable debug logging**: Use `RUST_LOG=info` to see if actions are being created\n3. **Verify diagnostics**: Code actions only appear where there are warnings\n4. **Trigger manually**: Use your editor's code action keybinding (Cmd+. / Ctrl+.)\n\nFor detailed troubleshooting, see [CODE_ACTION_TESTING.md](CODE_ACTION_TESTING.md).\n\n## Supported Fixture Patterns\n\n### Decorator Style\n```python\n@pytest.fixture\ndef my_fixture():\n    \"\"\"Fixture docstring.\"\"\"\n    return 42\n```\n\n### Assignment Style (pytest-mock)\n```python\nmocker = pytest.fixture()(_mocker)\n```\n\n### Async Fixtures\n```python\n@pytest.fixture\nasync def async_fixture():\n    return await some_async_operation()\n```\n\n### Fixture Dependencies\n```python\n@pytest.fixture\ndef fixture_a():\n    return \"a\"\n\n@pytest.fixture\ndef fixture_b(fixture_a):  # Go to definition works on fixture_a\n    return fixture_a + \"b\"\n```\n\n## Fixture Priority Rules\n\npytest-language-server correctly implements pytest's fixture shadowing rules:\n1. **Same file**: Fixtures defined in the same file have highest priority\n2. **Closest conftest.py**: Searches parent directories for conftest.py files\n3. **Virtual environment**: Third-party plugin fixtures\n\n### Fixture Overriding\n\nThe LSP correctly handles complex fixture overriding scenarios:\n\n```python\n# conftest.py (parent)\n@pytest.fixture\ndef cli_runner():\n    return \"parent runner\"\n\n# tests/conftest.py (child)\n@pytest.fixture\ndef cli_runner(cli_runner):  # Overrides parent\n    return cli_runner  # Uses parent\n\n# tests/test_example.py\ndef test_example(cli_runner):  # Uses child\n    pass\n```\n\nWhen using find-references:\n- Clicking on the **function name** `def cli_runner(...)` shows references to the child fixture\n- Clicking on the **parameter** `cli_runner(cli_runner)` shows references to the parent fixture\n- Character-position aware to distinguish between the two\n\n## Supported Third-Party Fixtures\n\nAutomatically discovers fixtures from popular pytest plugins:\n- **pytest-mock**: `mocker`, `class_mocker`\n- **pytest-asyncio**: `event_loop`\n- **pytest-django**: Database fixtures\n- **pytest-cov**: Coverage fixtures\n- And any other pytest plugin in your environment\n\n## Architecture\n\n- **Language**: Rust \ud83e\udd80\n- **LSP Framework**: tower-lsp\n- **Parser**: rustpython-parser\n- **Concurrency**: tokio async runtime\n- **Data Structures**: DashMap for lock-free concurrent access\n\n## Development\n\n### Prerequisites\n\n- Rust 1.83+ (2021 edition)\n- Python 3.10+ (for testing)\n\n### Building\n\n```bash\ncargo build --release\n```\n\n### Running Tests\n\n```bash\ncargo test\n```\n\n### Logging During Development\n\n```bash\nRUST_LOG=debug cargo run\n```\n\n## Security\n\nSecurity is a priority. This project includes:\n- Automated dependency vulnerability scanning (cargo-audit)\n- License compliance checking (cargo-deny)\n- Daily security audits in CI/CD\n- Dependency review on pull requests\n- Pre-commit security hooks\n\nSee [SECURITY.md](SECURITY.md) for our security policy and how to report vulnerabilities.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n### Development Setup\n\n1. Install pre-commit hooks:\n   ```bash\n   pre-commit install\n   ```\n\n2. Run security checks locally:\n   ```bash\n   cargo audit\n   cargo clippy\n   cargo test\n   ```\n\n## License\n\nMIT License - see LICENSE file for details.\n\n## Acknowledgments\n\nBuilt with:\n- [tower-lsp](https://github.com/ebkalderon/tower-lsp) - LSP framework\n- [rustpython-parser](https://github.com/RustPython/RustPython) - Python AST parsing\n- [tokio](https://tokio.rs/) - Async runtime\n\nSpecial thanks to the pytest team for creating such an amazing testing framework.\n\n---\n\n**Made with \u2764\ufe0f and Rust. Shamelessly vibed into existence. Blazingly fast. \ud83d\udd25**\n\n*When you need a pytest LSP and the vibes are just right.* \u2728\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A blazingly fast Language Server Protocol implementation for pytest",
    "version": "0.5.0",
    "project_urls": {
        "Homepage": "https://github.com/bellini666/pytest-language-server",
        "Issues": "https://github.com/bellini666/pytest-language-server/issues",
        "Repository": "https://github.com/bellini666/pytest-language-server"
    },
    "split_keywords": [
        "pytest",
        " lsp",
        " language-server",
        " testing"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5c37d8b10b40b8e7590c03fab213a6878cbea2aba43e7a45052cba218b6e2a5d",
                "md5": "d8961cd2909c18bba79969509bc0b27a",
                "sha256": "59c9f15bdbc883472ebf03942a8caf837fe666d86c8a230aff4fa06b2d56dfd5"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d8961cd2909c18bba79969509bc0b27a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 3058350,
            "upload_time": "2025-11-16T14:40:21",
            "upload_time_iso_8601": "2025-11-16T14:40:21.450249Z",
            "url": "https://files.pythonhosted.org/packages/5c/37/d8b10b40b8e7590c03fab213a6878cbea2aba43e7a45052cba218b6e2a5d/pytest_language_server-0.5.0-py3-none-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "629401cbb5489c84efffde6e2e3e4a5262f92c1e5695c21d5bdf334b678c8690",
                "md5": "241f3a9f982983c12205a1024c97c096",
                "sha256": "eb0f3c574d30850035e24a8b14e3e49f1bd93eaf6b17f370ac641dc691241a48"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "241f3a9f982983c12205a1024c97c096",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 2967616,
            "upload_time": "2025-11-16T14:40:23",
            "upload_time_iso_8601": "2025-11-16T14:40:23.093397Z",
            "url": "https://files.pythonhosted.org/packages/62/94/01cbb5489c84efffde6e2e3e4a5262f92c1e5695c21d5bdf334b678c8690/pytest_language_server-0.5.0-py3-none-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "01bd81ba70c4469a1e91b47df142a820f79a551b5c62e8cd6497cc01fee743af",
                "md5": "fe89a6ce98fb67bdab829d5f272a8e8c",
                "sha256": "1dbf03de550c30d753ac9cb6e16c907290580265ca9894d2bae629d22e102b0a"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "fe89a6ce98fb67bdab829d5f272a8e8c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 3116734,
            "upload_time": "2025-11-16T14:40:24",
            "upload_time_iso_8601": "2025-11-16T14:40:24.809374Z",
            "url": "https://files.pythonhosted.org/packages/01/bd/81ba70c4469a1e91b47df142a820f79a551b5c62e8cd6497cc01fee743af/pytest_language_server-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "107ec4d67fc8834acb3d7b078ebf21dcb4f39a6a1710a7376eb6a6fe1c440860",
                "md5": "cdf2ef3f0034f3a9fabc536ffefbdf09",
                "sha256": "a69e388fdb68adf975fbcf0a257b63fcfeeee76644a4d762a32d96afafe7516c"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "cdf2ef3f0034f3a9fabc536ffefbdf09",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 3112537,
            "upload_time": "2025-11-16T14:40:26",
            "upload_time_iso_8601": "2025-11-16T14:40:26.460506Z",
            "url": "https://files.pythonhosted.org/packages/10/7e/c4d67fc8834acb3d7b078ebf21dcb4f39a6a1710a7376eb6a6fe1c440860/pytest_language_server-0.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "579629f17721b0761ed215d391da10ad670cc2180cd374e535ec32c8931083bc",
                "md5": "668c47ea6e1a6b291bdea6a075e1576d",
                "sha256": "8e052efeab147af3069e13fd09af42b6ae65410eb8d39f320fd3cfa53edf5bc8"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "668c47ea6e1a6b291bdea6a075e1576d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 3371022,
            "upload_time": "2025-11-16T14:40:28",
            "upload_time_iso_8601": "2025-11-16T14:40:28.508805Z",
            "url": "https://files.pythonhosted.org/packages/57/96/29f17721b0761ed215d391da10ad670cc2180cd374e535ec32c8931083bc/pytest_language_server-0.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c51240ebf1a20121653df1be529b94c05168849831104459cad8a719a920065b",
                "md5": "c85a1a965beb285631f92aa310b299ca",
                "sha256": "18d60ba15daafa2b3ed8fd29580a7fa8dcfcf35daf3eb4fb72c99434454bb11b"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "c85a1a965beb285631f92aa310b299ca",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 3599090,
            "upload_time": "2025-11-16T14:40:30",
            "upload_time_iso_8601": "2025-11-16T14:40:30.158107Z",
            "url": "https://files.pythonhosted.org/packages/c5/12/40ebf1a20121653df1be529b94c05168849831104459cad8a719a920065b/pytest_language_server-0.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "339e0658fe9244cc6b05c23b3fa747121c9f70460043524ddf5ca834539da02c",
                "md5": "dbde727a75297c7e4103ee81f26d8136",
                "sha256": "a0fc91c96fb58e168122fce33a109ca188516e3a358db7722d72ed7d2c64b468"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "has_sig": false,
            "md5_digest": "dbde727a75297c7e4103ee81f26d8136",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 3232075,
            "upload_time": "2025-11-16T14:40:31",
            "upload_time_iso_8601": "2025-11-16T14:40:31.861001Z",
            "url": "https://files.pythonhosted.org/packages/33/9e/0658fe9244cc6b05c23b3fa747121c9f70460043524ddf5ca834539da02c/pytest_language_server-0.5.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9867a0a7962ec00ab38add697fe19ec07d64c59ef90e6c14f4b679e376e10e8c",
                "md5": "5ac8a83f2cdb83e27707fa18f20312ca",
                "sha256": "cd743c31a8bc7c596ef1bd3c4f6d28076e1eefdb717bd5420fb6b32c89257d8f"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5ac8a83f2cdb83e27707fa18f20312ca",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 3189913,
            "upload_time": "2025-11-16T14:40:33",
            "upload_time_iso_8601": "2025-11-16T14:40:33.885801Z",
            "url": "https://files.pythonhosted.org/packages/98/67/a0a7962ec00ab38add697fe19ec07d64c59ef90e6c14f4b679e376e10e8c/pytest_language_server-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2373639331d3838f2e97e679c99ecdb9a80aa3e05b29459c77f5f127afd1679a",
                "md5": "055068444fe90945659824495989ead0",
                "sha256": "694b8efb9e59fde3b241f48654099b436ff3473976e315865f680317360a2117"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "055068444fe90945659824495989ead0",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 3161135,
            "upload_time": "2025-11-16T14:40:35",
            "upload_time_iso_8601": "2025-11-16T14:40:35.588100Z",
            "url": "https://files.pythonhosted.org/packages/23/73/639331d3838f2e97e679c99ecdb9a80aa3e05b29459c77f5f127afd1679a/pytest_language_server-0.5.0-py3-none-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c2d9173014ad1e1d9df975c7a89bad013674c6b8bb72ab196332fb84f2479c79",
                "md5": "2ead698956e571b08fa28d62944807e0",
                "sha256": "0de09c34f53ce336408038cac0de9840c844a9cb21612d34277b82c482813057"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "2ead698956e571b08fa28d62944807e0",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 3151536,
            "upload_time": "2025-11-16T14:40:37",
            "upload_time_iso_8601": "2025-11-16T14:40:37.859683Z",
            "url": "https://files.pythonhosted.org/packages/c2/d9/173014ad1e1d9df975c7a89bad013674c6b8bb72ab196332fb84f2479c79/pytest_language_server-0.5.0-py3-none-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1b175d08c27071657e1cb4d3384305580817d463d17bdbb2c00f9dcd75b31987",
                "md5": "77b8a5f89e025a9b54343ab9f63d6489",
                "sha256": "be2d741bd5e00510cedadb2808c21e7bba1f94c256bcc49edd74eb003e6bcf01"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "77b8a5f89e025a9b54343ab9f63d6489",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 3264525,
            "upload_time": "2025-11-16T14:40:39",
            "upload_time_iso_8601": "2025-11-16T14:40:39.631327Z",
            "url": "https://files.pythonhosted.org/packages/1b/17/5d08c27071657e1cb4d3384305580817d463d17bdbb2c00f9dcd75b31987/pytest_language_server-0.5.0-py3-none-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b3eafc5a61dbd48e59b91b4b1d2da0797eb077d80ea2ac6851af5a51dc4afe1c",
                "md5": "8790ec4130d0c0f32ddc0c46568a48b0",
                "sha256": "e4f8d950c6e996df419f803e95ba9f66ddf1608dc4f0fd26ccda71d0a4512741"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "8790ec4130d0c0f32ddc0c46568a48b0",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 3259111,
            "upload_time": "2025-11-16T14:40:41",
            "upload_time_iso_8601": "2025-11-16T14:40:41.266381Z",
            "url": "https://files.pythonhosted.org/packages/b3/ea/fc5a61dbd48e59b91b4b1d2da0797eb077d80ea2ac6851af5a51dc4afe1c/pytest_language_server-0.5.0-py3-none-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d506edae0c9533555d6a8d2e110fa240fafbd056a169d27ee521212bb6b2edf2",
                "md5": "22443d8014df57fefea68cc094269602",
                "sha256": "e09d6b5697e46973b7be36661455ee1b615bd20096fe4edffbae188c7c8a33cc"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-win32.whl",
            "has_sig": false,
            "md5_digest": "22443d8014df57fefea68cc094269602",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 2565830,
            "upload_time": "2025-11-16T14:40:43",
            "upload_time_iso_8601": "2025-11-16T14:40:43.250899Z",
            "url": "https://files.pythonhosted.org/packages/d5/06/edae0c9533555d6a8d2e110fa240fafbd056a169d27ee521212bb6b2edf2/pytest_language_server-0.5.0-py3-none-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1ce4c886f41607d144c51f55c93081fedfcffd41fccfc2da4a1d555c2e655bd1",
                "md5": "c98ec3dc2164ec9f6d982bf39687213b",
                "sha256": "cd5acf15f662bbbe75430825f3597d0e9a01447ac25e7972165e736fb87db451"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0-py3-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "c98ec3dc2164ec9f6d982bf39687213b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 2812790,
            "upload_time": "2025-11-16T14:40:45",
            "upload_time_iso_8601": "2025-11-16T14:40:45.362867Z",
            "url": "https://files.pythonhosted.org/packages/1c/e4/c886f41607d144c51f55c93081fedfcffd41fccfc2da4a1d555c2e655bd1/pytest_language_server-0.5.0-py3-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0774a723ddc64daae6c10e821d676f68b2cef7382ad4a3783b45943e158c2faa",
                "md5": "8d349e7fec3d4de50edaa7ce4e8ea089",
                "sha256": "d89082b90837b7279b523b071302bcaa2a25a9bfddddbf7df6cb93161f91a451"
            },
            "downloads": -1,
            "filename": "pytest_language_server-0.5.0.tar.gz",
            "has_sig": false,
            "md5_digest": "8d349e7fec3d4de50edaa7ce4e8ea089",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 85093,
            "upload_time": "2025-11-16T14:40:46",
            "upload_time_iso_8601": "2025-11-16T14:40:46.801496Z",
            "url": "https://files.pythonhosted.org/packages/07/74/a723ddc64daae6c10e821d676f68b2cef7382ad4a3783b45943e158c2faa/pytest_language_server-0.5.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-11-16 14:40:46",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "bellini666",
    "github_project": "pytest-language-server",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "pytest-language-server"
}
        
Elapsed time: 2.15131s