breadkit 0.1.0 → 0.2.0

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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/.codespellignore +2 -0
  3. data/.yamllint +16 -0
  4. data/README.md +109 -6
  5. data/data/boards/double_full.yml +18 -0
  6. data/data/boards/stripboard.yml +9 -0
  7. data/data/boards/universal.yml +8 -0
  8. data/data/parts/2n3904.yml +11 -0
  9. data/data/parts/2n7000_onsemi_to92.yml +10 -0
  10. data/data/parts/74hc00.yml +22 -0
  11. data/data/parts/74hc04.yml +22 -0
  12. data/data/parts/74hc08.yml +22 -0
  13. data/data/parts/74hc14.yml +22 -0
  14. data/data/parts/74hc165.yml +24 -0
  15. data/data/parts/74hc32.yml +22 -0
  16. data/data/parts/74hc595.yml +24 -0
  17. data/data/parts/active_buzzer.yml +8 -0
  18. data/data/parts/ams1117_3v3.yml +12 -0
  19. data/data/parts/arduino_nano.yml +70 -0
  20. data/data/parts/arduino_uno.yml +29 -26
  21. data/data/parts/atmega328p.yml +37 -0
  22. data/data/parts/attiny85.yml +16 -0
  23. data/data/parts/battery_box.yml +8 -0
  24. data/data/parts/cd4017.yml +24 -0
  25. data/data/parts/ck_bd04.yml +29 -0
  26. data/data/parts/crystal.yml +7 -0
  27. data/data/parts/dc_jack_2wire.yml +8 -0
  28. data/data/parts/diode.yml +1 -0
  29. data/data/parts/esp32_devkitc_v4_wroom32e.yml +86 -0
  30. data/data/parts/irlz44n.yml +10 -0
  31. data/data/parts/l293d.yml +24 -0
  32. data/data/parts/led.yml +1 -0
  33. data/data/parts/lm358.yml +16 -0
  34. data/data/parts/lm393.yml +16 -0
  35. data/data/parts/ne555.yml +2 -2
  36. data/data/parts/ntc_thermistor.yml +7 -0
  37. data/data/parts/photoresistor.yml +8 -0
  38. data/data/parts/pico.yml +89 -0
  39. data/data/parts/resistor.yml +1 -0
  40. data/data/parts/sc56_11ewa.yml +30 -0
  41. data/data/parts/seeed_xiao_samd21.yml +37 -0
  42. data/data/parts/shillehtek_mb102_4pin.yml +23 -0
  43. data/data/parts/slide_switch_spst.yml +8 -0
  44. data/data/parts/sparkfun_pro_micro_5v.yml +58 -0
  45. data/data/parts/transistor.yml +0 -1
  46. data/data/parts/ua7805.yml +10 -0
  47. data/data/parts/uln2003a.yml +23 -0
  48. data/data/parts/wp154a4sureqbfzgc.yml +11 -0
  49. data/docs/CLI.md +108 -0
  50. data/docs/COMPATIBILITY.md +60 -0
  51. data/docs/DECLARATIVE.md +138 -0
  52. data/docs/IR.md +42 -0
  53. data/docs/JUMPER_KIT.md +45 -0
  54. data/docs/LOCK.md +75 -0
  55. data/docs/LSP.md +59 -0
  56. data/docs/MB102_POWER.md +11 -0
  57. data/docs/MCP.md +44 -0
  58. data/docs/RAKE.md +19 -0
  59. data/docs/dsl.md +197 -6
  60. data/exe/breadkit-lsp +13 -0
  61. data/exe/breadkit-mcp +12 -0
  62. data/lib/breadkit/analysis.rb +174 -50
  63. data/lib/breadkit/board.rb +152 -4
  64. data/lib/breadkit/cli.rb +229 -13
  65. data/lib/breadkit/color.rb +38 -0
  66. data/lib/breadkit/dc_analysis.rb +261 -0
  67. data/lib/breadkit/dsl.rb +205 -24
  68. data/lib/breadkit/exporters.rb +202 -0
  69. data/lib/breadkit/formatter.rb +52 -0
  70. data/lib/breadkit/fritzing_export.rb +256 -0
  71. data/lib/breadkit/ir.rb +154 -22
  72. data/lib/breadkit/jumper_kit.rb +127 -0
  73. data/lib/breadkit/lsp_server.rb +248 -0
  74. data/lib/breadkit/mcp_server.rb +133 -0
  75. data/lib/breadkit/model.rb +47 -5
  76. data/lib/breadkit/part_library.rb +156 -3
  77. data/lib/breadkit/part_lock.rb +107 -0
  78. data/lib/breadkit/patterns.rb +119 -0
  79. data/lib/breadkit/rake_task.rb +25 -0
  80. data/lib/breadkit/resolver.rb +160 -28
  81. data/lib/breadkit/structured_input.rb +275 -0
  82. data/lib/breadkit/templates/555.bk.rb +34 -0
  83. data/lib/breadkit/templates/arduino.bk.rb +17 -0
  84. data/lib/breadkit/templates/led.bk.rb +21 -0
  85. data/lib/breadkit/value.rb +42 -3
  86. data/lib/breadkit/version.rb +1 -1
  87. data/lib/breadkit/wire_suggestions.rb +106 -0
  88. data/lib/breadkit.rb +28 -3
  89. data/package.json +1 -1
  90. data/schema/board-v1.json +38 -0
  91. data/schema/ir-v1.json +56 -11
  92. data/schema/ir-v2.json +173 -0
  93. data/schema/part-v1.json +52 -4
  94. data/sig/breadkit.rbs +107 -5
  95. metadata +119 -14
  96. data/docs/assets/01_led_button.svg +0 -12
  97. data/site/assets/01_led_button.svg +0 -14
  98. data/site/assets/03_arduino_blink.svg +0 -14
  99. data/site/favicon.svg +0 -7
  100. data/site/guide/components/index.html +0 -113
  101. data/site/guide/dsl/index.html +0 -132
  102. data/site/guide/index.html +0 -163
  103. data/site/index.html +0 -95
  104. data/site/styles.css +0 -14
