kicad-sch-api 0.3.5__py3-none-any.whl → 0.4.1__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.
Files changed (81) 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/collections/__init__.py +2 -2
  10. kicad_sch_api/collections/base.py +5 -7
  11. kicad_sch_api/collections/components.py +24 -12
  12. kicad_sch_api/collections/junctions.py +31 -43
  13. kicad_sch_api/collections/labels.py +19 -27
  14. kicad_sch_api/collections/wires.py +17 -18
  15. kicad_sch_api/core/collections/__init__.py +5 -0
  16. kicad_sch_api/core/collections/base.py +248 -0
  17. kicad_sch_api/core/component_bounds.py +5 -0
  18. kicad_sch_api/core/components.py +67 -45
  19. kicad_sch_api/core/config.py +85 -3
  20. kicad_sch_api/core/factories/__init__.py +5 -0
  21. kicad_sch_api/core/factories/element_factory.py +276 -0
  22. kicad_sch_api/core/formatter.py +3 -1
  23. kicad_sch_api/core/junctions.py +26 -75
  24. kicad_sch_api/core/labels.py +29 -53
  25. kicad_sch_api/core/managers/__init__.py +26 -0
  26. kicad_sch_api/core/managers/file_io.py +244 -0
  27. kicad_sch_api/core/managers/format_sync.py +501 -0
  28. kicad_sch_api/core/managers/graphics.py +579 -0
  29. kicad_sch_api/core/managers/metadata.py +269 -0
  30. kicad_sch_api/core/managers/sheet.py +454 -0
  31. kicad_sch_api/core/managers/text_elements.py +536 -0
  32. kicad_sch_api/core/managers/validation.py +475 -0
  33. kicad_sch_api/core/managers/wire.py +352 -0
  34. kicad_sch_api/core/nets.py +38 -43
  35. kicad_sch_api/core/no_connects.py +33 -55
  36. kicad_sch_api/core/parser.py +75 -1731
  37. kicad_sch_api/core/schematic.py +951 -1192
  38. kicad_sch_api/core/texts.py +28 -55
  39. kicad_sch_api/core/types.py +60 -22
  40. kicad_sch_api/core/wires.py +27 -75
  41. kicad_sch_api/geometry/font_metrics.py +3 -1
  42. kicad_sch_api/geometry/symbol_bbox.py +40 -21
  43. kicad_sch_api/interfaces/__init__.py +1 -1
  44. kicad_sch_api/interfaces/parser.py +1 -1
  45. kicad_sch_api/interfaces/repository.py +1 -1
  46. kicad_sch_api/interfaces/resolver.py +1 -1
  47. kicad_sch_api/parsers/__init__.py +2 -2
  48. kicad_sch_api/parsers/base.py +7 -10
  49. kicad_sch_api/parsers/elements/__init__.py +22 -0
  50. kicad_sch_api/parsers/elements/graphics_parser.py +564 -0
  51. kicad_sch_api/parsers/elements/label_parser.py +194 -0
  52. kicad_sch_api/parsers/elements/library_parser.py +165 -0
  53. kicad_sch_api/parsers/elements/metadata_parser.py +58 -0
  54. kicad_sch_api/parsers/elements/sheet_parser.py +352 -0
  55. kicad_sch_api/parsers/elements/symbol_parser.py +313 -0
  56. kicad_sch_api/parsers/elements/text_parser.py +250 -0
  57. kicad_sch_api/parsers/elements/wire_parser.py +242 -0
  58. kicad_sch_api/parsers/registry.py +4 -2
  59. kicad_sch_api/parsers/utils.py +80 -0
  60. kicad_sch_api/symbols/__init__.py +1 -1
  61. kicad_sch_api/symbols/cache.py +9 -12
  62. kicad_sch_api/symbols/resolver.py +20 -26
  63. kicad_sch_api/symbols/validators.py +188 -137
  64. kicad_sch_api/validation/__init__.py +25 -0
  65. kicad_sch_api/validation/erc.py +171 -0
  66. kicad_sch_api/validation/erc_models.py +203 -0
  67. kicad_sch_api/validation/pin_matrix.py +243 -0
  68. kicad_sch_api/validation/validators.py +391 -0
  69. {kicad_sch_api-0.3.5.dist-info → kicad_sch_api-0.4.1.dist-info}/METADATA +17 -9
  70. kicad_sch_api-0.4.1.dist-info/RECORD +87 -0
  71. kicad_sch_api/core/manhattan_routing.py +0 -430
  72. kicad_sch_api/core/simple_manhattan.py +0 -228
  73. kicad_sch_api/core/wire_routing.py +0 -380
  74. kicad_sch_api/parsers/label_parser.py +0 -254
  75. kicad_sch_api/parsers/symbol_parser.py +0 -227
  76. kicad_sch_api/parsers/wire_parser.py +0 -99
  77. kicad_sch_api-0.3.5.dist-info/RECORD +0 -58
  78. {kicad_sch_api-0.3.5.dist-info → kicad_sch_api-0.4.1.dist-info}/WHEEL +0 -0
  79. {kicad_sch_api-0.3.5.dist-info → kicad_sch_api-0.4.1.dist-info}/entry_points.txt +0 -0
  80. {kicad_sch_api-0.3.5.dist-info → kicad_sch_api-0.4.1.dist-info}/licenses/LICENSE +0 -0
  81. {kicad_sch_api-0.3.5.dist-info → kicad_sch_api-0.4.1.dist-info}/top_level.txt +0 -0
