kicad-sch-api 0.3.0__tar.gz → 0.3.1__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.

Potentially problematic release.


This version of kicad-sch-api might be problematic. Click here for more details.

Files changed (93) hide show
  1. {kicad_sch_api-0.3.0/kicad_sch_api.egg-info → kicad_sch_api-0.3.1}/PKG-INFO +1 -1
  2. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/__init__.py +2 -2
  3. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/formatter.py +1 -1
  4. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/parser.py +111 -7
  5. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1/kicad_sch_api.egg-info}/PKG-INFO +1 -1
  6. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/pyproject.toml +1 -1
  7. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/.claude/commands/dev/dead-code-analysis.md +0 -0
  8. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/.claude/commands/dev/publish-pypi.md +0 -0
  9. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/.claude/commands/dev/review-implementation.md +0 -0
  10. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/.claude/commands/dev/run-tests.md +0 -0
  11. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/.claude/commands/dev/update-and-commit.md +0 -0
  12. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/.claude/commands/dev/update-memory-bank.md +0 -0
  13. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/.claude/commands/test/run-reference-tests.md +0 -0
  14. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/CHANGELOG.md +0 -0
  15. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/LICENSE +0 -0
  16. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/MANIFEST.in +0 -0
  17. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/README.md +0 -0
  18. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/examples/advanced_usage.py +0 -0
  19. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/examples/basic_usage.py +0 -0
  20. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/examples/mcp_basic_example.py +0 -0
  21. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/examples/mcp_integration.py +0 -0
  22. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/examples/pin_to_pin_wiring_demo.py +0 -0
  23. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/examples/simple_circuit_with_pin_wiring.py +0 -0
  24. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/examples/simple_two_resistor_routing.py +0 -0
  25. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/cli.py +0 -0
  26. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/__init__.py +0 -0
  27. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/component_bounds.py +0 -0
  28. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/components.py +0 -0
  29. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/config.py +0 -0
  30. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/geometry.py +0 -0
  31. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/ic_manager.py +0 -0
  32. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/junctions.py +0 -0
  33. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/manhattan_routing.py +0 -0
  34. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/pin_utils.py +0 -0
  35. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/schematic.py +0 -0
  36. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/simple_manhattan.py +0 -0
  37. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/types.py +0 -0
  38. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/wire_routing.py +0 -0
  39. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/core/wires.py +0 -0
  40. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/discovery/__init__.py +0 -0
  41. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/discovery/search_index.py +0 -0
  42. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/library/__init__.py +0 -0
  43. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/library/cache.py +0 -0
  44. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/py.typed +0 -0
  45. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/utils/__init__.py +0 -0
  46. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api/utils/validation.py +0 -0
  47. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api.egg-info/SOURCES.txt +0 -0
  48. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api.egg-info/dependency_links.txt +0 -0
  49. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api.egg-info/entry_points.txt +0 -0
  50. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api.egg-info/requires.txt +0 -0
  51. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/kicad_sch_api.egg-info/top_level.txt +0 -0
  52. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/setup.cfg +0 -0
  53. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/README.md +0 -0
  54. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/blank_schematic/blank_schematic.kicad_pro +0 -0
  55. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/blank_schematic/blank_schematic.kicad_sch +0 -0
  56. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/multi_unit_7400/multi_unit_7400.kicad_pro +0 -0
  57. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/multi_unit_7400/multi_unit_7400.kicad_sch +0 -0
  58. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/power_symbols/power_symbols.kicad_pro +0 -0
  59. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/power_symbols/power_symbols.kicad_sch +0 -0
  60. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/resistor_divider/resistor_divider.kicad_pro +0 -0
  61. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/resistor_divider/resistor_divider.kicad_sch +0 -0
  62. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/sch_title/sch_title.kicad_pro +0 -0
  63. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/sch_title/sch_title.kicad_sch +0 -0
  64. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_extended_component/single_extended_component.kicad_pro +0 -0
  65. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_extended_component/single_extended_component.kicad_sch +0 -0
  66. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_hierarchical_sheet/single_hierarchical_sheet.kicad_pro +0 -0
  67. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_hierarchical_sheet/single_hierarchical_sheet.kicad_sch +0 -0
  68. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_hierarchical_sheet/subcircuit1.kicad_sch +0 -0
  69. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_label/single_label.kicad_pro +0 -0
  70. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_label/single_label.kicad_sch +0 -0
  71. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_label_hierarchical/single_label_hierarchical.kicad_pro +0 -0
  72. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_label_hierarchical/single_label_hierarchical.kicad_sch +0 -0
  73. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_resistor/single_resistor.kicad_pro +0 -0
  74. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_resistor/single_resistor.kicad_sch +0 -0
  75. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_text/single_text.kicad_pro +0 -0
  76. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_text/single_text.kicad_sch +0 -0
  77. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_text_box/single_text_box.kicad_pro +0 -0
  78. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_text_box/single_text_box.kicad_sch +0 -0
  79. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_wire/single_wire.kicad_pro +0 -0
  80. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/single_wire/single_wire.kicad_sch +0 -0
  81. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/two_resistors/two_resistors.kicad_pro +0 -0
  82. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/reference_tests/reference_kicad_projects/two_resistors/two_resistors.kicad_sch +0 -0
  83. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/test_bounding_box_rectangles.py +0 -0
  84. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/test_component_removal.py +0 -0
  85. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/test_element_removal.py +0 -0
  86. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/test_grid_snapping.py +0 -0
  87. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/test_manhattan_routing.py +0 -0
  88. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/test_parse_reference_rectangles.py +0 -0
  89. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/test_pin_positioning.py +0 -0
  90. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/test_pin_to_pin_wiring.py +0 -0
  91. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/test_rectangle.py +0 -0
  92. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/test_rectangle_roundtrip.py +0 -0
  93. {kicad_sch_api-0.3.0 → kicad_sch_api-0.3.1}/tests/test_removal_against_references.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kicad-sch-api
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Professional KiCAD schematic manipulation library with exact format preservation
5
5
  Author-email: Circuit-Synth <shane@circuit-synth.com>
