pytest-language-server 0.6.0__tar.gz → 0.7.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/.github/workflows/release.yml +63 -16
  2. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/AGENTS.md +24 -19
  3. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/Cargo.lock +1 -1
  4. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/Cargo.toml +1 -1
  5. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/PKG-INFO +1 -1
  6. pytest_language_server-0.7.2/demo.gif +0 -0
  7. pytest_language_server-0.7.2/demo.mp4 +0 -0
  8. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/demo.tape +7 -10
  9. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/intellij-plugin/build.sh +1 -1
  10. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/intellij-plugin/src/main/resources/META-INF/plugin.xml +2 -3
  11. pytest_language_server-0.7.2/extensions/intellij-plugin/src/main/resources/META-INF/python-support.xml +6 -0
  12. pytest_language_server-0.7.2/extensions/vscode-extension/LICENSE +21 -0
  13. pytest_language_server-0.7.2/extensions/vscode-extension/icon.png +0 -0
  14. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/vscode-extension/package.json +1 -1
  15. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/pyproject.toml +1 -1
  16. pytest_language_server-0.7.2/src/fixtures.rs +2254 -0
  17. pytest_language_server-0.7.2/src/main.rs +792 -0
  18. pytest_language_server-0.7.2/tests/test_fixtures.rs +2950 -0
  19. pytest_language_server-0.7.2/tests/test_lsp.rs +1181 -0
  20. pytest_language_server-0.7.2/tests/test_project/conftest.py +44 -0
  21. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/tests/test_project/subdir/conftest.py +4 -4
  22. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/tests/test_project/test_example.py +1 -1
  23. pytest_language_server-0.6.0/demo.gif +0 -0
  24. pytest_language_server-0.6.0/src/fixtures.rs +0 -4961
  25. pytest_language_server-0.6.0/src/main.rs +0 -1945
  26. pytest_language_server-0.6.0/tests/test_parser_api.rs +0 -24
  27. pytest_language_server-0.6.0/tests/test_project/conftest.py +0 -31
  28. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/.github/dependabot.yml +0 -0
  29. {pytest_language_server-0.6.0/extensions/vscode-extension → pytest_language_server-0.7.2/.github}/icon.png +0 -0
  30. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/.github/workflows/ci.yml +0 -0
  31. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/.github/workflows/security.yml +0 -0
  32. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/.gitignore +0 -0
  33. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/.pre-commit-config.yaml +0 -0
  34. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/CODE_ACTION_TESTING.md +0 -0
  35. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/EXTENSION_PUBLISHING.md +0 -0
  36. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/EXTENSION_SETUP.md +0 -0
  37. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/Formula/pytest-language-server.rb +0 -0
  38. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/LICENSE +0 -0
  39. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/PERFORMANCE_ANALYSIS.md +0 -0
  40. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/README.md +0 -0
  41. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/RELEASE.md +0 -0
  42. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/SECURITY.md +0 -0
  43. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/bump-version.sh +0 -0
  44. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/deny.toml +0 -0
  45. {pytest_language_server-0.6.0/extensions/vscode-extension → pytest_language_server-0.7.2/extensions/intellij-plugin}/LICENSE +0 -0
  46. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/intellij-plugin/README.md +0 -0
  47. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/intellij-plugin/src/main/java/com/github/bellini666/pytestlsp/PytestLanguageServerListener.kt +0 -0
  48. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/intellij-plugin/src/main/java/com/github/bellini666/pytestlsp/PytestLanguageServerService.kt +0 -0
  49. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/intellij-plugin/src/main/resources/META-INF/pluginIcon.png +0 -0
  50. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/intellij-plugin/src/main/resources/META-INF/pluginIcon.svg.png +0 -0
  51. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/vscode-extension/.vscodeignore +0 -0
  52. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/vscode-extension/README.md +0 -0
  53. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/vscode-extension/package-lock.json +0 -0
  54. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/vscode-extension/src/extension.ts +0 -0
  55. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/vscode-extension/tsconfig.json +0 -0
  56. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/extensions/vscode-extension/webpack.config.js +0 -0
  57. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/src/lib.rs +0 -0
  58. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/tests/manual_test.py +0 -0
  59. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/tests/test_project/subdir/test_hierarchy.py +0 -0
  60. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/tests/test_project/subdir/test_override.py +0 -0
  61. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/tests/test_project/test_parent_usage.py +0 -0
  62. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/tests/test_project/test_undeclared_example.py +0 -0
  63. {pytest_language_server-0.6.0 → pytest_language_server-0.7.2}/uv.lock +0 -0
@@ -117,7 +117,7 @@ jobs:
117
117
  strategy:
118
118
  matrix:
119
119
  include:
