You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@burr.apache.org by gi...@apache.org on 2026/03/16 05:31:08 UTC

(burr) branch gh-pages updated: deploy: fe8af758f41891f6d25e0e69882d4368455bae9d

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/burr.git


The following commit(s) were added to refs/heads/gh-pages by this push:
     new 522898f2 deploy: fe8af758f41891f6d25e0e69882d4368455bae9d
522898f2 is described below

commit 522898f25095ab9474b9c5b007c3d2260973414c
Author: skrawcz <sk...@users.noreply.github.com>
AuthorDate: Mon Mar 16 05:31:05 2026 +0000

    deploy: fe8af758f41891f6d25e0e69882d4368455bae9d
---
 pull/644/.doctrees/concepts/transitions.doctree | Bin 13639 -> 21457 bytes
 pull/644/.doctrees/environment.pickle           | Bin 456337 -> 456337 bytes
 pull/644/.doctrees/reference/conditions.doctree | Bin 59410 -> 62466 bytes
 pull/644/_sources/concepts/transitions.rst.txt  |  34 ++++++++++++++++++++++
 pull/644/concepts/transitions/index.html        |  31 ++++++++++++++++++++
 pull/644/reference/conditions/index.html        |  36 +++++++++++++++++++++---
 pull/644/searchindex.js                         |   2 +-
 7 files changed, 98 insertions(+), 5 deletions(-)

diff --git a/pull/644/.doctrees/concepts/transitions.doctree b/pull/644/.doctrees/concepts/transitions.doctree
index e0dd334c..7143ed12 100644
Binary files a/pull/644/.doctrees/concepts/transitions.doctree and b/pull/644/.doctrees/concepts/transitions.doctree differ
diff --git a/pull/644/.doctrees/environment.pickle b/pull/644/.doctrees/environment.pickle
index 432230ec..5a724a7b 100644
Binary files a/pull/644/.doctrees/environment.pickle and b/pull/644/.doctrees/environment.pickle differ
diff --git a/pull/644/.doctrees/reference/conditions.doctree b/pull/644/.doctrees/reference/conditions.doctree
index 409ca9e4..c3cfc589 100644
Binary files a/pull/644/.doctrees/reference/conditions.doctree and b/pull/644/.doctrees/reference/conditions.doctree differ
diff --git a/pull/644/_sources/concepts/transitions.rst.txt b/pull/644/_sources/concepts/transitions.rst.txt
index a3338395..479ee881 100644
--- a/pull/644/_sources/concepts/transitions.rst.txt
+++ b/pull/644/_sources/concepts/transitions.rst.txt
@@ -54,6 +54,40 @@ Conditions have a few APIs, but the most common are the three convenience functi
     )
 
 
+``when()`` also supports comparison operators via Django-style ``__`` suffixes:
+
+.. code-block:: python
+
+    from burr.core import when
+    with_transitions(
+        ("check", "adult", when(age__gte=18)),       # age >= 18
+        ("check", "child", when(age__lt=18)),         # age < 18
+        ("check", "valid", when(score__gt=0, score__lte=100)),  # 0 < score <= 100
+        ("check", "active", when(status__in=["active", "pending"])),  # membership
+        ("check", "tagged", when(tags__contains="python")),  # collection contains value
+        ("check", "clean", when(status__notin=["banned", "suspended"])),  # not in
+        ("check", "changed", when(status__ne="initial")),  # not equal
+        ("check", "missing", when(value__is=None)),  # identity check
+        ("check", "present", when(value__isnot=None)),  # not-identity check
+    )
+
+Available operators:
+
+- ``key=value`` — exact equality (default, unchanged)
+- ``key__eq=value`` — explicit equality
+- ``key__ne=value`` — not equal
+- ``key__gt=value`` — greater than
+- ``key__gte=value`` — greater than or equal
+- ``key__lt=value`` — less than
+- ``key__lte=value`` — less than or equal
+- ``key__in=[values]`` — value is in the given collection
+- ``key__notin=[values]`` — value is not in the given collection
+- ``key__contains=value`` — collection/string in state contains the value
+- ``key__is=value`` — identity check (``is``), useful for ``None``/``True``/``False``
+- ``key__isnot=value`` — negated identity check (``is not``)
+
+Multiple keyword arguments are ANDed together. For more complex expressions, use ``expr()``.
+
 Conditions are evaluated in the order they are specified, and the first one that evaluates to True will be the transition that is selected
 when determining which action to run next. If no condition evaluates to ``True``, the application execution will stop early.
 
