doc-weaver init and cross wiki-lib links fixes
Some checks reported errors
continuous-integration/drone/push Build was killed

This commit is contained in:
2026-10-17 23:59:31 +05:30
parent 1af4fee63f
commit 12a2493c6c
138 changed files with 12345 additions and 28 deletions

View File

@@ -980,11 +980,11 @@
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a> <span class="n">port2</span><span class="p">:</span> <span class="n">HexaChildClass2</span>
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a> <span class="n">port3</span><span class="p">:</span> <span class="n">HexaChildClass3</span>
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a> <span class="k">def</span><span class="w"> </span><span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">kwarg1</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">kwarg2</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">""</span><span class="p">):</span>
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a> <span class="k">def</span><span class="w"> </span><span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">kwarg1</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">kwarg2</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">):</span>
<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a> <span class="k">return</span> <span class="p">{</span>
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a> <span class="s2">"port1"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">port1</span><span class="o">.</span><span class="n">method1</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="n">kwarg1</span><span class="o">=</span><span class="n">kwarg1</span><span class="p">,</span> <span class="n">kwarg2</span><span class="o">=</span><span class="n">kwarg2</span><span class="p">),</span>
<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a> <span class="s2">"port2"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">port2</span><span class="o">.</span><span class="n">method1</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="n">kwarg1</span><span class="o">=</span><span class="n">kwarg1</span><span class="p">,</span> <span class="n">kwarg2</span><span class="o">=</span><span class="n">kwarg2</span><span class="p">),</span>
<a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a> <span class="s2">"port3"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">port3</span><span class="o">.</span><span class="n">method1</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="n">kwarg1</span><span class="o">=</span><span class="n">kwarg1</span><span class="p">,</span> <span class="n">kwarg2</span><span class="o">=</span><span class="n">kwarg2</span><span class="p">),</span>
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a> <span class="s2">&quot;port1&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">port1</span><span class="o">.</span><span class="n">method1</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="n">kwarg1</span><span class="o">=</span><span class="n">kwarg1</span><span class="p">,</span> <span class="n">kwarg2</span><span class="o">=</span><span class="n">kwarg2</span><span class="p">),</span>
<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a> <span class="s2">&quot;port2&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">port2</span><span class="o">.</span><span class="n">method1</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="n">kwarg1</span><span class="o">=</span><span class="n">kwarg1</span><span class="p">,</span> <span class="n">kwarg2</span><span class="o">=</span><span class="n">kwarg2</span><span class="p">),</span>
<a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a> <span class="s2">&quot;port3&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">port3</span><span class="o">.</span><span class="n">method1</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="n">kwarg1</span><span class="o">=</span><span class="n">kwarg1</span><span class="p">,</span> <span class="n">kwarg2</span><span class="o">=</span><span class="n">kwarg2</span><span class="p">),</span>
<a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a> <span class="p">}</span>
</code></pre></div>
<p>Finally, guard the two representations against drift:</p>

View File

@@ -944,7 +944,7 @@
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">config_var12</span><span class="p">:</span> <span class="nb">int</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="nd">@abstractmethod</span>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="k">def</span><span class="w"> </span><span class="nf">method1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">kwarg1</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">kwarg2</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">""</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span> <span class="o">...</span>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="k">def</span><span class="w"> </span><span class="nf">method1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">kwarg1</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">kwarg2</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span> <span class="o">...</span>
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a>
<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a>
<a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a><span class="k">class</span><span class="w"> </span><span class="nc">ParentClass</span><span class="p">(</span><span class="n">ABC</span><span class="p">):</span>
@@ -956,14 +956,14 @@
<a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a> <span class="n">port3</span><span class="p">:</span> <span class="n">HexaChildClass3</span>
<a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a>
<a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a> <span class="nd">@abstractmethod</span>
<a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a> <span class="k">def</span><span class="w"> </span><span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">kwarg1</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">kwarg2</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">""</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span> <span class="o">...</span>
<a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a> <span class="k">def</span><span class="w"> </span><span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">kwarg1</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">kwarg2</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span> <span class="o">...</span>
</code></pre></div>
<p>Emit the YAML spec from the module:</p>
<div class="language-bash highlight"><span class="filename">Bash</span><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>hexa<span class="w"> </span>generate-yaml<span class="w"> </span>samples/minimal/abc.py<span class="w"> </span>--out<span class="w"> </span>spec.yaml
</code></pre></div>
<p>Inspect the parsed tree to make sure the root was detected correctly:</p>
<div class="language-bash highlight"><span class="filename">Bash</span><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>hexa<span class="w"> </span>parse-abc<span class="w"> </span>samples/minimal/abc.py
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="c1"># PortNode(name='ParentClass', port_cls='ParentClass', kind='parent', ...)</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="c1"># PortNode(name=&#39;ParentClass&#39;, port_cls=&#39;ParentClass&#39;, kind=&#39;parent&#39;, ...)</span>
</code></pre></div>
<p>And verify the spec against the module:</p>
<div class="language-bash highlight"><span class="filename">Bash</span><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>hexa<span class="w"> </span>check<span class="w"> </span>spec.yaml<span class="w"> </span>samples/minimal/abc.py