120
- - runner: macos-13
120
+ - runner: macos-15
121
121
  target: x86_64
122
122
  - runner: macos-14
123
123
  target: aarch64
@@ -223,7 +223,7 @@ jobs:
223
223
  - os: ubuntu-latest
224
224
  target: aarch64-unknown-linux-gnu
225
225
  binary_name: pytest-language-server-aarch64-unknown-linux-gnu
226
- - os: macos-13
226
+ - os: macos-15
227
227
  target: x86_64-apple-darwin
228
228
  binary_name: pytest-language-server-x86_64-apple-darwin
229
229
  - os: macos-14
@@ -330,25 +330,72 @@ jobs:
330
330
  uses: softprops/action-gh-release@v2
331
331
  with:
332
332
  files: extensions/intellij-plugin/dist/pytest-language-server-*.zip
333
- - name: Publish to JetBrains Marketplace
333
+ - name: Verify plugin compatibility
334
334
  run: |
335
- # Install plugin-verifier and marketplace tools
335
+ # Download plugin verifier
336
336
  curl -L https://github.com/JetBrains/intellij-plugin-verifier/releases/download/1.307/plugin-verifier-1.307-all.jar -o plugin-verifier.jar
337
- # For now, just upload to GitHub releases
338
- # Manual JetBrains publishing requires their CLI tool or web upload
339
- echo "Plugin built and uploaded to GitHub releases"
340
- echo "Upload manually to https://plugins.jetbrains.com/plugin/add"
337
+ # Run verification (informational only)
338
+ PLUGIN_ZIP=$(ls extensions/intellij-plugin/dist/pytest-language-server-*.zip | head -1)
339
+ java -jar plugin-verifier.jar check-plugin "$PLUGIN_ZIP" || true
340
+ continue-on-error: true
341
+ - name: Publish to JetBrains Marketplace
342
+ env:
343
+ JETBRAINS_TOKEN: ${{ secrets.JETBRAINS_TOKEN }}
344
+ JETBRAINS_PLUGIN_ID: ${{ secrets.JETBRAINS_PLUGIN_ID }}
345
+ run: |
346
+ PLUGIN_ZIP=$(ls extensions/intellij-plugin/dist/pytest-language-server-*.zip | head -1)
347
+
348
+ if [ -z "$JETBRAINS_TOKEN" ] || [ -z "$JETBRAINS_PLUGIN_ID" ]; then
349
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
350
+ echo "⚠️ JetBrains Marketplace publishing skipped"
351
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
352
+ echo ""
353
+ echo "✅ Plugin built successfully: $PLUGIN_ZIP"
354
+ echo "✅ Plugin uploaded to GitHub release"
355
+ echo ""
356
+ echo "📦 To publish to JetBrains Marketplace:"
357
+ echo ""
358
+ echo " Option 1 - Manual upload (first time):"
359
+ echo " 1. Visit https://plugins.jetbrains.com/plugin/add"
360
+ echo " 2. Download the plugin ZIP from GitHub releases"
361
+ echo " 3. Upload and complete the listing"
362
+ echo " 4. Note the plugin ID for automated future releases"
363
+ echo ""
364
+ echo " Option 2 - Automated (after first publish):"
365
+ echo " 1. Get permanent token: https://plugins.jetbrains.com/author/me/tokens"
366
+ echo " 2. Add secrets to repository settings:"
367
+ echo " - JETBRAINS_TOKEN: your permanent token"
368
+ echo " - JETBRAINS_PLUGIN_ID: plugin ID from marketplace"
369
+ echo " 3. Future releases will auto-publish"
370
+ echo ""
371
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
372
+ else
373
+ echo "🚀 Publishing to JetBrains Marketplace (Plugin ID: $JETBRAINS_PLUGIN_ID)..."
374
+
375
+ RESPONSE=$(curl -s -w "\n%{http_code}" \
376
+ --header "Authorization: Bearer $JETBRAINS_TOKEN" \
377
+ -F pluginId="$JETBRAINS_PLUGIN_ID" \
378
+ -F file=@"$PLUGIN_ZIP" \
379
+ https://plugins.jetbrains.com/plugin/uploadPlugin)
380
+
381
+ HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
382
+ BODY=$(echo "$RESPONSE" | head -n-1)
383
+
384
+ if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "201" ]; then
385
+ echo "✅ Successfully published to JetBrains Marketplace!"
386
+ else
387
+ echo "❌ Failed to publish to JetBrains Marketplace"
388
+ echo "HTTP Status: $HTTP_CODE"
389
+ echo "Response: $BODY"
390
+ exit 1
391
+ fi
392
+ fi
341
393
 
342
394
  publish-zed:
343
395
  name: Publish Zed extension
344
396
  runs-on: ubuntu-latest