@@ -1,227 +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 = {
197
- "project": "",
198
- "path": "",
199
- "reference": "",
200
- "unit": 1
201
- }
202
-
203
- for elem in instance_element[1:]:
204
- if isinstance(elem, list) and len(elem) >= 2:
205
- elem_type = str(elem[0])
206
- if elem_type == "project":
207
- instance["project"] = str(elem[1])
208
- elif elem_type == "path":
209
- instance["path"] = str(elem[1])
210
- elif elem_type == "reference":
211
- instance["reference"] = str(elem[1])
212
- elif elem_type == "unit":
213
- try:
214
- instance["unit"] = int(elem[1])
215
- except (ValueError, IndexError):
216
- pass
217
-
218
- return instance if instance["reference"] else None
219
-
220
- def _parse_boolean(self, value: Any) -> bool:
221
- """Parse boolean value from S-expression."""
222
- if isinstance(value, str):
223
- return value.lower() in ("yes", "true", "1")
224
- elif isinstance(value, sexpdata.Symbol):
225
- return str(value).lower() in ("yes", "true", "1")
226
- else:
227
- 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,58 +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=VqVucNyFa6E86TX6z0EmJirjFU2scinMdOlIIzHzljc,626
5
- kicad_sch_api/collections/base.py,sha256=b1U7gIFOP0YEajUXc499aOoCBGm6UUsWUUj3-DiI0gs,8417
6
- kicad_sch_api/collections/components.py,sha256=7SKTVWnWvzqDkFtLemYd7iC1MaKjB7dpqmPjtNQVIxQ,13888
7
- kicad_sch_api/collections/junctions.py,sha256=pSNWNDe4TZ8C1t0jC0BcMP3kzx15g4LaHBJwSrETsgU,11770
8
- kicad_sch_api/collections/labels.py,sha256=dGmlSOHON5YA0C1CfjT-mMutg10FGB4j5eyikA3LGT4,12314
9
- kicad_sch_api/collections/wires.py,sha256=OkCxvkljrq3AdjQD9iRpIsMqx3-RRPhnlOvoZaaFpd8,12375
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=tXRL18GObl2u94wl5jP-1ID56s_UD9F1gQ_iRIyZ_Kw,25290
13
- kicad_sch_api/core/config.py,sha256=itw0j3DeIEHaFVf8p3mfAS1SP6jclBwvMv7NPdkThE4,4309
14
- kicad_sch_api/core/formatter.py,sha256=zzZi0f06C1YWUy5l0WFS9G4KRTEzmAY3rFK3XGocvCo,22185
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=jOg2NSCkD7CvOwOubezzCDFMM7NM4kXoxBkcSZQrUio,11093
19
- kicad_sch_api/core/manhattan_routing.py,sha256=t_T2u0zsQB-a8dTijFmY-qFq-oDt2qDebYyXzD_pBWI,15989
20
- kicad_sch_api/core/nets.py,sha256=0kaYvRylAwP7XDuhTsONA-QuLu141C3Q9Cyu0plds94,9587
21
- kicad_sch_api/core/no_connects.py,sha256=kyvIkLuN4bizqacKb_a80kQvQ3HOpdCDcxIxby15dQE,9411
22
- kicad_sch_api/core/parser.py,sha256=UY_GNX1yHd3xgTVqZ9TZe1u94q4YZBo-NibsSH8Jy44,94983
23
- kicad_sch_api/core/pin_utils.py,sha256=XGEow3HzBTyT8a0B_ZC8foMvwzYaENSaqTUwDW1rz24,5417
24
- kicad_sch_api/core/schematic.py,sha256=Y1EnWifc_xjI9bHsHW3gwgQWwOrhRCXkIRKSomTBfA4,67496
25
- kicad_sch_api/core/simple_manhattan.py,sha256=CvIHvwmfABPF-COzhblYxEgRoR_R_eD-lmBFHHjDuMI,7241
26
- kicad_sch_api/core/texts.py,sha256=NUKoqldVI771w6aTCCNssuqyOLFGFSsRduD8iewBFQA,10726
27
- kicad_sch_api/core/types.py,sha256=DfXbIdw76nZZCQlat30wNzmec7oBUWnjHoWHjmo32Qc,14174
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/discovery/__init__.py,sha256=qSuCsnC-hVtaLYE8fwd-Gea6JKwEVGPQ-hSNDNJYsIU,329
31
- kicad_sch_api/discovery/search_index.py,sha256=KgQT8ipT9OU6ktUwhDZ37Mao0Cba0fJOsxUk9m8ZKbY,15856
32
- kicad_sch_api/geometry/__init__.py,sha256=hTBXkn8mZZCjzDIrtPv67QsnCYB77L67JjthQgEIX7o,716
33
- kicad_sch_api/geometry/font_metrics.py,sha256=qqnfBuRqiLQDnGkk64rKzdyvuSNU0uBfdp0TKEgzXds,831
34
- kicad_sch_api/geometry/symbol_bbox.py,sha256=ewd1HmGNae68zlxYnF2JMCvvjf53p1f6mXlpl0ixQq4,23902
35
- kicad_sch_api/interfaces/__init__.py,sha256=X85PQ2-ic4796xuTSUxnZP8iiliVzGTM2nCAylicTMw,434
36
- kicad_sch_api/interfaces/parser.py,sha256=y06cJsJ_OB2SgYZeqaix77j1m_pND3N0bBQVTvIl7gI,2007
37
- kicad_sch_api/interfaces/repository.py,sha256=qN-jCymSFIgGgWTBWrFGSrLNVXuFRr1mPXvpNmLrXH0,1762
38
- kicad_sch_api/interfaces/resolver.py,sha256=St1mCvRem661Bt1H_gPiWQxIaD1edkFEoNfn41Txmoo,2935
39
- kicad_sch_api/library/__init__.py,sha256=NG9UTdcpn25Bl9tPsYs9ED7bvpaVPVdtLMbnxkQkOnU,250
40
- kicad_sch_api/library/cache.py,sha256=7na88grl465WHwUOGuOzYrrWwjsMBXhXVtxhnaJ9GBY,33208
41
- kicad_sch_api/parsers/__init__.py,sha256=8GwbDcj1iJnGjcqXEwqqbRbIBr163_SqdntY6CP1K-g,356
42
- kicad_sch_api/parsers/base.py,sha256=P4MPkowJibbrGWoZ2fvpgx5ZS9vQ4FsiJqXTBRx3WX0,4633
43
- kicad_sch_api/parsers/label_parser.py,sha256=K9xxh_ZHvVFf4C51KvdSwR-WtmNsS0PSCQ6zrkbUpXg,8685
44
- kicad_sch_api/parsers/registry.py,sha256=J1i5WQY-AS5jGxYKvcTNW01c368VV4VeGCmh-6ye89w,5067
45
- kicad_sch_api/parsers/symbol_parser.py,sha256=FWGSYYKWBInXv9v8EsqFbuapfs-K4jf6PQFvbWkK9eU,8465
46
- kicad_sch_api/parsers/wire_parser.py,sha256=AEVc8Z-qghTGKSY1CFGEnjXeBX7dDVENQxvLsBFzxqI,3418
47
- kicad_sch_api/symbols/__init__.py,sha256=VXZeUUHajFtXexFw6ZrLPxL231JN4Z9ZOchYZSHkrH0,500
48
- kicad_sch_api/symbols/cache.py,sha256=UOy8r02eWtBtbovcYNs-cWUYKhkaAzQHPmOLm_0tcBw,16221
49
- kicad_sch_api/symbols/resolver.py,sha256=CsvCzEzXa869IzJoD0k_BsRj_bAATJo4O4WO48IyuYs,12090
50
- kicad_sch_api/symbols/validators.py,sha256=Uu5VueSexLDPElx1nen7KuOs250tXEwYedHid7a5WsM,15836
51
- kicad_sch_api/utils/__init__.py,sha256=1V_yGgI7jro6MUc4Pviux_WIeJ1wmiYFID186SZwWLQ,277
52
- kicad_sch_api/utils/validation.py,sha256=XlWGRZJb3cOPYpU9sLQQgC_NASwbi6W-LCN7PzUmaPY,15626
53
- kicad_sch_api-0.3.5.dist-info/licenses/LICENSE,sha256=Em65Nvte1G9MHc0rHqtYuGkCPcshD588itTa358J6gs,1070
54
- kicad_sch_api-0.3.5.dist-info/METADATA,sha256=uxxdX5QZHo_K2VohvK4cWFDO8G0hEV03uRoo8Wt2hd8,17183
55
- kicad_sch_api-0.3.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
56
- kicad_sch_api-0.3.5.dist-info/entry_points.txt,sha256=VWKsFi2Jv7G_tmio3cNVhhIBfv_OZFaKa-T_ED84lc8,57
57
- kicad_sch_api-0.3.5.dist-info/top_level.txt,sha256=n0ex4gOJ1b_fARowcGqRzyOGZcHRhc5LZa6_vVgGxcI,14
58
- kicad_sch_api-0.3.5.dist-info/RECORD,,