View File

@@ -941,7 +941,7 @@
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="k">class</span><span class="w"> </span><span class="nc">_Repo</span><span class="p">:</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s2">"injected-repo"</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;injected-repo&quot;</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="k">class</span><span class="w"> </span><span class="nc">_Leaf</span><span class="p">:</span>
@@ -957,20 +957,20 @@
<a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a> <span class="n">repo</span><span class="p">:</span> <span class="n">_Repo</span>
<a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a> <span class="n">mid</span><span class="p">:</span> <span class="n">_Mid</span>
<a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a> <span class="n">retries</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span>
<a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a> <span class="n">label</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">""</span>
<a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a> <span class="n">label</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a>
<a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a>
<a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a><span class="c1"># Provide a runtime instance for a slot, and config values by name.</span>
<a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a><span class="n">repo</span> <span class="o">=</span> <span class="n">_Repo</span><span class="p">()</span>
<a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a><span class="n">root</span> <span class="o">=</span> <span class="n">build</span><span class="p">(</span>
<a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a> <span class="n">_Root</span><span class="p">,</span>
<a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a> <span class="n">instances</span><span class="o">=</span><span class="p">{</span><span class="s2">"repo"</span><span class="p">:</span> <span class="n">repo</span><span class="p">},</span>
<a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a> <span class="n">config</span><span class="o">=</span><span class="p">{</span><span class="s2">"retries"</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">"label"</span><span class="p">:</span> <span class="s2">"fast"</span><span class="p">,</span> <span class="s2">"threshold"</span><span class="p">:</span> <span class="mf">2.5</span><span class="p">},</span>
<a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a> <span class="n">instances</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;repo&quot;</span><span class="p">:</span> <span class="n">repo</span><span class="p">},</span>
<a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a> <span class="n">config</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;retries&quot;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;fast&quot;</span><span class="p">,</span> <span class="s2">&quot;threshold&quot;</span><span class="p">:</span> <span class="mf">2.5</span><span class="p">},</span>
<a id="__codelineno-0-31" name="__codelineno-0-31" href="#__codelineno-0-31"></a><span class="p">)</span>
<a id="__codelineno-0-32" name="__codelineno-0-32" href="#__codelineno-0-32"></a>
<a id="__codelineno-0-33" name="__codelineno-0-33" href="#__codelineno-0-33"></a><span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">repo</span> <span class="ow">is</span> <span class="n">repo</span> <span class="c1"># injected verbatim, not reconstructed</span>
<a id="__codelineno-0-34" name="__codelineno-0-34" href="#__codelineno-0-34"></a><span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">retries</span> <span class="o">==</span> <span class="mi">3</span> <span class="c1"># config applied</span>
<a id="__codelineno-0-35" name="__codelineno-0-35" href="#__codelineno-0-35"></a><span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">label</span> <span class="o">==</span> <span class="s2">"fast"</span>
<a id="__codelineno-0-35" name="__codelineno-0-35" href="#__codelineno-0-35"></a><span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">label</span> <span class="o">==</span> <span class="s2">&quot;fast&quot;</span>
<a id="__codelineno-0-36" name="__codelineno-0-36" href="#__codelineno-0-36"></a><span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">mid</span><span class="o">.</span><span class="n">leaf</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="c1"># nested ports built recursively</span>
<a id="__codelineno-0-37" name="__codelineno-0-37" href="#__codelineno-0-37"></a><span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">mid</span><span class="o">.</span><span class="n">threshold</span> <span class="o">==</span> <span class="mf">2.5</span> <span class="c1"># config propagates by name into nested nodes</span>
</code></pre></div>
@@ -979,7 +979,7 @@
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">repo</span><span class="p">,</span> <span class="n">_Repo</span><span class="p">)</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">_Mid</span><span class="p">)</span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">mid</span><span class="o">.</span><span class="n">leaf</span><span class="p">,</span> <span class="n">_Leaf</span><span class="p">)</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">retries</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">root</span><span class="o">.</span><span class="n">label</span> <span class="o">==</span> <span class="s2">""</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">retries</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">root</span><span class="o">.</span><span class="n">label</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span>
</code></pre></div>
<p>Optional / typing-generic config fields are handled the same way — a <code>str | None</code> annotated attribute takes its <code>config</code> value when provided and defaults to the class default otherwise:</p>
<div class="language-python highlight"><span class="filename">Python</span><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="k">class</span><span class="w"> </span><span class="nc">_OptionalConfig</span><span class="p">:</span>
@@ -988,8 +988,8 @@
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> <span class="n">port</span><span class="p">:</span> <span class="n">_Leaf</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="n">built</span> <span class="o">=</span> <span class="n">build</span><span class="p">(</span><span class="n">_OptionalConfig</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="p">{</span><span class="s2">"trust_fallback"</span><span class="p">:</span> <span class="s2">"amount"</span><span class="p">})</span>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="k">assert</span> <span class="n">built</span><span class="o">.</span><span class="n">trust_fallback</span> <span class="o">==</span> <span class="s2">"amount"</span>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="n">built</span> <span class="o">=</span> <span class="n">build</span><span class="p">(</span><span class="n">_OptionalConfig</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;trust_fallback&quot;</span><span class="p">:</span> <span class="s2">&quot;amount&quot;</span><span class="p">})</span>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="k">assert</span> <span class="n">built</span><span class="o">.</span><span class="n">trust_fallback</span> <span class="o">==</span> <span class="s2">&quot;amount&quot;</span>
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="k">assert</span> <span class="n">built</span><span class="o">.</span><span class="n">starters</span> <span class="ow">is</span> <span class="kc">None</span> <span class="c1"># unrelated optional field keeps its default</span>
</code></pre></div>
<hr />

