kicad-sch-api 0.3.2__py3-none-any.whl → 0.3.5__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 (39) hide show
  1. kicad_sch_api/__init__.py +2 -2
  2. kicad_sch_api/collections/__init__.py +21 -0
  3. kicad_sch_api/collections/base.py +296 -0
  4. kicad_sch_api/collections/components.py +422 -0
  5. kicad_sch_api/collections/junctions.py +378 -0
  6. kicad_sch_api/collections/labels.py +412 -0
  7. kicad_sch_api/collections/wires.py +407 -0
  8. kicad_sch_api/core/formatter.py +31 -0
  9. kicad_sch_api/core/labels.py +348 -0
  10. kicad_sch_api/core/nets.py +310 -0
  11. kicad_sch_api/core/no_connects.py +274 -0
  12. kicad_sch_api/core/parser.py +72 -0
  13. kicad_sch_api/core/schematic.py +185 -9
  14. kicad_sch_api/core/texts.py +343 -0
  15. kicad_sch_api/core/types.py +26 -0
  16. kicad_sch_api/geometry/__init__.py +26 -0
  17. kicad_sch_api/geometry/font_metrics.py +20 -0
  18. kicad_sch_api/geometry/symbol_bbox.py +589 -0
  19. kicad_sch_api/interfaces/__init__.py +17 -0
  20. kicad_sch_api/interfaces/parser.py +76 -0
  21. kicad_sch_api/interfaces/repository.py +70 -0
  22. kicad_sch_api/interfaces/resolver.py +117 -0
  23. kicad_sch_api/parsers/__init__.py +14 -0
  24. kicad_sch_api/parsers/base.py +148 -0
  25. kicad_sch_api/parsers/label_parser.py +254 -0
  26. kicad_sch_api/parsers/registry.py +153 -0
  27. kicad_sch_api/parsers/symbol_parser.py +227 -0
  28. kicad_sch_api/parsers/wire_parser.py +99 -0
  29. kicad_sch_api/symbols/__init__.py +18 -0
  30. kicad_sch_api/symbols/cache.py +470 -0
  31. kicad_sch_api/symbols/resolver.py +367 -0
  32. kicad_sch_api/symbols/validators.py +453 -0
  33. {kicad_sch_api-0.3.2.dist-info → kicad_sch_api-0.3.5.dist-info}/METADATA +1 -1
  34. kicad_sch_api-0.3.5.dist-info/RECORD +58 -0
  35. kicad_sch_api-0.3.2.dist-info/RECORD +0 -31
  36. {kicad_sch_api-0.3.2.dist-info → kicad_sch_api-0.3.5.dist-info}/WHEEL +0 -0
  37. {kicad_sch_api-0.3.2.dist-info → kicad_sch_api-0.3.5.dist-info}/entry_points.txt +0 -0
  38. {kicad_sch_api-0.3.2.dist-info → kicad_sch_api-0.3.5.dist-info}/licenses/LICENSE +0 -0
  39. {kicad_sch_api-0.3.2.dist-info → kicad_sch_api-0.3.5.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,453 @@
1
+ """
2
+ Symbol validation for KiCAD symbol definitions.
3
+
4
+ Provides comprehensive validation for symbol definitions, inheritance chains,
5
+ and symbol data integrity.
6
+ """
7
+
8
+ import logging
9
+ from typing import Any, Dict, List, Optional, Set, Tuple
10
+
11
+ from ..library.cache import SymbolDefinition
12
+ from ..utils.validation import ValidationError, ValidationIssue
13
+ from .cache import ISymbolCache
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class SymbolValidator:
19
+ """
20
+ Comprehensive validator for symbol definitions and inheritance.
21
+
22
+ Provides detailed validation with specific error reporting for
23
+ symbol issues that could affect schematic generation.
24
+ """
25
+
26
+ def __init__(self, cache: Optional[ISymbolCache] = None):
27
+ """
28
+ Initialize symbol validator.
29
+
30
+ Args:
31
+ cache: Optional symbol cache for inheritance validation
32
+ """
33
+ self._cache = cache
34
+ self._validation_rules = self._initialize_validation_rules()
35
+
36
+ def validate_symbol(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
37
+ """
38
+ Validate a symbol definition comprehensively.
39
+
40
+ Args:
41
+ symbol: Symbol to validate
42
+
43
+ Returns:
44
+ List of validation issues found
45
+ """
46
+ issues = []
47
+
48
+ # Run all validation rules
49
+ for rule_name, rule_func in self._validation_rules.items():
50
+ try:
51
+ rule_issues = rule_func(symbol)
52
+ issues.extend(rule_issues)
53
+ except Exception as e:
54
+ issues.append(ValidationIssue(
55
+ category="validation",
56
+ message=f"Validation rule '{rule_name}' failed: {e}",
57
+ level="error",
58
+ context={"symbol": symbol.lib_id, "rule": rule_name}
59
+ ))
60
+
61
+ return issues
62
+
63
+ def validate_lib_id(self, lib_id: str) -> bool:
64
+ """
65
+ Validate library ID format.
66
+
67
+ Args:
68
+ lib_id: Library identifier to validate
69
+
70
+ Returns:
71
+ True if lib_id format is valid
72
+ """
73
+ if not lib_id or not isinstance(lib_id, str):
74
+ return False
75
+
76
+ if ":" not in lib_id:
77
+ return False
78
+
79
+ parts = lib_id.split(":")
80
+ if len(parts) != 2:
81
+ return False
82
+
83
+ library_name, symbol_name = parts
84
+ return bool(library_name.strip() and symbol_name.strip())
85
+
86
+ def validate_inheritance_chain(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
87
+ """
88
+ Validate symbol inheritance chain for cycles and missing parents.
89
+
90
+ Args:
91
+ symbol: Symbol to validate inheritance for
92
+
93
+ Returns:
94
+ List of inheritance-related validation issues
95
+ """
96
+ issues = []
97
+
98
+ if not symbol.extends:
99
+ return issues
100
+
101
+ if not self._cache:
102
+ issues.append(ValidationIssue(
103
+ category="inheritance",
104
+ message="Cannot validate inheritance without cache",
105
+ level="warning",
106
+ context={"symbol": symbol.lib_id}
107
+ ))
108
+ return issues
109
+
110
+ # Check for inheritance chain issues
111
+ visited = set()
112
+ current_lib_id = symbol.lib_id
113
+
114
+ while current_lib_id:
115
+ if current_lib_id in visited:
116
+ issues.append(ValidationIssue(
117
+ category="inheritance",
118
+ message=f"Circular inheritance detected in chain starting from {symbol.lib_id}",
119
+ level="error",
120
+ context={"symbol": symbol.lib_id, "cycle_point": current_lib_id}
121
+ ))
122
+ break
123
+
124
+ visited.add(current_lib_id)
125
+ current_symbol = self._cache.get_symbol(current_lib_id)
126
+
127
+ if not current_symbol:
128
+ issues.append(ValidationIssue(
129
+ category="inheritance",
130
+ message=f"Missing symbol in inheritance chain: {current_lib_id}",
131
+ level="error",
132
+ context={"symbol": symbol.lib_id, "missing": current_lib_id}
133
+ ))
134
+ break
135
+
136
+ if not current_symbol.extends:
137
+ break
138
+
139
+ # Resolve parent lib_id
140
+ parent_name = current_symbol.extends
141
+ if ":" in parent_name:
142
+ current_lib_id = parent_name
143
+ else:
144
+ current_lib_id = f"{current_symbol.library}:{parent_name}"
145
+
146
+ # Check if parent exists
147
+ if not self._cache.has_symbol(current_lib_id):
148
+ issues.append(ValidationIssue(
149
+ category="inheritance",
150
+ message=f"Parent symbol not found: {current_lib_id}",
151
+ level="error",
152
+ context={"symbol": symbol.lib_id, "parent": current_lib_id}
153
+ ))
154
+ break
155
+
156
+ return issues
157
+
158
+ def validate_symbol_integrity(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
159
+ """
160
+ Validate symbol data integrity and consistency.
161
+
162
+ Args:
163
+ symbol: Symbol to validate
164
+
165
+ Returns:
166
+ List of integrity validation issues
167
+ """
168
+ issues = []
169
+
170
+ # Validate pin integrity
171
+ pin_issues = self._validate_pins(symbol)
172
+ issues.extend(pin_issues)
173
+
174
+ # Validate graphic elements
175
+ graphics_issues = self._validate_graphics(symbol)
176
+ issues.extend(graphics_issues)
177
+
178
+ # Validate units
179
+ units_issues = self._validate_units(symbol)
180
+ issues.extend(units_issues)
181
+
182
+ return issues
183
+
184
+ def _initialize_validation_rules(self) -> Dict[str, callable]:
185
+ """Initialize all validation rules."""
186
+ return {
187
+ "lib_id_format": self._validate_lib_id_format,
188
+ "required_fields": self._validate_required_fields,
189
+ "reference_prefix": self._validate_reference_prefix,
190
+ "pin_consistency": self._validate_pin_consistency,
191
+ "pin_details": self._validate_pins,
192
+ "unit_consistency": self._validate_unit_consistency,
193
+ "unit_details": self._validate_units,
194
+ "extends_format": self._validate_extends_format,
195
+ }
196
+
197
+ def _validate_lib_id_format(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
198
+ """Validate lib_id format."""
199
+ issues = []
200
+
201
+ if not self.validate_lib_id(symbol.lib_id):
202
+ issues.append(ValidationIssue(
203
+ category="lib_id",
204
+ message=f"Invalid lib_id format: {symbol.lib_id}",
205
+ level="error",
206
+ context={"symbol": symbol.lib_id}
207
+ ))
208
+
209
+ return issues
210
+
211
+ def _validate_required_fields(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
212
+ """Validate required symbol fields."""
213
+ issues = []
214
+
215
+ if not symbol.name:
216
+ issues.append(ValidationIssue(
217
+ category="required_fields",
218
+ message="Symbol name is required",
219
+ level="error",
220
+ context={"symbol": symbol.lib_id}
221
+ ))
222
+
223
+ if not symbol.library:
224
+ issues.append(ValidationIssue(
225
+ category="required_fields",
226
+ message="Symbol library is required",
227
+ level="error",
228
+ context={"symbol": symbol.lib_id}
229
+ ))
230
+
231
+ if not symbol.reference_prefix:
232
+ issues.append(ValidationIssue(
233
+ category="required_fields",
234
+ message="Symbol reference prefix is missing",
235
+ level="warning",
236
+ context={"symbol": symbol.lib_id}
237
+ ))
238
+
239
+ return issues
240
+
241
+ def _validate_reference_prefix(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
242
+ """Validate reference prefix format."""
243
+ issues = []
244
+
245
+ if symbol.reference_prefix:
246
+ # Check for invalid characters
247
+ invalid_chars = set(symbol.reference_prefix) - set("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_")
248
+ if invalid_chars:
249
+ issues.append(ValidationIssue(
250
+ category="reference_prefix",
251
+ message=f"Reference prefix contains invalid characters: {invalid_chars}",
252
+ level="warning",
253
+ context={"symbol": symbol.lib_id, "prefix": symbol.reference_prefix}
254
+ ))
255
+
256
+ # Check for common patterns
257
+ if symbol.reference_prefix.lower() in ["u", "ic"] and not symbol.description:
258
+ issues.append(ValidationIssue(
259
+ category="reference_prefix",
260
+ message="Generic IC prefix 'U' - consider adding description",
261
+ level="info",
262
+ context={"symbol": symbol.lib_id}
263
+ ))
264
+
265
+ return issues
266
+
267
+ def _validate_pin_consistency(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
268
+ """Validate pin consistency and numbering."""
269
+ issues = []
270
+
271
+ if not symbol.pins:
272
+ issues.append(ValidationIssue(
273
+ category="symbol",
274
+ level="warning",
275
+ message="Symbol has no pins defined",
276
+ context={"symbol": symbol.lib_id}
277
+ ))
278
+ return issues
279
+
280
+ # Check for duplicate pin numbers
281
+ pin_numbers = [pin.number for pin in symbol.pins]
282
+ duplicates = set([num for num in pin_numbers if pin_numbers.count(num) > 1])
283
+
284
+ if duplicates:
285
+ issues.append(ValidationIssue(
286
+ category="symbol",
287
+ level="error",
288
+ message=f"Duplicate pin numbers found: {duplicates}",
289
+ context={"symbol": symbol.lib_id, "duplicates": list(duplicates)}
290
+ ))
291
+
292
+ # Check for pins with same position
293
+ pin_positions = [(pin.position.x, pin.position.y) for pin in symbol.pins]
294
+ for i, pos1 in enumerate(pin_positions):
295
+ for j, pos2 in enumerate(pin_positions[i+1:], i+1):
296
+ if pos1 == pos2:
297
+ issues.append(ValidationIssue(
298
+ category="symbol",
299
+ level="warning",
300
+ message=f"Pins at same position: {symbol.pins[i].number} and {symbol.pins[j].number}",
301
+ context={"symbol": symbol.lib_id, "position": pos1}
302
+ ))
303
+
304
+ return issues
305
+
306
+ def _validate_unit_consistency(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
307
+ """Validate unit consistency."""
308
+ issues = []
309
+
310
+ if symbol.units < 1:
311
+ issues.append(ValidationIssue(
312
+ category="symbol",
313
+ level="error",
314
+ message=f"Invalid unit count: {symbol.units}",
315
+ context={"symbol": symbol.lib_id}
316
+ ))
317
+
318
+ # Check unit names consistency
319
+ if symbol.unit_names:
320
+ for unit_num in symbol.unit_names:
321
+ if unit_num < 1 or unit_num > symbol.units:
322
+ issues.append(ValidationIssue(
323
+ category="symbol",
324
+ level="warning",
325
+ message=f"Unit name defined for invalid unit number: {unit_num}",
326
+ context={"symbol": symbol.lib_id, "unit": unit_num}
327
+ ))
328
+
329
+ return issues
330
+
331
+ def _validate_extends_format(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
332
+ """Validate extends directive format."""
333
+ issues = []
334
+
335
+ if symbol.extends is not None:
336
+ # Check extends format
337
+ if not symbol.extends.strip():
338
+ issues.append(ValidationIssue(
339
+ category="symbol",
340
+ level="error",
341
+ message="Empty extends directive",
342
+ context={"symbol": symbol.lib_id}
343
+ ))
344
+
345
+ # Check for self-reference
346
+ if symbol.extends == symbol.name:
347
+ issues.append(ValidationIssue(
348
+ category="symbol",
349
+ level="error",
350
+ message="Symbol cannot extend itself",
351
+ context={"symbol": symbol.lib_id}
352
+ ))
353
+
354
+ return issues
355
+
356
+ def _validate_pins(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
357
+ """Validate pin definitions."""
358
+ issues = []
359
+
360
+ for pin in symbol.pins:
361
+ # Validate pin number
362
+ if not pin.number:
363
+ issues.append(ValidationIssue(
364
+ category="symbol",
365
+ level="error",
366
+ message="Pin missing number",
367
+ context={"symbol": symbol.lib_id}
368
+ ))
369
+
370
+ # Validate pin name
371
+ if not pin.name:
372
+ issues.append(ValidationIssue(
373
+ category="symbol",
374
+ level="warning",
375
+ message=f"Pin {pin.number} missing name",
376
+ context={"symbol": symbol.lib_id, "pin": pin.number}
377
+ ))
378
+
379
+ # Validate pin type
380
+ if not hasattr(pin, 'pin_type') or not pin.pin_type:
381
+ issues.append(ValidationIssue(
382
+ category="symbol",
383
+ level="warning",
384
+ message=f"Pin {pin.number} missing pin type",
385
+ context={"symbol": symbol.lib_id, "pin": pin.number}
386
+ ))
387
+
388
+ return issues
389
+
390
+ def _validate_graphics(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
391
+ """Validate graphic elements."""
392
+ issues = []
393
+
394
+ if not symbol.graphic_elements:
395
+ issues.append(ValidationIssue(
396
+ category="symbol",
397
+ level="info",
398
+ message="Symbol has no graphic elements",
399
+ context={"symbol": symbol.lib_id}
400
+ ))
401
+
402
+ # Could add more graphic validation here
403
+ # - Check for overlapping elements
404
+ # - Validate coordinate ranges
405
+ # - Check fill/stroke consistency
406
+
407
+ return issues
408
+
409
+ def _validate_units(self, symbol: SymbolDefinition) -> List[ValidationIssue]:
410
+ """Validate unit definitions."""
411
+ issues = []
412
+
413
+ # Check if pins are distributed across units correctly
414
+ if symbol.units > 1:
415
+ unit_pins = {}
416
+ for pin in symbol.pins:
417
+ unit = getattr(pin, 'unit', 1)
418
+ if unit not in unit_pins:
419
+ unit_pins[unit] = []
420
+ unit_pins[unit].append(pin)
421
+
422
+ # Check for empty units
423
+ for unit_num in range(1, symbol.units + 1):
424
+ if unit_num not in unit_pins:
425
+ issues.append(ValidationIssue(
426
+ category="symbol",
427
+ level="warning",
428
+ message=f"Unit {unit_num} has no pins",
429
+ context={"symbol": symbol.lib_id, "unit": unit_num}
430
+ ))
431
+
432
+ return issues
433
+
434
+ def get_validation_summary(self, issues: List[ValidationIssue]) -> Dict[str, Any]:
435
+ """
436
+ Get validation summary statistics.
437
+
438
+ Args:
439
+ issues: List of validation issues
440
+
441
+ Returns:
442
+ Summary dictionary with issue counts and severity
443
+ """
444
+ summary = {
445
+ "total_issues": len(issues),
446
+ "error_count": len([i for i in issues if i.level.value == "error"]),
447
+ "warning_count": len([i for i in issues if i.level.value == "warning"]),
448
+ "info_count": len([i for i in issues if i.level.value == "info"]),
449
+ "severity": "error" if any(i.level.value == "error" for i in issues) else
450
+ "warning" if any(i.level.value == "warning" for i in issues) else "info"
451
+ }
452
+
453
+ return summary
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kicad-sch-api
3
- Version: 0.3.2
3
+ Version: 0.3.5
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>
@@ -0,0 +1,58 @@
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,,
@@ -1,31 +0,0 @@
1
- kicad_sch_api/__init__.py,sha256=6yDjQeaoOdZatCgDaIULVxwXqT1fjLSNjYU0yKRh9f4,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/core/__init__.py,sha256=ur_KeYBlGKl-e1hLpLdxAhGV2A-PCCGkcqd0r6KSeBA,566
5
- kicad_sch_api/core/component_bounds.py,sha256=BFYJYULyzs5it2hN7bHTimyS9Vet4dxsMklRStob-F4,17509
6
- kicad_sch_api/core/components.py,sha256=tXRL18GObl2u94wl5jP-1ID56s_UD9F1gQ_iRIyZ_Kw,25290
7
- kicad_sch_api/core/config.py,sha256=itw0j3DeIEHaFVf8p3mfAS1SP6jclBwvMv7NPdkThE4,4309
8
- kicad_sch_api/core/formatter.py,sha256=7kwM7WdbVjT8biirWSSFO44OMjeByvzYYr_-mpGiEA4,20862
9
- kicad_sch_api/core/geometry.py,sha256=27SgN0padLbQuTi8MV6UUCp6Pyaiv8V9gmYDOhfwny8,2947
10
- kicad_sch_api/core/ic_manager.py,sha256=Kg0HIOMU-TGXiIkrnwcHFQ1Kfv_3rW2U1cwBKJsKopc,7219
11
- kicad_sch_api/core/junctions.py,sha256=Ay6BsWX_DLs-wB0eMA2CytKKq0N8Ja41ZubJWpAqNgM,6122
12
- kicad_sch_api/core/manhattan_routing.py,sha256=t_T2u0zsQB-a8dTijFmY-qFq-oDt2qDebYyXzD_pBWI,15989
13
- kicad_sch_api/core/parser.py,sha256=UMTpwrxtyFM5cjAkgLWts6vBJ254gc4Hvx-puZydkVQ,92209
14
- kicad_sch_api/core/pin_utils.py,sha256=XGEow3HzBTyT8a0B_ZC8foMvwzYaENSaqTUwDW1rz24,5417
15
- kicad_sch_api/core/schematic.py,sha256=U9-wrhuGtgRqZJfc76Dj-g1_ZTjrT8R9LmfX-BIBH8w,61201
16
- kicad_sch_api/core/simple_manhattan.py,sha256=CvIHvwmfABPF-COzhblYxEgRoR_R_eD-lmBFHHjDuMI,7241
17
- kicad_sch_api/core/types.py,sha256=UmqIvEx_Pd3B9jhvtmgZxx4SAjHUeOZBOEc8VtRILZs,13716
18
- kicad_sch_api/core/wire_routing.py,sha256=G-C7S-ntQxwuu1z3OaaYlkURXwKE4r4xmhbbi6cvvaI,12830
19
- kicad_sch_api/core/wires.py,sha256=608t9oH4UzppdGgNgUd-ABK6T-ahyETZwhO_-CuKFO8,8319
20
- kicad_sch_api/discovery/__init__.py,sha256=qSuCsnC-hVtaLYE8fwd-Gea6JKwEVGPQ-hSNDNJYsIU,329
21
- kicad_sch_api/discovery/search_index.py,sha256=KgQT8ipT9OU6ktUwhDZ37Mao0Cba0fJOsxUk9m8ZKbY,15856
22
- kicad_sch_api/library/__init__.py,sha256=NG9UTdcpn25Bl9tPsYs9ED7bvpaVPVdtLMbnxkQkOnU,250
23
- kicad_sch_api/library/cache.py,sha256=7na88grl465WHwUOGuOzYrrWwjsMBXhXVtxhnaJ9GBY,33208
24
- kicad_sch_api/utils/__init__.py,sha256=1V_yGgI7jro6MUc4Pviux_WIeJ1wmiYFID186SZwWLQ,277
25
- kicad_sch_api/utils/validation.py,sha256=XlWGRZJb3cOPYpU9sLQQgC_NASwbi6W-LCN7PzUmaPY,15626
26
- kicad_sch_api-0.3.2.dist-info/licenses/LICENSE,sha256=Em65Nvte1G9MHc0rHqtYuGkCPcshD588itTa358J6gs,1070
27
- kicad_sch_api-0.3.2.dist-info/METADATA,sha256=m8NfvoWy9m4AfShTSlHkn2AMUzy1cZkxiQXPnF3e0a0,17183
28
- kicad_sch_api-0.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
- kicad_sch_api-0.3.2.dist-info/entry_points.txt,sha256=VWKsFi2Jv7G_tmio3cNVhhIBfv_OZFaKa-T_ED84lc8,57
30
- kicad_sch_api-0.3.2.dist-info/top_level.txt,sha256=n0ex4gOJ1b_fARowcGqRzyOGZcHRhc5LZa6_vVgGxcI,14
31
- kicad_sch_api-0.3.2.dist-info/RECORD,,