The Import-LIB-KiCad-Plugin documentation registers third-party libraries
using `${KICAD_3RD_PARTY}` (without a KiCad-version prefix). KiCad accepts
both unprefixed and version-prefixed forms in lib-tables, and the analogous
`KICAD_SYMBOL_DIR` was already handled in `library_symbol.py`'s env-var
dictionary.
`KICAD_3RD_PARTY` was missing from both `_resolve_uri` env-var dictionaries
(in `python/commands/library.py` and `python/commands/library_symbol.py`),
so lib-table rows authored as `${KICAD_3RD_PARTY}/Foo.kicad_sym` or
`${KICAD_3RD_PARTY}/Foo.pretty` failed to substitute, were treated as
non-existent paths, and disappeared from `list_symbol_libraries` /
`list_libraries` results — even though KiCad's GUI showed them correctly.
Changes:
- Add `KICAD_3RD_PARTY` to both `_resolve_uri` env-var dictionaries.
- Add `KICAD_3RD_PARTY` fallback in
`SymbolLibraryManager._find_3rd_party_dir`.
- Refactor `LibraryManager._find_kicad_3rdparty_dir` to check all four
env-var forms (KICAD10/9/8_3RD_PARTY + KICAD_3RD_PARTY) consistently.
- Add regression tests in `tests/test_kicad_3rd_party_env_resolution.py`.
Reproduces with:
- Set `KICAD_3RD_PARTY` env var in the MCP server's environment.
- Register `(lib (name "Foo") (type "KiCad") (uri "\${KICAD_3RD_PARTY}/Foo.kicad_sym") ...)` in the global sym-lib-table.
- Place a real `Foo.kicad_sym` at the resolved path.
- Before: `list_symbol_libraries` does not return `Foo`.
- After: `Foo` is listed.
76 lines
2.9 KiB
Python
76 lines
2.9 KiB
Python
"""
|
|
Regression tests for ``${KICAD_3RD_PARTY}`` (no-version-prefix) URI resolution
|
|
in both the symbol and footprint library managers.
|
|
|
|
Background:
|
|
The Import-LIB-KiCad-Plugin (impart) documentation registers third-party
|
|
libraries using ``${KICAD_3RD_PARTY}`` without a KiCad-version prefix.
|
|
KiCad accepts both unprefixed and version-prefixed forms in lib-tables.
|
|
|
|
Prior to this fix the env-var dictionaries in ``_resolve_uri`` only handled
|
|
``KICAD8/9/10_3RD_PARTY`` (analogous to ``KICAD_SYMBOL_DIR`` which *was*
|
|
in the dictionary without a prefix). Lib-table rows authored as
|
|
``${KICAD_3RD_PARTY}/Foo.kicad_sym`` or ``${KICAD_3RD_PARTY}/Foo.pretty``
|
|
therefore failed to resolve and disappeared from MCP listings even though
|
|
KiCad's GUI showed them correctly.
|
|
"""
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent / "python"))
|
|
|
|
from commands.library import LibraryManager
|
|
from commands.library_symbol import SymbolLibraryManager
|
|
|
|
|
|
@pytest.mark.unit
|
|
def test_symbol_manager_resolves_unprefixed_kicad_3rd_party(monkeypatch, tmp_path):
|
|
monkeypatch.setenv("KICAD_3RD_PARTY", str(tmp_path))
|
|
target = tmp_path / "EasyEDA.kicad_sym"
|
|
target.touch()
|
|
|
|
manager = SymbolLibraryManager.__new__(SymbolLibraryManager)
|
|
manager.project_path = None
|
|
|
|
resolved = manager._resolve_uri("${KICAD_3RD_PARTY}/EasyEDA.kicad_sym")
|
|
assert resolved == str(target)
|
|
|
|
|
|
@pytest.mark.unit
|
|
def test_library_manager_resolves_unprefixed_kicad_3rd_party(monkeypatch, tmp_path):
|
|
monkeypatch.setenv("KICAD_3RD_PARTY", str(tmp_path))
|
|
target_dir = tmp_path / "EasyEDA.pretty"
|
|
target_dir.mkdir()
|
|
|
|
manager = LibraryManager.__new__(LibraryManager)
|
|
manager.project_path = None
|
|
|
|
resolved = manager._resolve_uri("${KICAD_3RD_PARTY}/EasyEDA.pretty")
|
|
assert resolved == str(target_dir)
|
|
|
|
|
|
@pytest.mark.unit
|
|
def test_versioned_and_unprefixed_forms_both_work(monkeypatch, tmp_path):
|
|
"""Both ``${KICAD10_3RD_PARTY}`` and ``${KICAD_3RD_PARTY}`` must resolve when
|
|
the corresponding env vars are set, even pointing at the same directory."""
|
|
monkeypatch.setenv("KICAD10_3RD_PARTY", str(tmp_path))
|
|
monkeypatch.setenv("KICAD_3RD_PARTY", str(tmp_path))
|
|
|
|
sym_target = tmp_path / "Mixed.kicad_sym"
|
|
sym_target.touch()
|
|
fp_target = tmp_path / "Mixed.pretty"
|
|
fp_target.mkdir()
|
|
|
|
sym_mgr = SymbolLibraryManager.__new__(SymbolLibraryManager)
|
|
sym_mgr.project_path = None
|
|
fp_mgr = LibraryManager.__new__(LibraryManager)
|
|
fp_mgr.project_path = None
|
|
|
|
assert sym_mgr._resolve_uri("${KICAD10_3RD_PARTY}/Mixed.kicad_sym") == str(sym_target)
|
|
assert sym_mgr._resolve_uri("${KICAD_3RD_PARTY}/Mixed.kicad_sym") == str(sym_target)
|
|
assert fp_mgr._resolve_uri("${KICAD10_3RD_PARTY}/Mixed.pretty") == str(fp_target)
|
|
assert fp_mgr._resolve_uri("${KICAD_3RD_PARTY}/Mixed.pretty") == str(fp_target)
|