6
6
  Maintainer-email: Circuit-Synth <shane@circuit-synth.com>
@@ -42,7 +42,7 @@ Advanced Usage:
42
42
  print(f"Found {len(issues)} validation issues")
43
43
  """
44
44
 
45
- __version__ = "0.3.0"
45
+ __version__ = "0.3.1"
46
46
  __author__ = "Circuit-Synth"
47
47
  __email__ = "info@circuit-synth.com"
48
48
 
@@ -55,7 +55,7 @@ from .library.cache import SymbolLibraryCache, get_symbol_cache
55
55
  from .utils.validation import ValidationError, ValidationIssue
56
56
 
57
57
  # Version info
58
- VERSION_INFO = (0, 3, 0)
58
+ VERSION_INFO = (0, 3, 1)
59
59
 
60
60
  # Public API
61
61
  __all__ = [
@@ -55,7 +55,7 @@ class ExactFormatter:
55
55
  self.rules["generator"] = FormatRule(inline=True, quote_indices={1})
56
56
  self.rules["generator_version"] = FormatRule(inline=True, quote_indices={1})
57
57
  self.rules["uuid"] = FormatRule(inline=True, quote_indices={1})
58
- self.rules["paper"] = FormatRule(inline=True) # No quotes for paper size (A4, A3, etc.)
58
+ self.rules["paper"] = FormatRule(inline=True, quote_indices={1}) # Paper size should be quoted per KiCad format
59
59
 
60
60
  # Title block
61
61
  self.rules["title_block"] = FormatRule(inline=False)
@@ -420,19 +420,123 @@ class SExpressionParser:
420
420
 
421
421
  def _parse_wire(self, item: List[Any]) -> Optional[Dict[str, Any]]:
422
422
  """Parse a wire definition."""
423
- # Implementation for wire parsing
424
- # This would parse pts, stroke, uuid elements
425
- return {}
423
+ wire_data = {
424
+ "points": [],
425
+ "stroke_width": 0.0,
426
+ "stroke_type": "default",
427
+ "uuid": None,
428
+ "wire_type": "wire" # Default to wire (vs bus)
429
+ }
430
+
431
+ for elem in item[1:]:
432
+ if not isinstance(elem, list):
433
+ continue
434
+
435
+ elem_type = str(elem[0]) if isinstance(elem[0], sexpdata.Symbol) else None
436
+
437
+ if elem_type == "pts":
438
+ # Parse points: (pts (xy x1 y1) (xy x2 y2) ...)
439
+ for pt in elem[1:]:
440
+ if isinstance(pt, list) and len(pt) >= 3:
441
+ if str(pt[0]) == "xy":
442
+ x, y = float(pt[1]), float(pt[2])
443
+ wire_data["points"].append({"x": x, "y": y})
444
+
445
+ elif elem_type == "stroke":
446
+ # Parse stroke: (stroke (width 0) (type default))
447
+ for stroke_elem in elem[1:]:
448
+ if isinstance(stroke_elem, list) and len(stroke_elem) >= 2:
449
+ stroke_type = str(stroke_elem[0])
450
+ if stroke_type == "width":
451
+ wire_data["stroke_width"] = float(stroke_elem[1])
452
+ elif stroke_type == "type":
453
+ wire_data["stroke_type"] = str(stroke_elem[1])
454
+
455
+ elif elem_type == "uuid":
456
+ wire_data["uuid"] = str(elem[1]) if len(elem) > 1 else None
457
+
458
+ # Only return wire if it has at least 2 points
459
+ if len(wire_data["points"]) >= 2:
460
+ return wire_data
461
+ else:
462
+ logger.warning(f"Wire has insufficient points: {len(wire_data['points'])}")
463
+ return None
426
464
 
427
465
  def _parse_junction(self, item: List[Any]) -> Optional[Dict[str, Any]]:
428
466
  """Parse a junction definition."""
429
- # Implementation for junction parsing
430
- return {}
467
+ junction_data = {
468
+ "position": {"x": 0, "y": 0},
469
+ "diameter": 0,
470
+ "color": (0, 0, 0, 0),
471
+ "uuid": None
472
+ }
473
+
474
+ for elem in item[1:]:
475
+ if not isinstance(elem, list):
476
+ continue
477
+
478
+ elem_type = str(elem[0]) if isinstance(elem[0], sexpdata.Symbol) else None
479
+
480
+ if elem_type == "at":
481
+ # Parse position: (at x y)
482
+ if len(elem) >= 3:
483
+ junction_data["position"] = {"x": float(elem[1]), "y": float(elem[2])}
484
+
485
+ elif elem_type == "diameter":
486
+ # Parse diameter: (diameter value)
487
+ if len(elem) >= 2:
488
+ junction_data["diameter"] = float(elem[1])
489
+
490
+ elif elem_type == "color":
491
+ # Parse color: (color r g b a)
492
+ if len(elem) >= 5:
493
+ junction_data["color"] = (int(elem[1]), int(elem[2]), int(elem[3]), int(elem[4]))
494
+
495
+ elif elem_type == "uuid":
496
+ junction_data["uuid"] = str(elem[1]) if len(elem) > 1 else None
497
+
498
+ return junction_data
431
499
 
432
500
  def _parse_label(self, item: List[Any]) -> Optional[Dict[str, Any]]:
433
501
  """Parse a label definition."""
434
- # Implementation for label parsing
435
- return {}
502
+ # Label format: (label "text" (at x y rotation) (effects ...) (uuid ...))
503
+ if len(item) < 2:
504
+ return None
505
+
506
+ label_data = {
507
+ "text": str(item[1]), # Label text is second element
508
+ "position": {"x": 0, "y": 0},
509
+ "rotation": 0,
510
+ "size": 1.27,
511
+ "uuid": None
512
+ }
513
+
514
+ for elem in item[2:]: # Skip label keyword and text
515
+ if not isinstance(elem, list):
516
+ continue
517
+
518
+ elem_type = str(elem[0]) if isinstance(elem[0], sexpdata.Symbol) else None
519
+
520
+ if elem_type == "at":
521
+ # Parse position: (at x y rotation)
522
+ if len(elem) >= 3:
523
+ label_data["position"] = {"x": float(elem[1]), "y": float(elem[2])}
524
+ if len(elem) >= 4:
525
+ label_data["rotation"] = float(elem[3])
526
+
527
+ elif elem_type == "effects":
528
+ # Parse effects for font size: (effects (font (size x y)) ...)
529
+ for effect_elem in elem[1:]:
530
+ if isinstance(effect_elem, list) and str(effect_elem[0]) == "font":
531
+ for font_elem in effect_elem[1:]:
532
+ if isinstance(font_elem, list) and str(font_elem[0]) == "size":
533
+ if len(font_elem) >= 2:
534
+ label_data["size"] = float(font_elem[1])
535
+
536
+ elif elem_type == "uuid":
537
+ label_data["uuid"] = str(elem[1]) if len(elem) > 1 else None
538
+
539
+ return label_data
436
540
 
437
541
  def _parse_rectangle(self, item: List[Any]) -> Optional[Dict[str, Any]]:
438
542
  """Parse a rectangle graphical element."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kicad-sch-api
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Professional KiCAD schematic manipulation library with exact format preservation
5
5
  Author-email: Circuit-Synth <shane@circuit-synth.com>
6
6
  Maintainer-email: Circuit-Synth <shane@circuit-synth.com>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "kicad-sch-api"
7
- version = "0.3.0"
7
+ version = "0.3.1"
8
8
  description = "Professional KiCAD schematic manipulation library with exact format preservation"
9
9
  readme = "README.md"
10
10
  license = "MIT"
File without changes
File without changes
File without changes
File without changes