data/schema/ir-v2.json ADDED
@@ -0,0 +1,173 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://breadkit.github.io/breadkit/schema/ir-v2.json",
4
+ "title": "Breadkit IR v2",
5
+ "type": "object",
6
+ "required": ["schema_version", "title", "boards", "components", "wires", "supplies", "labels", "expectations"],
7
+ "not": { "anyOf": [{ "required": ["board"] }, { "required": ["board_definition"] }] },
8
+ "properties": {
9
+ "schema_version": { "const": 2 },
10
+ "source_root": { "type": "string" },
11
+ "title": { "type": ["string", "null"] },
12
+ "steps": { "type": "array", "items": { "$ref": "#/$defs/step" } },
13
+ "part_definitions": { "type": "array", "items": { "$ref": "#/$defs/partDefinition" } },
14
+ "boards": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/namedBoard" } },
15
+ "lint_disables": { "type": "array", "items": { "type": "object" } },
16
+ "components": { "type": "array", "items": { "$ref": "#/$defs/component" } },
17
+ "wires": { "type": "array", "items": { "$ref": "#/$defs/wire" } },
18
+ "supplies": { "type": "array", "items": { "$ref": "#/$defs/supply" } },
19
+ "labels": { "type": "array", "items": { "$ref": "#/$defs/label" } },
20
+ "expectations": { "type": "array", "items": { "$ref": "#/$defs/expectation" } },
21
+ "analysis": {
22
+ "type": "object",
23
+ "required": ["nets"],
24
+ "properties": { "nets": { "type": "array", "items": { "$ref": "#/$defs/net" } } }
25
+ }
26
+ },
27
+ "additionalProperties": true,
28
+ "$defs": {
29
+ "namedBoard": {
30
+ "type": "object", "required": ["name", "type", "options", "definition"],
31
+ "properties": {
32
+ "name": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_]*$" },
33
+ "type": { "type": "string", "minLength": 1 },
34
+ "options": { "type": "object", "properties": { "split_rails": { "type": "boolean" } } },
35
+ "definition": { "$ref": "#/$defs/boardDefinition" }
36
+ }
37
+ },
38
+ "partDefinition": {
39
+ "type": "object", "required": ["id", "pins"],
40
+ "properties": {
41
+ "id": { "type": "string", "minLength": 1 },
42
+ "datasheet_url": { "type": "string", "format": "uri", "pattern": "^https://" },
43
+ "pins": { "type": "array", "items": { "type": "object", "required": ["num"],
44
+ "properties": { "num": { "type": ["string", "integer"] }, "name": { "type": "string" }, "type": { "type": "string" }, "role": { "type": "string" }, "max_current": { "type": "number", "exclusiveMinimum": 0 } } } },
45
+ "placement": { "enum": ["leads", "dip", "footprint", "offboard"] },
46
+ "max_lead_span_mm": { "type": "number", "exclusiveMinimum": 0 },
47
+ "polarity": { "type": "object" }, "footprint": { "type": "object" },
48
+ "provides": { "type": "array", "items": { "type": "object", "required": ["positive", "negative", "voltage"],
49
+ "properties": { "positive": { "type": "string" }, "negative": { "type": "string" }, "voltage": { "type": "number", "exclusiveMinimum": 0 } } } }
50
+ }
51
+ },
52
+ "boardDefinition": {
53
+ "type": "object", "required": ["id", "terminal"],
54
+ "properties": {
55
+ "id": { "type": "string", "minLength": 1 },
56
+ "terminal": { "type": "object", "required": ["columns", "rows", "groups"],
57
+ "properties": {
58
+ "columns": { "type": "integer", "minimum": 1 },
59
+ "rows": { "type": "array", "items": { "type": "string" } },
60
+ "groups": { "type": "array", "items": { "type": "array", "items": { "type": "string" } } },
61
+ "ravine_between": { "type": "array", "items": { "type": "string" }, "minItems": 2, "maxItems": 2 }
62
+ } },
63
+ "rails": { "type": "array", "items": { "type": "object", "required": ["id"],
64
+ "properties": { "id": { "type": "string" }, "side": { "type": "string" }, "order": { "type": "integer" }, "polarity": { "enum": ["+", "-"] } } } },
65
+ "rail_layout": { "type": "object", "properties": { "segments": { "type": "array" }, "split_segments": { "type": "array" } } }
66
+ }
67
+ },
68
+ "source": {
69
+ "type": "object",
70
+ "required": ["path", "line"],
71
+ "properties": { "path": { "type": "string" }, "line": { "type": "integer", "minimum": 1 } }
72
+ },
73
+ "nullableSource": { "anyOf": [{ "type": "null" }, { "$ref": "#/$defs/source" }] },
74
+ "step": {
75
+ "type": "object",
76
+ "required": ["number"],
77
+ "properties": {
78
+ "number": { "type": "integer", "minimum": 1 },
79
+ "title": { "type": ["string", "null"], "minLength": 1 },
80
+ "source": { "$ref": "#/$defs/nullableSource" }
81
+ }
82
+ },
83
+ "location": {
84
+ "type": "object",
85
+ "required": ["path", "line"],
86
+ "properties": { "path": { "type": "string" }, "line": { "type": "integer", "minimum": 1 } }
87
+ },
88
+ "component": {
89
+ "type": "object",
90
+ "required": ["ref", "part", "value", "attrs", "pins", "unused", "source"],
91
+ "properties": {
92
+ "ref": { "type": "string" },
93
+ "part": { "type": "string" },
94
+ "value": { "type": ["string", "number", "null"] },
95
+ "attrs": { "type": "object" },
96
+ "pins": { "type": "object", "additionalProperties": { "type": ["string", "null"] } },
97
+ "unused": { "type": "array", "items": { "type": "string" } },
98
+ "step": { "type": "integer", "minimum": 1 },
99
+ "source": { "$ref": "#/$defs/nullableSource" }
100
+ }
101
+ },
102
+ "wire": {
103
+ "type": "object",
104
+ "required": ["id", "from", "to", "color", "route", "source"],
105
+ "properties": {
106
+ "id": { "type": "string" },
107
+ "from": { "type": "string" },
108
+ "to": { "type": "string" },
109
+ "color": { "type": ["string", "null"] },
110
+ "route": { "type": "string" },
111
+ "step": { "type": "integer", "minimum": 1 },
112
+ "source": { "$ref": "#/$defs/nullableSource" }
113
+ }
114
+ },
115
+ "supply": {
116
+ "type": "object",
117
+ "required": ["name", "voltage", "plus", "minus", "source"],
118
+ "properties": {
119
+ "name": { "type": "string" },
120
+ "voltage": { "type": "number" },
121
+ "isolated": { "type": "boolean" },
122
+ "voltage_range": { "type": ["array", "null"], "prefixItems": [{ "type": "number", "exclusiveMinimum": 0 }, { "type": "number", "exclusiveMinimum": 0 }], "minItems": 2, "maxItems": 2 },
123
+ "current_limit": { "type": ["number", "null"], "exclusiveMinimum": 0 },
124
+ "plus": { "type": "string" },
125
+ "minus": { "type": "string" },
126
+ "step": { "type": "integer", "minimum": 1 },
127
+ "source": { "$ref": "#/$defs/nullableSource" }
128
+ }
129
+ },
130
+ "label": {
131
+ "type": "object",
132
+ "required": ["net", "at", "source"],
133
+ "properties": {
134
+ "net": { "type": "string" },
135
+ "at": { "type": "string" },
136
+ "step": { "type": "integer", "minimum": 1 },
137
+ "source": { "$ref": "#/$defs/nullableSource" }
138
+ }
139
+ },
140
+ "expectation": {
141
+ "type": "object",
142
+ "required": ["strict", "entries", "location"],
143
+ "properties": {
144
+ "strict": { "type": "boolean" },
145
+ "when": { "type": "string", "minLength": 1 },
146
+ "entries": {
147
+ "type": "array",
148
+ "items": {
149
+ "type": "object",
150
+ "required": ["kind", "refs", "location"],
151
+ "properties": {
152
+ "kind": { "enum": ["connected", "isolated", "net", "voltage", "current"] },
153
+ "refs": { "type": "array", "items": { "type": "string" } },
154
+ "range": { "type": "array", "items": { "type": "number" }, "minItems": 2, "maxItems": 2 },
155
+ "location": { "$ref": "#/$defs/location" }
156
+ }
157
+ }
158
+ },
159
+ "location": { "$ref": "#/$defs/location" }
160
+ }
161
+ },
162
+ "net": {
163
+ "type": "object",
164
+ "required": ["name", "members", "holes", "potential"],
165
+ "properties": {
166
+ "name": { "type": "string" },
167
+ "members": { "type": "array", "items": { "type": "string" } },
168
+ "holes": { "type": "array", "items": { "type": "string" } },
169
+ "potential": { "type": ["number", "null"] }
170
+ }
171
+ }
172
+ }
173
+ }
data/schema/part-v1.json CHANGED
@@ -1,12 +1,45 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://breadkit.github.io/breadkit/schema/part-v1.json",
3
4
  "title": "Breadkit part definition v1",