diff --git a/pull/644/concepts/transitions/index.html b/pull/644/concepts/transitions/index.html
index 73c9c932..e1a4d7e9 100644
--- a/pull/644/concepts/transitions/index.html
+++ b/pull/644/concepts/transitions/index.html
@@ -426,6 +426,37 @@ You can think of them as edges in a graph.</p>
 <span class="p">)</span>
 </pre></div>
 </div>
+<p><code class="docutils literal notranslate"><span class="pre">when()</span></code> also supports comparison operators via Django-style <code class="docutils literal notranslate"><span class="pre">__</span></code> suffixes:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">burr.core</span><span class="w"> </span><span class="kn">import</span> <span class="n">when</span>
+<span class="n">with_transitions</span><span class="p">(</span>
+    <span class="p">(</span><span class="s2">&quot;check&quot;</span><span class="p">,</span> <span class="s2">&quot;adult&quot;</span><span class="p">,</span> <span class="n">when</span><span class="p">(</span><span class="n">age__gte</span><span class="o">=</span><span class="mi">18</span><span class="p">)),</span>       <span class="c1"># age &gt;= 18</span>
+    <span class="p">(</span><span class="s2">&quot;check&quot;</span><span class="p">,</span> <span class="s2">&quot;child&quot;</span><span class="p">,</span> <span class="n">when</span><span class="p">(</span><span class="n">age__lt</span><span class="o">=</span><span class="mi">18</span><span class="p">)),</span>         <span class="c1"># age &lt; 18</span>
+    <span class="p">(</span><span class="s2">&quot;check&quot;</span><span class="p">,</span> <span class="s2">&quot;valid&quot;</span><span class="p">,</span> <span class="n">when</span><span class="p">(</span><span class="n">score__gt</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">score__lte</span><span class="o">=</span><span class="mi">100</span><span class="p">)),</span>  <span class="c1"># 0 &lt; score &lt;= 100</span>
+    <span class="p">(</span><span class="s2">&quot;check&quot;</span><span class="p">,</span> <span class="s2">&quot;active&quot;</span><span class="p">,</span> <span class="n">when</span><span class="p">(</span><span class="n">status__in</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;active&quot;</span><span class="p">,</span> <span class="s2">&quot;pending&quot;</span><span class="p">])),</span>  <span class="c1"># membership</span>
+    <span class="p">(</span><span class="s2">&quot;check&quot;</span><span class="p">,</span> <span class="s2">&quot;tagged&quot;</span><span class="p">,</span> <span class="n">when</span><span class="p">(</span><span class="n">tags__contains</span><span class="o">=</span><span class="s2">&quot;python&quot;</span><span class="p">)),</span>  <span class="c1"># collection contains value</span>
+    <span class="p">(</span><span class="s2">&quot;check&quot;</span><span class="p">,</span> <span class="s2">&quot;clean&quot;</span><span class="p">,</span> <span class="n">when</span><span class="p">(</span><span class="n">status__notin</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;banned&quot;</span><span class="p">,</span> <span class="s2">&quot;suspended&quot;</span><span class="p">])),</span>  <span class="c1"># not in</span>
+    <span class="p">(</span><span class="s2">&quot;check&quot;</span><span class="p">,</span> <span class="s2">&quot;changed&quot;</span><span class="p">,</span> <span class="n">when</span><span class="p">(</span><span class="n">status__ne</span><span class="o">=</span><span class="s2">&quot;initial&quot;</span><span class="p">)),</span>  <span class="c1"># not equal</span>
+    <span class="p">(</span><span class="s2">&quot;check&quot;</span><span class="p">,</span> <span class="s2">&quot;missing&quot;</span><span class="p">,</span> <span class="n">when</span><span class="p">(</span><span class="n">value__is</span><span class="o">=</span><span class="kc">None</span><span class="p">)),</span>  <span class="c1"># identity check</span>
+    <span class="p">(</span><span class="s2">&quot;check&quot;</span><span class="p">,</span> <span class="s2">&quot;present&quot;</span><span class="p">,</span> <span class="n">when</span><span class="p">(</span><span class="n">value__isnot</span><span class="o">=</span><span class="kc">None</span><span class="p">)),</span>  <span class="c1"># not-identity check</span>
+<span class="p">)</span>
+</pre></div>
+</div>
+<p>Available operators:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">key=value</span></code> — exact equality (default, unchanged)</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">key__eq=value</span></code> — explicit equality</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">key__ne=value</span></code> — not equal</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">key__gt=value</span></code> — greater than</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">key__gte=value</span></code> — greater than or equal</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">key__lt=value</span></code> — less than</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">key__lte=value</span></code> — less than or equal</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">key__in=[values]</span></code> — value is in the given collection</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">key__notin=[values]</span></code> — value is not in the given collection</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">key__contains=value</span></code> — collection/string in state contains the value</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">key__is=value</span></code> — identity check (<code class="docutils literal notranslate"><span class="pre">is</span></code>), useful for <code class="docutils literal notranslate"><span class="pre">None</span></code>/<code class="docutils literal notranslate"><span class="pre">True</span></code>/<code class="docutils literal notranslate"><span class="pre">False</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">key__isnot=value</span></code> — negated identity check (<code class="docutils literal notranslate"><span class="pre">is</span> <span class="pre">not</span></code>)</p></li>
+</ul>
+<p>Multiple keyword arguments are ANDed together. For more complex expressions, use <code class="docutils literal notranslate"><span class="pre">expr()</span></code>.</p>
 <p>Conditions are evaluated in the order they are specified, and the first one that evaluates to True will be the transition that is selected
 when determining which action to run next. If no condition evaluates to <code class="docutils literal notranslate"><span class="pre">True</span></code>, the application execution will stop early.</p>
 <p>The <code class="docutils literal notranslate"><span class="pre">~</span></code> operator will invert a condition. For instance:</p>