View File

@@ -1207,12 +1207,12 @@
<p>All utilities serialize through one neutral model, a <code>PortNode</code> tree. It is NOT tied to the extraction sample — any port tree fits.</p>
<div class="language-python highlight"><span class="filename">Python</span><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="nd">@dataclass</span>
<a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="k">class</span><span class="w"> </span><span class="nc">PortNode</span><span class="p">:</span>
<a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="c1"># slot name, e.g. "parser", "amount_balance"</span>
<a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a> <span class="n">kind</span><span class="p">:</span> <span class="nb">str</span> <span class="c1"># "leaf" | "port" | "parent"</span>
<a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a> <span class="n">port_cls</span><span class="p">:</span> <span class="nb">str</span> <span class="c1"># ABC class name, e.g. "TransactionParserPort"</span>
<a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="c1"># slot name, e.g. &quot;parser&quot;, &quot;amount_balance&quot;</span>
<a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a> <span class="n">kind</span><span class="p">:</span> <span class="nb">str</span> <span class="c1"># &quot;leaf&quot; | &quot;port&quot; | &quot;parent&quot;</span>
<a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a> <span class="n">port_cls</span><span class="p">:</span> <span class="nb">str</span> <span class="c1"># ABC class name, e.g. &quot;TransactionParserPort&quot;</span>
<a id="__codelineno-8-6" name="__codelineno-8-6" href="#__codelineno-8-6"></a> <span class="n">attributes</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">ConfigValue</span><span class="p">]</span> <span class="c1"># annotated attributes: name -&gt; type expr,</span>
<a id="__codelineno-8-7" name="__codelineno-8-7" href="#__codelineno-8-7"></a> <span class="c1"># or a nested struct dict for grouped values</span>
<a id="__codelineno-8-8" name="__codelineno-8-8" href="#__codelineno-8-8"></a> <span class="n">children</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="s2">"PortNode"</span><span class="p">]</span>
<a id="__codelineno-8-8" name="__codelineno-8-8" href="#__codelineno-8-8"></a> <span class="n">children</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="s2">&quot;PortNode&quot;</span><span class="p">]</span>
<a id="__codelineno-8-9" name="__codelineno-8-9" href="#__codelineno-8-9"></a> <span class="n">methods</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">MethodSpec</span><span class="p">]</span> <span class="c1"># abstract methods</span>
</code></pre></div>
<h3 id="1-parse_yamlpath-portnode">1. <code>parse_yaml(path) -&gt; PortNode</code><a class="headerlink" href="#1-parse_yamlpath-portnode" title="Permanent link">&para;</a></h3>

View File