4
5
  "type": "object",
5
6
  "required": ["id", "pins"],
6
7
  "properties": {
7
8
  "id": { "type": "string", "minLength": 1 },
9
+ "datasheet_url": { "type": "string", "format": "uri", "pattern": "^https://" },
8
10
  "aliases": { "type": "array", "items": { "type": "string", "minLength": 1 } },
9
11
  "category": { "type": "string" },
12
+ "extends": { "type": "string" },
13
+ "override": { "type": "boolean" },
14
+ "straddle": { "type": "boolean" },
15
+ "transistor_polarity": { "enum": ["NPN", "PNP"] },
16
+ "flags": { "type": "array", "items": { "type": "string" } },
17
+ "supply_range": { "type": "array", "prefixItems": [{ "type": "number" }, { "type": "number" }], "minItems": 2, "maxItems": 2 },
18
+ "max_reverse_voltage": { "type": "number", "minimum": 0 },
19
+ "forward_voltage": { "type": "number", "exclusiveMinimum": 0 },
20
+ "on_resistance": { "type": "number", "exclusiveMinimum": 0 },
21
+ "max_forward_current": { "type": "number", "exclusiveMinimum": 0 },
22
+ "max_lead_span_mm": { "type": "number", "exclusiveMinimum": 0 },
23
+ "package": { "type": "object", "properties": { "pins": { "type": "integer", "minimum": 1 } }, "additionalProperties": false },
24
+ "attributes": { "type": "object", "additionalProperties": { "oneOf": [{ "const": "css_color" }, { "type": "array", "minItems": 1, "items": { "type": ["string", "number"] } }] } },
25
+ "required_attributes": { "type": "array", "uniqueItems": true, "items": { "type": "string" } },
26
+ "provides": {
27
+ "type": "array",
28
+ "items": { "type": "object", "required": ["positive", "negative", "voltage"],
29
+ "properties": { "positive": { "type": "string" }, "negative": { "type": "string" }, "voltage": { "type": "number", "exclusiveMinimum": 0 },
30
+ "when": { "type": "object", "minProperties": 1, "additionalProperties": { "type": ["string", "number"] } } },
31
+ "additionalProperties": false }
32
+ },
33
+ "render": {
34
+ "type": "object",
35
+ "properties": {
36
+ "shape": { "type": "string" }, "label": { "type": "string" },
37
+ "size_mm": { "type": "array", "prefixItems": [{ "type": "number" }, { "type": "number" }], "minItems": 2, "maxItems": 2 },
38
+ "body_offset_mm": { "type": "array", "prefixItems": [{ "type": "number" }, { "type": "number" }], "minItems": 2, "maxItems": 2 },
39
+ "fill": { "type": "string" }, "stroke": { "type": "string" }, "text_color": { "type": "string" },
40
+ "svg": { "type": "string" }
41
+ }, "additionalProperties": false
42
+ },
10
43
  "placement": { "enum": ["leads", "dip", "footprint", "offboard"] },
11
44
  "pins": {
12
45
  "type": "array",
@@ -17,10 +50,16 @@
17
50
  "num": { "type": ["integer", "string"] },
18
51
  "name": { "type": "string" },
19
52
  "aliases": { "type": "array", "items": { "type": "string" } },
20
- "type": { "type": "string" },
21
- "role": { "type": "string" }
53
+ "type": { "$ref": "#/$defs/pinRole" },
54
+ "role": { "$ref": "#/$defs/pinRole" },
55
+ "label": { "type": ["boolean", "string"] },
56
+ "max_voltage": { "type": "number", "exclusiveMinimum": 0 },
57
+ "max_current": { "type": "number", "exclusiveMinimum": 0 },
58
+ "output_capable": { "type": "boolean" },
59
+ "mount": { "const": "rail" }
22
60
  },
23
- "additionalProperties": true
61
+ "not": { "required": ["type", "role"] },
62
+ "additionalProperties": false
24
63
  }
