kicad-sch-api 0.4.0__py3-none-any.whl → 0.4.2__py3-none-any.whl

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 (57) hide show
  1. kicad_sch_api/__init__.py +2 -2
  2. kicad_sch_api/cli/__init__.py +45 -0
  3. kicad_sch_api/cli/base.py +302 -0
  4. kicad_sch_api/cli/bom.py +164 -0
  5. kicad_sch_api/cli/erc.py +229 -0
  6. kicad_sch_api/cli/export_docs.py +289 -0
  7. kicad_sch_api/cli/netlist.py +94 -0
  8. kicad_sch_api/cli/types.py +43 -0
  9. kicad_sch_api/core/collections/__init__.py +5 -0
  10. kicad_sch_api/core/collections/base.py +248 -0
  11. kicad_sch_api/core/component_bounds.py +5 -0
  12. kicad_sch_api/core/components.py +142 -47
  13. kicad_sch_api/core/config.py +85 -3
  14. kicad_sch_api/core/factories/__init__.py +5 -0
  15. kicad_sch_api/core/factories/element_factory.py +276 -0
  16. kicad_sch_api/core/formatter.py +22 -5
  17. kicad_sch_api/core/junctions.py +26 -75
  18. kicad_sch_api/core/labels.py +28 -52
  19. kicad_sch_api/core/managers/file_io.py +3 -2
  20. kicad_sch_api/core/managers/metadata.py +6 -5
  21. kicad_sch_api/core/managers/validation.py +3 -2
  22. kicad_sch_api/core/managers/wire.py +7 -1
  23. kicad_sch_api/core/nets.py +38 -43
  24. kicad_sch_api/core/no_connects.py +29 -53
  25. kicad_sch_api/core/parser.py +75 -1765
  26. kicad_sch_api/core/schematic.py +211 -148
  27. kicad_sch_api/core/texts.py +28 -55
  28. kicad_sch_api/core/types.py +59 -18
  29. kicad_sch_api/core/wires.py +27 -75
  30. kicad_sch_api/parsers/elements/__init__.py +22 -0
  31. kicad_sch_api/parsers/elements/graphics_parser.py +564 -0
  32. kicad_sch_api/parsers/elements/label_parser.py +194 -0
  33. kicad_sch_api/parsers/elements/library_parser.py +165 -0
  34. kicad_sch_api/parsers/elements/metadata_parser.py +58 -0
  35. kicad_sch_api/parsers/elements/sheet_parser.py +352 -0
  36. kicad_sch_api/parsers/elements/symbol_parser.py +313 -0
  37. kicad_sch_api/parsers/elements/text_parser.py +250 -0
  38. kicad_sch_api/parsers/elements/wire_parser.py +242 -0
  39. kicad_sch_api/parsers/utils.py +80 -0
  40. kicad_sch_api/validation/__init__.py +25 -0
  41. kicad_sch_api/validation/erc.py +171 -0
  42. kicad_sch_api/validation/erc_models.py +203 -0
  43. kicad_sch_api/validation/pin_matrix.py +243 -0
  44. kicad_sch_api/validation/validators.py +391 -0
  45. {kicad_sch_api-0.4.0.dist-info → kicad_sch_api-0.4.2.dist-info}/METADATA +17 -9
  46. kicad_sch_api-0.4.2.dist-info/RECORD +87 -0
  47. kicad_sch_api/core/manhattan_routing.py +0 -430
  48. kicad_sch_api/core/simple_manhattan.py +0 -228
  49. kicad_sch_api/core/wire_routing.py +0 -380
  50. kicad_sch_api/parsers/label_parser.py +0 -254
  51. kicad_sch_api/parsers/symbol_parser.py +0 -222
  52. kicad_sch_api/parsers/wire_parser.py +0 -99
  53. kicad_sch_api-0.4.0.dist-info/RECORD +0 -67
  54. {kicad_sch_api-0.4.0.dist-info → kicad_sch_api-0.4.2.dist-info}/WHEEL +0 -0
  55. {kicad_sch_api-0.4.0.dist-info → kicad_sch_api-0.4.2.dist-info}/entry_points.txt +0 -0
  56. {kicad_sch_api-0.4.0.dist-info → kicad_sch_api-0.4.2.dist-info}/licenses/LICENSE +0 -0
  57. {kicad_sch_api-0.4.0.dist-info → kicad_sch_api-0.4.2.dist-info}/top_level.txt +0 -0