@@ -1003,7 +1003,7 @@
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a> ├─ number: AxisNumberPort (get_numbers → all clean nums)
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> ├─ desc: AxisDescPort (STARTTERS)
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> └─ amount_balance: AxisAmountBalancePort
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> └─ number: AxisNumberPort (re-pin: same bank's number port)
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> └─ number: AxisNumberPort (re-pin: same bank&#39;s number port)
</code></pre></div>
<p>Siblings that are already correct in <code>Impl*</code> are <strong>inherited, not redeclared</strong>. E.g. the parser's <code>date</code> slot comes from <code>ImplTransactionParserPort</code>; the amount-balance port's <code>ambiguity</code> comes from <code>ImplAmountBalancePort</code>. Re-declaring them adds mental load on the extender with zero behavior change.</p>
<blockquote>

View File

@@ -996,7 +996,7 @@ Do not confuse "structural" with "runtime": a spec that names a class that doesn
<p>A list result is <em>truthy</em> in Python, so always compare with <code>is True</code>:</p>
<div class="language-python highlight"><span class="filename">Python</span><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="n">res</span> <span class="o">=</span> <span class="n">check_matches</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">abc</span><span class="p">)</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="k">if</span> <span class="n">res</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> <span class="nb">print</span><span class="p">(</span><span class="s2">"clean"</span><span class="p">)</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;clean&quot;</span><span class="p">)</span>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="k">else</span><span class="p">:</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> <span class="nb">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="c1"># iterable of diff strings</span>
</code></pre></div>

View File

@@ -963,10 +963,10 @@
<li><code>test_yaml_to_abc_to_yaml</code> — parse <code>samples/minimal/sample.yaml</code>, generate ABC source, parse it back, re-emit YAML, parse again; the roots and child counts match.</li>
<li><code>test_nested_struct_roundtrip</code> — a nested struct attribute (<code>source</code>) survives YAML → ABC → YAML unchanged:
<div class="language-python highlight"><span class="filename">Python</span><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="n">node1</span> <span class="o">=</span> <span class="n">parse_yaml</span><span class="p">(</span><span class="n">yaml_path</span><span class="p">)</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node1</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"source"</span><span class="p">),</span> <span class="nb">dict</span><span class="p">)</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node1</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;source&quot;</span><span class="p">),</span> <span class="nb">dict</span><span class="p">)</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="o">...</span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="n">node2</span> <span class="o">=</span> <span class="n">parse_abc</span><span class="p">(</span><span class="n">tmp_abc</span><span class="p">)</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="k">assert</span> <span class="n">node1</span><span class="o">.</span><span class="n">attributes</span><span class="p">[</span><span class="s2">"source"</span><span class="p">]</span> <span class="o">==</span> <span class="n">node2</span><span class="o">.</span><span class="n">attributes</span><span class="p">[</span><span class="s2">"source"</span><span class="p">]</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="k">assert</span> <span class="n">node1</span><span class="o">.</span><span class="n">attributes</span><span class="p">[</span><span class="s2">&quot;source&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="n">node2</span><span class="o">.</span><span class="n">attributes</span><span class="p">[</span><span class="s2">&quot;source&quot;</span><span class="p">]</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="k">assert</span> <span class="n">node1</span><span class="o">.</span><span class="n">diff</span><span class="p">(</span><span class="n">node2</span><span class="p">)</span> <span class="o">==</span> <span class="p">[]</span>
</code></pre></div></li>
<li><code>test_abc_to_yaml_to_abc</code> — the mirror circuit starting from <code>samples/minimal/abc.py</code>.</li>
@@ -980,8 +980,8 @@
<li><strong>Runtime injection</strong> (<code>test_build_with_instances_and_config</code>) —
<div class="language-python highlight"><span class="filename">Python</span><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="n">root</span> <span class="o">=</span> <span class="n">build</span><span class="p">(</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a> <span class="n">_Root</span><span class="p">,</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> <span class="n">instances</span><span class="o">=</span><span class="p">{</span><span class="s2">"repo"</span><span class="p">:</span> <span class="n">repo</span><span class="p">},</span>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> <span class="n">config</span><span class="o">=</span><span class="p">{</span><span class="s2">"retries"</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">"label"</span><span class="p">:</span> <span class="s2">"fast"</span><span class="p">,</span> <span class="s2">"threshold"</span><span class="p">:</span> <span class="mf">2.5</span><span class="p">},</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> <span class="n">instances</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;repo&quot;</span><span class="p">:</span> <span class="n">repo</span><span class="p">},</span>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> <span class="n">config</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;retries&quot;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;fast&quot;</span><span class="p">,</span> <span class="s2">&quot;threshold&quot;</span><span class="p">:</span> <span class="mf">2.5</span><span class="p">},</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="p">)</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">repo</span> <span class="ow">is</span> <span class="n">repo</span> <span class="c1"># injected verbatim</span>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">mid</span><span class="o">.</span><span class="n">threshold</span> <span class="o">==</span> <span class="mf">2.5</span> <span class="c1"># config propagated by name into nested nodes</span>

Binary file not shown.