25
64
  },
26
65
  "polarity": { "type": "object", "additionalProperties": { "type": ["string", "integer"] } },
@@ -31,12 +70,21 @@
31
70
  "minItems": 2, "maxItems": 2
32
71
  }
33
72
  },
73
+ "footprint_mm": {
74
+ "type": "object",
75
+ "additionalProperties": {
76
+ "type": "array", "prefixItems": [{ "type": "number" }, { "type": "number" }],
77
+ "minItems": 2, "maxItems": 2
78
+ }
79
+ },
34
80
  "internal": { "$ref": "#/$defs/pairs" },
35
81
  "switch": { "$ref": "#/$defs/pairs" },
82
+ "independent_switches": { "const": true },
36
83
  "same_strip_ok": { "$ref": "#/$defs/pairs" }
37
84
  },
38
- "additionalProperties": true,
85
+ "additionalProperties": false,
39
86
  "$defs": {
87
+ "pinRole": { "enum": ["input", "output", "gpio", "power", "ground", "data", "clock", "interrupt", "address", "nc", "passive", "analog", "reset", "open_drain"] },
40
88
  "pairs": {
41
89
  "type": "array",
42
90
  "items": {
data/sig/breadkit.rbs CHANGED
@@ -5,9 +5,15 @@ module Breadkit
5
5
  end
6
6
 
7
7
  class DSLError < Error
8
+ attr_reader location: SourceLocation?
8
9
  end
9
10
 
10
- def self.load: (String path) -> Circuit
11
+ def self.load: (String path, ?timeout: Numeric) -> Circuit
12
+
13
+ module Color
14
+ NAMES: Array[String]
15
+ def self.valid?: (untyped value) -> bool
16
+ end
11
17
 
12
18
  class SourceLocation
13
19
  attr_reader path: String
@@ -32,7 +38,9 @@ module Breadkit
32
38
  attr_reader ref: String
33
39
  attr_reader part: PartDef
34
40
  attr_reader pins: Hash[String, Pin]
41
+ attr_reader step: Integer?
35
42
  def pin: (String | Symbol | Integer reference) -> Pin?
43
+ def body_bounds: (Board | BoardSet board) -> [Float, Float, Float, Float]?
36
44
  end
37
45
 
38
46
  class Wire
@@ -40,6 +48,7 @@ module Breadkit
40
48
  attr_reader from: String
41
49
  attr_reader to: String
42
50
  attr_reader electrical: bool
51
+ attr_reader step: Integer?
43
52
  end
44
53
 
45
54
  class Supply
@@ -48,12 +57,17 @@ module Breadkit
48
57
  attr_reader plus: String
49
58
  attr_reader minus: String
50
59
  attr_reader location: SourceLocation?
60
+ attr_reader isolated: bool
61
+ attr_reader voltage_range: Array[Float]?
62
+ attr_reader current_limit: Float?
63
+ attr_reader step: Integer?
51
64
  end
52
65
 
53
66
  class Label
54
67
  attr_reader name: String
55
68
  attr_reader at: String
56
69
  attr_reader location: SourceLocation?
70
+ attr_reader step: Integer?
57
71
  end
58
72
 
59
73
  class Net
@@ -73,9 +87,23 @@ module Breadkit
73
87
  attr_reader conflicts: Array[untyped]
74
88
  end
75
89
 
90
+ class DCResult
91
+ attr_reader status: Symbol
92
+ attr_reader voltages: Hash[String, Float]
93
+ attr_reader currents: Hash[String, Float]
94
+ attr_reader power: Hash[String, Float]
95
+ attr_reader floating: Array[Array[String]]
96
+ attr_reader reference_nodes: Array[String]
97
+ attr_reader assumptions: Array[String]
98
+ attr_reader errors: Array[String]
99
+ def success?: () -> bool
100
+ end
101
+
76
102
  class Circuit
77
103
  attr_reader title: String?
78
- attr_reader board: Board
104
+ attr_reader board: Board | BoardSet
105
+ def boards: () -> Hash[String, Board]
106
+ def multi_board?: () -> bool
79
107
  attr_reader components: Hash[String, Component]
80
108
  attr_reader wires: Array[Wire]
81
109
  attr_reader supplies: Array[Supply]
@@ -83,12 +111,19 @@ module Breadkit
83
111
  attr_reader expectations: Array[Hash[Symbol, untyped]]
84
112
  attr_reader lint_disables: Array[Hash[Symbol, untyped]]
85
113
  attr_reader diagnostics: Array[Diagnostic]
86
- def states: (?String mode) -> Array[State]
114
+ attr_reader source_root: String?
115
+ attr_reader steps: Array[Hash[Symbol, untyped]]
116
+ def voltage_sources: () -> Array[Supply]
117
+ def states: (?String mode, ?budget: Integer?) -> Array[State]
118
+ def state: (String? name) -> State?
87
119
  def nets: (?State? state) -> Array[Net]
88
120
  def potentials: (?State? state) -> PotentialResult
121
+ def dc_analysis: (?State? state) -> DCResult
89
122
  def net_of: (String reference, ?State? state) -> Net?
123
+ def wire_suggestions: () -> Array[Hash[Symbol, untyped]]
90
124
  def shortest_path: (String a, String b, ?State? state) -> Array[untyped]
91
125
  def to_ir: () -> Hash[String, untyped]
126
+ def diff: (Circuit other) -> Hash[String, [untyped, untyped]]
92
127
  end
93
128
 
94
129
  class BoardDef
@@ -114,12 +149,23 @@ module Breadkit
114
149
  def rail_polarity: (String id) -> String?
115
150
  end
116
151
 
152
+ class BoardSet
153
+ attr_reader boards: Hash[String, Board]
154
+ attr_reader holes: Hash[String, untyped]
155
+ attr_reader strips: Hash[String, Array[String]]
156
+ def hole: (String id) -> untyped
157
+ def strip: (String id) -> Array[String]?
158
+ def board_id_for: (String id) -> String?
159
+ def width: () -> Integer
160
+ def height: () -> Integer
161
+ end
162
+
117
163
  class HoleId
118
164
  attr_reader kind: Symbol
119
165
  attr_reader row: String?
120
166
  attr_reader col: Integer?
121
167
  attr_reader rail: String?
122
- def self.parse: (String value, ?board: Board?) -> HoleId
168
+ def self.parse: (String value, ?board: (Board | BoardSet)?) -> HoleId
123
169
  def to_s: () -> String
124
170
  end
125
171
 
@@ -129,20 +175,32 @@ module Breadkit
129
175
  def id: () -> String
130
176
  def pins: () -> Array[Hash[String, untyped]]
131
177
  def placement: () -> String
178
+ def max_lead_span_mm: () -> Float?
132
179
  def pin: (String | Symbol | Integer value) -> Hash[String, untyped]?
133
180
  end
134
181
 
135
182
  class PartLibrary
183
+ attr_reader warnings: Array[String]
136
184
  def initialize: (?extra_paths: Array[String], ?extra_definitions: Array[Hash[String, untyped]]) -> void
137
185
  def find: (String | Symbol name, ?pin_count: Integer?) -> PartDef?
138
186
  def all: () -> Array[PartDef]
139
187
  end
140
188
 
189
+ class JumperKit
190
+ def initialize: (Hash[String, untyped] data) -> void
191
+ def self.load: (String path) -> JumperKit
192
+ def allocate: (Circuit circuit) -> Hash[Symbol, untyped]
193
+ end
194
+
141
195
  class Value
142
196
  attr_reader value: Float
143
197
  attr_reader unit: String
144
- def initialize: (String | Numeric value) -> void
198
+ def initialize: (String | Numeric value, ?category: Symbol?) -> void
145
199
  def self.parse: (String | Numeric input) -> Float
200
+ def self.tolerance: (String | Numeric input) -> Float?
201
+ def self.power_rating: (String | Numeric input) -> Float?
202
+ def self.voltage_rating: (String | Numeric input) -> Float?
203
+ def self.split_spec: (String | Numeric input) -> [String, Array[String]]
146
204
  def to_s: () -> String
147
205
  end
148
206
 
@@ -154,17 +212,61 @@ module Breadkit
154
212
  def run: (Array[String] argv) -> Integer
155
213
  end
156
214
 
215
+ class RakeTask
216
+ attr_reader task: untyped
217
+ def initialize: (?String | Symbol name, files: Array[String]) -> void
218
+ end
219
+
220
+ class MCPServer
221
+ def initialize: (?root: String) -> void
222
+ def server: () -> untyped
223
+ def run: () -> untyped
224
+ end
225
+
226
+ module Exporters
227
+ FORMATS: Array[String]
228
+ def self.call: (Circuit circuit, format: String | Symbol) -> String
229
+ end
230
+
231
+ module Patterns
232
+ def self.call: (Circuit circuit) -> Array[Hash[String, String | Float]]
233
+ end
234
+
157
235
  class Document
158
236
  attr_accessor title: String?
159
237
  attr_accessor board: Hash[Symbol, untyped]
238
+ attr_accessor boards: Array[Hash[Symbol, untyped]]
160
239
  attr_accessor board_paths: Array[String]
161
240
  attr_accessor board_definitions: Array[Hash[String, untyped]]
162
241
  attr_accessor part_paths: Array[String]
163
242
  attr_accessor part_definitions: Array[Hash[String, untyped]]
243
+ attr_accessor diagnostics: Array[Diagnostic]
244
+ attr_accessor source_root: String?
245
+ attr_accessor steps: Array[Hash[Symbol, untyped]]
164
246
  end
165
247
 
166
248
  module DSL
249
+ def self.load_file: (String path, ?timeout: Numeric, ?source: String?) -> Document
250
+ end
251
+
252
+ class StructuredInput
167
253
  def self.load_file: (String path) -> Document
254
+ def self.load_source: (String path, String source) -> Document
255
+ end
256
+
257
+ class PartLock
258
+ def self.write: (String path) -> String
259
+ def self.verify: (Document document, String path) -> void
260
+ def self.lock_path: (String path) -> String
261
+ end
262
+
263
+ class LSPServer
264
+ def initialize: (?input: IO, ?output: IO, ?root: String?, ?trusted_ruby: bool) -> void
265
+ def run: () -> void
266
+ end
267
+
268
+ module Formatter
269
+ def self.call: (String path) -> String
168
270
  end
169
271
 
170
272
  module IR
metadata CHANGED
@@ -1,70 +1,175 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: breadkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yudai Takada
8
8
  bindir: exe
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
- dependencies: []
12
- description: Breadkit resolves breadboard wiring DSL files into deterministic circuit
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: matrix
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0.4'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0.4'
26
+ - !ruby/object:Gem::Dependency
27
+ name: mcp
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.6'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.6'
40
+ - !ruby/object:Gem::Dependency
41
+ name: tomlrb
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.0'
54
+ description: Breadkit resolves breadboard wiring descriptions into deterministic circuit
13
55
  connectivity and JSON IR.
14
56
  email:
15
57
  - t.yudai92@gmail.com
16
58
  executables:
17
59
  - breadkit
60
+ - breadkit-lsp
61
+ - breadkit-mcp
18
62
  extensions: []
19
63
  extra_rdoc_files: []
20
64
  files:
65
+ - ".codespellignore"
66
+ - ".yamllint"
21
67
  - LICENSE.txt
22
68
  - README.md
23
69
  - SECURITY.md
70
+ - data/boards/double_full.yml
24
71
  - data/boards/full.yml
25
72
  - data/boards/half.yml
26
73
  - data/boards/mini.yml
74
+ - data/boards/stripboard.yml
75
+ - data/boards/universal.yml
76
+ - data/parts/2n3904.yml
27
77
  - data/parts/2n3906.yml
78
+ - data/parts/2n7000_onsemi_to92.yml
79
+ - data/parts/74hc00.yml
80
+ - data/parts/74hc04.yml
81
+ - data/parts/74hc08.yml
82
+ - data/parts/74hc14.yml
83
+ - data/parts/74hc165.yml
84
+ - data/parts/74hc32.yml
85
+ - data/parts/74hc595.yml
86
+ - data/parts/active_buzzer.yml
87
+ - data/parts/ams1117_3v3.yml
88
+ - data/parts/arduino_nano.yml
28
89
  - data/parts/arduino_uno.yml
90
+ - data/parts/atmega328p.yml
91
+ - data/parts/attiny85.yml
92
+ - data/parts/battery_box.yml
29
93
  - data/parts/bc547.yml
30
94
  - data/parts/bc557.yml
31
95
  - data/parts/capacitor.yml
96
+ - data/parts/cd4017.yml
97
+ - data/parts/ck_bd04.yml
98
+ - data/parts/crystal.yml
99
+ - data/parts/dc_jack_2wire.yml
32
100
  - data/parts/diode.yml
33
101
  - data/parts/electrolytic.yml
102
+ - data/parts/esp32_devkitc_v4_wroom32e.yml
103
+ - data/parts/irlz44n.yml
104
+ - data/parts/l293d.yml
34
105
  - data/parts/led.yml
106
+ - data/parts/lm358.yml
107
+ - data/parts/lm393.yml
35
108
  - data/parts/ne555.yml
109
+ - data/parts/ntc_thermistor.yml
110
+ - data/parts/photoresistor.yml
111
+ - data/parts/pico.yml
36
112
  - data/parts/pot.yml
37
113
  - data/parts/resistor.yml
114
+ - data/parts/sc56_11ewa.yml
115
+ - data/parts/seeed_xiao_samd21.yml
116
+ - data/parts/shillehtek_mb102_4pin.yml
117
+ - data/parts/slide_switch_spst.yml
118
+ - data/parts/sparkfun_pro_micro_5v.yml
38
119
  - data/parts/tact_switch_6mm.yml
39
120
  - data/parts/transistor.yml
40
- - docs/assets/01_led_button.svg
121
+ - data/parts/ua7805.yml
122
+ - data/parts/uln2003a.yml
123
+ - data/parts/wp154a4sureqbfzgc.yml
124
+ - docs/CLI.md
125
+ - docs/COMPATIBILITY.md
126
+ - docs/DECLARATIVE.md
127
+ - docs/IR.md
128
+ - docs/JUMPER_KIT.md
129
+ - docs/LOCK.md
130
+ - docs/LSP.md
131
+ - docs/MB102_POWER.md
132
+ - docs/MCP.md
133
+ - docs/RAKE.md
41
134
  - docs/dsl.md
42
135
  - exe/breadkit
136
+ - exe/breadkit-lsp
137
+ - exe/breadkit-mcp
43
138
  - lib/breadkit.rb
44
139
  - lib/breadkit/analysis.rb
45
140
  - lib/breadkit/board.rb
46
141
  - lib/breadkit/cli.rb
142
+ - lib/breadkit/color.rb
143
+ - lib/breadkit/dc_analysis.rb
47
144
  - lib/breadkit/dsl.rb
145
+ - lib/breadkit/exporters.rb
146
+ - lib/breadkit/formatter.rb
147
+ - lib/breadkit/fritzing_export.rb
48
148
  - lib/breadkit/hole_id.rb
49
149
  - lib/breadkit/ir.rb
150
+ - lib/breadkit/jumper_kit.rb
151
+ - lib/breadkit/lsp_server.rb
152
+ - lib/breadkit/mcp_server.rb
50
153
  - lib/breadkit/model.rb
51
154
  - lib/breadkit/part_library.rb
155
+ - lib/breadkit/part_lock.rb
156
+ - lib/breadkit/patterns.rb
157
+ - lib/breadkit/rake_task.rb
52
158
  - lib/breadkit/resolver.rb
159
+ - lib/breadkit/structured_input.rb
160
+ - lib/breadkit/templates/555.bk.rb
161
+ - lib/breadkit/templates/arduino.bk.rb
162
+ - lib/breadkit/templates/led.bk.rb
53
163
  - lib/breadkit/value.rb
54
164
  - lib/breadkit/version.rb
165
+ - lib/breadkit/wire_suggestions.rb
55
166
  - package-lock.json
56
167
  - package.json
168
+ - schema/board-v1.json
57
169
  - schema/ir-v1.json
170
+ - schema/ir-v2.json
58
171
  - schema/part-v1.json
59
172
  - sig/breadkit.rbs
60
- - site/assets/01_led_button.svg
61
- - site/assets/03_arduino_blink.svg
62
- - site/favicon.svg
63
- - site/guide/components/index.html
64
- - site/guide/dsl/index.html
65
- - site/guide/index.html
66
- - site/index.html
67
- - site/styles.css
68
173
  homepage: https://github.com/breadkit/breadkit
69
174
  licenses:
70
175
  - MIT
@@ -88,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
193
  - !ruby/object:Gem::Version
89
194
  version: '0'
90
195
  requirements: []
91
- rubygems_version: 4.0.16
196
+ rubygems_version: 4.0.20
92
197
  specification_version: 4
93
- summary: Describe and analyze breadboard circuits with a Ruby DSL.
198
+ summary: Describe and analyze breadboard circuits in Ruby, YAML, or TOML.
94
199
  test_files: []