345
- # Disabled until the extension is ready to be published
397
+ # Disabled: Extension must be published manually to zed-industries/extensions
398
+ # Automated publishing is disabled until further notice
346
399
  if: false
347
400
  steps:
348
- - uses: huacnlee/zed-extension-action@v1
349
- with:
350
- extension-name: pytest-language-server
351
- extension-path: extensions/zed-extension
352
- push-to: bellini666/extensions
353
- env:
354
- COMMITTER_TOKEN: ${{ secrets.COMMITTER_TOKEN }}
401
+ - uses: actions/checkout@v4
@@ -7,7 +7,7 @@ This document helps AI agents understand the pytest-language-server codebase str
7
7
  **pytest-language-server** is a Language Server Protocol (LSP) implementation for pytest fixtures, written in Rust. It provides IDE features like go-to-definition, find-references, and hover documentation for pytest fixtures.
8
8
 
9
9
  - **Language**: Rust (Edition 2021, MSRV 1.83)
10
- - **Lines of Code**: ~4,000 lines (2,501 in fixtures.rs, 1,574 in main.rs)
10
+ - **Lines of Code**: ~3,050 lines (2,256 in fixtures.rs, 794 in main.rs)
11
11
  - **Architecture**: Async LSP server using tower-lsp
12
12
  - **Key Features**: Fixture go-to-definition, find-references, hover docs, fixture overriding, undeclared fixture diagnostics
13
13
 
@@ -18,8 +18,8 @@ This document helps AI agents understand the pytest-language-server codebase str
18
18
  ```
19
19
  src/
20
20
  ├── lib.rs # Library exports (3 lines)
21
- ├── main.rs # LSP server implementation (~1,574 lines)
22
- └── fixtures.rs # Fixture analysis engine (~2,501 lines)
21
+ ├── main.rs # LSP server implementation (794 lines)
22
+ └── fixtures.rs # Fixture analysis engine (2,256 lines)
23
23
  ```
24
24
 
25
25
  ### Key Components
@@ -145,32 +145,37 @@ This is handled by `start_char` and `end_char` in `FixtureUsage`.
145
145
  ### Test Structure
146
146
 
147
147
  ```
148
+ src/
149
+ ├── fixtures.rs # Main code (2,256 lines)
150
+ └── main.rs # LSP server (794 lines)
151
+
148
152
  tests/
149
- ├── test_project/ # Fixture test files for integration tests
150
- ├── conftest.py
151
- │ ├── test_example.py
152
- ├── test_parent_usage.py
153
- │ └── subdir/
154
- ├── conftest.py
155
- │ ├── test_hierarchy.py
156
- │ └── test_override.py
157
- └── test_parser_api.rs # Integration tests
153
+ ├── test_fixtures.rs # FixtureDatabase integration tests (60 tests, 2,951 lines)
154
+ ├── test_lsp.rs # LSP protocol tests (13 tests, 1,187 lines)
155
+ └── test_project/ # Fixture test files for integration tests
156
+ ├── conftest.py
157
+ ├── test_example.py
158
+ ├── test_parent_usage.py
159
+ └── subdir/
160
+ ├── conftest.py
161
+ ├── test_hierarchy.py
162
+ └── test_override.py
158
163
  ```
159
164
 
160
165
  ### Running Tests
161
166
 
162
167
  ```bash
163
- cargo test # Run all tests
164
- cargo test --lib # Run library tests (fixtures.rs: 47 tests)
165
- cargo test --bin # Run binary tests (main.rs: 13 tests)
166
- RUST_LOG=debug cargo test # Run with debug logging
168
+ cargo test # Run all tests (73 total)
169
+ cargo test --test test_fixtures # Run FixtureDatabase tests (60 tests)
170
+ cargo test --test test_lsp # Run LSP protocol tests (13 tests)
171
+ RUST_LOG=debug cargo test # Run with debug logging
167
172
  ```
168
173
 
169
174
  ### Test Coverage
170
175
 
171
- - **60 total tests passing** (as of v0.5.1)
172
- - 47 tests in `src/fixtures.rs`
173
- - 13 tests in `src/main.rs`
176
+ - **73 total tests passing** (as of v0.6.0)
177
+ - 60 integration tests in `tests/test_fixtures.rs` (FixtureDatabase API)
178
+ - 13 integration tests in `tests/test_lsp.rs` (LSP protocol handlers)
174
179
 
175
180
  Key test areas:
176
181
  - Fixture definition extraction from various patterns