diff --git a/pull/644/reference/conditions/index.html b/pull/644/reference/conditions/index.html
index 1df89f96..017c653d 100644
--- a/pull/644/reference/conditions/index.html
+++ b/pull/644/reference/conditions/index.html
@@ -564,15 +564,43 @@ The result is just a key/value dictionary.</p>
 <dl class="py method">
 <dt class="sig sig-object py" id="burr.core.action.Condition.when">
 <em class="property"><span class="k"><span class="pre">classmethod</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">when</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#burr.core.action.Condition.when" title="Link to this definition">¶</a></dt>
-<dd><p>Returns a condition that checks if the given keys are in the
-state and equal to the given values.</p>
+<dd><p>Returns a condition that checks state values using optional operators.</p>
 <p>You can also refer to this as <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">burr.core</span> <span class="pre">import</span> <span class="pre">when</span></code> in the API.</p>
+<p>Basic equality (unchanged from original):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">when</span><span class="p">(</span><span class="n">foo</span><span class="o">=</span><span class="s2">&quot;bar&quot;</span><span class="p">)</span>            <span class="c1"># state[&quot;foo&quot;] == &quot;bar&quot;</span>
+<span class="n">when</span><span class="p">(</span><span class="n">foo</span><span class="o">=</span><span class="s2">&quot;bar&quot;</span><span class="p">,</span> <span class="n">baz</span><span class="o">=</span><span class="s2">&quot;qux&quot;</span><span class="p">)</span> <span class="c1"># state[&quot;foo&quot;] == &quot;bar&quot; AND state[&quot;baz&quot;] == &quot;qux&quot;</span>
+</pre></div>
+</div>
+<p>Comparison operators via <code class="docutils literal notranslate"><span class="pre">__</span></code> suffix:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">when</span><span class="p">(</span><span class="n">age__gt</span><span class="o">=</span><span class="mi">18</span><span class="p">)</span>           <span class="c1"># state[&quot;age&quot;] &gt; 18</span>
+<span class="n">when</span><span class="p">(</span><span class="n">age__gte</span><span class="o">=</span><span class="mi">18</span><span class="p">)</span>          <span class="c1"># state[&quot;age&quot;] &gt;= 18</span>
+<span class="n">when</span><span class="p">(</span><span class="n">age__lt</span><span class="o">=</span><span class="mi">18</span><span class="p">)</span>           <span class="c1"># state[&quot;age&quot;] &lt; 18</span>
+<span class="n">when</span><span class="p">(</span><span class="n">age__lte</span><span class="o">=</span><span class="mi">18</span><span class="p">)</span>          <span class="c1"># state[&quot;age&quot;] &lt;= 18</span>
+<span class="n">when</span><span class="p">(</span><span class="n">age__ne</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>            <span class="c1"># state[&quot;age&quot;] != 0</span>
+<span class="n">when</span><span class="p">(</span><span class="n">age__eq</span><span class="o">=</span><span class="mi">18</span><span class="p">)</span>           <span class="c1"># state[&quot;age&quot;] == 18  (explicit)</span>
+</pre></div>
+</div>
+<p>Membership operators:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">when</span><span class="p">(</span><span class="n">status__in</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;a&quot;</span><span class="p">,</span> <span class="s2">&quot;b&quot;</span><span class="p">])</span>     <span class="c1"># state[&quot;status&quot;] in [&quot;a&quot;, &quot;b&quot;]</span>
+<span class="n">when</span><span class="p">(</span><span class="n">status__notin</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;x&quot;</span><span class="p">,</span> <span class="s2">&quot;y&quot;</span><span class="p">])</span>  <span class="c1"># state[&quot;status&quot;] not in [&quot;x&quot;, &quot;y&quot;]</span>
+<span class="n">when</span><span class="p">(</span><span class="n">tags__contains</span><span class="o">=</span><span class="s2">&quot;python&quot;</span><span class="p">)</span>   <span class="c1"># &quot;python&quot; in state[&quot;tags&quot;]</span>
+</pre></div>
+</div>
+<p>Identity operators:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">when</span><span class="p">(</span><span class="n">value__is</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>            <span class="c1"># state[&quot;value&quot;] is None</span>
+<span class="n">when</span><span class="p">(</span><span class="n">value__isnot</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>         <span class="c1"># state[&quot;value&quot;] is not None</span>
+</pre></div>
+</div>
+<p>Multiple conditions are ANDed together:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">when</span><span class="p">(</span><span class="n">age__gte</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="s2">&quot;active&quot;</span><span class="p">)</span>  <span class="c1"># age &gt;= 18 AND status == &quot;active&quot;</span>
+</pre></div>
+</div>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters<span class="colon">:</span></dt>
-<dd class="field-odd"><p><strong>kwargs</strong> – Keyword arguments of keys and values to check – will be an AND condition</p>
+<dd class="field-odd"><p><strong>kwargs</strong> – Keyword arguments with optional <code class="docutils literal notranslate"><span class="pre">__operator</span></code> suffixes</p>
 </dd>
 <dt class="field-even">Returns<span class="colon">:</span></dt>
-<dd class="field-even"><p>A condition that checks if the given keys are in the state and equal to the given values</p>
+<dd class="field-even"><p>A condition that checks all specified constraints (AND)</p>
 </dd>
 </dl>
 </dd></dl>
diff --git a/pull/644/searchindex.js b/pull/644/searchindex.js
index 2a5422fe..0cfaa05c 100644
--- a/pull/644/searchindex.js
+++ b/pull/644/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles":{"1. Agent application is modeled as State + Actions \u2013> Graph":[[28,"agent-application-is-modeled-as-state-actions-graph"]],"1. Make your methods async":[[6,"make-your-methods-async"]],"2. Build application \u2013> built in checkpointing & tracking":[[28,"build-application-built-in-checkpointing-tracking"]],"2. Implement the is_async method":[[6,"implement-the-is-async-method"]],"3. Comes with a UI":[[28,"comes-with-a-ui"]],"3. Use async persisters with  [...]
\ No newline at end of file
+Search.setIndex({"alltitles":{"1. Agent application is modeled as State + Actions \u2013> Graph":[[28,"agent-application-is-modeled-as-state-actions-graph"]],"1. Make your methods async":[[6,"make-your-methods-async"]],"2. Build application \u2013> built in checkpointing & tracking":[[28,"build-application-built-in-checkpointing-tracking"]],"2. Implement the is_async method":[[6,"implement-the-is-async-method"]],"3. Comes with a UI":[[28,"comes-with-a-ui"]],"3. Use async persisters with  [...]
\ No newline at end of file