@@ -1,222 +0,0 @@
1
- """
2
- Symbol element parser for S-expression symbol definitions.
3
-
4
- Handles parsing of symbol elements with properties, positions, and library references.
5
- """
6
-
7
- import logging
8
- from typing import Any, Dict, List, Optional
9
-
10
- import sexpdata
11
-
12
- from .base import BaseElementParser
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
-
17
- class SymbolParser(BaseElementParser):
18
- """Parser for symbol S-expression elements."""
19
-
20
- def __init__(self):
21
- """Initialize symbol parser."""
22
- super().__init__("symbol")
23
-
24
- def parse_element(self, element: List[Any]) -> Optional[Dict[str, Any]]:
25
- """
26
- Parse a symbol S-expression element.
27
-
28
- Expected format:
29
- (symbol (lib_id "Device:R") (at x y angle) (property "Reference" "R1" ...)...)
30
-
31
- Args:
32
- element: Symbol S-expression element
33
-
34
- Returns:
35
- Parsed symbol data with library ID, position, and properties
36
- """
37
- symbol_data = {
38
- "lib_id": "",
39
- "position": {"x": 0, "y": 0, "angle": 0},
40
- "mirror": "",
41
- "unit": 1,
42
- "in_bom": True,
43
- "on_board": True,
44
- "fields_autoplaced": False,
45
- "uuid": None,
46
- "properties": [],
47
- "instances": [],
48
- }
49
-
50
- for elem in element[1:]:
51
- if not isinstance(elem, list):
52
- continue
53
-
54
- elem_type = str(elem[0]) if isinstance(elem[0], sexpdata.Symbol) else None
55
-
56
- if elem_type == "lib_id":
57
- symbol_data["lib_id"] = str(elem[1]) if len(elem) > 1 else ""
58
- elif elem_type == "at":
59
- self._parse_position(elem, symbol_data)
60
- elif elem_type == "mirror":
61
- symbol_data["mirror"] = str(elem[1]) if len(elem) > 1 else ""
62
- elif elem_type == "unit":
63
- symbol_data["unit"] = int(elem[1]) if len(elem) > 1 else 1
64
- elif elem_type == "in_bom":
65
- symbol_data["in_bom"] = self._parse_boolean(elem[1]) if len(elem) > 1 else True
66
- elif elem_type == "on_board":
67
- symbol_data["on_board"] = self._parse_boolean(elem[1]) if len(elem) > 1 else True
68
- elif elem_type == "fields_autoplaced":
69
- symbol_data["fields_autoplaced"] = True
70
- elif elem_type == "uuid":
71
- symbol_data["uuid"] = str(elem[1]) if len(elem) > 1 else None
72
- elif elem_type == "property":
73
- prop = self._parse_property(elem)
74
- if prop:
75
- symbol_data["properties"].append(prop)
76
- elif elem_type == "instances":
77
- symbol_data["instances"] = self._parse_instances(elem)
78
-
79
- return symbol_data
80
-
81
- def _parse_position(self, at_element: List[Any], symbol_data: Dict[str, Any]) -> None:
82
- """
83
- Parse position from at element.
84
-
85
- Args:
86
- at_element: (at x y [angle])
87
- symbol_data: Symbol data dictionary to update
88
- """
89
- try:
90
- if len(at_element) >= 3:
91
- symbol_data["position"]["x"] = float(at_element[1])
92
- symbol_data["position"]["y"] = float(at_element[2])
93
- if len(at_element) >= 4:
94
- symbol_data["position"]["angle"] = float(at_element[3])
95
- except (ValueError, IndexError) as e:
96
- self._logger.warning(f"Invalid position coordinates: {at_element}, error: {e}")
97
-
98
- def _parse_property(self, prop_element: List[Any]) -> Optional[Dict[str, Any]]:
99
- """
100
- Parse a property element.
101
-
102
- Args:
103
- prop_element: (property "name" "value" (at x y angle) ...)
104
-
105
- Returns:
106
- Parsed property data or None if invalid
107
- """
108
- if len(prop_element) < 3:
109
- return None
110
-
111
- prop_data = {
112
- "name": str(prop_element[1]),
113
- "value": str(prop_element[2]),
114
- "position": {"x": 0, "y": 0, "angle": 0},
115
- "effects": {},
116
- }
117
-
118
- # Parse additional property elements
119
- for elem in prop_element[3:]:
120
- if isinstance(elem, list) and len(elem) > 0:
121
- elem_type = str(elem[0])
122
- if elem_type == "at":
123
- self._parse_property_position(elem, prop_data)
124
- elif elem_type == "effects":
125
- prop_data["effects"] = self._parse_effects(elem)
126
-
127
- return prop_data
128
-
129
- def _parse_property_position(self, at_element: List[Any], prop_data: Dict[str, Any]) -> None:
130
- """Parse property position from at element."""
131
- try:
132
- if len(at_element) >= 3:
133
- prop_data["position"]["x"] = float(at_element[1])
134
- prop_data["position"]["y"] = float(at_element[2])
135
- if len(at_element) >= 4:
136
- prop_data["position"]["angle"] = float(at_element[3])
137
- except (ValueError, IndexError) as e:
138
- self._logger.warning(f"Invalid property position: {at_element}, error: {e}")
139
-
140
- def _parse_effects(self, effects_element: List[Any]) -> Dict[str, Any]:
141
- """Parse effects element for text formatting."""
142
- effects = {
143
- "font_size": 1.27,
144
- "font_thickness": 0.15,
145
- "bold": False,
146
- "italic": False,
147
- "hide": False,
148
- "justify": [],
149
- }
150
-
151
- for elem in effects_element[1:]:
152
- if isinstance(elem, list) and len(elem) > 0:
153
- elem_type = str(elem[0])
154
- if elem_type == "font":
155
- self._parse_font(elem, effects)
156
- elif elem_type == "justify":
157
- effects["justify"] = [str(j) for j in elem[1:]]
158
- elif elem_type == "hide":
159
- effects["hide"] = True
160
-
161
- return effects
162
-
163
- def _parse_font(self, font_element: List[Any], effects: Dict[str, Any]) -> None:
164
- """Parse font element within effects."""
165
- for elem in font_element[1:]:
166
- if isinstance(elem, list) and len(elem) > 0:
167
- elem_type = str(elem[0])
168
- if elem_type == "size":
169
- try:
170
- if len(elem) >= 3:
171
- effects["font_size"] = float(elem[1])
172
- except (ValueError, IndexError):
173
- pass
174
- elif elem_type == "thickness":
175
- try:
176
- effects["font_thickness"] = float(elem[1])
177
- except (ValueError, IndexError):
178
- pass
179
- elif elem_type == "bold":
180
- effects["bold"] = True
181
- elif elem_type == "italic":
182
- effects["italic"] = True
183
-
184
- def _parse_instances(self, instances_element: List[Any]) -> List[Dict[str, Any]]:
185
- """Parse instances element for symbol instances."""
186
- instances = []
187
- for elem in instances_element[1:]:
188
- if isinstance(elem, list) and len(elem) > 0 and str(elem[0]) == "instance":
189
- instance = self._parse_instance(elem)
190
- if instance:
191
- instances.append(instance)
192
- return instances
193
-
194
- def _parse_instance(self, instance_element: List[Any]) -> Optional[Dict[str, Any]]:
195
- """Parse a single instance element."""
196
- instance = {"project": "", "path": "", "reference": "", "unit": 1}
197
-
198
- for elem in instance_element[1:]:
199
- if isinstance(elem, list) and len(elem) >= 2:
200
- elem_type = str(elem[0])
201
- if elem_type == "project":
202
- instance["project"] = str(elem[1])
203
- elif elem_type == "path":
204
- instance["path"] = str(elem[1])
205
- elif elem_type == "reference":
206
- instance["reference"] = str(elem[1])
207
- elif elem_type == "unit":
208
- try:
209
- instance["unit"] = int(elem[1])
210
- except (ValueError, IndexError):
211
- pass
212
-
213
- return instance if instance["reference"] else None
214
-
215
- def _parse_boolean(self, value: Any) -> bool:
216
- """Parse boolean value from S-expression."""
217
- if isinstance(value, str):
218
- return value.lower() in ("yes", "true", "1")
219
- elif isinstance(value, sexpdata.Symbol):
220
- return str(value).lower() in ("yes", "true", "1")
221
- else:
222
- return bool(value)
@@ -1,99 +0,0 @@
1
- """
2
- Wire element parser for S-expression wire definitions.
3
-
4
- Handles parsing of wire elements with points, stroke properties, and UUIDs.
5
- """
6
-
7
- import logging
8
- from typing import Any, Dict, List, Optional
9
-
10
- import sexpdata
11
-
12
- from .base import BaseElementParser
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
-
17
- class WireParser(BaseElementParser):
18
- """Parser for wire S-expression elements."""
19
-
20
- def __init__(self):
21
- """Initialize wire parser."""
22
- super().__init__("wire")
23
-
24
- def parse_element(self, element: List[Any]) -> Optional[Dict[str, Any]]:
25
- """
26
- Parse a wire S-expression element.
27
-
28
- Expected format:
29
- (wire (pts (xy x1 y1) (xy x2 y2) ...) (stroke (width w) (type t)) (uuid "..."))
30
-
31
- Args:
32
- element: Wire S-expression element
33
-
34
- Returns:
35
- Parsed wire data with points, stroke, and UUID information
36
- """
37
- wire_data = {
38
- "points": [],
39
- "stroke_width": 0.0,
40
- "stroke_type": "default",
41
- "uuid": None,
42
- "wire_type": "wire", # Default to wire (vs bus)
43
- }
44
-
45
- for elem in element[1:]:
46
- if not isinstance(elem, list):
47
- continue
48
-
49
- elem_type = str(elem[0]) if isinstance(elem[0], sexpdata.Symbol) else None
50
-
51
- if elem_type == "pts":
52
- self._parse_points(elem, wire_data)
53
- elif elem_type == "stroke":
54
- self._parse_stroke(elem, wire_data)
55
- elif elem_type == "uuid":
56
- wire_data["uuid"] = str(elem[1]) if len(elem) > 1 else None
57
-
58
- # Validate wire has sufficient points
59
- if len(wire_data["points"]) >= 2:
60
- return wire_data
61
- else:
62
- self._logger.warning(f"Wire has insufficient points: {len(wire_data['points'])}")
63
- return None
64
-
65
- def _parse_points(self, pts_element: List[Any], wire_data: Dict[str, Any]) -> None:
66
- """
67
- Parse points from pts element.
68
-
69
- Args:
70
- pts_element: (pts (xy x1 y1) (xy x2 y2) ...)
71
- wire_data: Wire data dictionary to update
72
- """
73
- for pt in pts_element[1:]:
74
- if isinstance(pt, list) and len(pt) >= 3:
75
- if str(pt[0]) == "xy":
76
- try:
77
- x, y = float(pt[1]), float(pt[2])
78
- wire_data["points"].append({"x": x, "y": y})
79
- except (ValueError, IndexError) as e:
80
- self._logger.warning(f"Invalid point coordinates: {pt}, error: {e}")
81
-
82
- def _parse_stroke(self, stroke_element: List[Any], wire_data: Dict[str, Any]) -> None:
83
- """
84
- Parse stroke properties from stroke element.
85
-
86
- Args:
87
- stroke_element: (stroke (width w) (type t))
88
- wire_data: Wire data dictionary to update
89
- """
90
- for stroke_elem in stroke_element[1:]:
91
- if isinstance(stroke_elem, list) and len(stroke_elem) >= 2:
92
- stroke_type = str(stroke_elem[0])
93
- try:
94
- if stroke_type == "width":
95
- wire_data["stroke_width"] = float(stroke_elem[1])
96
- elif stroke_type == "type":
97
- wire_data["stroke_type"] = str(stroke_elem[1])
98
- except (ValueError, IndexError) as e:
99
- self._logger.warning(f"Invalid stroke property: {stroke_elem}, error: {e}")
@@ -1,67 +0,0 @@
1
- kicad_sch_api/__init__.py,sha256=87qLx-VMQTBHDVq_CiXW-6wyKtvLFc3AsKQaoLKsIbs,2919
2
- kicad_sch_api/cli.py,sha256=ZzmwzfHEvPgGfCiQBU4G2LBAyRtMNiBRoY21pivJSYc,7621
3
- kicad_sch_api/py.typed,sha256=e4ldqxwpY7pNDG1olbvj4HSKr8sZ9vxgA_2ek8xXn-Q,70
4
- kicad_sch_api/collections/__init__.py,sha256=I3DSWk0XmGE8J1fcTtiYOETaWrY-fFJPlz3UGUK2qXY,627
5
- kicad_sch_api/collections/base.py,sha256=7p-WVLg-2_uBS7z7mzwkOpCMwlR_VJZGr2iW_Hd1K3Q,8386
6
- kicad_sch_api/collections/components.py,sha256=ofH3P38Ube3uxVvk_28gJwJPsdL6KA37rgxWNig6BGM,14023
7
- kicad_sch_api/collections/junctions.py,sha256=4bjuUKm-tCWSJJTtuPwgjYh0Xglg2SEG8IOAvhULgtg,11728
8
- kicad_sch_api/collections/labels.py,sha256=zg6_xe4ifwIbc8M1E5MDGTh8Ps57oBeqbS9MclrvxKU,12266
9
- kicad_sch_api/collections/wires.py,sha256=o2Y_KIwOmFMytdOc2MjgnoUrK4Woj7wR9ROj4uRTuY0,12394
10
- kicad_sch_api/core/__init__.py,sha256=ur_KeYBlGKl-e1hLpLdxAhGV2A-PCCGkcqd0r6KSeBA,566
11
- kicad_sch_api/core/component_bounds.py,sha256=BFYJYULyzs5it2hN7bHTimyS9Vet4dxsMklRStob-F4,17509
12
- kicad_sch_api/core/components.py,sha256=ilwZfrWUXQjtT3yB3yxT-H0X64izU3aXP6TdPZdki2k,25393
13
- kicad_sch_api/core/config.py,sha256=itw0j3DeIEHaFVf8p3mfAS1SP6jclBwvMv7NPdkThE4,4309
14
- kicad_sch_api/core/formatter.py,sha256=RGN1Y1Ne5uBhKU4XRINVBb0ph6pm5Khycdv352r3cDw,22207
15
- kicad_sch_api/core/geometry.py,sha256=27SgN0padLbQuTi8MV6UUCp6Pyaiv8V9gmYDOhfwny8,2947
16
- kicad_sch_api/core/ic_manager.py,sha256=Kg0HIOMU-TGXiIkrnwcHFQ1Kfv_3rW2U1cwBKJsKopc,7219
17
- kicad_sch_api/core/junctions.py,sha256=Ay6BsWX_DLs-wB0eMA2CytKKq0N8Ja41ZubJWpAqNgM,6122
18
- kicad_sch_api/core/labels.py,sha256=hkqZVd7wudl1-uil9jHt4k3vy1ZSX5JAyTFXktGauLo,11094
19
- kicad_sch_api/core/manhattan_routing.py,sha256=t_T2u0zsQB-a8dTijFmY-qFq-oDt2qDebYyXzD_pBWI,15989
20
- kicad_sch_api/core/nets.py,sha256=9bO8A1dzSuJ8aZ26-PHbUiWi9KYx6LqoXQHEKTCR7VA,9588
21
- kicad_sch_api/core/no_connects.py,sha256=LM__SeeK-0YPOLjkh1RXlBbaKnqehhbox7A8F6cUq0o,9426
22
- kicad_sch_api/core/parser.py,sha256=K3Dh5J3YswlXNakbR0FVcTPpuW4VK6Yg2e1a-yxH0xI,96227
23
- kicad_sch_api/core/pin_utils.py,sha256=XGEow3HzBTyT8a0B_ZC8foMvwzYaENSaqTUwDW1rz24,5417
24
- kicad_sch_api/core/schematic.py,sha256=OXOlC7GDfYFc1FlYHIUnHHp19DbzhRWBnNJjlma2NAk,56063
25
- kicad_sch_api/core/simple_manhattan.py,sha256=CvIHvwmfABPF-COzhblYxEgRoR_R_eD-lmBFHHjDuMI,7241
26
- kicad_sch_api/core/texts.py,sha256=el_9pr9VN-8v7miSG0HvOVsGEsMrkXNKpzJIRNxZmQ0,10727
27
- kicad_sch_api/core/types.py,sha256=tieyn5-L_hW6EnKR-bLVB_jtXV6NCNb0SbdYE2srW4s,14140
28
- kicad_sch_api/core/wire_routing.py,sha256=G-C7S-ntQxwuu1z3OaaYlkURXwKE4r4xmhbbi6cvvaI,12830
29
- kicad_sch_api/core/wires.py,sha256=608t9oH4UzppdGgNgUd-ABK6T-ahyETZwhO_-CuKFO8,8319
30
- kicad_sch_api/core/managers/__init__.py,sha256=Ec9H9RSBFt2MeJIhnZFUN9sa2ql0BSrO8FNOa1XsXeU,731
31
- kicad_sch_api/core/managers/file_io.py,sha256=dHHoi0BhIdpWmrpMQ0tdZJpbNd7dseytnY3UO-p5xWY,7605
32
- kicad_sch_api/core/managers/format_sync.py,sha256=ar0FfhwXrU2l5ATV0aW5KtVRfIM2iM1WoyGvXQh-ShY,16963
33
- kicad_sch_api/core/managers/graphics.py,sha256=-jd-JL1TOuDntNEQcSeJ56Ccrkuudmj1dJkRtLUtRog,18370
34
- kicad_sch_api/core/managers/metadata.py,sha256=Mjv-YjdaWRq-XlDZNlqgcWTyE1v8H7yLUXGWc9f9g7Q,8058
35
- kicad_sch_api/core/managers/sheet.py,sha256=jnnEBon0QmMh22-Ls7ZP5A_4FxM7bCyaJOF9AzZT1Kg,14816
36
- kicad_sch_api/core/managers/text_elements.py,sha256=utZIg488x9NLQID6ALbOcI0ZM2PfvgADVJ1jcbGP9jk,17319
37
- kicad_sch_api/core/managers/validation.py,sha256=Rz6e1m14Qxw1Izbqm7fAGySFOimfx9m5BWdnuomueg8,15792
38
- kicad_sch_api/core/managers/wire.py,sha256=Uvrqnacl0SjEfLmBwHVoyq0KXTM5lz7TRPdIffmKaG4,11596
39
- kicad_sch_api/discovery/__init__.py,sha256=qSuCsnC-hVtaLYE8fwd-Gea6JKwEVGPQ-hSNDNJYsIU,329
40
- kicad_sch_api/discovery/search_index.py,sha256=KgQT8ipT9OU6ktUwhDZ37Mao0Cba0fJOsxUk9m8ZKbY,15856
41
- kicad_sch_api/geometry/__init__.py,sha256=hTBXkn8mZZCjzDIrtPv67QsnCYB77L67JjthQgEIX7o,716
42
- kicad_sch_api/geometry/font_metrics.py,sha256=3f5_9ifxtDUigLDiafglO2pCgPE7JFDKqa-0uhLPkoQ,839
43
- kicad_sch_api/geometry/symbol_bbox.py,sha256=3zd9-M9ehue5_-Gpdm_Yht4W49CbE0YRsAhAzfqJGEg,24161
44
- kicad_sch_api/interfaces/__init__.py,sha256=ukuLgCT16e0sPLmrGb4HB_3DhGU1YriDEkeRgEBsQIA,435
45
- kicad_sch_api/interfaces/parser.py,sha256=J-b0czz1q_O81HlvIp3dHx53cm8UGSgQTd4xe5tBszk,2008
46
- kicad_sch_api/interfaces/repository.py,sha256=wFnWUCut6wPV9yDDE9k6zkhhijRnflbLteeXYtcU-gM,1763
47
- kicad_sch_api/interfaces/resolver.py,sha256=2_3et6VVnyZZ8VI5i-Q4C-4bBXKTAgYAEFxAFuOWEGw,2936
48
- kicad_sch_api/library/__init__.py,sha256=NG9UTdcpn25Bl9tPsYs9ED7bvpaVPVdtLMbnxkQkOnU,250
49
- kicad_sch_api/library/cache.py,sha256=7na88grl465WHwUOGuOzYrrWwjsMBXhXVtxhnaJ9GBY,33208
50
- kicad_sch_api/parsers/__init__.py,sha256=4TFc2duJMy6iRuk2dYbW4b7s-9H525iAsGU674_2a-E,357
51
- kicad_sch_api/parsers/base.py,sha256=vsKGxZkdzTNqrdbRPx11D4b3ebDm3LW65v2Xf4Q06_c,4569
52
- kicad_sch_api/parsers/label_parser.py,sha256=E9A2FY_BBZtFRxoT7g0Pg09J0J87nHAlMuTK4selsGQ,8692
53
- kicad_sch_api/parsers/registry.py,sha256=LoPvWIiGYysvTRtFfd8kWCXE0i535hoKYpdKs49Ygjs,5098
54
- kicad_sch_api/parsers/symbol_parser.py,sha256=RpTPMMOfNVHjJbXOrlJyTFWeVBH64Fq-dndG1F9Y_70,8411
55
- kicad_sch_api/parsers/wire_parser.py,sha256=xHSG-baXS0ncnv3TLjLnd9poXB4rhBdHmz6q99RadX8,3420
56
- kicad_sch_api/symbols/__init__.py,sha256=NfakJ5-8AQxq5vi8nZVuaUtDpWHfwHm5AD4rC-p9BZI,501
57
- kicad_sch_api/symbols/cache.py,sha256=pKFjmuyId-9gGPAue-1Rzy4MRsecoC4TMn0hn2n0Yqk,16204
58
- kicad_sch_api/symbols/resolver.py,sha256=w0jqepp9RwWqlwQHX28FpTn1aSz8iOf7kcJUOBMHwqE,12074
59
- kicad_sch_api/symbols/validators.py,sha256=5Ryt4rLHxDF3ALViaNLRrI3pYvOreVT51gpvhECTZms,17216
60
- kicad_sch_api/utils/__init__.py,sha256=1V_yGgI7jro6MUc4Pviux_WIeJ1wmiYFID186SZwWLQ,277
61
- kicad_sch_api/utils/validation.py,sha256=XlWGRZJb3cOPYpU9sLQQgC_NASwbi6W-LCN7PzUmaPY,15626
62
- kicad_sch_api-0.4.0.dist-info/licenses/LICENSE,sha256=Em65Nvte1G9MHc0rHqtYuGkCPcshD588itTa358J6gs,1070
63
- kicad_sch_api-0.4.0.dist-info/METADATA,sha256=my1z7F-NiRJw7Kh1c99d5bh0-ohJ8CuDNTfbxylPxwI,17183
64
- kicad_sch_api-0.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
65
- kicad_sch_api-0.4.0.dist-info/entry_points.txt,sha256=VWKsFi2Jv7G_tmio3cNVhhIBfv_OZFaKa-T_ED84lc8,57
66
- kicad_sch_api-0.4.0.dist-info/top_level.txt,sha256=n0ex4gOJ1b_fARowcGqRzyOGZcHRhc5LZa6_vVgGxcI,14
67
- kicad_sch_api-0.4.0.dist-info/RECORD,,