@@ -753,7 +753,7 @@ dependencies = [
753
753
 
754
754
  [[package]]
755
755
  name = "pytest-language-server"
756
- version = "0.6.0"
756
+ version = "0.7.2"
757
757
  dependencies = [
758
758
  "dashmap 6.1.0",
759
759
  "rustpython-parser",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "pytest-language-server"
3
- version = "0.6.0"
3
+ version = "0.7.2"
4
4
  edition = "2021"
5
5
  rust-version = "1.83"
6
6
  authors = ["Thiago Bellini Ribeiro <hackedbellini@gmail.com>"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytest-language-server
3
- Version: 0.6.0
3
+ Version: 0.7.2
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
Binary file
Binary file
@@ -13,10 +13,10 @@ Output demo.mp4
13
13
 
14
14
  Set Shell "bash"
15
15
  Set FontSize 12
16
- Set Width 1200
17
- Set Height 700
16
+ Set Width 800
17
+ Set Height 400
18
18
  Set Padding 10
19
- Set Framerate 20
19
+ Set Framerate 30
20
20
  Set Theme "Dracula"
21
21
 
22
22
  Hide
@@ -36,20 +36,17 @@ Hide
36
36
  Type ":set nu" Enter
37
37
  Show
38
38
 
39
- # Hover on sample_fixture
39
+ # Hover on sample_fixture (position cursor on the fixture name)
40
40
  Type "ggf(w"
41
41
  Sleep 1s
42
42
  Type "K"
43
- Sleep 3.5s
44
-
45
- # Close hover popup explicitly
46
- Escape
47
- Sleep 500ms
43
+ Sleep 3s
48
44
 
49
- # Go to definition on same fixture
45
+ # Go to definition (this will close hover and jump)
50
46
  Type "gd"
51
47
  Sleep 2.5s
52
48
  Ctrl+O
49
+ Sleep 500ms
53
50
 
54
51
  Type "ZQ"
55
52
  Sleep 300ms
@@ -19,7 +19,7 @@ cp src/main/resources/META-INF/plugin.xml build/META-INF/
19
19
  cp src/main/resources/META-INF/pluginIcon.png build/META-INF/
20
20
 
21
21
  # Copy bundled binaries if they exist
22
- if [ -d "src/main/resources/bin" ]; then
22
+ if [ -d "src/main/resources/bin" ] && [ -n "$(ls -A src/main/resources/bin 2>/dev/null)" ]; then
23
23
  echo "Copying bundled binaries..."
24
24
  mkdir -p build/bin
25
25
  cp -r src/main/resources/bin/* build/bin/
@@ -1,7 +1,7 @@
1
1
  <idea-plugin>
2
2
  <id>com.github.bellini666.pytest-language-server</id>
3
3
  <name>pytest Language Server</name>
4
- <version>0.6.0</version>
4
+ <version>0.7.2</version>
5
5
  <vendor email="hackedbellini@gmail.com" url="https://github.com/bellini666/pytest-language-server">Thiago Bellini Ribeiro</vendor>
6
6
 
7
7
  <description><![CDATA[
@@ -30,11 +30,10 @@
30
30
  <idea-version since-build="223" until-build="242.*"/>
31
31
 
32
32
  <depends>com.intellij.modules.platform</depends>
33
- <depends>com.intellij.modules.python</depends>
33
+ <depends optional="true" config-file="python-support.xml">com.intellij.modules.python</depends>
34
34
 
35
35
  <extensions defaultExtensionNs="com.intellij">
36
36
  <projectService serviceImplementation="com.github.bellini666.pytestlsp.PytestLanguageServerService"/>
37
- <fileType name="Python" extensions="py" implementationClass="com.jetbrains.python.PythonFileType"/>
38
37
  </extensions>
39
38
 
40
39
  <applicationListeners>
@@ -0,0 +1,6 @@
1
+ <idea-plugin>
2
+ <!-- This file is loaded only when com.intellij.modules.python is available -->
3
+ <extensions defaultExtensionNs="com.intellij">
4
+ <!-- Python-specific extensions can be added here if needed -->
5
+ </extensions>
6
+ </idea-plugin>
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Patrick Arminio
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -2,7 +2,7 @@
2
2
  "name": "pytest-language-server",
3
3
  "displayName": "pytest Language Server",
4
4
  "description": "A blazingly fast Language Server Protocol implementation for pytest fixtures",
5
- "version": "0.6.0",
5
+ "version": "0.7.2",
6
6
  "publisher": "bellini666",
7
7
  "license": "MIT",
8
8
  "author": "Thiago Bellini Ribeiro <hackedbellini@gmail.com>",
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "pytest-language-server"
7
- version = "0.6.0"
7
+ version = "0.7.2"
8
8
  description = "A blazingly fast Language Server Protocol implementation for pytest"
9
9
  authors = [{name = "Thiago Bellini Ribeiro", email = "hackedbellini@gmail.com"}]
10
10
  readme = "README.md"